6.mongodb之sharding-cluster(分片叢集)分片詳細介紹
阿新 • • 發佈:2020-11-11
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;