本文共 19465 字,大约阅读时间需要 64 分钟。
MongoDB 高可用可用分两种 : Master-Slave 主从复制 : 只需要在某一个服务启动时加上–master 参数, 而另一个服务加上–slave 与–source 参数, 即可实现同步 。 MongoDB的最新版本已不再推荐此方案。 Replica Sets 复制集 :MongoDB 在 1.6 版本对开发了新功能 replica set,这比之前的 replication 功能要强大一 些,增加了故障自动切换 和自动修复成员节点,各个 DB 之间数据完全一致,大大降低了维 护成功。auto shard 已经明确说明不支持 replication paris, 建议使用 replica set,replica set 故障切换完全自动。 Replica Sets 的结构非常类似一个集群 ,其中一个节点如果出现故障, 其它节点马上会将业务 接过来而无须停机操作。
192.168.110.131(node1) 192.168.110.132(node2) 192.168.110.133(node3) 一、MongoDB安装 [root@node1 ~]# vim /etc/yum.repos.d/Mongodb.repo [mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc [root@node1 ~]# yum install -y mongodb-org [root@node1 ~]# service mongod start Starting mongod: [ OK ] [root@node1 ~]# ps aux|grep mong mongod 1361 5.7 14.8 351180 35104 ? Sl 01:26 0:01 /usr/bin/mongod -f /etc/mongod.conf 更改数据存放目录: [root@node1 ~]# mkdir -p /mongodb/data [root@node1 ~]# chown -R mongod:mongod /mongodb/ [root@node1 ~]# ll /mongodb/ total 4 drwxr-xr-x 2 mongod mongod 4096 May 18 02:04 data [root@node1 ~]# grep -v "^#" /etc/mongod.conf |grep -v "^$" systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log storage: dbPath: /mongodb/data journal: enabled: true processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile net: port: 27017 bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces. [root@node1 ~]# service mongod start Starting mongod: [ OK ] node2,node2与上面一样 二、配置 Replication Sets 介绍一下涉及到的参数 --oplogSize 日志操作文件的大小 --dbpath 数据文件路径 --logpath 日志文件路径 --port 端口号,默认是27017.我这里使用的也是这个端口号. --replSet 复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test. --replSet test/ 这个后面跟的是其他standard节点的ip和端口 --maxConns 最大连接数 --fork 后台运行 --logappend 日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。 --keyFile 标识同一集群的认证私钥 其中在启动节点时一定要加上oplogSize 的参数 为其设置大小,不然在64位操作系统上的mongodb,oplogs都相当大-可能是5%的磁盘空间。 要根据情况设置个合理的值。 v3.4.4上的参数: [root@node1 ~]# vim /etc/mongod.conf replication: oplogSizeMB: 1024 replSetName: rs0 使用Keyfile存取控制部署复制集: openssl rand -base64 756 > <path-to-keyfile> chmod 400 <path-to-keyfile> Configuration File If using a configuration file, set the security.keyFile option to the keyfile’s path, and the replication.replSetName option to the replica set name: security: keyFile: <path-to-keyfile> replication: replSetName: <replicaSetName> Command Line If using the command line option, start the mongod with the --keyFile and --replSet parameters: mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> 配置带密钥文件的 Replication Sets: [root@node1 ~]# openssl rand -base64 756 > /mongodb/mongokey [root@node1 ~]# cat /mongodb/mongokey gxpcgjyFj2qE8b9TB/0XbdRVYH9VDb55NY03AHwxCFU58MUjJMeez844i1gaUo/t ..... ..... [root@node1 ~]# chmod 400 /mongodb/mongokey [root@node1 ~]# chown mongod:mongod /mongodb/mongokey [root@node1 ~]# ll /mongodb/ total 8 drwxr-xr-x 4 mongod mongod 4096 May 19 18:39 data -r-------- 1 mongod mongod 1024 May 19 18:29 mongokey [root@node1 ~]# vim /etc/mongod.conf #security: security: keyFile: /mongodb/mongokey #operationProfiling: #replication: replication: oplogSizeMB: 1024 replSetName: rs0 [root@node1 ~]# service mongod restart Stopping mongod: [ OK ] Starting mongod: [ OK ] [root@node1 ~]# iptables -I INPUT 4 -m state --state NEW -p tcp --dport 27017 -j ACCEPT 复制hosts文件: [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/hosts root@node2.pancou.com:/mongodb/ [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/hosts root@node3.pancou.com:/mongodb/ 复制密钥文件: [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /mongodb/mongokey root@node3.pancou.com:/mongodb/ [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /mongodb/mongokey root@node3.pancou.com:/mongodb/ 复制配置文件: [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/mongod.conf root@node2.pancou.com:/etc/ [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/mongod.conf root@node3.pancou.com:/etc/ 注意:双方都要按照rsync和openssh-clients [root@node1 ~]# mongo > help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers ..... > rs.help() rs.status() { replSetGetStatus : 1 } checks repl set status rs.initiate() { replSetInitiate : null } initiates set with default settings rs.initiate(cfg) { replSetInitiate : cfg } initiates set with configuration cfg rs.conf() get the current configuration object from local.system.replset ..... > rs.status() { "info" : "run rs.initiate(...) if not yet done for the set", "ok" : 0, "errmsg" : "no replset config has been received", "code" : 94, "codeName" : "NotYetInitialized" } > rs.initiate() { "info2" : "no configuration specified. Using a default configuration for the set", "me" : "node1.pancou.com:27017", "ok" : 1 } rs0:OTHER> rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2017-05-18T17:00:49.868Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1495126845, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1495126845, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1495126845, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "node1.pancou.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1239, "optime" : { "ts" : Timestamp(1495126845, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-18T17:00:45Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1495126824, 2), "electionDate" : ISODate("2017-05-18T17:00:24Z"), "configVersion" : 1, "self" : true } ], "ok" : 1 } rs0:PRIMARY> rs.add("node2.pancou.com") { "ok" : 1 } rs0:PRIMARY> rs.add("node3.pancou.com") { "ok" : 1 } rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2017-05-18T17:08:47.724Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "node1.pancou.com:27017", "health" : 1, //表明状态正常 "state" : 1, //1表示是PRIMARY,2表示是slave "stateStr" : "PRIMARY", //表示此机器是主库 "uptime" : 1717, "optime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-18T17:08:45Z"), "electionTime" : Timestamp(1495126824, 2), "electionDate" : ISODate("2017-05-18T17:00:24Z"), "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "node2.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 64, "optime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-18T17:08:45Z"), "optimeDurableDate" : ISODate("2017-05-18T17:08:45Z"), "lastHeartbeat" : ISODate("2017-05-18T17:08:46.106Z"), "lastHeartbeatRecv" : ISODate("2017-05-18T17:08:47.141Z"), "pingMs" : NumberLong(0), "syncingTo" : "node1.pancou.com:27017", "configVersion" : 3 }, { "_id" : 2, "name" : "node3.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 55, "optime" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1495127325, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-18T17:08:45Z"), "optimeDurableDate" : ISODate("2017-05-18T17:08:45Z"), "lastHeartbeat" : ISODate("2017-05-18T17:08:46.195Z"), "lastHeartbeatRecv" : ISODate("2017-05-18T17:08:46.924Z"), "pingMs" : NumberLong(0), "syncingTo" : "node2.pancou.com:27017", "configVersion" : 3 } ], "ok" : 1 } rs0:PRIMARY> db.isMaster() { "hosts" : [ "node1.pancou.com:27017", "node2.pancou.com:27017", "node3.pancou.com:27017" ], "setName" : "rs0", "setVersion" : 3, "ismaster" : true, "secondary" : false, "primary" : "node1.pancou.com:27017", "me" : "node1.pancou.com:27017", "electionId" : ObjectId("7fffffff0000000000000001"), "lastWrite" : { "opTime" : { "ts" : Timestamp(1495127705, 1), "t" : NumberLong(1) }, "lastWriteDate" : ISODate("2017-05-18T17:15:05Z") }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-05-18T17:15:11.146Z"), "maxWireVersion" : 5, "minWireVersion" : 0, "readOnly" : false, "ok" : 1 } rs0:PRIMARY> use testdb rs0:PRIMARY> show collections testcoll rs0:PRIMARY> db.testcoll.find() { "_id" : ObjectId("591dd9f965cc255a5373aefa"), "name" : "tom", "age" : 25 } 到从库上查看: node2: rs0:SECONDARY> rs.slaveOk() rs0:SECONDARY> show dbs admin 0.000GB local 0.000GB testdb 0.000GB rs0:SECONDARY> use testdb switched to db testdb rs0:SECONDARY> show collections testcoll rs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("591dd9f965cc255a5373aefa"), "name" : "tom", "age" : 25 } rs0:SECONDARY> node3: rs0:SECONDARY> rs.slaveOk() rs0:SECONDARY> show dbs admin 0.000GB local 0.000GB testdb 0.000GB rs0:SECONDARY> use testdb switched to db testdb rs0:SECONDARY> show collections testcoll rs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("591dd9f965cc255a5373aefa"), "name" : "tom", "age" : 25 } rs0:SECONDARY> 主从操作日志 rs0:PRIMARY> use local switched to db local rs0:PRIMARY> show collections me oplog.rs replset.election replset.minvalid startup_log system.replset rs0:PRIMARY> db.oplog.rs.find() { "ts" : Timestamp(1495126824, 1), "h" : NumberLong("3056083863196084673"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "initiating set" } } { "ts" : Timestamp(1495126825, 1), "t" : NumberLong(1), "h" : NumberLong("7195178065440751511"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "new primary" } } { "ts" : Timestamp(1495126835, 1), "t" : NumberLong(1), "h" : NumberLong("5723995478292318850"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "periodic noop" } } { "ts" : Timestamp(1495126845, 1), "t" : NumberLong(1), "h" : NumberLong("-3772304067699003381"), "v" : 2, "op" : "n", "ns" : "", "o" 三、查看配置信息 rs0:PRIMARY> db.printReplicationInfo() configured oplog size: 1024MB log length start to end: 2541secs (0.71hrs) oplog first event time: Fri May 19 2017 01:00:24 GMT+0800 (CST) oplog last event time: Fri May 19 2017 01:42:45 GMT+0800 (CST) now: Fri May 19 2017 01:42:48 GMT+0800 (CST) rs0:PRIMARY> db.oplog.rs.find():查看复制集产生的日志 db.printReplicationInfo():查看操作日志的一些基本信息,如日志大小、日志启用时间。 db.printSlaveReplicationInfo():查看所有slave延迟情况。 rs0:PRIMARY> db.printSlaveReplicationInfo() source: node2.pancou.com:27017 syncedTo: Fri May 19 2017 01:47:15 GMT+0800 (CST) 0 secs (0 hrs) behind the primary source: node3.pancou.com:27017 syncedTo: Fri May 19 2017 01:47:15 GMT+0800 (CST) 0 secs (0 hrs) behind the primary db.system.replset.find():查看复制集 配置信息: rs0:PRIMARY> db.system.replset.find() { "_id" : "rs0", "version" : 3, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "node1.pancou.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "node2.pancou.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "node3.pancou.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : 2000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("591dd3284fc6957e660dc933") } } rs0:PRIMARY> db.system.replset.find().forEach(printjson) 这种方式更直观 四、主从切换: 1、把node3冰冻30秒 rs0:SECONDARY> rs.freeze(30) { "ok" : 1 } 2、把node1 PRIMARY降级、 rs0:PRIMARY> rs.stepDown(30) 2017-05-19T02:09:27.945+0800 E QUERY [thread1] Error: error doing query: failed: network error while attempting to run command 'replSetStepDown' on host '127.0.0.1:27017' : DB.prototype.runCommand@src/mongo/shell/db.js:132:1 DB.prototype.adminCommand@src/mongo/shell/db.js:150:16 rs.stepDown@src/mongo/shell/utils.js:1261:12 @(shell):1:1 2017-05-19T02:09:27.947+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed 2017-05-19T02:09:27.949+0800 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) ok 30秒后就变成从了 rs0:SECONDARY> rs.status() { "set" : "rs0", "date" : ISODate("2017-05-18T18:12:09.732Z"), "myState" : 2, "term" : NumberLong(2), "syncingTo" : "node2.pancou.com:27017", "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1495131128, 1), "t" : NumberLong(2) }, "appliedOpTime" : { "ts" : Timestamp(1495131128, 1), "t" : NumberLong(2) }, "durableOpTime" : { "ts" : Timestamp(1495131128, 1), "t" : NumberLong(2) } }, "members" : [ { "_id" : 0, "name" : "node1.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 5519, "optime" : { "ts" : Timestamp(1495131128, 1), "t" : NumberLong(2) }, "optimeDate" : ISODate("2017-05-18T18:12:08Z"), "syncingTo" : "node2.pancou.com:27017", "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "node2.pancou.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3866, "optime" : { "ts" : Timestamp(1495131118, 1), "t" : NumberLong(2) }, "optimeDurable" : { "ts" : Timestamp(1495131118, 1), "t" : NumberLong(2) }, "optimeDate" : ISODate("2017-05-18T18:11:58Z"), "optimeDurableDate" : ISODate("2017-05-18T18:11:58Z"), "lastHeartbeat" : ISODate("2017-05-18T18:12:08.333Z"), "lastHeartbeatRecv" : ISODate("2017-05-18T18:12:08.196Z"), "pingMs" : NumberLong(0), "electionTime" : Timestamp(1495130977, 1), "electionDate" : ISODate("2017-05-18T18:09:37Z"), "configVersion" : 3 }, { "_id" : 2, "name" : "node3.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 3857, "optime" : { "ts" : Timestamp(1495131118, 1), "t" : NumberLong(2) }, "optimeDurable" : { "ts" : Timestamp(1495131118, 1), "t" : NumberLong(2) }, "optimeDate" : ISODate("2017-05-18T18:11:58Z"), "optimeDurableDate" : ISODate("2017-05-18T18:11:58Z"), "lastHeartbeat" : ISODate("2017-05-18T18:12:08.486Z"), "lastHeartbeatRecv" : ISODate("2017-05-18T18:12:08.116Z"), "pingMs" : NumberLong(0), "syncingTo" : "node2.pancou.com:27017", "configVersion" : 3 } ], "ok" : 1 } rs0:SECONDARY> 五、增减节点 1、增加节点 通过oplog增加节点,这种方式使数据的同步完全依赖于oplog,即oplog中有多少操作日志,这些操作日志就完全在新添加的节点中执行一遍,以完成同步 。 在上面有一个3节点的复制集基础上,现在想配置并启动一个新节点,将其加入现在复制集环境中。 [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/hosts root@node2.pancou.com:/etc/ [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /mongodb/mongokey root@node4.pancou.com:/mongodb/ [root@node1 ~]# rsync -avH --progress '-e ssh -p 22' /etc/mongod.conf root@node4.pancou.com:/etc/ [root@node4 ~]# iptables -I INPUT 4 -m state --state NEW -p tcp --dport 27017 -j ACCEPT 在主上添加新节点: rs0:PRIMARY> rs.add("node4.pancou.com") { "ok" : 1 } rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2017-05-19T12:12:57.697Z"), "myState" : 1, "term" : NumberLong(8), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "appliedOpTime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "durableOpTime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) } }, "members" : [ { "_id" : 0, "name" : "node1.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 159, "optime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDurable" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-05-19T12:12:51Z"), "optimeDurableDate" : ISODate("2017-05-19T12:12:51Z"), "lastHeartbeat" : ISODate("2017-05-19T12:12:56.111Z"), "lastHeartbeatRecv" : ISODate("2017-05-19T12:12:57.101Z"), "pingMs" : NumberLong(0), "syncingTo" : "node3.pancou.com:27017", "configVersion" : 4 }, { "_id" : 1, "name" : "node2.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 189, "optime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDurable" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-05-19T12:12:51Z"), "optimeDurableDate" : ISODate("2017-05-19T12:12:51Z"), "lastHeartbeat" : ISODate("2017-05-19T12:12:56.111Z"), "lastHeartbeatRecv" : ISODate("2017-05-19T12:12:57.103Z"), "pingMs" : NumberLong(0), "syncingTo" : "node3.pancou.com:27017", "configVersion" : 4 }, { "_id" : 2, "name" : "node3.pancou.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 191, "optime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-05-19T12:12:51Z"), "electionTime" : Timestamp(1495195800, 1), "electionDate" : ISODate("2017-05-19T12:10:00Z"), "configVersion" : 4, "self" : true }, { "_id" : 3, "name" : "node4.pancou.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 71, "optime" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDurable" : { "ts" : Timestamp(1495195971, 1), "t" : NumberLong(8) }, "optimeDate" : ISODate("2017-05-19T12:12:51Z"), "optimeDurableDate" : ISODate("2017-05-19T12:12:51Z"), "lastHeartbeat" : ISODate("2017-05-19T12:12:56.122Z"), "lastHeartbeatRecv" : ISODate("2017-05-19T12:12:56.821Z"), "pingMs" : NumberLong(1), "syncingTo" : "node3.pancou.com:27017", "configVersion" : 4 } ], "ok" : 1 } 查看状态: rs0:SECONDARY> rs.slaveOk() rs0:SECONDARY> show dbs admin 0.000GB local 0.000GB testdb 0.000GB rs0:SECONDARY> use testdb switched to db testdb rs0:SECONDARY> show collections testcoll rs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("591dd9f965cc255a5373aefa"), "name" : "tom", "age" : 25 } rs0:SECONDARY> rs0:SECONDARY> db.isMaster() { "hosts" : [ "node1.pancou.com:27017", "node2.pancou.com:27017", "node3.pancou.com:27017", "node4.pancou.com:27017" ], "setName" : "rs0", "setVersion" : 4, "ismaster" : false, "secondary" : true, "primary" : "node3.pancou.com:27017", "me" : "node4.pancou.com:27017", "lastWrite" : { "opTime" : { "ts" : Timestamp(1495196261, 1), "t" : NumberLong(8) }, "lastWriteDate" : ISODate("2017-05-19T12:17:41Z") }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-05-19T12:17:44.104Z"), "maxWireVersion" : 5, "minWireVersion" : 0, "readOnly" : false, "ok" : 1 } rs0:SECONDARY> 2、减少节点 rs0:PRIMARY> rs.remove("node4.pancou.com:27017") { "ok" : 1 } rs0:PRIMARY> db.isMaster() { "hosts" : [ "node1.pancou.com:27017", "node2.pancou.com:27017", "node3.pancou.com:27017" ], "setName" : "rs0", "setVersion" : 5, "ismaster" : true, "secondary" : false, "primary" : "node3.pancou.com:27017", "me" : "node3.pancou.com:27017", "electionId" : ObjectId("7fffffff0000000000000008"), "lastWrite" : { "opTime" : { "ts" : Timestamp(1495196531, 1), "t" : NumberLong(8) }, "lastWriteDate" : ISODate("2017-05-19T12:22:11Z") }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-05-19T12:22:19.874Z"), "maxWireVersion" : 5, "minWireVersion" : 0, "readOnly" : false, "ok" : 1 } rs0:PRIMARY> 转载地址:http://wnpab.baihongyu.com/