分片,副本級(jí)集群對(duì)比
| 分片 | 副本級(jí)集群 | |
|---|---|---|
| 實(shí)現(xiàn)意義 | 提升并發(fā)性能 | 數(shù)據(jù)沉余,提升度性能 |
| 架構(gòu)上 | 水平化 | 中心化 |
| 實(shí)現(xiàn)原理 | 數(shù)據(jù)分散 | 數(shù)據(jù)鏡像 |
| 維護(hù)成本 | 相對(duì)高 | 較容易 |
分片節(jié)點(diǎn)
Shard節(jié)點(diǎn):
存取數(shù)據(jù)的節(jié)點(diǎn)( 單個(gè)mongod)
Config server:
儲(chǔ)存元數(shù)據(jù),為mongos服務(wù),路由到Shard
Mongos
接收請(qǐng)求,進(jìn)行消息路由
成員節(jié)點(diǎn)啟動(dòng)參數(shù)
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()
產(chǎn)看shard狀態(tài)
> db.printShardingStatus()
哈希分片
>db.runCommand({"shardcollection":"db.collection","key":{key:hashed}})
范圍分片和哈希分片的對(duì)比
基于范圍的分片方式提供了更高效的范圍查詢(xún),給定一個(gè)片鍵的范圍,分發(fā)路由可以很簡(jiǎn)單地確定哪個(gè)數(shù)據(jù)塊存儲(chǔ)了請(qǐng)求需要的數(shù)據(jù),并將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的分片中.
不過(guò),基于范圍的分片會(huì)導(dǎo)致數(shù)據(jù)在不同分片上的不均衡,有時(shí)候,帶來(lái)的消極作用會(huì)大于查詢(xún)性能的積極作用.比如,如果片鍵所在的字段是線性增長(zhǎng)的,一定時(shí)間內(nèi)的所有請(qǐng)求都會(huì)落到某個(gè)固定的數(shù)據(jù)塊中,最終導(dǎo)致分布在同一個(gè)分片中.在這種情況下,一小部分分片承載了集群大部分的數(shù)據(jù),系統(tǒng)并不能很好地進(jìn)行擴(kuò)展.
與此相比,基于哈希的分片方式以范圍查詢(xún)性能的損失為代價(jià),保證了集群中數(shù)據(jù)的均衡.哈希值的隨機(jī)性使數(shù)據(jù)隨機(jī)分布在每個(gè)數(shù)據(jù)塊中,因此也隨機(jī)分布在不同分片中.但是也正由于隨機(jī)性,一個(gè)范圍查詢(xún)很難確定應(yīng)該請(qǐng)求哪些分片,通常為了返回需要的結(jié)果,需要請(qǐng)求所有分片.