前言
我们知道关于Mongodb的副本集有两种:Primary-Secondary-Arbiter(俗称PSA)和Primary-Secondary-Secondary(俗称:PSS),关于两者的含义概念这里不在多余介绍,可自行百度。此篇文章主要介绍PSS模式的副本集搭建。
所谓副本集:就是用几个其他的机器(Secondary),来备份某个特定机器(Primary)上的数据
如果让mongodb变为副本集的模式:简单对配置文件配置一下,然后照常启动一下mongodb就行了,并不需要其他特殊的设置。
前期准备
- 关闭防火墙
查看是否关闭:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
(不关的话,rs.initiate时会 报replSetInitiate quorum check failed because not all proposed set members responded affirmatively错误) - 配置节点,这里我通过vmware虚拟出3个centos7作为3个节点,如下:
PSS模式(还有PSA模式) 地址 别名 Primary 192.168.40.128 节点1 Secondary 192.168.40.129 节点2 Secondary 192.168.40.130 节点3
副本集搭建
官网:Deploy a Replica Set — MongoDB Manual
第一步:修改配置文件(默认位置/etc/mongod.conf),设置副本集的一些配置,三个节点都要设置
replication:
replSetName: "rs0" #3个节点服务器上配置文件中设置的这个值必须是相同的,名字随意
net:
bindIp: 0.0.0.0 # 用0.0.0.0是因为用ip时总是报错,就用万能的0.0.0.0了
第二步:启动mongodb(三个节点都要这么启动)
mongod -f /etc/mongod.conf #通过指定配置文件方式启动
以上两步是配置启动mongodb副本集的方式之一(我建议的方式),另外还有一种替换上面两步的 方式,就是直接在启动mongodb的时候,通过参数直接配置副本集,如下(如果没兴趣可跳过直接到第三步):
mongod --fork --replSet "rs0" --bind_ip 192.168.40.128 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log
这种方式我再使用时总是出现意想不到的问题,所以我放弃了这种方式,大家可以自己选择。
第三步:初始化副本集(在Primary上进行这一步,其他2个节点不需要操作)
执行下面2句命令:
mongosh
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "192.168.40.128:27017" },
{ _id: 1, host: "192.168.40.129:27017" },
{ _id: 2, host: "192.168.40.130:27017" }
]
})
语句执行完成后,出现下面如图内容,就说明副本集已经成功了
注意命令行的变化,默认通过mongosh连接后命令行显示的是
,当副本集方式启动后,会在开头多了一个rs0[direct:other]的前缀(这个rs0就是咱在配置文件配置的那个名字)。
提示:到这里,副本集就算是已经搭建成功了,可以通过rs.status()查看
第四步:验证副本集是否成功
首先,在Primary节点上创建一个Collection(所谓的表),如下图:
图中命令如下:
db.rs_test.insertOne({"name":"1"})
然后,我们在其他两个Secondary节点上通过show tables命令来查看节点上的Collection,如下图:
如果能查看到Primary节点上添加的rs_test,那么就说明我们的副本集搭建成功了。
第五步:解决从Secondary节点无法读取数据的问题
在第四步中,我们已经通过show tables命令可以看到在Primary上创建的Collection了,但是如果你想通过find()去读取它里面的数据是不行的,会报错误,如下图:
这是因为默认只能从Primary上读取数据,不能从Secondary上读取数据。如果想从Secondary上也可以读取数据,需要在每个Secondary节点上执行如下命令:
db.getMongo().setReadPref('secondary')
// 参考地址:https://www.mongodb.com/docs/v4.4/reference/method/Mongo.setReadPref/
执行这个命令后 ,就可以读取数据了,如下图:
到此,一个PSS模式的副本集配置就算完成了。关于PSA模式的有机会在介绍。
最后,因为在整个配置过程中,会经常用到一些例如启动和关闭mongodb,查看mongodb是否启动的命令,为了方便期间,我再最后给大家罗列一下,如下:
命令 | 作用 |
ps -ef | grep mongod | 查看mongogdb是否成功启动 |
use admin db.shutdownServer() | 通过mongosh连上mongodb后的关闭mongodb进程的方式 |
mongod --shutdown | 直接通过mongod关闭mongodb服务【推荐方式】 |
service mongod stop | 通过服务方式关闭mongodb服务(尽量不要用这种服务的方式停止mongodb,容易导致启动mongodb时出错) |
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork | 启动mongodb |
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown | 关闭mongodb,与上面方式配对使用 |