MongoDB在Linux環境下的分片集群由三大核心組件構成,需提前規劃部署:
工作原理:根據分片鍵的值范圍將數據劃分為多個chunk(如{name:1}
的range分片,數據按name
字段的字母順序分布),每個chunk對應一個分片。
適用場景:數據有明顯范圍特征且需頻繁進行范圍查詢(如時間戳、地理位置、用戶年齡區間)。例如,按createdate
字段分片,可快速查詢某個月份的所有訂單。
優缺點:
工作原理:對分片鍵的值應用哈希函數(如MD5、SHA-1),將哈希結果映射到固定范圍的chunk(如0~2^64-1),實現數據均勻分布。
適用場景:數據無明顯范圍特征、需要隨機寫入或無特定范圍查詢需求(如用戶ID、設備ID)。例如,按userid
字段哈希分片,可避免新用戶集中寫入同一分片。
優缺點:
工作原理:通過標簽(Zone)將分片與特定數據范圍關聯(如Asia
標簽對應country: "China"
的數據),mongos會根據分片鍵的標簽將數據路由到對應分片。
適用場景:需根據地理位置、數據中心、業務模塊等邏輯條件分配數據(如國內用戶數據存儲在上海分片,海外用戶存儲在新加坡分片)。
優缺點:
分片鍵是分片策略的核心,直接影響集群性能。需遵循以下原則:
userid
、orderid
),避免低基數字段(如gender
、country
),否則會導致數據分布不均。_id
),這類字段會導致新數據集中寫入同一分片,形成熱點。status
、region
),使查詢能通過分片鍵直接定位到目標分片,減少跨分片查詢。{region:1, userid:1}
),結合范圍和哈希的優點(如按地區范圍劃分,再按用戶ID哈希,兼顧范圍查詢與數據均勻性)。--configsvr
參數和復制集名稱(如rs.initiate({_id: "configReplSet", members: [{_id:0, host:"192.168.1.1:27019"}, {_id:1, host:"192.168.1.2:27019"}, {_id:2, host:"192.168.1.3:27019"}]})
)。--shardsvr
參數和復制集名稱(如rs.initiate({_id: "shard1", members: [{_id:0, host:"192.168.1.4:27018"}, {_id:1, host:"192.168.1.5:27018"}]})
)。mongos --configdb configReplSet/192.168.1.1:27019,192.168.1.2:27019,192.168.1.3:27019 --port 28017
)。sh.enableSharding("<database>")
命令(如sh.enableSharding("testdb")
),指定需要分片的數據庫。db.person.createIndex({userid: "hashed"})
,哈希分片需使用"hashed"
索引類型)。sh.shardCollection("<database>.<collection>", <shardKey>)
命令(如sh.shardCollection("testdb.person", {userid: "hashed"})
,范圍分片則使用{userid:1}
)。mongodump
導出數據,創建新分片集合后重新導入。sh.setBalancerState(false)
臨時關閉,避免遷移影響業務性能。sh.status()
命令定期查看分片狀態(如chunk分布、分片負載);通過mongostat
監控寫入負載,及時調整分片策略。