83.mongodb副本集介绍 搭建 测试

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,

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3866149/blog/3030832

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值