天天看點

昊鼎王五:mongodb的副本集與分片的對比?

#昊鼎王五:mongodb的副本集與分片的對比?

本文基于:《昊鼎王五:linux(centos7)如何七分鐘搭建mongodb叢集伺服器?》
https://blog.csdn.net/haoding205/article/details/82253048
           

高可用分片叢集架構圖

昊鼎王五:mongodb的副本集與分片的對比?

#1.分片與複制集對比

昊鼎王五:mongodb的副本集與分片的對比?

##1.1 、shard片區

每個shard 片區都是一個副本集(Replica Set) 每個片區都有一個主的服務可以寫入還有N個副本的資料備份,幾個片區的資料加起來就一個完整的資料集

##1.2、config配置服務

配置伺服器相當于叢集的大腦,儲存着叢集和分片的配置資訊。是以,應該首先建立配置伺服器,鑒于它所包含的的資料極端重要性,必須啟用其日志功能,并確定其資料儲存在非易失性驅動器上。每個配置伺服器都應該位于單獨的實體機上,最好是分布在不同位址位置的機器上。(注:在測試環境上配置服務可以開一個,但是在生産環境,則要開3個或以上。如:一個資料中心,資料分布在,北京、上海、廣州,則在每個區域都需要啟動一個配置服務)

##1.3、mongos路由服務

相當于進入叢集的一個路由器、可以啟動任意數量的mongos程序。其職責是隐藏分片内部的複雜性并向使用者提供一個簡潔的單伺服器接口。ssssss通常的設定時每個應用程式伺服器使用一個mongos程序(與應用伺服器運作在同一台機器上)

Mongo中對資料的分割

Mongodb使用基于區間的方法來劃分片區如下

Mongo中多以[a,b)來表示區間範圍

假如我們有四個分片區以使用者名做為片鍵,使用者名都以”a” 到 “z”之間的字母開頭,其可表示的區間範圍為[a, }),} 是ASCII碼表中字母z後面的字元。分區大緻如下圖

#2.片鍵選擇

拆分資料最常用的資料分發方式有三種:升序片鍵、随機分發的片鍵和基于位置的片鍵。

##2.1.升序片鍵:升序片鍵通常有點類似于"date"字段或者是ObjectId,是一種随着時間穩定增長的字段。缺點:例如ObjectId可能會導緻接下來的所有的寫入操作都在同一塊分片上。

如:db.runCommand( { shardcollection : "dydb.user ",key : {_id : 1} } )
           

##2.2.随機分發的片鍵:随機分發的片鍵可以是使用者名,郵件位址,UDID,MD5散列值或者資料集中其他一些沒有規律的鍵。缺點:MongoDB在随機通路超出RAM大小的資料時效率不高。

如:db.runCommand( { shardcollection : "dydb.user ",key : {username : 1} } )
           

##2.3.基于位置的片鍵:基于位置的片鍵可以是使用者的IP、經緯度、或者位址。這裡的"位置"比較抽象,不必與實際的實體位置字段相關。

如果希望特定範圍内的塊出現在特定的分片中,可以為分片添加tag,然後為塊指定相應的tag
           

如:

1、為分片指定tag:sh.addShardTag('shardName','tagName')

mongos> sh.addShardTag("mablevi","AAA")
mongos> sh.addShardTag("shard0000","BBB")

2、為tag指定規則:sh.addTagRange('庫.集合',{minkey:num},{maxkey:num},tagName)

mongos> sh.addTagRange("abc.number",{"num":0},{"num":20},"AAA")
mongos> sh.addTagRange("abc.number",{"num":21},{"num":50},"BBB")

(1和2的意思是把分片mablevi、shard000指定AAA、BBB标簽。并且0到20的資料寫到AAA标簽裡,21到50的資料寫到BBB标簽裡。其他範圍的資料也可以寫進)

3、删除分片
use admin
db.runCommand({"removeshard" : "s3"});
           

##2.4.片鍵規則和指導方針:

1、 片鍵限制:片鍵不可以是數組。文檔一旦插入,其片鍵就無法修改了。要修改文檔的片鍵值,就必須先删除文檔。

2、 片鍵的勢:選擇一個值會變化的的鍵非常重要,即值很多,随着資料量的增大可以分出更多的片鍵。分片在勢比較高的字段上性能更佳。

資料均衡:

1、均衡器:均衡器隻使用塊的數量,而非資料大小,作為衡量分片間是否均衡的名額。自動均衡總是根據資料集的目前狀态來決定資料遷移,而不考慮資料集曆史狀态。我們可以手動均衡資料集塊的數量。

2、修改塊的大小:塊的大小預設為64M,這個大小的塊既易于遷移,又不至于導緻過多的流失。使用shell連接配接到mongos,修改config.setting集合,進而完成塊大小的修改。
  如果MongoDB頻繁進行資料遷移或文檔增大,則可能需要增加塊的大小。

