這篇為理論篇,稍後會有實踐篇 1、分片集群是個啥玩意兒 要回答這個問題,首先得知道它是由什麼東東組成的。 MongoDB分片集群由以下組件組成: mongos:mongos作為查詢路由器,提供客戶端應用程式和分片集群之間的介面。 配置伺服器:配置伺服器存儲集群的元數據和配置信息。從MongoDB 3 ...
這篇為理論篇,稍後會有實踐篇
1、分片集群是個啥玩意兒
要回答這個問題,首先得知道它是由什麼東東組成的。
MongoDB分片集群由以下組件組成:
- mongos:mongos作為查詢路由器,提供客戶端應用程式和分片集群之間的介面。
- 配置伺服器:配置伺服器存儲集群的元數據和配置信息。從MongoDB 3.4開始,配置伺服器必須部署為副本集(CSRS)。
- 分片:每個分片包含分片數據的一部分。每個分片可以部署為副本集。
MongoDB基於集合級別的數據分片,將集合數據分佈在集群的分片上。
2、 為啥要用分片集群(分片的好處)
分片是一種在多台機器上存儲數據的方法。MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作的部署。
1)工作負載
MongoDB將讀寫工作負載分佈在分片集群的 分片上,從而允許每個分片處理集群操作的一個子集。通過添加更多的分片,可以在集群之間水平地縮放讀取和寫入的工作負載。
2)存儲容量
分片用來存儲數據,當數據集增大,可以通過添加分片來擴展分片集群的容量。因此,理論上,分片集群的容量可以無限水平擴展。
3)高可用
分片集群可以繼續執行部分讀/寫操作,即使一個或多個分片不可用。雖然在停機期間無法訪問不可用的分片上的數據子集,但是可用分片上的讀取或寫入仍然可以成功。
3、分片集群要知道的名詞(分片鍵,塊)
1)分片鍵
分片鍵就是由集合中每個文檔中存在的欄位或不可變欄位組成。
分片鍵的作用:MongoDB 使用分片鍵對集合進行分片。
註意:分片後的分片鍵的選擇不能改變,也就是說欄位不能更改為其他欄位,並且欄位的值不能修改。分片集合只能有一個分片鍵。
要分割非空集合,集合必須具有 以分片鍵開頭的索引。對於空集合,如果集合尚未具有指定分片鍵的適當索引,則MongoDB將創建索引。
分片鍵的選擇會影響分片集群的性能,效率和可擴展性。
2)塊
MongoDB將分片數據分割成塊。基於分片鍵,每個塊都有一個包含下限,但不包含上限的範圍。
MongoDB使用分片集群平衡器在分片集群的分片之間遷移塊。平衡器試圖實現在群集中的所有分片的塊均勻分佈。
4、分片前考慮事項
為確保集群性能和效率,必須認真考慮選擇分片鍵。分片後您不能更改分片鍵,也不能取消集合分片。如果查詢不包含分片鍵或複合分片鍵的首碼 ,則mongos執行廣播操作,查詢分片集群中的所有分片。這可能需要長時間運行的操作。
分片具有一定的操作要求和限制。
1)在分片中不可用的操作
不起作用:group, db.eval(), $where不允許引用db對象,$isolated, $snapshot, geoSearch命令。
2)在分片中單個文檔的修改操作
所有的updateOne(),removeOne()以及deleteOne()用於分片集合操作必須包括分片鍵 或_id在查詢欄位中。否則,會返回一個錯誤。
3)分片集合的唯一索引
MongoDB不支持分片上的唯一索引,除非唯一索引包含完整的分片鍵作為索引的首碼。在這些情況下,MongoDB將強制執行完整鍵的唯一性,而不是單個欄位。
即可以有唯一索引,但這個唯一索引必須包含分片鍵的全部。
5、分片策略
MongoDB支持兩種分片策略,哈希分片和範圍分片。
1) 哈希分片
哈希分片,Mongo自動計算分片鍵欄位值的哈希值。然後,基於哈希的分片鍵值為每個塊分配一個範圍。
當使用哈希索引解析查詢時,Mongo會自動計算哈希值。應用程式不需要計算哈希值。
示例是用“X” 作為分片鍵,採用哈希分片策略,它們的哈希值可能不在同一塊,基於哈希值有助於更均勻的數據分佈,特別是在分片鍵單調變化的數據集中。
2)範圍分片
範圍分片,基於分片鍵值將數據劃分為範圍。每個塊被分配基於所述分片鍵值的範圍內。
值為“X”的分片鍵的範圍更可能存儲在相同的塊上。這允許目標操作,因為mongos可以將操作路由到僅包含所需數據的分片。
3)哈希分片 VS 範圍分片
給定使用單調遞增值的集合,X作為分片鍵,使用範圍分片可以得到類似於以下內容的插入分佈:
由於X的值總是在增加,所以具有上限maxKey的塊接收到大部分的寫入。這將限制對包含此塊的單個分片的插入操作,從而減少或消除分散式寫入在分片集群中的優勢。
通過使用哈希索引,X作為分片鍵,插入的分佈類似於以下內容:
由於數據現在更均勻地分佈,所以插入在整個集群中有效地分佈。
以上資料,大部分是參考官網的資料,在此表示感謝。
https://docs.mongodb.com/manual/sharding/