MongoDB分片集群扩容与缩容

MongoDB开启分片以后,有两种扩容(缩容)方式。一种是纵向扩容,在现有的分片副本集上添加新的机器节点。这种只需要在副本集内部进行数据复制。另一种是横向扩容是扩展分片数量,需要创建新的副本集并创建新分片,随后要进行数据自动分割迁移。

纵向扩容

纵向扩容为了保证一切顺利,我从之前的分片副本集中直接拷贝了配置文件到新的节点上。随后在新节点上启动mongodb:

./mongod --config ../conf/mongo-shard1.conf
./mongod --config ../conf/mongo-shard2.conf
./mongod --config ../conf/mongo-shard3.conf

向现有副本集中增加节点

首先要确保现有副本集中的节点能够和新建节点网络保持畅通,确保在每一个节点上都更新了hosts文件。随后找到当前副本集的主节点,并在主节点上新增节点。建议将priority及votes设为0,即不会选为主(priority默认1),也没有投票特性(votes默认1,有投票权)。

rs.isMaster()
rs.add( { host: "mgc-4:27017", priority: 0, votes: 0 } )
rs.add( { host: "mgc-4:27018", priority: 0, votes: 0 } )
rs.add( { host: "mgc-4:27019", priority: 0, votes: 0 } )
rs.status()

查看副本集的状态,新的副本集节点已经加入。刚开始新节点的statestr为STARTUP(刚加入到复制集中,配置还未加载)。过一会儿会变为STARTUP2(配置已加载完,初始化状态)。新加的副本集节点不用设置用户,会从主节点同步。根据数据量的大小,这个状态可能会保持很长时间。通过观测数据文件夹中的文件更新情况,可以判断同步状态。

设置新节点的优先级和Vote权限

上节中我们添加新节点默认将priority及votes设为0。数据同步完成后,再把这两个属性设置回来即可。

var cfg = rs.conf()
//需要知道新节点在members中的位置
cfg.members[3].priority = 1
cfg.members[3].votes = 1
rs.reconfig(cfg)

新节点加入副本集完成以后,就会自动添加到分片中,如图:

参考:https://cloud.tencent.com/developer/article/1920982

纵向缩容

纵向缩容相对简单,但是在实际操作中也可能出现问题。比如上例中MongoDB分片集群分了三个片,每个片有6台副本集服务器。现在计划把mgc-1,mgc-2和mgc-3删除。大概的步骤如下:

  1. 登录每个节点,使用db.shutdownServer()关闭数据库;先关闭从节点。这里要非常注意,如果要删除的节点是主节点(primary),那么在关闭主节点以后要观察整个副本集有没有重新选举主节点。这个非常重要,在实践过程中就发现关闭了主节点,但是剩余的节点没有选出新的主节点,导致集群不可用。可能存在“unable to read primary for set shard1”这样的错误,或者“mongodb could not find host matching read preference { mode: “primary” } for set”这样的问题。如果没有选择新的主节点,那么再把刚才关闭的主节点启动起来。当选出了新的主节点,就可以安全进入下一步。
  2. 到新的主节点上,使用rs.remove(“mgc-1:27017”)删除节点。
  3. 如果mongos里面配置的config节点也要删除,注意需要重新配置mongos并重启。
Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。