Mongodb副本集部署+用戶認證


工作原理

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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM