21.33 mongodb副本集介绍
21.34 mongodb副本集搭建
21.35 mongodb副本集测试
21.33 mongodb副本集介绍
像mysql主宕机之后,我们可以让从成为新的主,但是需要手动去改的,甚至新的主从关系都是要手动去改。但是mongodb副本集中他完全都是自动的,主宕机之后,从成为了新的主,从也可以自动的识别新的主。这是他更高级的地方,很智能
1.早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
2.目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),读写,和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主
#目的也是实现mongodb的高可用、保证数据的安全。读写仅仅是在主上,从不需要提供服务
3.在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
#arbiter用来决定你的主宕机之后,很准确的告诉你他的主断掉了。像keepalived当主挂掉之后是怎么决定主当掉了,会容易出现脑裂的情况。所以为了防止脑裂的情况就出现了arbiter这样的角色。数据库是坚决不允许出现脑裂的情况
4.再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server
#另一种方式。在代码里面实现读写分离,让读的时候去其中一个从库上去读。这样也可以实现负载均衡
在从上也可以增加一个所谓的lvs这样的代理,当然从很多的情况下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.34 mongodb副本集搭建
一.
三台机器: 192.168.133.130(primary) 192.168.133.132(secondary) 192.168.133.133(secondary)
二.
编辑三台机器的配置文件(/etc/mongod.conf ),更改或增加:
!1replication://把此行前面的#删除
oplogSizeMB: 20//前面有两个空格,加上这一行。
#这个日志类似于mysql的主从的binlog日志
#oplog大小
replSetName: aminglinux//前面有两个空格,加上这一行
#定义副本集的名字,如上为aminglinux
#复制集名称
!2还要检查bindIp: 127.0.0.1,192.168.208.128。
bindIp有没有监听自己 (内网IP)192.168.xxx.xxx
三.
分别重启三台机器
四.
连接主,在主上运行命令mongo(!哪台为主,就在哪台上操作!)
!1.>use admin
!2.>config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
#"aminglinux"为副本集的名字
#members:指定他的成员
!3.>rs.initiate(config)
#显示ok:1就代表成功了
!4.rs.status() //查看状态
五.
如果两个从上的状态为"stateStr" : "STARTUP"(代表还没起来),或者三台机器都是secondary并没有primary。 则需要进行如下操作(重新配置一下)
> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.reconfig(config)
此时再次查看rs.status()会发现从的状态变为SECONDARY
实例:
[root@axinlinux-01 ~]# cd /etc/yum.repos.d/ #01我们已经安装后mongodb了,把yum源拷贝在02、03 上即可
[root@axinlinux-01 yum.repos.d]# cat mongo.repo #先cat出来
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
[root@axinlinux-02 ~]# vim /etc/yum.repos.d/mongo.repo #02 03均复制上面一段
[root@axinlinux-03 ~]# vim /etc/yum.repos.d/mongo.repo
[root@axinlinux-02 ~]# yum install -y mongodb-org #02 03yum安装即可
[root@axinlinux-03 ~]# yum install -y mongodb-org
如果下载速度太慢,到这来下载到linux上,在全部rpm -ivh安装一下就可以了
https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL/mongodb_rpm%E5%8C%85
[root@axinlinux-01 yum.repos.d]# vim /etc/mongod.conf #修改配置文件,改动后如下
replication:
oplogSizeMB: 20
replSetName: aminglinux
[root@axinlinux-01 yum.repos.d]# systemctl restart mongod #重启mongodb
[root@axinlinux-01 yum.repos.d]# ps aux |grep mongod #检查进程
mongod 4652 38.3 2.6 1018308 49688 ? Sl 14:59 0:08 /usr/bin/mongod -f /etc/mongod.conf
root 4687 0.0 0.0 112720 976 pts/0 S+ 15:00 0:00 grep --color=auto mongod
#此处需要注意,因为之前做过用户认证(--auth),要把它去掉,操作如下:(
[root@axinlinux-01 yum.repos.d]# vim /usr/lib/systemd/system/mongod.service #编辑他的启动脚本
Environment="OPTIONS=--auth -f /etc/mongod.conf" #这一行的--auth去掉即可。一旦我们更改了这个配置文件,他会提示我们执行daemon reload的命令,复制执行一下即可)
修改配置文件,02 03 上也要如此,直接复制过去即可,还要设置bindIp 也监听本机内网IP。这里就不做演练了
[root@axinlinux-02 ~]# systemctl start mongod #02 03均启动一下
[root@axinlinux-03 ~]# systemctl start mongod
[root@axinlinux-03 ~]# netstat -lntp #01 02 03都要监听这两个ip才可以
tcp 0 0 192.168.208.133:27017 0.0.0.0:* LISTEN 2995/mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2995/mongod
三台均关闭firewalld和selinux
[root@axinlinux-01 yum.repos.d]# mongo #直接连接主(本机上直接mongo即可进入)。即01为主
> use admin
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
{
"_id" : "aminglinux",
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017"
},
{
"_id" : 1,
"host" : "192.168.208.130:27017"
},
{
"_id" : 2,
"host" : "192.168.208.133:27017"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
aminglinux:OTHER> rs.status()
{
"set" : "aminglinux", #集合的名字
。。。。。
"members" : [ #成员
{
"_id" : 0,
"name" : "192.168.208.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #状态为primary,就是主
。。。。。
{
"_id" : 1,
"name" : "192.168.208.130:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #状态为secondary,就是为从
。。。。。
{
"_id" : 2,
"name" : "192.168.208.133:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #状态为secondary,这台也是从
。。。。。
"ok" : 1
}
aminglinux:PRIMARY> #我们再次看命令行的前缀就自动变成了主
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.35 mongodb副本集测试
1.主上建库,建集合
>use mydb
#mydb库
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
#acc为测试的集合,并且插入(insert)一些数据
>show dbs
2.从上查看
>show dbs
3.若出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要执行
>rs.slaveOk()
副本集更改权重模拟主宕机
1.默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:128:3,130:2,133:1
2.在主上执行
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg) #使他生效
3.这样的话,第二个节点将会成为候选主节点。
4.主上执行 iptables -I INPUT -p tcp --dport 27017 -j DROP
实例:
测试
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"}) #主上写数据才可以
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> show tables
acc
aminglinux:SECONDARY> show dbs #我们在一个从上查看一下是否有数据
2018-11-20T16:20:00.424+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false", #报错了是因为不是主。而且slaveok=false
。。。。。
aminglinux:SECONDARY> rs.slaveOk() #根据他的提示这样执行就可以了
aminglinux:SECONDARY> show dbs #我们再来show dbs,就可以了
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:SECONDARY> use mydb
switched to db mydb
aminglinux:SECONDARY> show tables #查看集合
acc
副本集更改权重模拟主宕机
aminglinux:PRIMARY> rs.config() #rs.config()可以查看权重
。。。。。
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1, #可以看到权重都是1
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
aminglinux:PRIMARY> cfg = rs.conf()
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
aminglinux:SECONDARY> rs.config() #再来查看一下新的权重。此时已经变为secondary
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 3,
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,