上一篇文章,已经完成一个单节点的复制集,现在我们向该复制集中添加新节点。
1,启动新节点MongoDB服务
以相同的配置文件启动新节点上的MongoDB。
启动配置文件为:
systemLog:
destination: file
path: "/mongodb-3.2.8/logs/mongodb.log"
logAppend: true
storage:
dbPath: "/mongodb-3.2.8/data"
journal:
enabled: true
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27017
setParameter:
enableLocalhostAuthBypass: true
replication:
replSetName: "sprintrs1"
security:
clusterAuthMode: keyFile
keyFile: "/mongodb-3.2.8/conf/.keyFile"
注意replication中的replSetName与primary节点一致。
启动MongoDB服务
bin/mongod -f conf/mongodb.conf
2,添加节点
在primary节点上,登录mongo shell,执行命令:
rs.add({_id: 1, host: "192.168.1.250:27017", priority: 10})
3,日志分析
将一个新节点加入复制集中,会发生什么我们看下日志。
3.1 本地MongoDB服务的初始化
下图红线以上部分,为本地MongoDB服务的初始化操作。
3.2 执行add操作
接收到primary发过来的复制集config,确定本机mongodb在配置文件中,并将自己的状态转变为STARTUP2.
3.3 initial sync操作
新加入复制集的节点,进行initail sync操作,
删除所有的database(出了local db),并从primary节点复制所有的database。
3.4 执行sync
逐个数据库进行同步。
3.5 initial sync done,并执行选举
由于此节点的priority为10,所以此节点转换为primary。
到此往复制集中添加节点就完成了。
4总结
4.1 复制集状态
复制集中新加节点时,涉及状态startup2:表示正在进行init sync。
关于复制集节点的各个状态详细介绍,请参见参见:https://blog.csdn.net/wxlkeepmoving/article/details/124865825
4.2复制集新加节点的两个阶段
进行数据同步需要两个阶段:
- Initial Sync
从复制集的一个节点拷贝所有数据,到新节点。 - Replication
Initial sync完成后,Secondary 节点持续从source节点读取oplog,并进行恢复。
4.3 local database
-
每个mongod实例都有一个local database;
-
存储的数据为复制集相关的配置相关数据和实例特定的数据;
-
local database不参与复制集数据的复制。