3、遷移塊:同一塊内的所有資料都位于同一分片上。如該分片的塊數量比其他分片多,則MongoDB會将其中的一部分塊遷移到其他塊數量較少的分片上。移動快的過程叫遷移,MongoDB就是這樣在叢集中
           

#3.副本集的操作:

##3.1主從及副本權重關系

###3.1.1主從切換

rs.stepDown([secs])
           

###3.1.2副本集權重設定

配置過程:

通過修改priority的值來實作(預設的優先級是1(0-100),priority的值設的越大,就優先成為主)

1)PRIMARY> config=rs.conf()
2)PRIMARY>config.members[1].priority = 3
3)PRIMARY> rs.reconfig(config)
config=rs.conf()
config.members[1].priority = 2
rs.reconfig(config)
           

##3.2複制節點的增減

###3.2.1.增加複制節點

./mongo -port 77018
shard2:PRIMARY> rs.add('192.168.1.293:77018');
{ "ok" : 1 }
shard2:PRIMARY> rs.config();
shard2:PRIMARY> rs.status();
           

###3.2.2.減少複制節點

./mongo -port 77018
shard2:PRIMARY> rs.remove('virtual-node.com:67020');
{ "ok" : 1 }
shard2:PRIMARY> rs.status();
           

##3.3均衡器管理

db.locks.findOne({'_id':'balancer'})
db.settings.find({'_id':'balancer'})
sh.getBalancerState()
sh.setBalancerState(true)
sh.setBalancerState(false)
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
           

##3.4可以通過下面的方式檢視目前是否有遷移在進行:

while(db.locks.findOne({'_id':'balancer'}).state){print('wating...');sleep(1000)}
           

##3.5釋放空間

db.repairDatabase()
           

##3.6檢視複制集

db.printReplicationInfo()
db.printSlaveReplicationInfo()
           

##3.7檢視連接配接狀态

> db.serverStatus().connections
{ "current" : 224, "available" : 400317, "totalCreated" : 632 }
>
           

##3.8監控叢集

mongostat --authenticationDatabase admin -u root -p root --port 90000
           

#4分片的操作

##4.1.添加分片

use admin
db.runCommand({addshard:"shard1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017", name:"s1", maxsize:20480});
db.runCommand({addshard:"shard2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018", name:"s2", maxsize:20480});
db.runCommand({addshard:"shard3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019", name:"s3", maxsize:20480});
           

##4.2.單分片

db.runCommand({addshard:"192.168.1.101:27017"});
db.runCommand({addshard:"192.168.1.102:27017"});
db.runCommand({addshard:"192.168.1.103:27017"});

db.runCommand({addshard:"192.168.1.101:27018"});
db.runCommand({addshard:"192.168.1.102:27018"});
db.runCommand({addshard:"192.168.1.103:27018"});

db.runCommand({addshard:"192.168.1.101:27019"});
db.runCommand({addshard:"192.168.1.102:27019"});
db.runCommand({addshard:"192.168.1.103:27019"});
           

##4.3.删除分片

use admin
db.runCommand({"removeshard" : "s3"});
           

##4.4.列印分片狀态

db.printShardingStatus();
           

##4.5.指定dbname分片生效

db.runCommand( { enablesharding :"dbname"});
           

##4.6.指定資料庫裡需要分片的集合和片鍵

db.runCommand( { shardcollection : "testdb.c1",key : {id: 1} } )
           

##4.7.chunks表分片

db.fs.chunks.ensureIndex({files_id: 1});
db.runCommand( { enablesharding :"dbname"});
db.runCommand( { shardcollection : "dbname.fs.chunks",key : {files_id : 1} } )
           

##4.8.hashed key 分片

db.runCommand( { shardcollection : "dbname.fs.chunks",key : {files_id : "hashed"} } )

db.runCommand( { shardcollection : "dbname.fs.files",key : {_id : 1,filename:1} } )
           

##4.9.檢視chunks狀态

use dbname
db.fs.chunks.stats();
           

##4.10.插入測試資料

for (var i = 1; i <= 100000; i++){
  db.c1.save({id:i,"name":"testval"+i});
}
           

##4.11.統計

db.c1.stats()
           

##4.12.如何檢視shard資訊

登上mongos

sh.status()或者需要看詳細一點
sh.status({verbose:true})


use config
db.settings.save( { _id:"chunksize", value: 1024} )

db.settings.save( { _id:"chunksize", value: 512} )
           

好了,聰明如你,知道了mongodb的副本集與分片的對比,是不是很歡喜 _

還有其他問題的可以在評論區留言或者掃碼加部落客擷取資源或者提問。

昊鼎王五:mongodb的副本集與分片的對比?