一、介绍
1、节点类型
主节点(Primary):负责处理客户端的请求
从节点(Secondary):负责复制主节点上的数据。可读不可写
仲裁节点(Arbiter):不保留任何数据,只具有投票选举作用。
MongoDB实现复制集群至少需要两个节点(一主一从),仲裁节点为可选,但一般会一起作用
2、主从复制方式
从节点定期轮询从主节点操作日志中获取操作记录,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
二、环境准备
虚拟机三台,分别安装好MongoDB。服务网格信息如下:
主机名 | 操作系统 | IP | Node | 端口 |
vm-xwj100 | Centos7.6 | 192.168.20.100 | Primary | 27017 |
vm-xwj101 | Centos7.6 | 192.168.20.101 | Secondary | 27017 |
vm-xwj102 | Centos7.6 | 192.168.20.102 | Arbiter | 27017 |
三、应用配置
修改三个节点下的mongo.conf配置文件
主节点(vm-xwj100):
#数据保存路径 dbpath=/usr/local/mongo/data/db/ #日志保存路径 logpath=/usr/local/mongo/logs/mongodb.log #进程描述文件 pidfilepath=/usr/local/mongo/pids/mongo.pid #日志追加写入 logappend=true #复制集名称 replSet=rs0 bind_ip_all=true #mongo默认端口 port=27017 #操作日志容量 oplogSize=10000 #开启子进程 fork=true
从节点(vm-xwj101):
#数据保存路径 dbpath=/usr/local/mongo/data/db/ #日志保存路径 logpath=/usr/local/mongo/logs/mongodb.log #进程描述文件 pidfilepath=/usr/local/mongo/pids/mongo.pid #日志追加写入 logappend=true #复制集名称 replSet=rs0 bind_ip_all=true #mongo默认端口 port=27017 #操作日志容量 oplogSize=10000 #开启子进程 fork=true
仲裁节点(vm-xwj102):
#数据保存路径 dbpath=/usr/local/mongo/data/db/ #日志保存路径 logpath=/usr/local/mongo/logs/mongodb.log #进程描述文件 pidfilepath=/usr/local/mongo/pids/mongo.pid #日志追加写入 logappend=true #复制集名称 replSet=rs0 bind_ip_all=true #mongo默认端口 port=27017 #操作日志容量 oplogSize=10000 #开启子进程 fork=true
四、初始化复制集群
1、在所有节点启动mongo服务端
/usr/local/mongo/bin/mongod -f /usr/local/mongo/conf/mongo.conf
2、登录客户端,访问主节点
/usr/local/mongo/bin/mongo --host 192.168.20.100 --port 27017
3、初始化复制集
rs.initiate({ _id:"rs0", members:[ {_id:0, host:"192.168.20.100:27017", priority:2}, {_id:1, host:"192.168.20.101:27017", priority:1}, {_id:2, host:"192.168.20.102:27017", arbiterOnly:true} ] });
_id: "rs0": 复制集名称,与配置文件对应
priority: 权重(数字越大优先级越高)
arbiterOnly: 是否是仲裁节点
执行成功后,如下所示(命令行符号由 > 变为 rs0:SECONDARY>,然后会进行选举,最终变成rs0:Primary>):
4、查看复制集状态
rs.status()
5、查看当前节点是否为主节点
rs.isMaster()
总结:
1、当主节点宕机时,仲裁节点会根据配置信息中的权重值优先选举权重高的节点作为主节点继续提供服务。当宕机的主节点回复后,复制集会恢复原主节点状态,临时主节点重新成为从节点。
踩坑:
1、初始化时,报如下错误:
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.20.101:27017 failed
with Error connecting to 192.168.20.101:27017 :: caused by :: No route to host, 192.168.20.102:27017 failed with Error connecting to
192.168.20.102:27017 :: caused by :: No route to host", "code" : 74, "codeName" : "NodeNotFound",
问题原因:初始化复制集群时,用的三台机器,主节点想连通其它节点,需要关闭防火墙
解决办法:在从节点和仲裁节点上,关闭防火墙:systemctl stop firewalld
2、在从节点上读取数据失败,报如下错误:
问题原因:默认情况下直接连从节点是无法查询数据的。因为从节点是不可读的
解决办法:开启从节点读权限。在从节点客户端输入命令 rs.slaveOk(true)