21.33 mongodb副本集介绍
21.34 mongodb副本集搭建
21.35 mongodb副本集测试
21.33 mongodb副本集介绍
mongodb早期版本是使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。
目前已经淘汰master-slave模式,改为副本集
,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)
的角色,它只负责裁决,而不存储数据。主要让它来判断谁来替代主,防止脑裂。
在此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server。
总结
mongodb副本集类似于MySQL主从,MySQL主从主宕机后要手动配置,mongodb副本集主宕机后从会自动顶上。
21.34 MongoDB副本集搭建
主:kun02 192.168.80.101 primary
从:kun03 192.168.80.102 secondary
从:kun04 192.168.80.103 secondary
步骤
1.三台机器安装好MongoDB并编辑配置文件
1 | [root@kun02 ~]# vim /etc/mongod.conf |
修改下面参数1
2
3
4
5 bindIp: 127.0.0.1,192.168.80.101
replication:
oplogSizeMB: 20
replSetName: kun
bindIp
后面添加本机内网ip,用逗号分开oplogSizeMB
定义oplog大小 前面空两格replSetName
定义副本集名字 前面空两格
2.三台机器启动MongoDB服务
1 | [root@kun04 mongodb 4.0]# systemctl start mongod |
3.在主上连接MongoDB
1 | [root@kun02 ~]# mongo |
4.配置副本集的数据
1 | > config={_id:"kun",members:[{_id:0,host:"192.168.80.101:27017"},{_id:1,host:"192.168.80.102:27017"},{_id:2,host:"192.168.80.103:27017"}]} |
5.初始化数据
1 | > rs.initiate(config) |
查看副本集
格式:rs.status()
1
2
3
4
5
6
7>rs.status()
{
"set" : "kun",
"date" : ISODate("2018-08-25T16:19:06.348Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
21.35 mongodb副本集测试
在主上建库并建立集合1
2
3kun:PRIMARY> use dbtest ##建立dbtest库
kun:PRIMARY> db.test.insert({AccountID:1,UserName:"123",password:"123456"}) ##创建test集合
现在去从上登录MongoDB并查看是否有该库和集合1
2kun:SECONDARY> show dbs
"errmsg" : "not master and slaveOk=false", ##显示slaveOk=false的错误
输入rs.slaveOk()1
2
3
4
5
6
7
8kun:SECONDARY> rs.slaveOk()
kun:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
dbtest 0.000GB
local 0.000GB
test 0.000GB
从库上以有主库上的数据,说明副本集搭建成功1
2
3
4kun:SECONDARY> use dbtest
switched to db dbtest
kun:SECONDARY> show tables
test
副本集更改权重模拟主宕机
在刚刚配置完副本集时所有机器的权重都是1,我们可以设置权重最高的为主,还能够让主宕机后,第二高的权重来顶替主
在主机器上登录MongoDB
添加下面命令1
2
3
4
5
6
7
8
9kun:PRIMARY> cfg = rs.conf()
kun:PRIMARY> cfg.members[0].priority = 3
kun:PRIMARY> cfg.members[1].priority = 2
kun:PRIMARY> cfg.members[2].priority = 1
kun:PRIMARY> rs.reconfig(cfg) ##初始化数据
查看权重
格式:rs.conf()
现在kun02权重是3,kun02权重是2,kun04权重是11
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
35
36
37
38
39
40
41
42
43
44
45
46
47kun:PRIMARY> cfg
{
"_id" : "kun",
"version" : 2,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.80.101:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 3,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.80.102:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.80.103:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
模拟主kun02宕机看看主是否切换到kun03上1
[root@kun02 ~]# iptables -I INPUT -p tcp --dport 27017 -j DROP
回去kun03上发现变为了主1
kun:PRIMARY>