mongodb 7、基于副本集的mongodb高可用原理,搭建及验证

本文详细介绍了MongoDB的副本集(Replica Set)模式,包括其基础、原理、多活架构和仲裁机制。重点讲解了如何通过配置实现高可用,包括初始化副本集、添加成员、主备切换验证以及在Puppet中的实现。还探讨了副本集为何通常是奇数个节点,以及心跳机制和同步策略。
摘要由CSDN通过智能技术生成

1 参考文档地址


http://www.mongoing.com/
原理
http://www.mongoing.com/archives/5200
mongodb高可用配置:
对了解整体体系有较大帮助
https://blog.csdn.net/doitsjz/article/details/72862026
实战配置:
https://www.cnblogs.com/aoldman/p/4191804.html
副本集简介:
https://www.cnblogs.com/aoldman/p/4191810.html
副本集原理:
https://www.cnblogs.com/aoldman/p/4191816.html
k8s中部署高可用mongodb:
http://www.dockerinfo.net/1015.html
书籍:
openstack高可用集群(上下册)
社区openstack高可用:
https://docs.openstack.org/ha-guide/

2 mongodb高可用方案概览


方案1: 主从模式
含义: master-slave模式, 主结点可读可写,从结点只读不可写
缺点: master异常后不能自动恢复

方案2: 副本集模式
含义: replica set模式,副本集维护了共同数据集的mongodb的进程实例
优点: primary结点宕机后,自动发生主备切换;

推荐使用副本集模式。


3 mongodb的Replica Set模式

 

3.1 副本集模式基础


含义: replica set模式,副本集维护了共同数据集的mongodb的进程实例
组成: 多个数据维护结点和一个可选的仲裁结点。
数据维护结点中有一个primary结点,其余都是secondary结点。
优点: primary结点宕机后,自动发生主备切换;
副本集: 解决单副本容错性问题
 


3.2 副本集模式原理


primary结点进行写操作,记录到oplog日志,secondary结点读取primary的oplog
日志并在本地重现oplog中记录的操作。
若primary宕机,则从剩余secondary中选举出新的primary结点。
特点: secondary不能被访问,因为secondary和primary结点可能存在时间差。
仲裁结点:  可选,在结点数目为偶数时起到仲裁作用,不处理读写请求。但不能部署在primary结点和secondary结点上。

3.3 多活架构图


              应用
            读|  写|
            primary
        副本|    心跳|    副本|    心跳|
        secondary<--->secondary
解释:
应用的读写请求都发送给primary结点,操作记录到oplog中后,各个secondary
结点复制primary结点的oplog日志,并在本地重现操作。
primary结点与各个secondary结点有心跳检测机制。

3.4 仲裁机制


当各个secondary与primary结点之间的通信延迟超过10秒,则会从剩余secondary结点中选举出
一个primary结点,成为primary结点的候选secondary结点需要获得超过一半的得票。

3.5 Replicat set部署形式


1) 1个primary结点和2个secondary结点
或者
2) 1个primary结点,1个secondary结点,一个仲裁结点
建议奇数个replica set结点,如果是偶数个,需要加上一个仲裁结点。

部署细节:
可将secondary结点配置为下面三种类型结点:
1) priority = 0
作用: 不选举,只备份
2) priority = 0, hidden = true
作用: 不选举,不可读,对客户端隐藏, 只备份
3) priority = 0, hidden = true, slaveDelay = xx
作用: 不选举,不可读,对客户端隐藏,保留历史镜像数据供恢复

3.6 多活指标


FT: 集群能够承受的故障结点个数,超过该值,集群不能正常工作。
mongodb中replicat set的FT > Replica Set结点个数 * 0.5
结点数目与FT的关系
Replica Set成员个数        选举需要的成员数目    FT大小
3                2            1
4                3            1
5                3            2
6                4            2

3.7 mongodb ha部署步骤


步骤1: 在各个结点上安装mongodb,在各个结点上启动mongodb服务
具体: 
先安装mongodb,
然后通过如下命令启动mongodb服务:
systemctl enable mongod
systemctl start mongod
systemctl status mongod
方式1: 命令行修改
通过replSet参数指定要创建的Replica Set名字,下面是设置该名字为ceilometer
mongod --replSet=ceilometer
方式2: 配置文件修改
每次mongodb启动,就会自动获取配置中replSet的值,保证每次启动都设置相同的replSet名称
echo "replSet=ceilometer" >> /etc/MongoDB.conf

步骤2: 选择一个mongodb所在结点,指定replica set名称并初始化
注意: Replica Set集群初始化只需要在某个成员结点上操作,只需要在结点的命令行(
不是mongodb命令行)中执行:
rs.initiate()
验证初始化Replica Set成功:
进入mongodb中,
执行: 
rs.conf()
样例输出结果如下:
ceilometer:PRIMARY> rs.conf()
{
    "_id" : "ceilometer",
    "version" : 5,
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.10.3:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : 0,
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "192.168.10.4:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : 0,
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "192.168.10.7:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : 0,
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatTimeoutSecs" : 10,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        }
    }
}


执行:
rs.status()
样例输出结果如下:
ceilometer:PRIMARY> rs.status()
{
    "set" : "ceilometer",
    "date" : ISODate("2019-04-26T12:15:34.346Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.10.3:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 364552,
            "optime" : Timestamp(1556280687, 51),
            "optimeDate" : ISODate("2019-04-26T12:11:27Z"),
            "lastHeartbeat" : ISODate("2019-04-26T12:15:33.354Z"),
            "lastHeartbeatRecv" : ISODate("2019-04-26T12:15:34.183Z"),
            "pingMs" : 1,
            "syncingTo" : "192.168.10.7:27017",
            "configVersion" : 5
        },
        {
            "_id" : 1,
            "name" : "192.168.10.4:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 364524,
            "optime" : Timestamp(1556280687, 51),
            "optimeDate" : ISODate("2019-04-26T12:11:27Z"),
            "lastHeartbeat" : ISODate("2019-04-26T12:15:32.992Z"),
            "lastHeartbeatRecv" : ISODate("2019-04-26T12:15:34.099Z"),
            "pingMs" : 0,
            "syncingTo" : "192.168.10.7:27017",
            "configVersion" : 5
        },
        {
            "_id" : 2,
            "name" : "192.168.10.7:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 364564,
            "optime" : Timestamp(1556280687, 51),
            "optimeDate" : ISODate("2019-04-26T12:11:27Z"),
            "electionTime" : Timestamp(1556269695, 1),
            "electionDate" : ISODate("2019-04-26T09:08:15Z"),
            "configVersion" : 5,
            "self" : true
        }
    ],
    "ok" : 1
}


步骤3: 将剩余所有mongodb所在结点加入到replica set中
具体: 在步骤2的mongodb结点(也就是primary结点,只有primary
结点才可以添加结点)中,先进入mongodb的shell,
然后通过如下命令加入新的mongodb结点:
rs.add('192.168.10.3:27017')
注意:
请将上述:
192.168.10.3替换为待添加到Replica Set的mongodb所在结点的ip

步骤4: 验证Replica Set状态
在mongodb命令行中执行:
rs.conf()
查看最终配置情况

执行:
rs.status()
来查看集群状态

如果所有待添加的mongodb所在结点已经全部添加到Replica Set集群中,
则表明此时Replica Set状态正确。


步骤5: 验证Replica Set集群功能正常
验证主备切换功能正常,验证脑裂是否正常


4 puppet中如何实现mongodb高可用


4.0 项目地址


https://wiki.openstack.org/wiki/Puppet-ope

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值