天天看點

MongoDB總結(三):mongoDB的主從複制、副本集、分布式部署

1. 主從複制

  主從複制是MongoDB最常用的複制方式。這種方式非常靈活,可用于備份、故障恢複、讀擴充等。

  MongoDB的複制至少需要兩個伺服器或者節點。其中一個是主節點,負責處理用戶端請求,其它的都是從節點,負責映射主節點的資料。主節點記錄在其上執行的所有操作。從節點定期輪詢主節點獲得這些操作,然後對自己的資料副本執行這些操作。由于和主節點執行了相同的操作,從節點就能保持與主節點的資料同步。

示例:

   在D盤建立兩個目錄master和slave,master目錄作為主節點的資料檔案的目錄,slave目錄作為從節點的資料檔案的目錄。

注意:主節點和從節點要指定不同的端口。

啟動主節點:mongod –dbpath d:\master –port 10000  –master

啟動從節點:mongod –dbpath d:\slave –port 10001 –slave –source localhost:10000

2. 副本集

  副本集就是有自動故障恢複功能的主從叢集。

  主從叢集和副本集最大的差別就是副本集沒有固定的“主節點”;整個叢集會選出一個“主節點”,當其挂掉後,又在剩下的從節點中選中其他節點為“主節點”,副本集總有一個活躍點(primary)和一個或多個備份節點(secondary)。

  

以三個節點為例:

節點1: HOST:localhost:10001

    Log File:D:\mongodb\logs\node1**logs.txt**(該檔案會在建立日志時自動建立)

    Data File:D:\mongodb\dbs\node1

節點2: HOST:localhost:10002

    Log File:D:\mongodb\logs\node2\logs.txt Data

    File:D:\mongodb\dbs\node2

節點3: HOST:localhost:10003

    Log File:D:\mongodb\logs\node3\logs.txt

     Data File:D:\mongodb\dbs\node3

啟動節點1:

mongod –dbpath D:\mongodb\dbs\node1 –logpath D:\mongodb\logs\node1\logs.txt –logappend –port 10001 –replSet ywendeng(副本集的名稱)/localhost:10002 (表示和localhost:10002是一組的)–master(表明該節點為活躍節點)

啟動節點2:

mongod –dbpath D:\mongodb\dbs\node2

–logpath D:\mongodb\logs\node2\logs.txt –logappend –port 10002 –replSet ywendeng/localhost:10001

啟動節點3:

mongod –dbpath D:\mongodb\dbs\node3 –logpath D:\mongodb\logs\node3\logs.txt –logappend –port 10003 –replSet ywendeng/localhost:10001,localhost:10002 

初始化節點(隻能初始化一次):随便登入一個節點,以10001為例

mongo localhost:10001/admin

db.runCommand({ “replSetInitiate”:

{ “_id”:“ywendeng”,

“members”:[

{ “_id”:1, “host”:”localhost:10001”, “priority”:3 },

{ “_id”:2, “host”:”localhost:10002”, “priority”:2 },

{ “_id”:3, “host”:”localhost:10003”, “priority”:1 }

]

}});

參數解釋:

–replSet 指定副本集 後面緊跟着副本集的名稱

–logappend 日志檔案末尾添加

–port 指定端口号

db.runCommand({}) 初始化副本集

初始化文檔:

“_id”:“ywendeng”, 指副本集的名稱

“members”:[…] 副本集的伺服器清單 每個清單有個

   “_id”: 每個伺服器的唯一id,

    “host” 指定伺服器的主機,

   “priority”設定優先級,預設優先級為1,可以是1-1000的數字  

  • 對副本集中節點的屬性檢視操作:

關閉10001服務Dos指令視窗, 登入10002查詢目前主庫  mongo localhost:10002

 db.$cmd.findOne ( {ismaster: 1 } );

  • 預設情況下從庫是不能進行讀寫操作的 設定從庫可讀(在從庫secondary上執行):
rs.slaveOk ( );

3. 分布式部署

  • 在了解分布式部署之前,先了解一下MongoDB中分片的思想。

      MongoDB分片的基本思想就是将集合切分成小塊。這些塊分散到若幹節點上,每個片隻負責總資料的一部分。應用程式不必知道哪片對應哪些資料,甚至不需要知道資料已經被拆分了,是以在分片之前要運作一個路由程序,該程序名為mongos。這個路由器知道所有資料的存放位置,是以應用可以連接配接它來正常發送請求。對應用來說,它僅知道連接配接了一個普通的mongod。路由器知道資料和片的對應關系,能夠轉發請求到正确的片上。如果請求有了回應,路由器将其收集起來回送給應用。

      設定分片時,需要從集合裡面選一個鍵,用該鍵的值作為資料拆分的依據。這個鍵稱為片鍵(shard key)。{name:“shell”,age:1}

  • MongoDB中的分布式部署原理
MongoDB總結(三):mongoDB的主從複制、副本集、分布式部署

  mongos就是一個路由伺服器,它會根據管理者設定的“片鍵”将資料分攤到自己管理的mongod叢集,資料和片的對應關系以及相應的配置資訊儲存在“config伺服器”上。

  mongod:一個普通的資料庫執行個體,如果不分片的話,我們會直接連上mongod。

  

  • MongoDB中的分布式部署步驟

1、建立三個目錄,分别存放兩個mongod服務的資料檔案和config服務的資料檔案

2、開啟config伺服器 。mongos要把mongod之間的配置放到config伺服器裡面,是以首先開啟它,這裡就使用2222端口。 指令為:

mongod –dbpath E:\sharding\config_node –port 2222

3、開啟mongos伺服器 。這裡要注意的是我們開啟的是mongos,端口3333,同時指定下config伺服器。指令為:

mongos –port 3333 –configdb=127.0.0.1:2222

4、啟動mongod伺服器 。對分片來說,也就是要添加片了,這裡開啟兩個mongod服務,端口分别為:4444,5555。指令為:

mongod –dbpath E:\sharding\mongod_node1 –port 4444

mongod –dbpath E:\sharding\mongod_node2 –port 5555

5、服務配置 。client直接跟mongos打交道,也就說明我們要連接配接mongos伺服器,然後将4444,5555的mongod交給mongos,添加分片也就是addshard()。

 mongo localhost:3333/admin 連接配接到mongos 伺服器

 db.runCommand({“addshared”:”localhost:4444”,allowLocal:true})

 db.runCommand({“addshared”:”localhost:5555”,allowLocal:true})

6、開啟資料庫分片功能,指令很簡單 enablesharding(),這裡就開啟test資料庫。

db.runCommand({“enablesharding”:”test”})

7、指定集合中分片的片鍵,這裡就指定為person.name鍵。

db.runCommand({“shardcollection”:”test.shell”,”key”:{“name”:1}})

8、通過mongos插入10w記錄,然後通過printShardingStatus指令檢視mongodb的資料分片情況。

MongoDB總結(三):mongoDB的主從複制、副本集、分布式部署

這裡主要看三點資訊:

① shards: 可以看到已經别分為兩個片了,shard0000和shard0001。

② databases:: 這裡有個partitioned字段表示是否分區,這裡可以看到test已經分區。

③ chunks: 集合被砍成四段:

    無窮小 —— jack0,

   jack0 ——jack234813,

   jack234813——jack9999,

   jack9999——無窮大。