目前的MongoDB还是单机使用,虽然有用mongoexport导出数据备份,用着还是慌…学着搭个复制集看看吧
简述复制集
MongoDB复制集的意义在于实现服务高可用、数据分发、读写分离、异地容灾,依赖于两个功能实现:
- 数据写入时将数据迅速复制到另一个独立节点上
- 在接受写入的节点发生故障时自动选举出一个新的替代节点(复制集由3个以上具有投票权的节点组成,一般为奇数节点)
准备节点
1、官方手册中有命令行安装的教程:
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#overview
由于我在机器中已经按步骤安装过一个MongoDB,又是在单机学习搭建复制的步骤,就采用创建临时目录,用MongoDB压缩包的形式测试下:
1 | mkdir MongoWork/MongoData/db{1,2,3} |
在三个db文件夹下分别创建mongo.conf
文件,并写入内容:
1 | systemLog: |
注意上面的path
、dbPath
、port
要分别修改。
现在分别启动三个mongodb:
1 | cd mongodb-4.2.1 |
通过ps和netstat分别查看一下:
1 | ps -ef | grep mongod |
配置节点
进入第一个节点:
1 | bin/mongo top:28018 |
信息中显示的rs0:SECONDARY
已经进入复制集的从节点状态,rs0:PRIMARY
显示成为了主节点。这个时候查看节点的状态:
1 | rs0:PRIMARY> rs.status() |
members
表明了复制集中的成员信息,此时还是一个单节点,接下来加入其它两个节点:
1 | rs0:PRIMARY> rs.add("top:28019") |
再次键入rs.status()
可以看到members
中已经三个节点信息了。
验证复制集
在主节点中写入信息:
1 | rs0:PRIMARY> db.test.insert({ a: 1}) |
在另外两个会话窗口中分别键入命令进入mongodb:
1 | bin/mongo top:28019 |
显示报错,不允许在从节点读,此时键入rs.slaveOk()
即可:
1 | rs0:SECONDARY> rs.slaveOk() |
可以看到数据已经进行了复制。
关于NTP
使用复制集的话,需要注意在各个节点配置下NTP,如果运行ntpd服务,一般来说ntpd会逐渐调整时钟,避免时间跳变。没有的话可以先安装,然后在ntp.conf
中增加一行:
1 | server ntp7.aliyun.com |
如果你的机器的时钟发生跳变不会有严重后果,可以通过ntpdate ntp7.aliyun.com
进行一次性的同步。
参考
1、https://docs.mongodb.com/manual/administration/production-notes/#recommended-configuration
2、https://tuna.moe/help/ntp/
3、https://help.aliyun.com/document_detail/92704.html