小白到运维工程师自学之路 第四十六集 (mongodb复制集)

一、概述

       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成为了主服务器

角色设置生效后只有主节点才会成为主服务器、从服务器和仲裁服务不会参与主节点的竞选

 

以上就是mongodb复制集的配置

如有错误欢迎各位大佬批评指正,我们共同进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值