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