维护

节点数据同步

MongoDB 复制集中当从节点无法跟上主节点数据时,则该节点就需要节点数据同步,MongoDB 提供了两种数据同步的方式:

  • 初始化节点数据同步

  • 拷贝数据文件数据同步

初始化节点数据同步的优点是不需要集群停机,但会会一定程度上适度影响集群的正常读写,数据同步所花时间也稍微长于拷贝数据文件数据同步;而拷贝数据文件数据同步需要步骤较多,且需要停机窗口。本部分从三个方面说明节点数据同步,并给出具体执行步骤。

判读选择那种同步方式

判读选择那种同步方式分两个步骤:

  1. 查看主节点磁盘数据大小,计算出拷贝这些数据文件到从节点所花费的时间

  2. 查看主节点复制窗口,及预测未来一段时间(不停机执行初始化节点数据同步)主节点接收的写压力

  3. 如果第 2 步计算出来的复制窗口时间远大于第 1 步评估出来的拷贝数据所需的时间,且未来一段时间(不停机执行初始化节点数据同步)主节点接收的写压力较小,则选择初始化节点数据同步

  4. 与第 3 步相反,如果复制窗口时间小于拷贝数据所需的时间,或与拷贝数据所需的时间差不多,且主节点写压力较大,那么选择拷贝数据文件数据同步

在主节点上执行如下命令,计算复制窗口
var opEnd = db.getSiblingDB("local").oplog.rs.find().sort({$natural: -1}).limit(1).next().ts.getTime()
var opStart = db.getSiblingDB("local").oplog.rs.find().sort({$natural: 1}).limit(1).next().ts.getTime()
windowsecs =  (opEnd - opStart)
windowhrs = (windowsecs/3600).toFixed(2)
print(windowsecs + " secs (" + windowhrs + " hrs)");
Note
通常情况下,推荐优先使用初始化节点数据同步的方式。

初始化节点数据同步

1. 停止要同步的从节点,删除数据库目录(配置文件中的dbPath指向的目录)
# 请务必谨慎操作,可首先备份
rm -rf <dbpath>
2. 重建该目录并分配权限
mkdir <dbpath>
# 如果使用 mongod 用户启动 mongod,需要修改相应的 owner
chown mongod:mongod <dbpath>

3. 使用现有启动方式启动从节点

4. 如果需要将从节点添加到集群,主节点执行如下命令
rs.add("<从节点IP>:<端口>")

拷贝数据文件数据同步

1. 停止集群

2. 删除从节点(需要同步)数据库目录(配置文件中的dbPath指向的目录)
# 请务必谨慎操作,可首先备份
rm -rf <dbpath>
3. 执行拷贝数据文件同步
scp -r /data/db/* mongodb2.example.com:/data/db/
Note
数据拷贝可以基于其他方式或命令

4. 启动集群

修改默认 Oplog 大小

Oplog 大小会直接影响高可用数据复制的能力,在生产实践中我们通常需要调整 MongoDB Oplog 大小,从 MongoDB 3.6 开始可以通过管理命令 replSetResizeOplog 来动态调整 Oplog 大小,调整完成后不需要停机,不会有业务中断。

通常调整 Oplog 大小首先需要调整从节点 Oplog,然后再调整主节点。本部分说明如何调整一个复制集的默认 Oplog 大小。

1. 连接到复制集节点(先从节点,后主节点)
mongo --host mongodb0.example.com
2. 验证当前 Oplog 大小
use local
db.oplog.rs.stats().maxSize
3. 调整 Oplog 大小
db.adminCommand({replSetResizeOplog: 1, size: 30000})

3.4 及以前版本如何调整复制集 Oplog 的大小

在集群运行状态下如果需要调整 Oplog 的大小,在 MongoDB 3.4 版本下需要通过如下步骤完成:

  1. 选择一个从节点,执行 db.shutdownServer() 停止服务

  2. 修改 mongod 的配置文件将 replication 下的 replSetName 注释掉(为了可以单实例运行 mongod)

  3. 修改 net.port 配置(确保单实例运行 mongod 监听到不同的端口)

  4. 基于修改完的配置文件单实例运行 mongod

  5. 备份 oplog.rs 集合(例如执行 mongodump --db local --collection 'oplog.rs' --port 37017)

  6. 将当前 oplog.rs 中的最后一条数据备份(db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() ))

  7. 删除 oplog.rs 集合

  8. 创建一个新的 oplog.rs 集合,并指定大小(db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )),50 * 1024 * 1024 * 1024 的大小为 50 GB

  9. 将备份集合中的最后一条数据添加到新创建的 oplog.rs 集合中(db.oplog.rs.save( db.temp.findOne() ))

  10. 停止单实例运行 mongod

  11. 对照第 2 步,将注释掉的 replSetName 取消,确保和原始配置一致

  12. 对照第 3 步,将 net.port 配置为和初始端口一致

  13. 基于更新后的配置文件启动 mongod

  14. 确保 mongod 启动完成加入分片复制集后在主节点执行 rs.stepDown()

  15. 重复步骤 1 - 14,确保所有节点都重新设定 Oplog 完成。

相关命令
db.shutdownServer()

mongod --config mongod.conf

mongodump --db local --collection 'oplog.rs' --port 27005 -o oplog.rs.dump

use local
db.temp.drop()
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
db.temp.find()

db.oplog.rs.drop()
db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )
db.oplog.rs.save( db.temp.findOne() )
db.oplog.rs.find()
db.temp.drop()

use admin
db.shutdownServer()

常见不停机维护步骤

MongoDB 复制集一主多从架构,维护可以做到不停机,具体维护,例如升级可以先在从节点上进行,让所有从节点进行完成后强制进行一次选举,让未进行维护的主节点变成从节点,然后进行维护操作。本部分说明常见不停机维护的一般步骤。

1. 停止一个从节点
use admin
db.shutdownServer()
2. 以单点方式启动 MongoDB
// 1. 修改启动配置文件
#replication:
#   replSetName: "rs0"
net:
   bindIp: 0.0.0.0
   port: 27018
setParameter:
   skipShardingConfigurationChecks: true
   disableLogicalSessionCacheRefresh: true

// 2. 单实例启动
sudo mongod --config mongod-m.conf
3. 执行维护,也可以本地连接
mongo --port 27018
4. 维护结束后,重启从节点
use admin
db.shutdownServer()

sudo mongod --config mongod.conf
5. 主节点执行维护操作
rs.stepDown()

TODO

**
**
**
**
**
**
**
**
**
**
**
**
**
**
**

results matching ""

    No results matching ""