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)");
维护
节点数据同步
MongoDB 复制集中当从节点无法跟上主节点数据时,则该节点就需要节点数据同步,MongoDB 提供了两种数据同步的方式:
-
初始化节点数据同步
-
拷贝数据文件数据同步
初始化节点数据同步的优点是不需要集群停机,但会会一定程度上适度影响集群的正常读写,数据同步所花时间也稍微长于拷贝数据文件数据同步;而拷贝数据文件数据同步需要步骤较多,且需要停机窗口。本部分从三个方面说明节点数据同步,并给出具体执行步骤。
判读选择那种同步方式
判读选择那种同步方式分两个步骤:
-
查看主节点磁盘数据大小,计算出拷贝这些数据文件到从节点所花费的时间
-
查看主节点复制窗口,及预测未来一段时间(不停机执行初始化节点数据同步)主节点接收的写压力
-
如果第 2 步计算出来的复制窗口时间远大于第 1 步评估出来的拷贝数据所需的时间,且未来一段时间(不停机执行初始化节点数据同步)主节点接收的写压力较小,则选择初始化节点数据同步
-
与第 3 步相反,如果复制窗口时间小于拷贝数据所需的时间,或与拷贝数据所需的时间差不多,且主节点写压力较大,那么选择拷贝数据文件数据同步
Note
|
通常情况下,推荐优先使用初始化节点数据同步的方式。 |
初始化节点数据同步
# 请务必谨慎操作,可首先备份
rm -rf <dbpath>
mkdir <dbpath>
# 如果使用 mongod 用户启动 mongod,需要修改相应的 owner
chown mongod:mongod <dbpath>
3. 使用现有启动方式启动从节点
rs.add("<从节点IP>:<端口>")
拷贝数据文件数据同步
1. 停止集群
# 请务必谨慎操作,可首先备份
rm -rf <dbpath>
scp -r /data/db/* mongodb2.example.com:/data/db/
Note
|
数据拷贝可以基于其他方式或命令 |
4. 启动集群
修改默认 Oplog 大小
Oplog 大小会直接影响高可用数据复制的能力,在生产实践中我们通常需要调整 MongoDB Oplog 大小,从 MongoDB 3.6 开始可以通过管理命令 replSetResizeOplog
来动态调整 Oplog 大小,调整完成后不需要停机,不会有业务中断。
通常调整 Oplog 大小首先需要调整从节点 Oplog,然后再调整主节点。本部分说明如何调整一个复制集的默认 Oplog 大小。
mongo --host mongodb0.example.com
use local
db.oplog.rs.stats().maxSize
db.adminCommand({replSetResizeOplog: 1, size: 30000})
3.4 及以前版本如何调整复制集 Oplog 的大小
在集群运行状态下如果需要调整 Oplog 的大小,在 MongoDB 3.4 版本下需要通过如下步骤完成:
-
选择一个从节点,执行 db.shutdownServer() 停止服务
-
修改 mongod 的配置文件将 replication 下的 replSetName 注释掉(为了可以单实例运行 mongod)
-
修改 net.port 配置(确保单实例运行 mongod 监听到不同的端口)
-
基于修改完的配置文件单实例运行 mongod
-
备份 oplog.rs 集合(例如执行 mongodump --db local --collection 'oplog.rs' --port 37017)
-
将当前 oplog.rs 中的最后一条数据备份(db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() ))
-
删除 oplog.rs 集合
-
创建一个新的 oplog.rs 集合,并指定大小(db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )),50 * 1024 * 1024 * 1024 的大小为 50 GB
-
将备份集合中的最后一条数据添加到新创建的 oplog.rs 集合中(db.oplog.rs.save( db.temp.findOne() ))
-
停止单实例运行 mongod
-
对照第 2 步,将注释掉的 replSetName 取消,确保和原始配置一致
-
对照第 3 步,将 net.port 配置为和初始端口一致
-
基于更新后的配置文件启动 mongod
-
确保 mongod 启动完成加入分片复制集后在主节点执行 rs.stepDown()
-
重复步骤 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 复制集一主多从架构,维护可以做到不停机,具体维护,例如升级可以先在从节点上进行,让所有从节点进行完成后强制进行一次选举,让未进行维护的主节点变成从节点,然后进行维护操作。本部分说明常见不停机维护的一般步骤。
use admin
db.shutdownServer()
// 1. 修改启动配置文件
#replication:
# replSetName: "rs0"
net:
bindIp: 0.0.0.0
port: 27018
setParameter:
skipShardingConfigurationChecks: true
disableLogicalSessionCacheRefresh: true
// 2. 单实例启动
sudo mongod --config mongod-m.conf
mongo --port 27018
use admin
db.shutdownServer()
sudo mongod --config mongod.conf
rs.stepDown()
TODO