MongoDB副本集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB副本集相关的知识,希望对你有一定的参考价值。

mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。因此,官方推荐我们的副本集机器数量至少为3个:一个主节点,两个副本节点。当然,mongodb副本集中可以有很多类型的节点,其中有一个仲裁节点,即当参与选举的节点无法选出主节点时仲裁节点充当仲裁的作用。仲裁节点不存储数据,只是仲裁。所以,我们的副本集可以设置为:1主+1从+1仲裁。

三台服务器

192.168.3.212 主
192.168.3.213 从
192.168.3.214 仲裁

1.分别在每台机器上安装MongoDB安装包并配置

[[email protected] ~]# curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.6.tgz

[[email protected] ~]# tar -zxvf mongodb-linux-x86_64-amazon-3.4.6.tgz

[[email protected] ~]# mv mongodb-linux-x86_64-amazon-3.4.6/ /usr/local/mongodb

[[email protected] ~]# cd /usr/local/mongodb

[[email protected] ~]# mkdir -p data/db

[[email protected] ~]# mkdir log

[[email protected] ~]# touch log/mongod.log

[[email protected] ~]# mkdir etc

[[email protected] ~]# touch etc/mongod.conf

[[email protected] ~]# vim etc/mongod.conf
dbpath = /usr/local/mongodb/data/db        # 指定数据库路径
logpath = /usr/local/mongodb/log/mongod.log          # 指定mongodb日志文件
logappend = true        # 使用追加的方式写日志
port = 27017               #设置端口号为27017
fork = true                   #设置以守护进程的方式启动mongod
replSet = myrs            #设置副本集的名字为myrs,同一副本集群的replset名称必须相同

2.分别在每台机器上启动副本集

[[email protected] ~]# cd /usr/local/mongodb

[[email protected] ~]# ./bin/mongod -f ./etc/mongod.conf    #指定以mongod.conf配置启动mongod

3.初始化副本集
登录任意一台机器的mongodb后台管理shell:

[[email protected] ~]# cd /usr/local/mongodb

[[email protected] ~]# ./bin/mongo
use admin
config = 
"_id":"myrs",
"members":[
  "_id":0,"host":"192.168.3.212:27017",
  "_id":1,"host":"192.168.3.213:27017",
  "_id":2,"host":"192.168.3.214:27017",arbiterOnly:true
]

rs.initiate(config);   #初始化配置

----------------------------------------------------------------------
如果执行rs.initiate(config)报错,那么我们需要检查三台服务器的防火墙27017端口是否开放。如果没有问题,我们可以查看集群节点
rs.status();

到这里副本集就搭建成功了,下面是测试
1、测试副本集的数据复制功能
此时在我的机器上192.168.3.212是主节点,我们用mongo来登录shell。

[[email protected] ~]# cd /usr/local/mongodb

[[email protected] ~]# ./bin/mongo

[[email protected] ~]# use test  #创建test数据库

[[email protected] ~]# db.testdb.insert("name":"yaya");       #插入数据

我们用副本节点登录shell,我这里是192.168.3.213

[[email protected] ~]# cd /usr/local/mongodb

[[email protected] ~]# ./bin/mongo

[[email protected] ~]# use test

[[email protected] ~]# show tables

-------------------------------------------------------------------------------------------
此时会报错:
[thread1] Error: listCollections failed: 
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
 

因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

myrs:SECONDARY> db.getMongo().setSlaveOk();
此时就可以读取数据了:
repset:SECONDARY> db.testdb.find();
控制台输出: "_id" : ObjectId("65845sd71343582051seab23497"), "name" : "yaya" 
所以,数据复制的功能是可用的。

2、测试副本集的故障转移功能
将主节点192.168.3.212的mongod进程杀死

[[email protected] ~]# myrs:PRIMARY> use admin

[[email protected] ~]# myrs:PRIMARY> db.shutdownServer()

此时可以看到,192.168.3.213原本是副节点,此时自动转换为主节点。可以通过rs.status()来查看。

以上是关于MongoDB副本集的主要内容,如果未能解决你的问题,请参考以下文章

使用 rmongodb 连接到 MongoDB 副本集

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

Mongodb集群架构之副本集

mongodb副本集搭建

mongodb单机升级为副本集

mongodb带密码的副本集加入分片后怎么访问