- 目的
- 原理
- 步骤
- 1. 部署新的hidden节点
- 2. 添加hidden节点
- 3. 等待hidden节点完成initial sync(此方法耗时很长,但可以获得一份压缩后的数据)
- 4. 检查集群状态,确认一切正常,继续
- 5. 关闭hidden节点,检查集群状态,确认一切正常,继续
- 6. 以standalone方式启动hidden节点
- 7. 登陆hidden节点,执行创建索引动作
- 8. 待创建完毕,关闭hidden节点,以副本集方式启动
- 9. 检查集群状态和索引状态,确认一切正常,继续
- 10. 将hidden节点的新数据,逐个拷贝到集群中的其他secondary节点,并使用新数据重启mongod。对于primary节点,先使用rs.stepdown(),待新的primary节点产生后再进行重启。
- 11. 移除hidden节点
- 12. 清理线上关于hidden节点的hosts、iptables配置
- 回滚
目的
阐述一种风险较低,耗时较少的MongodDB创建大量索引的方案。
适用于 MongodDB2.x副本集。
原理
MongodDB2.2前台创建索引命令会阻塞实例的复制和读写操作,虽然可以通过指定background选项来避免,但是从节点依然是前台创建索引,而且在大数据集上建立索引耗时很长。
官方建议将副本集的节点摘下之后进行创建索引操作,然后再加入集群。
通过initial sync或者复制集群其他节点的数据在副本集中临时添加hidden节点,摘下hidden节点创建索引,然后将hidden节点的数据依次拷贝到集群中的其他节点,实现整个集群的索引创建。
参考资料:
https://docs.mongodb.org/v2.2/core/indexes/#index-creation-background
https://docs.mongodb.org/v2.2/administration/indexes/#index-building-replica-sets
步骤
- 配置hosts、iptables,保证新节点可以顺利与集群其他节点通信
- 配置mongodb并启动,配置文件参考集群其他节点
登陆到集群的primary,执行
1
rs.add({_id: 3, host: "hidden.Test.mongodb:6681", priority: 0, hidden: true})
检查集群状态
1
2rs.conf()
rs.status()
4. 检查集群状态,确认一切正常,继续
1 | rs.conf() |
1 | rs.conf() |
9. 检查集群状态和索引状态,确认一切正常,继续
1 | rs.conf() |
- 关闭hidden节点的mongod
- 登陆primary节点执行
1
rs.remove("hidden.Test.mongodb:6681")
至此,完成整个集群的索引创建
回滚
由于原始数据会进行备份,所以回滚只需替换回原来的数据启动。