復(fù)制是一種在多個(gè)服務(wù)器上同步數(shù)據(jù)的過程。通過在不同的數(shù)據(jù)庫服務(wù)器上實(shí)現(xiàn)多個(gè)數(shù)據(jù)副本,復(fù)制能夠?qū)崿F(xiàn)數(shù)據(jù)冗余,提高數(shù)據(jù)的可用性,從而避免了僅僅因?yàn)橐慌_(tái)服務(wù)器故障后就會(huì)產(chǎn)生的數(shù)據(jù)庫災(zāi)難。總之,復(fù)制可以使你免受硬件故障與服務(wù)中斷的影響,及時(shí)恢復(fù)數(shù)據(jù)。由于數(shù)據(jù)有多個(gè)副本,所以可以將其中一個(gè)副本用于災(zāi)難恢復(fù)、報(bào)告或備份。
MongoDB 使用副本集(replica set)來實(shí)現(xiàn)復(fù)制操作。副本集是一組托管同一數(shù)據(jù)集的 mongod 對象。在副本集中,主節(jié)點(diǎn)負(fù)責(zé)接收寫入操作。所有其他的實(shí)例(從節(jié)點(diǎn))則通過執(zhí)行主節(jié)點(diǎn)的操作來擁有同樣的數(shù)據(jù)集。副本集中只有一個(gè)主節(jié)點(diǎn)。
下圖展示了一個(gè)典型的 MongoDB 復(fù)制圖??蛻舳藨?yīng)用總是跟主節(jié)點(diǎn)交互,主節(jié)點(diǎn)將數(shù)據(jù)復(fù)制到從節(jié)點(diǎn)上。
http://wiki.jikexueyuan.com/project/mongodb/images/replication.png" alt="replication" />
在本教程中,我們將把單獨(dú)的一個(gè) mongod 實(shí)例轉(zhuǎn)變?yōu)楦北炯?,步驟如下:
關(guān)閉正在運(yùn)行的 MongoDB 服務(wù)器。
指定 --replSet 選項(xiàng)來開啟 MongoDB 服務(wù)器。--replSet 的基本格式如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
該命令會(huì)在端口 27017 處啟動(dòng)一個(gè)名為 rs0 的 MongoDB 實(shí)例。在命令行提示符上輸入命令連接到該 MongoDB 對象上。在 MongoDB 客戶端使用 rs.initiate() 命令來初始化一個(gè)新的副本集。檢查該副本集設(shè)置,則需使用 rs.conf()。檢查副本集狀態(tài)使用 rs.status()。
為了向副本集添加成員,在多臺(tái)機(jī)器上開啟多個(gè) MongoDB 實(shí)例。開啟一個(gè) MongoDB 客戶端,然后使用 rs.add() 命令。
基本的 rs.add() 命令語法格式如下所示:
>rs.add(HOST_NAME:PORT)
假設(shè) MongoDB 實(shí)例名稱為 mongodb1.net,且運(yùn)行在 27017 端口處。為了將該實(shí)例添加到副本集中,請?jiān)?MongoDB 客戶端中使用 rs.add()。
>rs.add("mongod1.net:27017")
>
只有當(dāng)連接到主節(jié)點(diǎn)上時(shí),才能向副本集中添加 MongoDB 實(shí)例。要想查看是否連接的是主節(jié)點(diǎn),請?jiān)?MongoDB 客戶端上使用 db.isMaster() 命令。