本文共 3413 字,大约阅读时间需要 11 分钟。
本文讲解的是可复制集架构的原理和搭建
可复制集是跨多个MongDB服务器(节点)分布和维护数据的方法。
mongoDB可以把数据从一个节点复制到其他节点并在修改时进行同步,集群中的节点配置为自动同步数据
旧方法叫做主从复制,mongoDB 3.0以后推荐使用可复制集
可复制集优点:
- 避免数据丢失,保障数据安全,提高系统安全性(最少3节点,最大50节点)
- 自动化灾备机制,主节点宕机后通过选举产生新主机,提高系统健壮性(7个选举节点上限)
- 读写分离,负载均衡,提高系统性能
- 生产环境推荐的部署模式
架构图:
- 首先从节点查询本机oplog最新时间戳
- 然后从节点查询主节点oplog晚于此时间戳的所有文档
- 最后从节点加载这些文档,并根据log执行写操作
- 情况一:不需要同步到从节点的策略(如: acknowledged、Unacknowledged 、w1),数据同步都是异步的
- 情况二:其他writeconcern情况都是同步的,因为都需要等待从节点确认完毕后才结束整个写流程
备注:oplog是盖子集合,大小是可以调整的,64为系统中默认是所在硬盘可用空间的5%,具体说明参考:
环境准备
这里只在一台机器上搭建三个节点,生产上一定要用3台
IP:192.168.31.41
MongoDB版本:mongodb-linux-x86_64-rhel70-3.4.20.tgz
安装好3个MongoDB节点,安装教程参考我的另一篇博客:
master 192.168.31.41 27030
slave1 192.168.31.41 27031
slave2 192.168.31.41 27032
3个MongoDB的配置文件mongodb.conf加入如下相同的配置
replication: replSetName: configRS #集群名称 oplogSizeMB: 500 #oplog集合大小,单位MB,一定不能设置太小,根据具体机器磁盘进行设置
这里列出master节点的配置文件全部内容,和slave1、slave2配置文件的不同之处在于端口和相关路径的配置,其他都一致:
storage: dbPath: "/usr/local/mongodb/replica/master/data" journal: enabled: true directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 journalCompressor: snappy directoryForIndexes: false collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: truesystemLog: destination: file path: "/usr/local/mongodb/replica/master/log/mongodb.logs"net: port: 27030 http: RESTInterfaceEnabled: trueprocessManagement: fork: falsereplication: replSetName: configRS oplogSizeMB: 500
创建启动脚本
cd /usr/local/mongodb/replicamkdir logsvim start-replica-mongo.sh#输入如下内容nohup ./master/bin/mongod -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 &nohup ./slave1/bin/mongod -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 &nohup ./slave2/bin/mongod -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 &#保存后授权执行权限chmod u+x start-replica-mongo.sh
启动
./start-replica-mongo.sh
在master节点上运行初始化命令
cd /usr/local/mongodb/replica/master/binmongo 127.0.0.1:27030# _id表示集群名称,members表示master主机rs.initiate({ _id: "configRS", version: 1, members: [{ _id: 0, host : "192.168.31.41:27030" }]});# 有多少个slave就执行多少次add rs.add("192.168.31.41:27031");rs.add("192.168.31.41:27032");
从节点上执行rs.slaveOk()【注意:这里有个小坑】
目前只能在主节点上查询出数据,但如果想在副节点上查询到数据需运行rs.slaveOk()
注意:每次使用命令行的方式登录从机的时候都要在从机执行rs.slaveOk()命令,否则是无法查询的!!!
cd /usr/local/mongodb/replica/master/binmongo 127.0.0.1:27031rs.slaveOk();exitmongo 127.0.0.1:27032rs.slaveOk();exit
主节点负责写入,从节点负责同步数据和负载均衡查询,现在测试一下吧,从主节点新增数据
cd /usr/local/mongodb/replica/master/binmongo 127.0.0.1:27030use dalomaodb.users.insertOne({ "username":"张三"})
然后登陆slave1和slave2查看是否有数据
可以在每个节点运行rs.status()或isMaster()命令查看复制集状态,如:
mongo 127.0.0.1:27031rs.isMaster()
停止命令如下
cd /usr/local/mongodb/replicavim stop-replica-mongo.sh#输入如下内容nohup ./master/bin/mongod --shutdown -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 &nohup ./slave1/bin/mongod --shutdown -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 &nohup ./slave2/bin/mongod --shutdown -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 &#保存后授权执行权限chmod u+x stop-replica-mongo.sh
转载地址:http://ykpxi.baihongyu.com/