MongoDB三节点副本集搭建

 

 

 

一个副本集的最小结构有用三个成员。一个三个成员的副本集可以有三个成员保存数据,或者有两个保存,一个为监督者。副本集应始终具有奇数个成员。这确保选举顺利进行。

主节点和两个从节点

主节点和一个从节点一个监督者节点

三个保存数据的副本集成员

拥有:

  • 一个主节点
  • 两个从节点。两个从节点都有可能在选举中成为主节点。

这里写图片描述

这样部署提供了除了主节点两个数据集的完整全时拷贝。这个副本集提供了额外的容错和高可用性,如果主节点不可用了,副本集会选举一个从节点成为主节点然后继续运行下去。当原来的主节点可用时会重新加入到副本集中。

这里写图片描述

一个主节点和一个从节点和监督者成员

一个拥有两个保存数据成员的副本集拥有:

  • 一个主节点
  • 一个从节点。 从节点可以再选举中成为主节点。
  • 一个监督者成员。监督者只能在选举中投票。

这里写图片描述

因为监督者没有保存数据的拷贝,这样部署只提供了疑问数据完整的备份。监督者只占有极少的资源,牺牲了额外的冗余和容错性。

但是,部署一个主节点、从节点、监督者成员在主节点或从节点不可用时保证了副本集的可用性。如果主节点不可用了,副本集会选举从节点成为主节点。

这里写图片描述

 

搭建副本集

1、环境

一个服务器上模拟mongodb的两种三个成员副本集

1
2
3
4
5
6
7
8
172.17.39.186:27017  PRIMARY
172.17.39.186:27018  SECONDARY
172.17.39.186:27019  SECONDARY
 
或者<br>
172.17.39.186:27017  PRIMARY
172.17.39.186:27018  SECONDARY
172.17.39.186:27019  arbitrate

  

2、下载与安装的MongoDB

进入官网,选择社区服务器进行下载

https://www.mongodb.com/download-center?jmp=nav#community

或者可以直接

1
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.2.tgz

 

3、解压改名

1
2
3
# mkdir -p /data/mongodb
# tar xvf mongodb-linux-x86_64-rhel70-4.0.2.tgz -C /data/mongodb/
# mv mongodb-linux-x86_64-rhel70-4.0.2  mongodb1

  

4、在mongodb1的文件夹下新建data,log和conf文件夹

1
2
# cd mongodb
# mkdir {data,log,conf}

 

5、将mongodb1复制为mongodb2,mongodb3

1
2
3
4
5
6
7
# cp -ra mongodb1 mongodb2
# cp -ra mongodb1 mongodb3
# ll
total 12
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb1
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb2
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb3

 

6、在三个文件夹的conf文件夹下编写配置文件“vi mongodb.conf”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# cat mongodb1/conf/mongodb.conf
port=27017
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb1/data/
logpath=/data/mongodb/mongodb1/log/r1.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset
 
 
# cat mongodb2/conf/mongodb.conf
port=27018
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb2/data/
logpath=/data/mongodb/mongodb2/log/r2.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset
 
 
# cat mongodb3/conf/mongodb.conf
port=27019
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb3/data/
logpath=/data/mongodb/mongodb3/log/r3.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset

参数:

port = 27017 #mongodb端口

logappend = true#以追加的方式记录日志

dbpath = / usr / local / mongodb1 / data / master#数据存放目录

logpath = / usr / local / mongodb1 / log / master.log#日志存放目录

fork = true#后台运行

oplogSize = 2048#同步操作记录文件大小(MB)

smallfiles = true#使用较小的默认文件

replSet = dbset#副本集名称,同一个副本集,名称必须一致 

 

7、启动

1
2
3
/data/mongodb/mongodb1/bin/mongod -f /data/mongodb/mongodb1/conf/mongodb.conf
/data/mongodb/mongodb2/bin/mongod -f /data/mongodb/mongodb2/conf/mongodb.conf
/data/mongodb/mongodb3/bin/mongod -f /data/mongodb/mongodb3/conf/mongodb.conf

  

8、登陆,进入你想成为master的那台机器,进入mongodb客户端,在想成为master的mongodb的bin目录下输入“./mongo -port 对应端口”(mongo指令中不输入port默认为27017端口)

1
/data/mongodb/mongodb3/bin/mongo 172.17.39.186:27017

 

9、接下来配置副本集,第一个id是副本集名称

9.1 

注意:这里配置的是有两个保存数据,一个为监督者

1
config={_id : 'dbset',members : [{_id : 1, host : '127.0.0.1:27017'},{_id : 2, host : '127.0.0.1:27018'}]}

回车键输出

  

接下来初始化副本集配置,在客户端内输入“rs.initiate( config )”

1
rs.initiate( config )

添加仲裁服务器,在客户端输入“rs.addArb("127.0.0.1:27019") ”

1
rs.addArb("127.0.0.1:27019")

可以通过查看副本集状态(输入“rs.status()”),查看三个mongodb的状态

1
rs.status()

此时副本集已搭建完成。

 

9.2

注意:这里配置的是三个保存数据的副本集成员,就不再截图说明了

1
2
3
4
5
6
> config={_id : 'dbset',members : [{_id : 1, host : '172.17.39.186:27017'},{_id : 2, host : '172.17.39.186:27018'},{_id : 3, host : '172.17.39.186:27019'}]}
回车键输出
> rs.initiate( config )
> rs.status()
 
此时副本集已搭建完成。

 

mongodb副本集测试

1、在master的mongodb上新建test,并插入集合acc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ./mongo 172.17.39.186:27017
 
.......<br>
dbset:PRIMARY> use test
switched to db admin
db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
dbset:PRIMARY> show tables
acc
dbset:PRIMARY> db.acc.find()
"_id" : ObjectId("5bab55810630ebfb7b618f6a"), "AccountID" : 1, "UserName" "123""password" "123456" }
 
dbset:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
dbset:PRIMARY>

2、在从节点的mongodb查看是否完成复制  

# ./mongo 172.17.39.186:27018
dbset:SECONDARY> use test
dbset:SECONDARY> show tables

mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置rs.slaveOk() ,副本节点可以读。

复制代码
dbset:SECONDARY> rs.slaveOk() 
dbset:SECONDARY> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
dbset:SECONDARY> db.acc.find()
复制代码

 

3、主从替换:

通过模拟主节点宕机来检验主从替换,以通过杀死指令杀死主进程来达到宕机效果

当主宕机后访问27018(从节点)端口,可以看到该端口对应的mongodb变成了主节点,以及当执行rs.status()命令时,显示27017端口的mongodb的状态为不可达/健康

 

 

 过程中用过的命令

1
2
3
4
5
6
7
8
9
10
/data/mongodb/bin/mongod --dbpath /data/mongodbtest/replset/data   --replSet repset
 
如果想移除某一个节点
rs.remove("127.0.0.1:27018")
这个不能删除主节点
 
 
rs.reconfig()
 
db.getMongo().setSlaveOk()

  

 
posted @ 2021-11-20 00:01  小雨淅淅o0  阅读(1077)  评论(0编辑  收藏  举报