Mongodb分片学习
分片
提高集群處理的性能,可同時提高應用的讀寫性能
-
輸入sh.status()命令會顯示當前分片的運行狀況, 此報告包括哪個分片是數據庫的主分片以及分片中的分塊分布
-
片鍵一般選擇的是索引,當查詢時應該利用索引進行查詢,這樣mongos會將查詢發往對應分片,而不是發送到所有的分片上
分片的幾個成員
1.配置服務器 配置服務器存儲群集的元數據和配置設置,配置服務器在 config 數據庫 中存儲了集群的元信息。 從MongoDB 3.4開始,配置服務器必須部署為副本集(CSRS)。而且最好不要手動修改config數據庫中的數據config數據庫包含包含分片群集元數據的集合。當元數據發生更改時, MongoDB會將數據寫入配置數據庫,例如在塊遷移或塊拆分之后。如果三個節點的集群中一個或者兩個配置服務器不可用,集群的元信息將變為 可讀, 你還可以從分片中讀寫信息,但是數據塊的遷移以及數據塊的分裂在所有配置服務器都恢復可用之前不能夠進行.---2.mongos輕量級的服務器 它將讀寫請求分發到分片中.應用并不直接訪問分片,mongos實例會緩存從配置服務器得到的路由信息, 當群集有元數據更改時,mongos會更新緩存,例如塊拆分或添加分片。3.mongod分片實例 分片是存儲了一個集合部分數據的MongoDB實例,每個分片是單獨的 mongod 或者是 replica set . 在生產環境中,所有的分片都應該是復制集。MongoDB以 每個集合 為單位使用分片, 你 必須 通過 mongos 訪問開啟了分片的集合,如果直接連接到某個分片,你只能看到集合的部分數據. 每個分片上的數據并沒有特定的順序.MongoDB并不保證兩個連續的數據塊會分布在同一個分片上.為了獲得更好的性能,最好在任何可能的時候都使用具有特定目標的操作. 雖然有些操作不得不使用廣播發送的形式,(比如有的時候需要查詢的數據分散在所有的分片上) 你也應該盡可能在進行操作時帶有片鍵來盡可能使用具有特定目標的操作.主分片
每個數據庫都有一個”主分片” 用來存儲這個數據庫中所有未開啟分片的集合的數據.改變集群中的主分片,會影響性能
mongodb的塊拆分 和 均衡功能
-
mongodb跟蹤集群數據的方式:會將文檔分組為塊,每個塊由給定的片鍵范圍的文檔組成,同一片鍵值的文檔必須在同一塊中,mongos會記錄每個塊中插入多少數據,一旦到達閾值(這里有一個概念叫 拆分閾值),就會對塊嘗試拆分,需要注意的是經過拆分的塊可能還在同一分片上
-
mongos進程需要保持盡量穩定,頻繁的掉線上線,可能導致塊拆分功能的失效,導致超大塊的誕生;只要有配置服務器掛了任何一個,拆分請求都會失敗,mongos到達閾值后,不停的發送塊拆分請求,會導致拆分風暴!
-
mongos還會定期化身為均衡器,用于在不同分片之間移動塊,力求使集群的負載更加均衡。前提是只有到達均衡閾值,才會真正數據遷移,數據的遷移是對客戶端透明的
Hashed片鍵的分配策略
哈希片鍵的可以更均勻的分布數據,缺點就是對于范圍查詢性能比較差,HASH適合單調增減的field。比如說_id和時間戳
如果集合已包含數據,則必須在使用shardCollection()之前使用db.collection.createIndex()方法在分片鍵上創建散列索引。如果集合為空,MongoDB將創建索引作為sh.shardCollection()的一部分。以下操作使用散列分片策略對目標集合進行分片。sh.shardCollection(“<database>。<collection>”,{<key>:"hashed" })從頭創建hash分片的步驟
range片鍵的分配策略
基于范圍的分片涉及將數據劃分為由分片鍵值確定的連續范圍。 在此模型中,具有“close”分片鍵值的文檔可能位于相同的塊或分片中。
具體的范圍片鍵命令,同時也是需要在指定鍵上有索引的! sh.shardCollection( "database.collection", { <shard key> } )從頭創建range分片的步驟
總結
以上是生活随笔為你收集整理的Mongodb分片学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2000~2017
- 下一篇: 金立创始人刘立荣:从南下淘金到身价15亿