工作原理
MongoDB的復制是基於操作日志oplog,相當於MySQL中的二進制日志,只記錄發生改變的記錄。復制是將主節點的oplog日志同步並應用到其他從節點的過程。
1.副本集之間的復制是通過oplog日志現實的.備份節點通過查詢這個集合就可以知道需要進行復制的操作
2.oplog是節點中local庫中的一個固定的集合,在默認情況下oplog初始化大小為空閑磁盤的5%.oplog是capped collection,所以當oplog的空間被占滿時,會覆蓋最初寫入的日志
3.通過改變oplog文檔的大小直接改變local所占磁盤空間的大小.可以在配置文件中設置oplogSize參數來指定oplog文檔的大小。
4.通過oplog中的操作記錄,把數據復制在備份節點.
5.主節點是集中接收寫入操作的,MongoDB中的應用連接到主節點進行寫入操作,然后記錄在主節點操作oplog,從節點成員定期輪詢復制此日志並將操作應用於其數據集。
常用命令
rs.conf() 查看副本集配置
rs.status() 查看副本集狀態
rs.initiate(config) 初始化副本集
rs.isMaster() 查看是否為主節點
db.getMongo().setSlaveOk(); 賦予副本集副本節點查詢數據的權限,副本節點執行
rs.add("ip:port") 新增副本集節點
rs.remove("ip:port") 刪除副本集節點
rs.addArb("ip:port") 添加仲裁節點
副本集參數說明
"_id": #集群中節點編號
"name": #成員服務器名稱及端口
"health" : #表示成員中的健康狀態(0:down;1:up)
"state" : #為0~10,表示成員的當前狀態
"stateStr" : #描述該成員是主庫(PRIMARY)還是備庫(SECONDARY)
"uptime" : #該成員在線時間(秒)
"optime" : #成員最后一次應用日志(oplog)的信息
"optimeDate" : #成員最后一次應用日志(oplog)的時間
"electionTime" : #當前primary從操作日志中選舉信息
"electionDate" : #當前primary被選定為primary的日期
"configVersion" : #mongodb版本
"self" : #為true 表示當前節點
開始部署mongod副本集
一、環境准備
操作系統centos6.5 mongodb版本3.6.6
ip地址 主機名 角色
192.168.1.230 mongodb01 副本集主節點
192.168.1.18 mongodb02 副本集副本節點
192.168.1.247 mongodb03 副本集副本節點
關閉3個服務器的防火牆及selinux
二、安裝部署mongodb及副本集配置
1、安裝部署mongodb
可參考:https://www.cnblogs.com/wusy/p/10405991.html
2、副本集配置
1)yum安裝mongodb在做副本集時需在所有服務器配置文件加入以下配置:
replication:
replSetName: repset(副本集名,可自定義) #副本集配置
security: #開啟副本集用戶認證
authorization: enabled
keyFile: /data/mongodb/keyfile
clusterAuthMode: keyFile
2)源碼包構建副本集時,則需加以下語法來配置:
replSet=repset(副本集名) #副本集配置
auth=true #開啟副本集用戶認證,若為單擊模式,則不創建和指定秘鑰文件
keyFile=/data2/mongodb-3.6.6/keyfile #指定秘鑰文件路徑
journal=true #開啟journal日志,默認為開啟
3、初始化副本集
在任意一台節點初始化都可,但在哪一台做初始化,那么這一台就作為副本集的主節點,這里選擇mongodb01(也可使用權重值來控制主副節點)
1)進入mongodb數據庫
[root@mongodb01 ~]# mongo --host 192.168.1.230
2)定義副本集配置,這里的_id:repset要與配置文件中所指的副本集名稱一致
1 >config={ 2 ... _id:"repset", #務必與配置文件中指定的副本集名稱一致 3 ... members:[ 4 ... {_id:0,host:"192.168.1.230:27017"}, 5 ... {_id:1,host:"192.168.1.18:27017"}, 6 ... {_id:2,host:"192.168.1.247:27017"} 7 ... ] 8 ... } 9 10 { 11 "_id" : "repset", 12 "members" : [ 13 { 14 "_id" : 0, 15 "host" : "192.168.1.230:27017" 16 }, 17 { 18 "_id" : 1, 19 "host" : "192.168.1.18:27017" 20 }, 21 { 22 "_id" : 2, 23 "host" : "192.18.1.247:27017" 24 } 25 ] 26 }
3)初始化副本集配置
1 > rs.initiate(config) 2 { 3 "ok" : 1, 4 "operationTime" : Timestamp(1551502195, 1), 5 "$clusterTime" : { 6 "clusterTime" : Timestamp(1551502195, 1), 7 "signature" : { 8 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 9 "keyId" : NumberLong(0) 10 } 11 } 12 }
4)查看集群節點狀態(health為1表明正常,為0表明異常)
1 repset:PRIMARY> rs.status() 2 { 3 "set" : "repset", 4 "date" : ISODate("2019-03-02T04:50:47.554Z"), 5 "myState" : 1, 6 "term" : NumberLong(1), 7 "syncingTo" : "", 8 "syncSourceHost" : "", 9 "syncSourceId" : -1, 10 "heartbeatIntervalMillis" : NumberLong(2000), 11 "optimes" : { 12 "lastCommittedOpTime" : { 13 "ts" : Timestamp(1551502238, 1), 14 "t" : NumberLong(1) 15 }, 16 "readConcernMajorityOpTime" : { 17 "ts" : Timestamp(1551502238, 1), 18 "t" : NumberLong(1) 19 }, 20 "appliedOpTime" : { 21 "ts" : Timestamp(1551502238, 1), 22 "t" : NumberLong(1) 23 }, 24 "durableOpTime" : { 25 "ts" : Timestamp(1551502238, 1), 26 "t" : NumberLong(1) 27 } 28 }, 29 "lastStableCheckpointTimestamp" : Timestamp(1551502208, 1), 30 "members" : [ 31 { 32 "_id" : 0, 33 "name" : "192.168.1.230:27017", 34 "health" : 1, 35 "state" : 1, 36 "stateStr" : "PRIMARY", 37 "uptime" : 153, 38 "optime" : { 39 "ts" : Timestamp(1551502238, 1), 40 "t" : NumberLong(1) 41 }, 42 "optimeDate" : ISODate("2019-03-02T04:50:38Z"), 43 "syncingTo" : "", 44 "syncSourceHost" : "", 45 "syncSourceId" : -1, 46 "infoMessage" : "could not find member to sync from", 47 "electionTime" : Timestamp(1551502207, 1), 48 "electionDate" : ISODate("2019-03-02T04:50:07Z"), 49 "configVersion" : 1, 50 "self" : true, 51 "lastHeartbeatMessage" : "" 52 }, 53 { 54 "_id" : 1, 55 "name" : "192.168.1.18:27017", 56 "health" : 1, 57 "state" : 2, 58 "stateStr" : "SECONDARY", 59 "uptime" : 51, 60 "optime" : { 61 "ts" : Timestamp(1551502238, 1), 62 "t" : NumberLong(1) 63 }, 64 "optimeDurable" : { 65 "ts" : Timestamp(1551502238, 1), 66 "t" : NumberLong(1) 67 }, 68 "optimeDate" : ISODate("2019-03-02T04:50:38Z"), 69 "optimeDurableDate" : ISODate("2019-03-02T04:50:38Z"), 70 "lastHeartbeat" : ISODate("2019-03-02T04:50:47.382Z"), 71 "lastHeartbeatRecv" : ISODate("2019-03-02T04:50:46.242Z"), 72 "pingMs" : NumberLong(0), 73 "lastHeartbeatMessage" : "", 74 "syncingTo" : "192.168.1.247:27017", 75 "syncSourceHost" : "192.168.1.247:27017", 76 "syncSourceId" : 2, 77 "infoMessage" : "", 78 "configVersion" : 1 79 }, 80 { 81 "_id" : 2, 82 "name" : "192.168.1.247:27017", 83 "health" : 1, 84 "state" : 2, 85 "stateStr" : "SECONDARY", 86 "uptime" : 51, 87 "optime" : { 88 "ts" : Timestamp(1551502238, 1), 89 "t" : NumberLong(1) 90 }, 91 "optimeDurable" : { 92 "ts" : Timestamp(1551502238, 1), 93 "t" : NumberLong(1) 94 }, 95 "optimeDate" : ISODate("2019-03-02T04:50:38Z"), 96 "optimeDurableDate" : ISODate("2019-03-02T04:50:38Z"), 97 "lastHeartbeat" : ISODate("2019-03-02T04:50:47.382Z"), 98 "lastHeartbeatRecv" : ISODate("2019-03-02T04:50:46.183Z"), 99 "pingMs" : NumberLong(0), 100 "lastHeartbeatMessage" : "", 101 "syncingTo" : "192.168.1.230:27017", 102 "syncSourceHost" : "192.168.1.230:27017", 103 "syncSourceId" : 0, 104 "infoMessage" : "", 105 "configVersion" : 1 106 } 107 ], 108 "ok" : 1, 109 "operationTime" : Timestamp(1551502238, 1), 110 "$clusterTime" : { 111 "clusterTime" : Timestamp(1551502238, 1), 112 "signature" : { 113 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 114 "keyId" : NumberLong(0) 115 } 116 } 117 } 118 repset:PRIMARY>
5)查看是否為主節點(可在其他節點執行查看)
1 repset:PRIMARY> rs.isMaster() 2 { 3 "hosts" : [ 4 "192.168.1.230:27017", 5 "192.168.1.18:27017", 6 "192.168.1.247:27017" 7 ], 8 "setName" : "repset", 9 "setVersion" : 1, 10 "ismaster" : true, 11 "secondary" : false, 12 "primary" : "192.168.1.230:27017", 13 "me" : "192.168.1.230:27017", 14 "electionId" : ObjectId("7fffffff0000000000000001"), 15 "lastWrite" : { 16 "opTime" : { 17 "ts" : Timestamp(1551502348, 1), 18 "t" : NumberLong(1) 19 }, 20 "lastWriteDate" : ISODate("2019-03-02T04:52:28Z"), 21 "majorityOpTime" : { 22 "ts" : Timestamp(1551502348, 1), 23 "t" : NumberLong(1) 24 }, 25 "majorityWriteDate" : ISODate("2019-03-02T04:52:28Z") 26 }, 27 "maxBsonObjectSize" : 16777216, 28 "maxMessageSizeBytes" : 48000000, 29 "maxWriteBatchSize" : 100000, 30 "localTime" : ISODate("2019-03-02T04:52:32.106Z"), 31 "logicalSessionTimeoutMinutes" : 30, 32 "minWireVersion" : 0, 33 "maxWireVersion" : 7, 34 "readOnly" : false, 35 "ok" : 1, 36 "operationTime" : Timestamp(1551502348, 1), 37 "$clusterTime" : { 38 "clusterTime" : Timestamp(1551502348, 1), 39 "signature" : { 40 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 41 "keyId" : NumberLong(0) 42 } 43 } 44 }
6)可登入副本集副本節點,並查看是否為主節點或副本節點
1 [root@mongodb02 ~]# mongo --host 192.168.1.18 2 3 repset:SECONDARY> 4 5 repset:SECONDARY> rs.isMaster() 6 { 7 "hosts" : [ 8 "192.168.1.230:27017", 9 "192.168.1.18:27017", 10 "192.168.1.247:27017" 11 ], 12 "setName" : "repset", 13 "setVersion" : 1, 14 "ismaster" : false, 15 "secondary" : true, 16 "primary" : "192.168.1.230:27017", 17 "me" : "192.168.1.18:27017", 18 "lastWrite" : { 19 "opTime" : { 20 "ts" : Timestamp(1551502458, 1), 21 "t" : NumberLong(1) 22 }, 23 "lastWriteDate" : ISODate("2019-03-02T04:54:18Z"), 24 "majorityOpTime" : { 25 "ts" : Timestamp(1551502458, 1), 26 "t" : NumberLong(1) 27 }, 28 "majorityWriteDate" : ISODate("2019-03-02T04:54:18Z") 29 }, 30 "maxBsonObjectSize" : 16777216, 31 "maxMessageSizeBytes" : 48000000, 32 "maxWriteBatchSize" : 100000, 33 "localTime" : ISODate("2019-03-02T04:54:27.819Z"), 34 "logicalSessionTimeoutMinutes" : 30, 35 "minWireVersion" : 0, 36 "maxWireVersion" : 7, 37 "readOnly" : false, 38 "ok" : 1, 39 "operationTime" : Timestamp(1551502458, 1), 40 "$clusterTime" : { 41 "clusterTime" : Timestamp(1551502458, 1), 42 "signature" : { 43 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 44 "keyId" : NumberLong(0) 45 } 46 } 47 }
三、登入副本集副本集節點驗證數據復制功能(默認副本集的副本節點不能查看數據)
1、在主節點mongodb01上插入數據,在副本節點查看數據
1 repset:PRIMARY> use test 2 switched to db test 3 4 repset:PRIMARY> db.test.save({id:"one",name:"wushaoyu"}) 5 WriteResult({ "nInserted" : 1 })
2、進入副本節點mongodb02查看主庫插入的數據
1 repset:SECONDARY> use test 2 switched to db test 3 repset:SECONDARY> show dbs 4 2019-03-02T13:07:06.503+0800 E QUERY [js] Error: listDatabases failed:{ 5 "operationTime" : Timestamp(1551503218, 1), 6 "ok" : 0, 7 "errmsg" : "not master and slaveOk=false", 8 "code" : 13435, 9 "codeName" : "NotMasterNoSlaveOk", 10 "$clusterTime" : { 11 "clusterTime" : Timestamp(1551503218, 1), 12 "signature" : { 13 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 14 "keyId" : NumberLong(0) 15 } 16 } 17 } : 18 _getErrorWithCode@src/mongo/shell/utils.js:25:13 19 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1 20 shellHelper.show@src/mongo/shell/utils.js:865:19 21 shellHelper@src/mongo/shell/utils.js:755:15 22 @(shellhelp2):1:1
注:上面出現了報錯
因為主庫插入的數據,從庫是不具備讀的權限的,所以要設置副本節點可以讀
1 repset:SECONDARY> db.getMongo().setSlaveOk(); 2 3 repset:SECONDARY> db.test.find() 4 { "_id" : ObjectId("5c7a0f3a6698c70ef075f0a8"), "id" : "one", "name" : "wushaoyu" } 5 6 repset:SECONDARY> show tables 7 test
注:由此看到,副本節點已經把主節點的數據復制過來了(在mongodb03上做同樣操作即可)
四、驗證故障轉移功能,停止當前副本主節點,驗證高可用
先停止副本主節點,在查看副本節點的狀態,
1)停止副本主節點的mongodb
1 [root@mongodb01 ~]# ps -ef |grep mongod 2 mongod 27170 1 0 12:48 ? 00:00:06 /usr/bin/mongod -f /etc/mongod.conf 3 root 27335 5388 0 13:15 pts/3 00:00:00 grep mongod 4 5 [root@mongodb01 ~]# kill -9 27170
2)登錄其他兩個副本集節點,查看是否推選出新的主節點
1 [root@mongodb02 ~]# mongo --host 192.168.1.18 2 3 repset:SECONDARY> rs.isMaster() 4 { 5 "hosts" : [ 6 "192.168.1.230:27017", 7 "192.168.1.18:27017", 8 "192.168.1.247:27017" 9 ], 10 "setName" : "repset", 11 "setVersion" : 1, 12 "ismaster" : false, 13 "secondary" : true, 14 "primary" : "192.168.1.247:27017", 15 "me" : "192.168.1.18:27017", 16 "lastWrite" : { 17 "opTime" : { 18 "ts" : Timestamp(1551503801, 1), 19 "t" : NumberLong(2) 20 }, 21 "lastWriteDate" : ISODate("2019-03-02T05:16:41Z"), 22 "majorityOpTime" : { 23 "ts" : Timestamp(1551503801, 1), 24 "t" : NumberLong(2) 25 }, 26 "majorityWriteDate" : ISODate("2019-03-02T05:16:41Z") 27 }, 28 "maxBsonObjectSize" : 16777216, 29 "maxMessageSizeBytes" : 48000000, 30 "maxWriteBatchSize" : 100000, 31 "localTime" : ISODate("2019-03-02T05:16:48.433Z"), 32 "logicalSessionTimeoutMinutes" : 30, 33 "minWireVersion" : 0, 34 "maxWireVersion" : 7, 35 "readOnly" : false, 36 "ok" : 1, 37 "operationTime" : Timestamp(1551503801, 1), 38 "$clusterTime" : { 39 "clusterTime" : Timestamp(1551503801, 1), 40 "signature" : { 41 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 42 "keyId" : NumberLong(0) 43 } 44 } 45 } 46 47 [root@mongodb03 ~]# mongo --host 192.168.1.247 48 49 repset:PRIMARY> rs.isMaster() 50 { 51 "hosts" : [ 52 "192.168.1.230:27017", 53 "192.168.1.18:27017", 54 "192.168.1.247:27017" 55 ], 56 "setName" : "repset", 57 "setVersion" : 1, 58 "ismaster" : true, 59 "secondary" : false, 60 "primary" : "192.168.1.247:27017", 61 "me" : "192.168.1.247:27017", 62 "electionId" : ObjectId("7fffffff0000000000000002"), 63 "lastWrite" : { 64 "opTime" : { 65 "ts" : Timestamp(1551503971, 1), 66 "t" : NumberLong(2) 67 }, 68 "lastWriteDate" : ISODate("2019-03-02T05:19:31Z"), 69 "majorityOpTime" : { 70 "ts" : Timestamp(1551503971, 1), 71 "t" : NumberLong(2) 72 }, 73 "majorityWriteDate" : ISODate("2019-03-02T05:19:31Z") 74 }, 75 "maxBsonObjectSize" : 16777216, 76 "maxMessageSizeBytes" : 48000000, 77 "maxWriteBatchSize" : 100000, 78 "localTime" : ISODate("2019-03-02T05:19:35.282Z"), 79 "logicalSessionTimeoutMinutes" : 30, 80 "minWireVersion" : 0, 81 "maxWireVersion" : 7, 82 "readOnly" : false, 83 "ok" : 1, 84 "operationTime" : Timestamp(1551503971, 1), 85 "$clusterTime" : { 86 "clusterTime" : Timestamp(1551503971, 1), 87 "signature" : { 88 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 89 "keyId" : NumberLong(0) 90 } 91 } 92 }
ps:發現主節點宕機之后,mongodb03為新推選出來的主節點
3)在新的主節點mongodb03插入數據,在mongodb02上查看是否同步
1 [root@mongodb03 ~]# mongo --host 192.168.1.247 2 3 repset:PRIMARY> use wsy 4 switched to db wsy 5 repset:PRIMARY> db.wsy.save({"name":"wsy"}) 6 WriteResult({ "nInserted" : 1 }) 7 8 [root@mongodb02 ~]# mongo --host 192.168.1.18 9 10 repset:SECONDARY> db.getMongo().setSlaveOk(); 11 repset:SECONDARY> show tables 12 wsy 13 14 repset:SECONDARY> db.wsy.find() 15 { "_id" : ObjectId("5c7a133007ebf60ac5870bae"), "name" : "wsy" }
由此可看出,數據同步成功
4)啟動先前的mongodb01,查看狀態,mongodb成為了當前主節點的副本節點,並且在它宕機期間插入的數據也同步了過來
1 [root@mongodb01 ~]# /etc/init.d/mongod start 2 3 [root@mongodb01 ~]# mongo --host 192.168.1.230 4 5 repset:SECONDARY> rs.isMaster() 6 { 7 "hosts" : [ 8 "192.168.1.230:27017", 9 "192.168.1.18:27017", 10 "192.168.1.247:27017" 11 ], 12 "setName" : "repset", 13 "setVersion" : 1, 14 "ismaster" : false, 15 "secondary" : true, 16 "primary" : "192.168.1.247:27017", 17 "me" : "192.168.1.230:27017", 18 "lastWrite" : { 19 "opTime" : { 20 "ts" : Timestamp(1551504771, 1), 21 "t" : NumberLong(2) 22 }, 23 "lastWriteDate" : ISODate("2019-03-02T05:32:51Z"), 24 "majorityOpTime" : { 25 "ts" : Timestamp(1551504771, 1), 26 "t" : NumberLong(2) 27 }, 28 "majorityWriteDate" : ISODate("2019-03-02T05:32:51Z") 29 }, 30 "maxBsonObjectSize" : 16777216, 31 "maxMessageSizeBytes" : 48000000, 32 "maxWriteBatchSize" : 100000, 33 "localTime" : ISODate("2019-03-02T05:32:59.225Z"), 34 "logicalSessionTimeoutMinutes" : 30, 35 "minWireVersion" : 0, 36 "maxWireVersion" : 7, 37 "readOnly" : false, 38 "ok" : 1, 39 "operationTime" : Timestamp(1551504771, 1), 40 "$clusterTime" : { 41 "clusterTime" : Timestamp(1551504771, 1), 42 "signature" : { 43 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 44 "keyId" : NumberLong(0) 45 } 46 } 47 }
#開啟副本節點讀的權限
1 repset:SECONDARY> db.getMongo().setSlaveOk(); 2 repset:SECONDARY> db.wsy.find() 3 { "_id" : ObjectId("5c7a133007ebf60ac5870bae"), "name" : "wsy" }
注:在原來的主節點宕機期間,新選舉出來的主機插入的數據,也會同步過來
五、java程序連接副本集測試
public class TestMongoDBReplSet { public static void main(String[] args) { try { List<ServerAddress> addresses = new ArrayList<ServerAddress>(); ServerAddress address1 = new ServerAddress("192.168.1.230" , 27017); ServerAddress address2 = new ServerAddress("192.168.1.18" , 27017); ServerAddress address3 = new ServerAddress("192.168.1.247" , 27017); addresses.add(address1); addresses.add(address2); addresses.add(address3); MongoClient client = new MongoClient(addresses); DB db = client.getDB( "test"); DBCollection coll = db.getCollection( "testdb"); // 插入 BasicDBObject object = new BasicDBObject(); object.append( "test2", "testval2" ); coll.insert(object); DBCursor dbCursor = coll.find(); while (dbCursor.hasNext()) { DBObject dbObject = dbCursor.next(); System. out.println(dbObject.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
目前看起來支持完美的故障轉移了,這個架構是不是比較完美了?其實還有很多地方可以優化
六、副本集開啟用戶認證模式
1、創建keyFile文件
keyFile文件的作用: 集群之間的安全認證,增加安全認證機制KeyFile(開啟keyfile認證就默認開啟了auth認證了,為了保證后面可以登錄,我已創建了用戶)
openssl rand -base64 666 > /root/keyfile 其中666是文件大小 /root/keyfile : 文件存放路徑
##該key的權限必須是600;也可改為400
chmod 600 /root/keyfile
注:創建秘鑰文件可添置mongodb副本集,在創建,防止服務無法啟動等原因
2、修改配置文件
security: authorization: enabled keyFile: /root/keyfile clusterAuthMode: keyFile
3、重新啟動mongodb節點
[root@ecs-1e54-0001 ~]# mongod -f /etc/mongod.conf 2019-04-20T13:05:11.479+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 26977 child process started successfully, parent exiting
注:此處啟動需使用這種指定文件的方式啟動。因為本人安裝mongodb采用rpm包安裝,故啟動是可用/etc/init.d/mongod start的方式啟動,但是在副本集開啟了用戶認證的方式下,在采取這種啟動方式,因為啟動腳本的內容原因,就會報錯permission denied,導致啟動服務失敗。
4、連接驗證
[root@ecs-2c32 mongodb]# mongo 192.168.1.193:27017 MongoDB shell version v4.0.0 connecting to: mongodb://192.168.1.193:27017/test MongoDB server version: 4.0.0 repset:PRIMARY> show dbs 2019-04-20T13:22:49.421+0800 E QUERY [js] Error: listDatabases failed:{ "operationTime" : Timestamp(1555737763, 1), "ok" : 0, "errmsg" : "command listDatabases requires authentication", "code" : 13, "codeName" : "Unauthorized", "$clusterTime" : { "clusterTime" : Timestamp(1555737763, 1), "signature" : { "hash" : BinData(0,"hKSQT5ImwURihIb0w/CeT4vu44E="), "keyId" : NumberLong("6681818258909167617") } } } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1 shellHelper.show@src/mongo/shell/utils.js:865:19 shellHelper@src/mongo/shell/utils.js:755:15 @(shellhelp2):1:1
可看出此處需要用戶認證方可查看數據
repset:PRIMARY> use admin switched to db admin repset:PRIMARY> db.auth('admin','admin') 1 repset:PRIMARY> show dbs admin 0.000GB config 0.000GB local 0.000GB
七、仲裁節點
副本集只能由主節點來接收寫操作,而副本節點可以專門用來讀操作
當副本節點增多時,主節點的復制壓力就會增大,這是就可以添加仲裁節點
在副本集里,仲裁節點仲裁節點不存儲數據,只是負責故障轉移的群體投票,這樣就少了數據復制的壓力
1)添加仲裁節點192.168.1.7
1 repset:PRIMARY> rs.addArb("192.168.1.7:27017") 2 { 3 "ok" : 1, 4 "operationTime" : Timestamp(1551519513, 1), 5 "$clusterTime" : { 6 "clusterTime" : Timestamp(1551519513, 1), 7 "signature" : { 8 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 9 "keyId" : NumberLong(0) 10 } 11 } 12 }
2)查看節點信息
1 repset:PRIMARY> rs.isMaster() 2 { 3 "hosts" : [ 4 "192.168.1.18:27017", 5 "192.168.1.247:27017", 6 "192.168.1.230:27017" 7 ], 8 "arbiters" : [ 9 "192.168.1.7:27017" 10 ], 11 "setName" : "repset", 12 "setVersion" : 8, 13 "ismaster" : true, 14 "secondary" : false, 15 "primary" : "192.168.1.18:27017", 16 "me" : "192.168.1.18:27017", 17 "electionId" : ObjectId("7fffffff0000000000000003"), 18 "lastWrite" : { 19 "opTime" : { 20 "ts" : Timestamp(1551519513, 1), 21 "t" : NumberLong(3) 22 }, 23 "lastWriteDate" : ISODate("2019-03-02T09:38:33Z"), 24 "majorityOpTime" : { 25 "ts" : Timestamp(1551519513, 1), 26 "t" : NumberLong(3) 27 }, 28 "majorityWriteDate" : ISODate("2019-03-02T09:38:33Z") 29 }, 30 "maxBsonObjectSize" : 16777216, 31 "maxMessageSizeBytes" : 48000000, 32 "maxWriteBatchSize" : 100000, 33 "localTime" : ISODate("2019-03-02T09:38:45.054Z"), 34 "logicalSessionTimeoutMinutes" : 30, 35 "minWireVersion" : 0, 36 "maxWireVersion" : 7, 37 "readOnly" : false, 38 "ok" : 1, 39 "operationTime" : Timestamp(1551519513, 1), 40 "$clusterTime" : { 41 "clusterTime" : Timestamp(1551519513, 1), 42 "signature" : { 43 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 44 "keyId" : NumberLong(0) 45 } 46 } 47 }
3)登錄仲裁節點查看狀態
1 repset:ARBITER> db.getMongo().setSlaveOk(); 2 repset:ARBITER> rs.isMaster() 3 { 4 "hosts" : [ 5 "192.168.1.18:27017", 6 "192.168.1.247:27017", 7 "192.168.1.230:27017" 8 ], 9 "arbiters" : [ 10 "192.168.1.7:27017" 11 ], 12 "setName" : "repset", 13 "setVersion" : 8, 14 "ismaster" : false, 15 "secondary" : false, 16 "primary" : "192.168.1.18:27017", 17 "arbiterOnly" : true, 18 "me" : "192.168.1.7:27017", 19 "lastWrite" : { 20 "opTime" : { 21 "ts" : Timestamp(1551519790, 1), 22 "t" : NumberLong(3) 23 }, 24 "lastWriteDate" : ISODate("2019-03-02T09:43:10Z"), 25 "majorityOpTime" : { 26 "ts" : Timestamp(1551519790, 1), 27 "t" : NumberLong(3) 28 }, 29 "majorityWriteDate" : ISODate("2019-03-02T09:43:10Z") 30 }, 31 "maxBsonObjectSize" : 16777216, 32 "maxMessageSizeBytes" : 48000000, 33 "maxWriteBatchSize" : 100000, 34 "localTime" : ISODate("2019-03-02T09:43:14.154Z"), 35 "logicalSessionTimeoutMinutes" : 30, 36 "minWireVersion" : 0, 37 "maxWireVersion" : 7, 38 "readOnly" : false, 39 "ok" : 1 40 }