1. 程式人生 > >13、MongoDB的分片,以及分散式的實現(分片,拆分的是集合,不是單條資料)

13、MongoDB的分片,以及分散式的實現(分片,拆分的是集合,不是單條資料)

 1、分片(sharding)

       分片,是指將資料拆分,將其分散存在不同的機器上的過程。 有時也用分割槽(partitioning)來表示這個概念。將資料分散到不同的機器上,不需要功能強大的大型計算機就可以儲存更多的資料,處理更多的負載。

2、MongoDB分片的基本思想就是將集合切分成小塊。 

        這些塊分散到若干片裡面,每個片只負責總資料的一部分。 應用程式不必知道哪片對應哪些資料,甚至不需要知道資料已經被拆分了。所以在分片之前要執行一個路由程序,該程序名為mongos。這個路由器知道所有資料的存放位置,所以應用可以連線它來正常傳送請求。 對應用來說,它僅知道連線了一個普通的mongod。路由器知道資料和片的對應關係,能夠轉發請求到正確的片上。如果請求有了迴應,路由器將其收集起來回送給應用。



3、 設定分片時,需要從集合裡面選一個鍵,用該鍵的值作為資料拆分的依據。這個鍵稱為片鍵(shard key)。
            {name:"zhangsan",age:1}
             用個例子來說明這個過程:
                 假設有個文件集合表示的是人員。如果選擇名字("name")作為片鍵,
                 第一片可能會存放名字以A~F開頭的文件,
                 第二片存的G~P的名字,第三片存的Q~Z的名字。

                 隨著新增或者刪除片,MongoDB會重新平衡資料,使每片的流量都比較均衡,資料量也在合理範圍內。

4、MongoDB分片實現分散式的案例

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

      2、開啟config伺服器 。mongos要把mongod之間的配置放到config伺服器裡面,所以首先開啟它,這裡就使用2222埠。

mongod --dbpath D:\mongodb\config  --port 2222
      3、開啟mongos伺服器 。這裡要注意的是我們開啟的是mongos,埠3333,同時指定下config伺服器
mongos --port 3333 --configdb=127.0.0.1:2222
     4、啟動mongod伺服器 。對分片來說,也就是要新增片了,這裡開啟三個mongod服務,埠分別為:4444,5555,6666。
mongod --dbpath D:\mongodb\node4444 --port 4444
mongod --dbpath D:\mongodb\node5555 --port 5555 
mongod --dbpath D:\mongodb\node6666 --port 6666

     5、服務配置 。client直接跟mongos打交道,也就說明我們要連線mongos伺服器,然後將4444,5555,6666的mongod交給mongos,新增分片也就是addshard()。
mongo localhost:3333/admin  #client直接跟mongos打交道
db.runCommand({"addshard":"127.0.0.1:4444",allowLocal:true})
db.runCommand({"addshard":"127.0.0.1:5555",allowLocal:true})
db.runCommand({"addshard":"127.0.0.1:6666",allowLocal:true})

   6、開啟資料庫分片功能,命令很簡單enablesharding(),這裡就開啟test資料庫
db.runCommand({"enablesharding":"test"})
   7、指定集合中分片的片鍵,這裡就指定為person.name鍵
db.runCommand({"shardcollection":"test.person","key":{"name":1}})

   8、通過客戶端,連線mongos,然後通過mongos插入10w記錄,然後通過printShardingStatus命令檢視mongodb的資料分片情況

mongos > use test
mongos > for ( var i=0; i<=100000;i++){
    db.person.insert({name:"tom","age":i})
    }
mongos > db.printShardingStatus()

  9、檢視資料的分片情況

mongo localhost:4444/test
db.person.find().count()


mongo localhost:5555/test
db.person.find().count() 


mongo localhost:6666/test
db.person.find().count()