Replica Sets 复制集搭建
MongoDB 有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。
Master-Slaver 是一种主从复制的模式,目前已经不推荐使用
ReplicaSet模式取代了Master-Slaver模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移。
MongoDB复制集主要用于实现服务的高可用性,与Redis中的哨兵模式相似。它的核心作用是数据的备份和故障转移。
Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
本文档主要内容为复制集的搭建和操作
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag 并追加??件中 /etc/rc.local [root@localhost ~]# vim /etc/rc.d/rc.local 增加下列内容: if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi 保存并退出,然后给rc.local添加可执行权限。 [root@localhost ~]# chmod +x /etc/rc.d/rc.local 最后重启。 |
使用普通用户启动命令之前添加 sudo -u mongo numactl --interleave=all
修改内核参数
echo 0 > /proc/sys/vm/zone_reclaim_mode echo vm.zone_reclaim_mode = 0 >> /etc/sysctl.conf |
临时修改
sysctl -w vm.swappiness=0 永久修改 vim /etc/sysctl.conf vm.swappiness = 0 |
vim /etc/security/limits.conf mongo soft nofile 65535 mongo hard nofile 65535 mongo soft nproc 65535 mongo hard nproc 65535 mongo soft stack 10240 mongo hards stack 10240 |
节点名 | IP | 端口 | 配置文件 |
M1 | 127.0.0.1 | 27018 | /u01/mongodb/node1/conf/mongodb.conf |
S1 | 127.0.0.1 | 27019 | /u01/mongodb/node2/conf/mongodb.conf |
S2 | 127.0.0.1 | 27020 | /u01/mongodb/node3/conf/mongodb.conf |
cd /u01 tar -zxvf? mongodb-linux-x86_64-rhel70-4.4.26.tgz |
移动目录
mv mongodb-linux-x86_64-rhel70-4.4.26.tgz mongodb |
创建目录
mkdir? key? node1 cd /u01/mongodb/node1 mkdir data log conf cd /u01/mongodb cp -r node1 node2 cp -r node2 node3 |
创建启动账号
groupadd mongo useradd -M -g mongo mongo |
生成keyfile,如果部署到不同主机,需要拷贝到其他主机上
openssl rand -base64 159 >? /u01/mongodb/key/mongo_cluster.key chmod 600 /u01/mongodb/key/mongo_cluster.key |
修改目录权限
chown -R mongo:mongo /u01/mongodb |
systemLog: ? destination: file ? path: /u01/mongodb/node1/log/mongod.log # log path ? logAppend: true ?? logRotate:?reopen ?? destination:?file ?? timeStampFormat:?"iso8601-local" storage: ? dbPath: /u01/mongodb/node1/data # data directory ? journal: #是否启用journal日志 enabled: true directoryPerDB:?true syncPeriodSecs:?60 ? engine: wiredTiger #存储引擎 wiredTiger: engineConfig: cacheSizeGB:?10 journalCompressor:?"snappy" directoryForIndexes:?false collectionConfig: blockCompressor:?"snappy" indexConfig: prefixCompression:?true net: ?port: 27018 # port ??bindIpAll:?true ??maxIncomingConnections:?50000 ??wireObjectCheck:?true ??ipv6:?false ??unixDomainSocket: ??????enabled:?true ??????pathPrefix:?"/u01/mongodb/node1/tmp" ??????filePermissions:?0700 processManagement: ?fork: true ?pidFilePath: /u01/mongodb/node1/node1.pid security: ?keyFile: "/u01/mongodb/key/mongo_cluster.key" ?clusterAuthMode: "keyFile" ?authorization: "enabled" ?javascriptEnabled: true operationProfiling: ????slowOpThresholdMs:?100 ????mode:?slowOp replication: ?oplogSizeMB: 20480 ?replSetName: "repl_cluster" ?enableMajorityReadConcern: false |
3个节点配置文件一致,根据需要更改相应值即可
sudo -u mongo numactl --interleave=all mongod -f? /u01/mongodb/node1/conf/mongodb.conf sudo -u mongo numactl --interleave=all mongod -f? /u01/mongodb/node2/conf/mongodb.conf sudo -u mongo numactl --interleave=all mongod -f? /u01/mongodb/node3/conf/mongodb.conf |
use admin cfg={_id:"repl_cluster", members:[{_id:0,host:"localhost:27018",priority:1}, {_id:1,host:"localhost:27019"}, {_id:2,host:"localhost:27020"}] } rs.initiate(cfg); |
repl_cluster:PRIMARY> rs.status() { ? ? ? ? "set" : "repl_cluster", ? ? ? ? "date" : ISODate("2024-01-05T06:35:09.080Z"), ? ? ? ? "myState" : 1, ? ? ? ? "term" : NumberLong(2), ? ? ? ? "syncSourceHost" : "", ? ? ? ? "syncSourceId" : -1, ? ? ? ? "heartbeatIntervalMillis" : NumberLong(2000), ? ? ? ? "majorityVoteCount" : 2, ? ? ? ? "writeMajorityCount" : 2, ? ? ? ? "votingMembersCount" : 3, ? ? ? ? "writableVotingMembersCount" : 3, ? ? ? ? "members" : [ ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27018", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "PRIMARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 78682, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T06:35:04Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : -1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "electionTime" : Timestamp(1704357871, 1), ? ? ? ? ? ? ? ? ? ? ? ? "electionDate" : ISODate("2024-01-04T08:44:31Z"), ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "self" : true, ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "" ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27019", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 78647, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T06:35:04Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T06:35:04Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T06:35:07.970Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T06:35:08.967Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "localhost:27020", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 2 ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27020", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 78642, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T06:35:04Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T06:35:04Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:35:04.073Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T06:35:07.971Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T06:35:08.465Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "localhost:27018", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 2 ? ? ? ? ? ? ? ? } ? ? ? ? ], ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704436504, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"v2qzTOmGVCC4cSO2EF38WQ3TGLM="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704436504, 1) } |
查看Replica Sets 状态
repl_cluster:PRIMARY> rs.isMaster() { ? ? ? ? "topologyVersion" : { ? ? ? ? ? ? ? ? "processId" : ObjectId("65966fc3b2be80d8248ff95e"), ? ? ? ? ? ? ? ? "counter" : NumberLong(6) ? ? ? ? }, ? ? ? ? "hosts" : [ ? ? ? ? ? ? ? ? "localhost:27018", ? ? ? ? ? ? ? ? "localhost:27019", ? ? ? ? ? ? ? ? "localhost:27020" ? ? ? ? ], ? ? ? ? "setName" : "repl_cluster", ? ? ? ? "setVersion" : 1, ? ? ? ? "ismaster" : true, ? ? ? ? "secondary" : false, ? ? ? ? "primary" : "localhost:27018", ? ? ? ? "me" : "localhost:27018", ? ? ? ? "electionId" : ObjectId("7fffffff0000000000000002"), ? ? ? ? "lastWrite" : { ? ? ? ? ? ? ? ? "opTime" : { ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436574, 1), ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? "lastWriteDate" : ISODate("2024-01-05T06:36:14Z"), ? ? ? ? ? ? ? ? "majorityOpTime" : { ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704436574, 1), ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(2) ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? "majorityWriteDate" : ISODate("2024-01-05T06:36:14Z") ? ? ? ? }, ? ? ? ? "maxBsonObjectSize" : 16777216, ? ? ? ? "maxMessageSizeBytes" : 48000000, ? ? ? ? "maxWriteBatchSize" : 100000, ? ? ? ? "localTime" : ISODate("2024-01-05T06:36:19.346Z"), ? ? ? ? "logicalSessionTimeoutMinutes" : 30, ? ? ? ? "connectionId" : 39, ? ? ? ? "minWireVersion" : 0, ? ? ? ? "maxWireVersion" : 9, ? ? ? ? "readOnly" : false, ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704436574, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"GIed52Qk4RdLOy9M0YmdT2z76NA="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704436574, 1) } |
db.createUser({user:"admin", pwd: "123456",roles:[{role:"root",db:"admin"}]}) db.auth("admin", "123456"); |
mongo --port 27018 -u admin -p?
rs.status()
主库插入测试数据
use test j={name:"mongo_new",age:5} i={x:3} db.test.insert(j) db.test.insert(i) db.test.save(i) db.test.save(j) db.test.find() repl_cluster:PRIMARY>use test switched to db test repl_cluster:PRIMARY> db.test.find() { "_id" : ObjectId("65962274d846bcd325533e5b"), "x" : 3 } { "_id" : ObjectId("659626a1d846bcd325533e5c"), "name" : "mongo_new", "age" : 5 } |
从库进行查询操作
repl_cluster:SECONDARY> show collections uncaught exception: Error: listCollections failed: { ? ? ? ? "topologyVersion" : { ? ? ? ? ? ? ? ? "processId" : ObjectId("65966fe4c8db6c6ee7ee58fa"), ? ? ? ? ? ? ? ? "counter" : NumberLong(4) ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704422833, 1), ? ? ? ? "ok" : 0, ? ? ? ? "errmsg" : "not master and slaveOk=false", ? ? ? ? "code" : 13435, ? ? ? ? "codeName" : "NotPrimaryNoSecondaryOk", ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704422833, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"zp3Q5q7KdZpW6jlTQSwi3bbLgkA="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? } }? |
查询报错,从库无法执行查询操作
开启从库查询操作
repl_cluster:SECONDARY> db.getMongo().setSecondaryOk() repl_cluster:SECONDARY> show collections test repl_cluster:SECONDARY> db.test.find() { "_id" : ObjectId("65962274d846bcd325533e5b"), "x" : 3 } { "_id" : ObjectId("659626a1d846bcd325533e5c"), "name" : "mongo_new", "age" : 5 } repl_cluster:SECONDARY> |
模拟主库down机,验证故障是否自动转移
杀掉主库进程 [root@erp-db ~]# ps -ef |grep mongo | more mongo? ? 15862 ? ? 1? 0 Jan04 ?? ? ? ? 00:12:23 mongod -f /u01/mongodb/node1/conf/mongodb.conf mongo? ? 16006 ? ? 1? 0 Jan04 ?? ? ? ? 00:12:25 mongod -f /u01/mongodb/node2/conf/mongodb.conf mongo? ? 16111 ? ? 1? 0 Jan04 ?? ? ? ? 00:12:38 mongod -f /u01/mongodb/node3/conf/mongodb.conf [root@erp-db ~]# kill -9 15862 |
查看副本集群状态
repl_cluster:PRIMARY> rs.status() { ? ? ? ? "set" : "repl_cluster", ? ? ? ? "date" : ISODate("2024-01-05T06:45:16.062Z"), ? ? ? ? "myState" : 1, ? ? ? ? "term" : NumberLong(3), ? ? ? ? "syncSourceHost" : "", ? ? ? ? "syncSourceId" : -1, ? ? ? ? "heartbeatIntervalMillis" : NumberLong(2000), ? ? ? ? "majorityVoteCount" : 2, ? ? ? ? "writeMajorityCount" : 2, ? ? ? ? "votingMembersCount" : 3, ? ? ? ? "writableVotingMembersCount" : 3, ? ? ? ? "members" : [ ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27018", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 8, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "(not reachable/healthy)", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(0, 0), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(-1) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(0, 0), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(-1) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("1970-01-01T00:00:00Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:44:34.087Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:44:34.087Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T06:45:15.756Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T06:44:37.970Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "Error connecting to localhost:27018 (127.0.0.1:27018) :: caused by :: Connection refused", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : -1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 2 ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27019", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "PRIMARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 79256, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704437107, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T06:45:07Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:45:07.750Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:45:07.750Z"), ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : -1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "electionTime" : Timestamp(1704437087, 1), ? ? ? ? ? ? ? ? ? ? ? ? "electionDate" : ISODate("2024-01-05T06:44:47Z"), ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3, ? ? ? ? ? ? ? ? ? ? ? ? "self" : true, ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "" ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27020", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 79248, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704437107, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704437107, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T06:45:07Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T06:45:07Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T06:45:07.750Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T06:45:07.750Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T06:45:15.742Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T06:45:14.249Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "localhost:27019", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3 ? ? ? ? ? ? ? ? } ? ? ? ? ], ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704437107, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"Q6vILQyJe0QvnCDuZZUfS2IJafA="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704437107, 1) } |
27018端口mongodb出现异常,状态为(not reachable/healthy)",系统自动选举了27019端口为主,实现了故障的自动转移
当原主进程启动后,自动加入到集群中,角色为SECONDARY
1、 配置并启动新节点,启用20721作为新节点端口,配置文件根据需要更改
sudo -u mongo numactl --interleave=all mongod -f? /u01/mongodb/node4/conf/mongodb.conf about to fork child process, waiting until server is ready for connections. forked process: 25698 child process started successfully, parent exiting |
2、 添加新节点到现有Replica Set
repl_cluster:PRIMARY> rs.add("localhost:27021") { ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704439046, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"S8ApX1WUo83welNeMKf5jkBdj+Q="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704439046, 1) } |
3、 查看集群状态
? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 3, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27021", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 10, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704439046, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704439046, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T07:17:26Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T07:17:26Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024005T07:17:26.414Z"), ?? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("20240105T07:17:26.414Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T07:17:36.481Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv":ISODate("2024-0105T07:17:36.772Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : -1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3 ? ? ? ? ? ? ? ? } ? ? ? ? ], ? ? ? ? "ok" : 1, |
4、 验证数据同步
repl_cluster:SECONDARY> rs.secondaryOk() repl_cluster:SECONDARY> db.test.find() { "_id" : ObjectId("65962274d846bcd325533e5b"), "x" : 3 } { "_id" : ObjectId("659626a1d846bcd325533e5c"), "name" : "mongo_new", "age" : 5 } |
通过oplog日志进行添加节点操作简单,但oplog是capped collection,采用循环的方式处理日志,通过oplog日志来添加节点,可能导致数据的不一致(日志被刷新),因此我们引出快照和oplog相结合的方式来添加节点,保证数据的一致性。
方式:复制一份副本集的物理文件来做初始化数据,然后使用oplog日志来追溯数据,最终达到数据的一致性。
1、复制一份副本集成员的物理文件做初始数据
cp –r /u01/mongodb/node4 /u01/mongodb/node5 |
2、复制完成后,清理不需要的文件,并插入一条新文档,作为同步验证使用
repl_cluster:PRIMARY> j={name:"node5",age:27022} { "name" : "node5", "age" : 27022 } repl_cluster:PRIMARY> db.test.insert(j) WriteResult({ "nInserted" : 1 }) repl_cluster:PRIMARY> db.test.find() { "_id" : ObjectId("65962274d846bcd325533e5b"), "x" : 3 } { "_id" : ObjectId("659626a1d846bcd325533e5c"), "name" : "mongo_new", "age" : 5 } { "_id" : ObjectId("6597b42827437b37032f0aa2"), "name" : "node5", "age" : 27022 } |
3、启动新节点27022端口
[root@erp-db]# sudo -u mongo numactl --interleave=all mongod -f? /u01/mongodb/node5/conf/mongodb.conf about to fork child process, waiting until server is ready for connections. forked process: 2520 child process started successfully, parent exiting |
4、添加新节点到现有Replica Set
repl_cluster:PRIMARY> rs.add("localhost:27022") { ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704442052, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"nQHjkoZke4XsoroiK8SqqisCfsA="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704442052, 1) } |
5、 验证数据同步
repl_cluster:SECONDARY> rs.secondaryOk() repl_cluster:SECONDARY> db.test.find() { "_id" : ObjectId("65962274d846bcd325533e5b"), "x" : 3 } { "_id" : ObjectId("659626a1d846bcd325533e5c"), "name" : "mongo_new", "age" : 5 } { "_id" : ObjectId("6597b42827437b37032f0aa2"), "name" : "node5", "age" : 27022 } |
将刚刚添加的两个新节点27021和27022从复制集中去除掉,只需执行rs.remove 指令
就可以了,具体如下:
repl_cluster:PRIMARY> rs.remove("localhost:27021") { ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704444644, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"2XlJmd+hB0L2oNeXGO4GNwS3E1U="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704444644, 1) } repl_cluster:PRIMARY> rs.remove("localhost:27022") { ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704444654, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"d1MJJ3p+dzvKBS63W3DWVWteb0k="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704444654, 1) } |
查看集群状态,27021,27022节点已经删除
repl_cluster:PRIMARY> rs.status() { ? ? ? ? "set" : "repl_cluster", ? ? ? ? "date" : ISODate("2024-01-05T08:51:31.008Z"), ? ? ? ? "myState" : 1, ? ? ? ? "term" : NumberLong(3), ? ? ? ? "syncSourceHost" : "", ? ? ? ? "syncSourceId" : -1, ? ? ? ? "heartbeatIntervalMillis" : NumberLong(2000), ? ? ? ? "majorityVoteCount" : 2, ? ? ? ? "writeMajorityCount" : 2, ? ? ? ? "votingMembersCount" : 3, ? ? ? ? "writableVotingMembersCount" : 3, ? ? ? ? "members" : [ ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 0, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27018", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 7101, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T08:51:27Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T08:51:27Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T08:51:30.974Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T08:51:30.977Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "localhost:27020", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 5, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3 ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27019", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "PRIMARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 86831, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T08:51:27Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : -1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "electionTime" : Timestamp(1704437087, 1), ? ? ? ? ? ? ? ? ? ? ? ? "electionDate" : ISODate("2024-01-05T06:44:47Z"), ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 5, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3, ? ? ? ? ? ? ? ? ? ? ? ? "self" : true, ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "" ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? "_id" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "name" : "localhost:27020", ? ? ? ? ? ? ? ? ? ? ? ? "health" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "state" : 2, ? ? ? ? ? ? ? ? ? ? ? ? "stateStr" : "SECONDARY", ? ? ? ? ? ? ? ? ? ? ? ? "uptime" : 86823, ? ? ? ? ? ? ? ? ? ? ? ? "optime" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurable" : { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ts" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "t" : NumberLong(3) ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? ? ? ? ? ? "optimeDate" : ISODate("2024-01-05T08:51:27Z"), ? ? ? ? ? ? ? ? ? ? ? ? "optimeDurableDate" : ISODate("2024-01-05T08:51:27Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastAppliedWallTime":ISODate("2024-01-05T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastDurableWallTime":ISODate("2024-0105T08:51:27.956Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeat" : ISODate("2024-01-05T08:51:30.975Z"), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatRecv" : ISODate("2024-01-05T08:51:30.977Z"), ? ? ? ? ? ? ? ? ? ? ? ? "pingMs" : NumberLong(0), ? ? ? ? ? ? ? ? ? ? ? ? "lastHeartbeatMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceHost" : "localhost:27019", ? ? ? ? ? ? ? ? ? ? ? ? "syncSourceId" : 1, ? ? ? ? ? ? ? ? ? ? ? ? "infoMessage" : "", ? ? ? ? ? ? ? ? ? ? ? ? "configVersion" : 5, ? ? ? ? ? ? ? ? ? ? ? ? "configTerm" : 3 ? ? ? ? ? ? ? ? } ? ? ? ? ], ? ? ? ? "ok" : 1, ? ? ? ? "$clusterTime" : { ? ? ? ? ? ? ? ? "clusterTime" : Timestamp(1704444687, 1), ? ? ? ? ? ? ? ? "signature" : { ? ? ? ? ? ? ? ? ? ? ? ? "hash" : BinData(0,"bBPDXuxrAqjzfO86rcj13v7mKQI="), ? ? ? ? ? ? ? ? ? ? ? ? "keyId" : NumberLong("7319816138693541892") ? ? ? ? ? ? ? ? } ? ? ? ? }, ? ? ? ? "operationTime" : Timestamp(1704444687, 1) } |