MongoDB複製


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

為什麼複製?

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

MongoDB複製的工作原理

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

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

顯示了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>