已搭建MongoDB分片集群后如何配置复制集实现高可用
MongoDB分片集群复制集高可用配置方案
核心疑问解答
你不能只给每个现有服务器加1个secondary节点就完成搭建,MongoDB复制集依赖多数派节点存活才能完成主节点选举、提供写入服务,偶数节点集群存在脑裂风险,单节点故障就会导致集群不可用。
现有架构适配调整说明
你当前的部署架构需要做以下调整即可满足高可用要求:
- mongos实例本身是无状态服务,你已经跨2个数据中心部署2个实例,只要前端做好请求负载均衡,这一层已经满足高可用要求,不需要配置复制集
- 配置服务器复制集(CSRS)官方要求必须为奇数个节点,最低要求3个数据承载节点(不允许使用仲裁节点),你现有2个配置服务器,需要新增1个配置服务器节点组成3节点复制集
- 每个分片的复制集同样需要奇数个节点,你现有2个分片节点,新增1个secondary节点组成3节点复制集即可满足基础高可用要求,跨DC部署的情况下可以给同业务主可用区的节点设置更高的选举优先级,避免主节点跨DC切换导致访问延迟升高
具体操作步骤
1. 前置准备
所有新增节点完成以下配置:
- 安装和现有节点大版本完全一致的MongoDB
- 配置和集群统一的密钥文件,开启身份验证
- 确保跨DC私有网络中所有节点的MongoDB服务端口(默认27017)互通
2. 配置服务器复制集搭建
任选一个现有配置节点执行以下操作:
- 以复制集模式重启该节点,配置文件中添加
replication.replSetName参数指定配置服务器复制集名称,比如cfg_rs - 进入mongo shell执行初始化命令:
rs.initiate({ _id: "cfg_rs", configsvr: true, members: [ {_id: 0, host: "现有配置节点1地址:端口"}, {_id: 1, host: "现有配置节点2地址:端口"}, {_id: 2, host: "新增配置节点地址:端口"} ] })
- 执行
rs.status()确认所有节点状态正常,1个primary、2个secondary
3. 分片复制集搭建
对每个分片分别执行以下操作:
- 以复制集模式重启现有分片节点,配置文件中添加
replication.replSetName参数指定当前分片的复制集名称,比如shard1_rs - 进入主分片节点的mongo shell执行初始化命令:
rs.initiate({ _id: "shard1_rs", members: [ {_id: 0, host: "现有分片节点1地址:端口", priority: 2}, // 主可用区节点优先级更高 {_id: 1, host: "现有分片节点2地址:端口", priority: 1}, {_id: 2, host: "新增分片节点地址:端口", priority: 1} ] })
- 执行
rs.status()确认所有节点状态正常,数据同步无异常
4. 更新mongos配置
修改所有mongos实例的配置文件:
- 将
sharding.configDB参数修改为配置服务器复制集地址格式,比如cfg_rs/配置节点1地址:端口,配置节点2地址:端口,配置节点3地址:端口 - 滚动重启所有mongos实例,重启后验证分片数据读写正常
5. 功能验证
- 手动终止任意1个配置节点/分片节点进程,验证集群可以正常选举新主,读写请求不受影响
- 验证跨DC节点数据同步延迟符合业务要求
内容的提问来源于stack exchange,提问作者olli
相关产品推荐
相关产品推荐

