259_Mongodb_集合_分片集合1
MongoDB 分片
MongoDB分片集群,可以滿足MongoDB數據量大量增長的需求,通過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據
1 分片集角色
Mongos (Query Routers)
前端路由,客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用
本身不存儲數據和索引信息, 數據的查詢目錄和索引信息被保存config server上,可以考慮將mongos與應用服務器部署在同一臺服務器上當應用下架,mongos也隨之消失
當集群已經分片的情況下, 應用經過mongos即可對分片數據進行查詢和寫入操作。Mongos根據預先定義好的片鍵字段 從元數據中找出對應位置進行寫入,查詢時如果查詢條件不包括分片鍵字段,則mongos必須在所有分片中查找,效率降低
Config server
保存元數據(ClusterMetadata,其中包括 chunk信息),每個分片上的數據塊列表及每個數據塊的數據范圍, 同時也保存了身份驗證相關信息(角色訪問控制)
Config server要求副本集形態出現,保證其高可用
3.4版本官方不推薦SCCC(sync cluster connection configuration)結構 必須使用CSRS(config server replica set)
Shard 服務
用于存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障,最大1024分片
2 分片集群數據分布方式
分片集群數據分布方式 – 基于范圍
分片集群數據分布方式 – 基于哈希 hash
分片集群數據分布方式 – 自定義Zone/tag
3 分片鍵(shard key)
配置規則讓MongoDB知道數據分配規則, 數據以數據塊(chunk)的形式分布存儲在各分片上。該規則就是分片鍵(shard key)
分片鍵顆粒度適中(數據分配條件) 保證數據塊拆分,搬遷的效果,如果沒有合適分片鍵,可以考慮增加一個與業務無關字段
3.1 Chunk
是分片中數據拆分出的一個區間, 存儲集合中一部分數據,隨著數據的增大,chunk會分裂和遷移,默認64M
3.2 分片鍵的配置
1 啟動分片
Sh.enableSharding(
2 設置分片鍵
sh.shardCollection(
3 控制數據分發:多地域Zone分片 (tag)
應用程序可以指定數據存放在某個分片/機房服務器上,依賴分片的標簽(tag),應用場景:
冷熱數據分離
Zone 就近讀寫
config = {_id: 'SZ_sh', members: [ {_id: 0, host:'10.0.0.51:20001'}, {_id: 1, host:'10.0.0.51:20002'}, {_id: 2, host:'10.0.0.52:20003'}] } config = {_id: 'SH_sh', members: [ {_id: 0, host:'10.0.0.51:20001'}, {_id: 1, host:'10.0.0.51:20002'}, {_id: 2, host:'10.0.0.52:20003'}] } db.runCommand( { addshard :"SZ_sh/10.0.0.51:20001,10.0.0.51:20002,10.0.0.52:20003",name:"SZ_sh"} ) db.runCommand( { addshard :"SH_sh/10.0.0.52:20001,10.0.0.52:20002,10.0.0.51:20003",name:"SH_sh"} ) Sh.enableSharding("zone_db") sh.shardCollection("zone_db.Members",{"city":1, "zipCode":1}) db.runCommand( { enablesharding : "zonedb" } ) sh.shardCollection("zonedb.vast", {order_id: 1});
1 分片標簽的設置 語法 sh.addShardTag(
4 平衡器 Balancer
分片鍵是數據分片的依據, 且數據拆分是以數據塊(chunk)為基本單位, 平衡器是確保每個分片保存的數據量(數據塊) 保持相對平衡的狀態
平衡器是以 數據塊為單位進行搬遷, 一個chunk包括0/多個文檔,一個分片包括0/多個 chunk
5 數據塊chunk
chunk 默認64M, 合理配置chunk大小
chunk過小 會導致頻繁拆分和搬遷,影響集群性能
chunk過大 會導致數據不易拆分,擠壓在某個分片上出現負載過高
均勻程度
網絡傳輸影響
遷移程度
每次網絡傳輸量
Chunk數量
Chunk size 越大
越差
越大
次數越小
越大
越少
Chunk size 越小
越好
越小
次數越頻繁
越小
越多
Chunk 分裂條件
當數據塊大小達到設定值
當chunk中的文檔數量超過最大值
命令查看狀態和操作平衡器
mongos> sh.getBalancerState() true mongos> sh.stopBalancer() mongos> sh.startBalancer()
手動搬遷命令
sh.moveChunk(
在config數據庫中, 可以運行指令來看lock集合中記錄的平衡器狀態(lock是系統集合,不允許手動操作) db.locks.find({"_id": "balancer"}) { "_id" : "balancer", "state": 2, # 2表示平衡器正在運行, 0表示 平衡器被關閉 "ts": ObjectId("52xxxxxxxx"), "who": "ConfigServer:Balancer", "process": "ConfigServer", "when": ISODate("XXXX-XX-XXTXXX") "Why" : "CSRS Balancer" }
平衡器的作用
MongoDB會周期性檢查分片是否均勻分布, 考慮的是每個分片chunk的數量,并非文檔的數據大小和數量, chunk數量不均勻 就會發生搬遷
搬遷期間,客戶端訪問仍是原分片的chunk,直到chunk搬遷完成更新元數據,mongos才會重新指向目的端分片
Chunk遷移閾值條件
Chunk數量
遷移閾值
備注
[1,20 )
2
集合分片的chunk在20個內時, 若分片間的chunk 數量差異超過2個,觸發chunk搬遷
[20,80 )
4
差異超過4個
[80,max )
8
Chunk分裂根據chunk大小,chunk數量 進行拆分依據
Chunk數量
分裂閾值
1
1024M
[1,3)
0.5M
[3,10 )
16M
[10,20 )
32M
[20,max )
64M
MongoDB 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。