一、概述
1、 MongoDB复制集(MongoDB Replica Set)是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成,其中一个作为主节点(Primary),其他节点则扮演从节点(Secondary)的角色。主节点处理所有的写操作和客户端请求,而从节点负责复制主节点的数据并提供读操作的能力。
2、 复制集的主要目标是提供数据的冗余和故障恢复的能力。当主节点发生故障或不可用时,复制集会自动选举出一个新的主节点来接管主节点的职责,保证系统的可用性。一旦原先的主节点恢复,它会以从节点的身份重新加入复制集,同步最新的数据。
3、在复制集中,数据同步是通过Oplog(操作日志)来实现的。主节点会记录所有的写操作,并将其顺序保存在Oplog中。从节点通过读取Oplog中的操作来进行数据的复制和同步。
4、 复制集还提供了其他一些功能,如自动故障检测和恢复、自动故障转移、读写分离等。通过配置合适的副本集成员和选举优先级,可以实现不同的数据治理策略和故障容错能力。
5、要配置一个MongoDB复制集,需要在MongoDB配置文件中指定每个节点的相关配置,包括主节点和从节点的IP地址、端口号、复制集名称等。在启动MongoDB实例时,指定配置文件即可。一旦复制集的节点都启动成功,系统会自动进行选举并形成一个复制集。
6、MongoDB复制集提供了高可用性、数据冗余和故障恢复的能力,是在生产环境中常用的部署架构之一。通过使用复制集,可以保证MongoDB数据库在单节点故障或部分故障的情况下仍然可用,并提供更好的读写性能和数据冗余。
二、工作原理
1. 节点角色:一个MongoDB复制集由多个节点组成,其中一个节点被选举为主节点(Primary),其他节点则扮演从节点(Secondary)的角色。主节点负责处理所有的写操作和客户端请求,从节点负责复制主节点的数据并提供读操作。
2. 选举过程:复制集的选举过程在初始启动或主节点故障时发生。当一个节点检测到主节点不可用时,它会发起一次选举。选举过程包括以下步骤:
- 节点发出选举请求,向其他节点发送投票请求。
- 其他节点接收到投票请求后,检查自己的选举条件,如节点状态、投票状态等。
- 如果节点满足选举条件,它会将投票回复给发起选举的节点。
- 发起选举的节点会等待一定数量的投票回复,如果它获得了足够多的投票(超过半数),则成为新的主节点。
3. 数据复制和同步:主节点负责记录所有的写操作并将其顺序保存在Oplog(操作日志)中。从节点通过读取Oplog中的操作来进行数据的复制和同步。复制包括两个阶段:
- 初始同步(Initial Sync):当一个从节点加入复制集时,它会从主节点复制所有的数据。主节点会将数据以数据文件(Data File)的形式发送给从节点,从节点按照顺序写入到本地磁盘中。初始同步完成后,从节点与主节点的数据将保持同步。
- 增量同步(Incremental Sync):一旦从节点完成初始同步,它会通过读取Oplog中的写操作来实现与主节点的增量同步。主节点将新的写操作追加到Oplog中,从节点定期读取Oplog并将相应的操作应用到本地数据中,使得它与主节点的数据保持一致。
4. 自动故障检测和恢复:复制集支持自动故障检测和恢复功能。当主节点故障或不可用时,复制集会自动进行主节点选举,从而选择一个新的主节点来接管主节点的职责。一旦原先的主节点恢复,它会以从节点的身份重新加入复制集,同步最新的数据。
三、安装部署
下载连接
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.6.tgz
创建mongodb文件夹
mkdir /usr/local/mongodb
指定解压路径
tar xf mongodb-linux-x86_64-rhel70-4.0.6.tgz -C /usr/local/mongodb
创建软连接
ln -s /usr/local/mongodb/bin/* /bin/
创建数据目录
mkdir -p /data/mongodb1
创建日志目录
mkdir -p /data/logs/mongodb
创建日志文件
touch /data/logs/mongodb/mongodb1.log
编写启停脚本
vim /etc/init.d/mongodb
#!/bin/bash
INSTANCE=$1
ACTION=$2
case "$ACTION" in
'start')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf;;
'stop')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf --shutdown;;
'restart')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf --shutdown
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf;;
esac
给脚本赋予执行权限
chmod +x /etc/init.d/mongodb
编写配置文件
cd /usr/local/mongodb/
mkdir conf 创建配置文件目录
vim conf/mongodb1.conf 创建配置文件
port=27017 监听端口
dbpath=/data/mongodb1 指定数据目录
logpath=/data/logs/mongodb/mongodb1.log 指定日志文件路径
logappend=true 允许写入日志
fork=true 允许创建子进程
maxConns=5000 最大连接数
storageEngine=mmapv1 存储引擎
启动命令
/etc/init.d/mongodb mongodb1 start
停止命令
/etc/init.d/mongodb mongodb1 stop
四、创建复制集
vim /usr/local/mongodb/conf/mongodb1.conf
port=27017
dbpath=/data/mongodb1
logpath=/data/logs/mongodb/mongodb1.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
slowms=1 开启慢查询阈值
profile=1 开启查询分析
replSet=722207 集群名字 随意取
在复制四份配置文件只修改配置文件中的端口号,数据文件目录,日志文件路径
mkdir /data/mongodb{1..4} -p 创建四个数据文件目录
mkdir /data/logs/mongodb -p 创建日志文件目录
touch /data/logs/mongodb/mongodb{1..4}.log 创建四个日志文件
chmod 777 /data/logs/mongodb/mongodb* 赋予日志所有权限
启动四个mongodb
/etc/init.d/mongodb mongodb1 start
/etc/init.d/mongodb mongodb2 start
/etc/init.d/mongodb mongodb3 start
/etc/init.d/mongodb mongodb4 start
netstat -anputl | grep mongodb 查看端口
五、测试
进入mongodb查看
查看节点信息 rs.status()
配置复制集
cfg={"_id":"722207","members":[{"_id":0,"host":"127.0.0.1:27017"},{"_id":1,"host":"127.0.0.1:27018"},{"_id":2,"host":"127.0.0.1:27019"}]}
查看复制集状态 rs.status()
在这里需要注意两条
"health" : 1, //1为健康,0为宕机
"state" : 1, //1为主,2为从
添加27020节点 rs.add("127.0.0.1:27020")
关闭主节点27017主节点 模拟故障
进入27018查看信息
可以看到27020节点变成了主节点
六、复制集选举原理
1、复制的原理
MongoDB复制是基于操作日志oplog实现,oplog相当于mysql中的二进制日志,只记录数据发生的改变操作。
2、选举的原理
(1)节点类型:标准节点,被动节点,仲裁节点
①、只有标准节点可能被选举为活跃(主)节点,有选举权
②、被动节点有完整副本,不可能成为活跃节点,有选举权
③、仲裁节点不复制数据,不可能成为活跃节点,只有选举权
(2)标准节点与被动节点的区别
priority值高者是标准节点,低者则为被动节点
(3)选举规则
票数高者获胜,priority是优先权0-1000值,相当于额外增加0-1000的票数。
选举结果:票数高者获胜;若票数相同,数据新者获胜。
3、修改选举优先权(设置两个主节点、一个从节点、一个仲裁节点)
重新停启mongodb
mongo进入mongodb
设置27017、27018为主节点、27019为从节点、27020为仲裁节点
cfg={"_id":"722207","protocolVersion":1,"members":[{"_id":0,"host":"127.0.0.1:27017","priority":100}, {"_id":1,"host":"127.0.0.1:27018","priority":100}, {"_id":2,"host":"127.0.0.1:27019","priority":0}, {"_id":3,"host":"127.0.0.1:27020","arbiterOnly":true}]}
创建完成后查看集群状态如果出现了报错下面的错误需要删除27020这个节点
再重新添加
rs.remove('127.0.0.1:27020')删除这个节点
rs.add('127.0.0.1:27020')再次添加这个节点
再次进行节点设置
再次查看集群状态
查看主节点是谁
现在再来把27017给停掉
可以看到27018变成了主服务器
再次把27018停掉查看情况
可以看到27017成为了主服务器
角色设置生效后只有主节点才会成为主服务器、从服务器和仲裁服务不会参与主节点的竞选