1. 程式人生 > 資料庫 >6.mongodb之sharding-cluster(分片叢集)分片詳細介紹

6.mongodb之sharding-cluster(分片叢集)分片詳細介紹

1.分片鍵的選擇

  

mongodb一般有兩種分片策略:range和hash(雜湊)

分片主要的事項:

  1.分片鍵是不可變

  2.分片鍵必須有索引

  3.分片建大小限制512bytes

  4.分片鍵用於路由查詢

  5.mangodb不接受已經collection級分片的collection上插入無分片鍵的文件(也不支援空值插入)

 

2.range 分片策略和測試

  2.1 啟用資料庫分片功能

mongo --port 38017 admin
admin>  ( { enablesharding : "資料庫名稱" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )

  2.2 指定分片鍵對集合分片

### 建立索引
use test
> db.vast.ensureIndex( { id: 1 } )
### 開啟分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )   ####### id:1指的是分片順序按照從小到大 

  2.3 集合分片驗證 

admin> use test
test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()

  2.4 分片集合測試 

shard1:
mongo --port 38021
db.vast.count();

shard2:
mongo --port 38024
db.vast.count();

 

3.Hash分片叢集

對oldboy庫下的vast大表進行hash
建立雜湊索引
(1)對於oldboy開啟分片功能
mongo --port 38017 admin
use admin
admin> db.runCommand( { enablesharding : "oldboy" } )
(2)對於oldboy庫下的vast表建立hash索引
use oldboy
oldboy> db.vast.ensureIndex( { id: "hashed" } )
(3)開啟分片 
use admin
admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)錄入10w行資料測試
use oldboy
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }   ####這個迴圈其實一共只有999999行資料
(5)hash分片結果測試
mongo --port 38021
use oldboy
db.vast.count();
mongo --port 38024
use oldboy
db.vast.count();

#######測試結果是 shar1:50393個文件 shar2:49606個文件

 

4. 分片叢集的查詢及管理

4.1 判斷是否Shard叢集
admin> db.runCommand({ isdbgrid : 1})
4.2 列出所有分片資訊
admin> db.runCommand({ listshards : 1})
4.3 列出開啟分片的資料庫
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有資料庫分片情況
4.4 檢視分片的片鍵
config> db.collections.find().pretty()
{
    "_id" : "test.vast",
    "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
    "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
    "dropped" : false,
    "key" : {
        "id" : 1
    },
    "unique" : false
}
4.5 檢視分片的詳細資訊 
admin> sh.status()   ##########一般用這個命令進行檢視
4.6 刪除分片節點(謹慎)

(1)確認blance是否在工作
sh.getBalancerState()
(2)刪除shard2節點(謹慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:刪除操作一定會立即觸發blancer。

 

5. balancer

  5.1 介紹:

mongos的一個重要功能,自動巡查所有shard節點上的chunk的情況,自動做chunk遷移。
什麼時候工作?
1、自動執行,會檢測系統不繁忙的時候做遷移
2、在做節點刪除的時候,立即開始遷移工作
3、balancer只能在預設定的時間視窗內執行

有需要時可以關閉和開啟blancer(備份的時候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()

  5.2 自定義 自動平衡進行的時間段

https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
// connect to mongos

use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )  #####這個自定義自動平衡進行的時間段(3:00-5:00)

sh.getBalancerWindow()
sh.status()

關於集合的balancer(瞭解下)
關閉某個集合的balance
sh.disableBalancing("students.grades")
開啟某個集合的balancer
sh.enableBalancing("students.grades")
確定某個集合的balance是開啟或者關閉
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;