横向扩容场景:副本集横向扩容,副本集与集群添加只读节点。几种场景下,数据库服务都是不会停止的,现有的节点添加逻辑是将新节点加入集群,然后通过逻辑同步方式进行数据同步。
当原集群数据量很大的情况下,会存在数据同步时间过长的问题。通过提升硬件性能(如CPU核数、内存、高IO磁盘)与优化网络当然可以提升数据同步效率,这个不在本文讨论的范围内。现仅考虑数据同步方案,梳理了下方几个数据同步方案。
方案一
1.使用快照或者备份文件:
主节点上创建一个数据快照备份。
将快照备份文件复制到新加入的从节点上。
在从节点上恢复数据,并启动 MongoDB 服务。在启动 MongoDB 服务时,指定 --replSet 参数加入到副本集中。
2.增量数据逻辑同步:
从节点逻辑同步主节点的数据,追写主节点新增的数据。
这个方案有以下的缺点:现在公有云上的存储系统不支持快照功能,故采用此方式会借助于文档数据库现有的热备份功能,通过createbackup命令将数据传输到新增的节点上,多节点时需并行执行,另外稳定性待进一步验证。
方案二
借用linux的rsync工具将主节点的数据目录同步至新增的从节点,rsync在复制文件时会比较源文件和目标文件的差异,然后只复制已经修改的部分。
rsync
rsync -avz --delete --bwlimit=<带宽限制> <主节点用户名>@<主节点IP地址>:/data/mongodb/ /data/mongodb/
该方案缺点:源端目标端机器都需要安装rsync工具
同步效率待测试。
方案三
1.添加节点时先创建一个备份,然后将备份文件恢复至新增节点,有点本末倒置了。
2.使用最新的一个成功的自动备份,可能存在找不到备份文件,自动备份配置关闭的问题。手动备份则可能存在数据过久的问题。
缺点:曲折且本末倒置。
方案四
停止hidden节点,将hidden节点的数据直接scp至新增节点,然后重启hidden节点与新增节点,并将新增节点加入副本集。
缺点:需要停止hidden节点,三节点副本集过程中再挂掉一个节点,会导致实例异常。不过重启后亦会恢复正常状态。