259_Mongodb_集合_分片集合1

      網友投稿 693 2025-03-31

      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(,,,) namespace: 要進行分片的集合,指定對應database.collection key: 分片依據的片鍵, 指定分片鍵的字段及排序,1表正向,-1反向,hashed散列分片鍵 unique: true表示唯一約束,hash分片不支持唯一約束 默認為false options: 可選參數 numInitialChunks 和 collation, numInitialChunks 整數,初始化chunk數量(小于8192chunk) collation, 指定字符串的排序規則。默認規則{locale: "simple"} 表字符串按二進制排序 sh.shardCollection("alex_db.tableName", {shardkey : 1}, false, {numInitialChunks:5, collation:{locale:"simple"}})

      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(,) 例 sh.addShardTag("SZ_sh","Tag_SZ") sh.addShardTag("SH_sh","Tag_SH") 2 指定數據自動分配到特定分片中 sh.addShareRange(,,,) # minnum maxmum 保存數據時分片鍵的最小值&最大值 例 sh.addShareRange("zone_db.Members", {city: "SZ", zipCode: "51800"},{city: "SZ", zipCode: "51899"},"Tag_SZ") sh.addShardTag("CN_sh", "shard00") sh.addShardTag("US_sh", "shard01") sh.addTagRange("zonedb.vast",{ "order_id" : MinKey },{ "order_id" : 500 },"shard00" ) sh.addTagRange("zonedb.vast",{"order_id" : 501 },{"order_id" : MaxKey},"shard01" ) use zonedb for(i=1;i<1000; i++){ db.vast.insert({"order_id":i,"name":"shenzheng","age":70,"date":new Date()}); } db.vast.getShardDistribution()

      4 平衡器 Balancer

      分片鍵是數據分片的依據, 且數據拆分是以數據塊(chunk)為基本單位, 平衡器是確保每個分片保存的數據量(數據塊) 保持相對平衡的狀態

      平衡器是以 數據塊為單位進行搬遷, 一個chunk包括0/多個文檔,一個分片包括0/多個 chunk

      259_Mongodb_集合_分片集合1

      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(,,) sh.moveChunk("Carts.members",{city:"SZ",zipCode:"518999"},"ShardSZ") # query條件必須是分片鍵

      在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小時內刪除侵權內容。

      上一篇:WPS表格怎么刪除編輯的內容圖文教程(如何刪除wps表格里的內容)
      下一篇:英特爾欲助力歐洲半導體生產制造份額提升至20%
      相關文章
      亚洲av无码一区二区三区乱子伦| 亚洲久本草在线中文字幕| 国产午夜亚洲精品午夜鲁丝片| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲成a人片在线观看中文动漫| 亚洲乱码无码永久不卡在线 | 亚洲区小说区图片区| 亚洲?V无码成人精品区日韩| 国产综合激情在线亚洲第一页| 亚洲成av人片在www鸭子| 亚洲经典千人经典日产| 亚洲精品伦理熟女国产一区二区| 亚洲熟妇无码八V在线播放| 亚洲色大网站WWW永久网站| 亚洲av最新在线观看网址| 精品国产_亚洲人成在线| 在线观看亚洲免费视频| 亚洲欧洲一区二区三区| 国产亚洲美女精品久久久| 中文字幕亚洲无线码| 精品国产亚洲一区二区三区| 国产v亚洲v天堂无码网站| 亚洲AV永久无码精品一百度影院| 亚洲成人激情在线| 亚洲欧洲日产专区| 亚洲三级高清免费| 久久精品国产亚洲AV| 亚洲国产V高清在线观看| 精品国产日韩亚洲一区| 亚洲人成网77777色在线播放| 亚洲产国偷V产偷V自拍色戒| 亚洲伦理一区二区| 亚洲人成激情在线播放| 亚洲乱理伦片在线观看中字| 国产成人亚洲精品91专区高清| 亚洲一级片免费看| 久久久久亚洲精品影视| 亚洲欧洲精品国产区| 在线亚洲午夜片AV大片| 国产亚洲精品美女| 亚洲精品国产字幕久久不卡|