1. 程式人生 > >MongoDB複製集簡單操作

MongoDB複製集簡單操作

一、MongoDB複製集介紹

1、如下圖所示有一個數據庫叢集,叢集中有三臺資料庫伺服器,一臺活躍伺服器和兩臺備份伺服器。當活躍伺服器A發生故障時,會根據權重演算法從備份伺服器B和C中選出B作為新的活躍伺服器,而當A恢復時當成備份伺服器,繼續加入到整個資料庫叢集中工作,這就是MongoDB的副本集。

2、配置一個副本集

2.1 在npfdev1,npfdev2,npfdev3三臺機器上的mongodb.conf增加配置:

replSet=kgpcReplSet, 指定了複製集的名稱. 為了使用方便,我們暫時不要使用auth啟動,去掉auth引數。

2.2 啟動MongoDB,使用 service mongod start 命令.

2.3 然後就需要初始化複製集。進入到這三臺資料庫伺服器中任何一個的admin資料庫,執行如下圖的操作來初始化複製集:這裡沒有設定這三臺伺服器的權重,MonggoDB推選活躍伺服器的策略是隨機的。

2.3.1 那麼使用命令mongo npfdev1:27017/admin

2.3.2 初始化複製集, 執行如下命令:

db.runCommand({"replSetInitiate":{
    "_id":"kgpcReplSet",
    "members":[
        {"_id":1,"host":"npfdev1:27017"},
        {"_id":2,"host":"npfdev2:27017"},
        {"_id":3,"host":"npfdev3:27017"}
    ]
}}
);

 

2.3.4 分別進入到這三臺伺服器的shell介面.可以發現npfdev1的伺服器被推選成了活躍伺服器,而其它兩臺就是備份伺服器.

2.3.5 在活躍伺服器shell中可以使用“rs.status()”來檢視副本集的狀態。

kgpcReplSet:PRIMARY> rs.status();
{
    "set" : "kgpcReplSet",
    "date" : ISODate("2017-05-05T13:05:29.158Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 1,
            "name" : "npfdev1:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 268,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "electionTime" : Timestamp(1493989298, 1),
            "electionDate" : ISODate("2017-05-05T13:01:38Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "npfdev2:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "lastHeartbeat" : ISODate("2017-05-05T13:05:28.555Z"),
            "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.549Z"),
            "pingMs" : NumberLong(1),
            "syncingTo" : "npfdev1:27017",
            "configVersion" : 1
        },
        {
            "_id" : 3,
            "name" : "npfdev3:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "lastHeartbeat" : ISODate("2017-05-05T13:05:28.557Z"),
            "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.554Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "npfdev1:27017",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}
kgpcReplSet:PRIMARY> 

2.3.6 複製集如下圖:

複製集使用的非同步同步方式,複製整合員之間每隔2s傳送一次hearbeat(pings).當主節點與其它成員通訊超時10s後,一個secondary節點將會被選舉為primary節點.在新的版本中,如果存在多個secondary節點,當第一個節點被選舉為primary後,其它的secondary節點將從它開始複製資料.

2.3.7 讀寫分離操作,注意:預設情況下非活躍伺服器(SECONDARY)是不能進行資料庫讀操作的。如下圖:

如果要設定SECONDARY節點也可以進行讀操作,那麼可以設定slaveOk引數為true。但是此屬性在shell中無法完成,這個特性是被寫到MongoDB的高階驅動程式中的。

參考文獻