跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何提升MongoDB分片集群的运维自动化水平_使用Ansible或Operator自动化部署

Ansible部署MongoDB分片集群时,hosts变量必须严格按角色隔离:同一IP若承担shard1、config_server、mongos多个角色,须配置唯一端口(如27001/27019/27017)和独立based_dir(/data/shard1、/data/configs、/data/mongos),仲裁节点需在mongod.conf中显式设arbiterOnly: true,否则复制集初始化静默失败。 Ansible部署分片集群时,hosts变量怎么组织才不翻车 Ansible不是靠“写对playbook”就能跑通分片集群的,关键在
hosts
文件里角色和端口的映射逻辑是否闭环。常见错误是把
shard1
config_server
mongos
混在同一台机器上却没隔离端口或数据目录,导致启动冲突或配置覆盖。 必须明确三点:
shardX_port
config_port
mongos_port
要全局唯一,比如
shard1_port=27001
config_port=27019
mongos_port=27017
同一IP上若同时承担多个角色(如某节点既是
shard1
主又是
config_server
),必须用不同
based_dir
子路径区分数据:/data/shard1、/data/configs、/data/mongos 仲裁节点(
arbiter
)不能参与数据读写,但
ansible
模板里仍需为其生成
mongod.conf
,且
replSet
配置中必须显式标注
arbiterOnly: true
漏掉任意一条,
service mongod start
会静默失败,日志里只报
Failed to start mongod.service
,实际卡在复制集初始化阶段。 Kubernetes Operator扩容分片,为什么改
spec.members
没反应 Operator对
topology: sharding
topology: replicaset
的处理逻辑完全不同:
spec.members
只在后者生效;前者扩容必须操作
spec.shards
数组。 直接编辑CR把
replicas: 3
改成
4
完全无效——Operator压根不解析这个字段。它只认
spec.shards
长度,每个数组元素代表一个独立副本集。 正确做法是: 向
spec.shards
追加新对象,例如新增
- name: shard4 members: 3
确保新shard的
storageClassName
resources
nodeAffinity
与现有shard一致,否则Pod卡在
Pending
Operator拉起Pod后,会调用
sh.addShard("shard4/...")
,但这一步依赖Ops Manager集成;纯Operator(无OM/CM)不会自动注册分片,得手动连
mongos
执行 不检查Operator日志里的
Adding shard
sh.addShard failed
提示,很容易以为扩容成功,其实数据根本没路由过去。 go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 缩容分片前,Operator不会帮你做
sh.removeShard()
Operator从不主动触发
sh.removeShard()
,这是人为强干预操作。直接删掉CR里的shard条目,Operator会立刻重建它——因为它发现“声明状态”和“实际集群状态”不一致,试图修复。 缩容必须按顺序人工完成: 先用
mongos
连接,运行
sh.stopBalancer()
停掉均衡器 反复执行
sh.status()
,确认目标shard的
chunks
字段为
0
(说明所有chunk已迁出) 手动执行
sh.removeShard("shardX")
,等返回
"msg" : "removeshard completed successfully"
最后才删除CR中对应shard,再
kubectl apply
跳过chunk迁移检查就删CR,Operator会不断重试拉起已注销的shard,Pod反复创建又崩溃,日志刷屏
failed to join replica set
。 备份与监控脚本嵌入Ansible时,权限和路径容易被忽略 Ansible默认以
root
执行,但
mongodump
若连带认证参数(如
--username
)一起写进
shell
模块,密码明文暴露在
ps aux
里;而
crontab
任务若用普通用户运行,又常因
/home/mongodb/.bashrc
未加载导致
mongodump
命令找不到。 稳妥方案是: 用
copy
模块下发
.mongorc.js
client.pem
/etc/mongod/
,让
mongodump
通过
--sslPEMKeyFile
--authenticationDatabase
隐式认证
crontab
条目统一用
root
用户,且
PATH
显式设为
/usr/bin:/bin:/usr/local/bin
,避免依赖shell环境变量 监控脚本(如
mongostat
采集)必须加
timeout 30
,否则网络抖动时
service
模块会卡死整个playbook 最隐蔽的问题是:Ansible的
shell
模块默认不继承
~/.bashrc
,哪怕你
user: mongodb
which mongodump
也可能返回空——得用
executable: /bin/bash
显式指定解释器。

相关文章