MongoDB複製

複製是跨多個服務器同步數據的過程。複製提供冗餘,並通過不同數據庫服務器上的多個數據副本增加數據可用性。 複製保護數據庫免受單個服務器的丟失。 複製還允許從硬件故障和服務中斷中恢復。 使用其他數據副本,可以將其專用於災難恢復,報告或備份。

爲什麼複製?

  • 保持數據安全
  • 數據的高可用性(24 * 7)
  • 災難恢復
  • 維護無停機(如備份,索引重建,壓縮)
  • 讀取縮放(額外的副本可讀)
  • 副本集對應用程序是透明的

MongoDB複製的工作原理

MongoDB通過使用副本集來實現複製。副本集是託管相同數據集的一組 mongod 實例。 在一個副本中,一個節點是接收所有寫操作的主節點。所有其他實例(例如輔助節點)都應用主節點的操作,以便它們具有相同的數據集。 副本集可以只有一個主節點。

  • 副本集是一組兩個或多個節點(通常最少需要3個節點)。
  • 在副本集中,一個節點是主節點,其餘節點是次要節點。
  • 所有數據從主節點複製到輔助節點。
  • 在自動故障切換或維護時,選擇爲主節點建立,並選擇新的主節點。
  • 恢復故障節點後,它再次加入副本集,並作爲輔助節點。

顯示了MongoDB複製的典型圖,客戶端應用程序始終與主節點進行交互,然後主節點將數據複製到輔助節點。

MongoDB複製

副本集功能

  • N個節點的集羣
  • 任何一個節點都可以是主節點
  • 所有寫入操作都轉到主節點操作
  • 自動故障切換
  • 自動恢復
  • 共識一般選舉

設置副本集

在本教程中,我們將獨立的 MongoDB 實例轉換爲副本集。要轉換爲副本集,以下是步驟 -

  • 關機正在運行 MongoDB 服務器。
  • 通過指定 - replSet選項啓動 MongoDB服 務器。 以下是--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
  • 它在端口27017上啓動名稱爲rs0的 mongod 實例。
  • 現在啓動命令提示符並連接到這個 mongod 實例。
  • 在Mongo客戶端中,發出命令rs.initiate()以啓動新的副本集。
  • 要檢查副本集配置,可使用命令rs.conf()。 要檢查複製集的狀態,請使用命令rs.status()

將會員添加到副本集

要將成員添加到副本集,請在多臺計算機上啓動 mongod 實例。 現在啓動一個 mongo 客戶端併發出一個命令rs.add()

語法

rs.add()命令的基本語法如下:

>rs.add(HOST_NAME:PORT)

示例

假設您的 mongod 實例名稱是 mongod1.net,它在端口 27017 上運行。要將此實例添加到副本集,請在 Mongo 客戶端中發出命令 rs.add()

>rs.add("mongod1.net:27017")
>

只能在連接到主節點時,將 mongod 實例添加到副本集。要檢查是否連接到主服務器,請在 mongo 客戶端中發出命令db.isMaster()

rs0:PRIMARY> db.isMaster()
{
        "hosts" : [
                "ubuntu:27017"
        ],
        "setName" : "rs0",
        "setVersion" : 1,
        "ismaster" : true,
        "secondary" : false,
        "primary" : "ubuntu:27017",
        "me" : "ubuntu:27017",
        "electionId" : ObjectId("7fffffff0000000000000001"),
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1498896581, 1),
                        "t" : NumberLong(1)
                },
                "lastWriteDate" : ISODate("2017-07-01T08:09:41Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 1000,
        "localTime" : ISODate("2017-07-01T08:09:50.365Z"),
        "maxWireVersion" : 5,
        "minWireVersion" : 0,
        "readOnly" : false,
        "ok" : 1
}
rs0:PRIMARY>