分片,副本級集群對比
分片 | 副本級集群 | |
---|---|---|
實現意義 | 提升并發性能 | 數據沉余,提升度性能 |
架構上 | 水平化 | 中心化 |
實現原理 | 數據分散 | 數據鏡像 |
維護成本 | 相對高 | 較容易 |
分片節點
Shard節點:
存取數據的節點( 單個mongod)
Config server:
儲存元數據,為mongos服務,路由到Shard
Mongos
接收請求,進行消息路由
成員節點啟動參數
Shard:
mongod --shardsvr
mongod --shardsvr --rpelSet (副本集)
Config server:
mongod --configsvr
Mongos
mongos --configdb <configdb server>
分片步驟
> use admin
> sh.addShard("ip:port")
> db.runCommand({enablesharding:"db"})
> db.runCommand({"shardcollection":"db.collection",key:{"key":1}})
查看shard成員
> use config
> db.shards.find()
產看shard狀態
> db.printShardingStatus()
哈希分片
>db.runCommand({"shardcollection":"db.collection","key":{key:hashed}})
范圍分片和哈希分片的對比
基于范圍的分片方式提供了更高效的范圍查詢,給定一個片鍵的范圍,分發路由可以很簡單地確定哪個數據塊存儲了請求需要的數據,并將請求轉發到相應的分片中.
不過,基于范圍的分片會導致數據在不同分片上的不均衡,有時候,帶來的消極作用會大于查詢性能的積極作用.比如,如果片鍵所在的字段是線性增長的,一定時間內的所有請求都會落到某個固定的數據塊中,最終導致分布在同一個分片中.在這種情況下,一小部分分片承載了集群大部分的數據,系統并不能很好地進行擴展.
與此相比,基于哈希的分片方式以范圍查詢性能的損失為代價,保證了集群中數據的均衡.哈希值的隨機性使數據隨機分布在每個數據塊中,因此也隨機分布在不同分片中.但是也正由于隨機性,一個范圍查詢很難確定應該請求哪些分片,通常為了返回需要的結果,需要請求所有分片.