副本集
什么是副本集锚贱?
顧名思義仔戈,副本集是一個(gè)集合,即MongoDB實(shí)例的集合拧廊,集合中的每個(gè)成員擁有相同的數(shù)據(jù)集合监徘;一個(gè)副本集包含多個(gè)數(shù)據(jù)節(jié)點(diǎn)和一個(gè)可選的仲裁節(jié)點(diǎn),在數(shù)據(jù)節(jié)點(diǎn)中卦绣,只有一個(gè)可以作為主節(jié)點(diǎn)(Primary Node)耐量,其他節(jié)點(diǎn)只能是第二節(jié)點(diǎn)(Secondary Nodes)飞蚓。
主節(jié)點(diǎn)接收所有的寫操作滤港,一個(gè)副本集只能有一個(gè)能夠確認(rèn)寫入的主節(jié)點(diǎn)(Primary Node),如下圖:
第二節(jié)點(diǎn)復(fù)制主節(jié)點(diǎn)的操作日志并且將所有的操作應(yīng)用到自己的數(shù)據(jù)集合中趴拧,復(fù)制過程是異步的溅漾,如果主節(jié)點(diǎn)不可用,一個(gè)可以被選舉的第二節(jié)點(diǎn)將會(huì)被選舉為主節(jié)點(diǎn)著榴,所以在副本集中添履,即使一個(gè)或者多個(gè)成員沒有正常運(yùn)行,但整個(gè)副本集仍然可以正常工作脑又;主副節(jié)點(diǎn)關(guān)系如下圖:
在某些情況下(比如受硬件條件所限暮胧,只有一個(gè)主節(jié)點(diǎn)和一個(gè)副節(jié)點(diǎn),無法添加更多的副節(jié)點(diǎn))问麸,你可以選擇將mongod實(shí)例添加進(jìn)副本集往衷,并作為仲裁者(仲裁者只負(fù)責(zé)選舉新的主節(jié)點(diǎn),不持有數(shù)據(jù))严卖,在副本集中席舍,如果主節(jié)點(diǎn)與其他節(jié)點(diǎn)無法通信的時(shí)間超過配置的時(shí)間值( electionTimeoutMillis ),那么副本集將視主節(jié)點(diǎn)出現(xiàn)故障哮笆,此時(shí)將會(huì)重新選舉一個(gè)正常副節(jié)點(diǎn)來作為新的主節(jié)點(diǎn)来颤,從而讓整個(gè)副本集系統(tǒng)正常工作,如下圖:
副本集搭建(文中為三個(gè)mongod實(shí)例的副本集)
副本集的搭建的步驟為:同時(shí)啟動(dòng)多個(gè)mongod實(shí)例(可以在一臺(tái)服務(wù)器上稠肘,也可以在不同的服務(wù)器上)福铅,然后在每個(gè)實(shí)例的配置文件中配置相應(yīng)的配置項(xiàng),最后啟動(dòng)實(shí)例后项阴,登錄并且在做一次配置即可本讥。
注意: 文中都是通過配置文件的方式來啟動(dòng)mongod實(shí)例的,你也可以通過啟動(dòng)參數(shù)來啟動(dòng)實(shí)例,同時(shí)本文中的mongod實(shí)例是通過supervisor 來管理的拷沸,關(guān)于如何通過supervisor管理進(jìn)程色查,可以自行查閱相關(guān)資料或者參考這里
-
在
/usr/local/etc
(目錄根據(jù)自己機(jī)器的實(shí)際情況來選擇)目錄下添加三個(gè)mongodb的配置文件,文件名隨意撞芍,為了方便起見秧了,這里分別命名為:mongod0.conf
,mongod1.conf
,mongod2.conf
, 如下圖:
文件內(nèi)容為:
systemLog: destination: file path: "/var/log/mongod0.log" logAppend: true processManagement: fork: false #因?yàn)閟upervisor本身就是以fork的形式啟動(dòng)進(jìn)程,所以這里填false pidFilePath: "/var/run/mongod0.pid" net: bindIp: 127.0.0.1 port: 27017 maxIncomingConnections: 2000 storage: dbPath: "/usr/local/mongodb-4.4.5/mongod0/shard0" journal: enabled: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 2 security: authorization: disabled replication: oplogSizeMB: 120 replSetName: replica-set
對(duì)于每一個(gè)配置項(xiàng)序无,如果不明白每個(gè)配置項(xiàng)的釋義验毡,請(qǐng)參考: mongo配置文件 。另外帝嗡,如果實(shí)例在同一臺(tái)機(jī)器上晶通,則針對(duì)每個(gè)實(shí)例,需要區(qū)分path
, pidFilePath
, port
, dbPath
這幾個(gè)的配置值哟玷,并且每個(gè)配置文件中的replSetName
必須相同狮辽。
-
添加每一個(gè)實(shí)例在supervisor中的啟動(dòng)文件,
mongod0.ini
,mongod1.ini
,mongod2.ini
巢寡, 文件內(nèi)容如下:[program:shard0] command=/usr/local/mongodb-4.4.5/bin/mongod --config /usr/local/etc/mongod0.conf process_name=%(program_name)s numprocs=1 directory=/usr/local/mongodb-4.4.5 autostart=true startretries=3 autorestart=unexpected stopsignal=QUIT user=user stdout_logfile=/var/log/mongod/mongod0.log stderr_logfile=/var/log/mongod/mongod0-err.log
在supervisorctl中執(zhí)行update喉脖,此時(shí)三個(gè)實(shí)例便啟動(dòng)成功。
-
三個(gè)實(shí)例啟動(dòng)成功后抑月,只是啟動(dòng)了三個(gè)獨(dú)立的mongod實(shí)例树叽,實(shí)例之間并沒有形成副本集,此時(shí)需要通過mongo客戶端登錄某一個(gè)實(shí)例谦絮,完成最后一步配置题诵。登錄進(jìn)mongo shell后,依次執(zhí)行以下命令:
replica-set > mongo --host 127.0.0.1 --port 27017 replica-set > conf = {_id: "replica-set(這個(gè)值必須與mongod實(shí)例配置文件中的replSetName相同)", members: [{_id: 0, host: "127.0.0.1:27017"}, {_id: 1, host: "127.0.0.1:27018"}, {_id: 2, host: "127.0.0.1:27019"}]} replica-set > rs.initiate(conf)
rs.initiate(conf)
是初始化副本集配置的命令层皱,初始化后副本集才算配置成功性锭,上面初始化的配置是不帶仲裁節(jié)點(diǎn)的配置,如果需要仲裁節(jié)點(diǎn)奶甘,則需要將配置改為: conf = {_id: replica-set, members: [{_id: 0, host: "127.0.0.1:27017"}, {_id: 1, host: "127.0.0.1:27018"}, {_id: 2, host: "127.0.0.1:27019", arbiter: true}]}篷店, 這樣id為2,地址為127.0.0.1:27019
的節(jié)點(diǎn)即為仲裁節(jié)點(diǎn)臭家,如果不在初始化的時(shí)候指定仲裁節(jié)點(diǎn)疲陕,后期也可以通過mongo客戶端設(shè)置。 -
至此钉赁,副本集已經(jīng)搭建完成蹄殃,可以對(duì)副本集的數(shù)據(jù)分布以及存儲(chǔ)情況進(jìn)行驗(yàn)證。在默認(rèn)情況下你踩,只能在主節(jié)點(diǎn)中進(jìn)行查詢操作诅岩,副本集中副節(jié)點(diǎn)(Secondary Nodes)是不能執(zhí)行mongodb查詢命令的讳苦,如果需要在副本節(jié)點(diǎn)中執(zhí)行,則需要通過mongo shell登錄主節(jié)點(diǎn)吩谦,并在客戶端中執(zhí)行下面的命令:
replica-set(Primary) > mongo --host 127.0.0.1 --port 27017 replica-set(Primary) > rs.slaveOk()
通過Shell客戶端或者代碼向副本集中插入數(shù)據(jù)鸳谜,然后查看數(shù)據(jù)分布情況,是否與預(yù)期的一致式廷。同時(shí)咐扭,如果通過代碼連接mongodb,那么在保持連接的時(shí)候滑废,將主節(jié)點(diǎn)斷開連接蝗肪,查看代碼中的mongodb連接是否還存在。
注意: 通過代碼連接副本集時(shí)蠕趁,在連接的URI中填某一個(gè)節(jié)點(diǎn)即可薛闪,不需要每一個(gè)節(jié)點(diǎn)地址都填寫,如:
mongodb://127.0.0.1:27017/?replicaSet=replica-set;slaveOk=true;w=majority;wtimeoutMS=2000
分片
什么是分片?
分片是將MongoDB中的數(shù)據(jù)集分割成多個(gè)數(shù)據(jù)片俺陋,每片數(shù)據(jù)存放在不同的MongoDB實(shí)例中豁延,可以理解為將一個(gè)MongoDB數(shù)據(jù)集拆分成多個(gè)小型數(shù)據(jù)集,而小數(shù)據(jù)集分布在相同或者不同的物理機(jī)器上倔韭,分割只是從物理層面進(jìn)行分割术浪,邏輯上仍然屬于同一個(gè)數(shù)據(jù)集合瓢对。
分片的目的
- 如果不進(jìn)行分割寿酌,則數(shù)據(jù)庫所有的讀寫操作都在同一個(gè)MongoDB實(shí)例或者同一臺(tái)機(jī)器上,對(duì)于資源有限(特別是CPU)的服務(wù)器來說硕蛹,隨著數(shù)據(jù)量增大以及數(shù)據(jù)IO越來越頻繁醇疼,最終將會(huì)導(dǎo)致服務(wù)器不堪重負(fù)。
- 對(duì)于大型系統(tǒng)來說法焰,一臺(tái)數(shù)據(jù)庫服務(wù)器或者一個(gè)數(shù)據(jù)庫實(shí)例無法滿足數(shù)據(jù)存儲(chǔ)的需求
- 數(shù)據(jù)分散存儲(chǔ)秧荆,可以多個(gè)實(shí)例同時(shí)執(zhí)行讀寫,滿足更高的并發(fā)需求埃仪。
搭建分片實(shí)例
分片包含三部分, 如下圖所示:
- 分片(Shards):一般來說乙濒,分片為一組MongoDB實(shí)例的集群,每個(gè)分片與副本集結(jié)合使用卵蛉,即每個(gè)分片是一組副本集颁股,數(shù)據(jù)存儲(chǔ)在每一個(gè)分片上。
- 配置服務(wù)器(Config Servers):配置服務(wù)器存儲(chǔ)分片集群的元數(shù)據(jù)傻丝,該元數(shù)據(jù)反應(yīng)了所有分片集群的狀態(tài)和組件甘有,元數(shù)據(jù)包含了每個(gè)分片上的chunk列表以及定義塊的范圍,配置服務(wù)器同樣存儲(chǔ)了權(quán)限驗(yàn)證的配置信息葡缰,比如角色權(quán)限控制和集群內(nèi)部驗(yàn)證設(shè)置亏掀。MongoDB同樣使用配置服務(wù)器來管理分布式鎖。
- 路由器(Mongos):Mongos緩存了配置服務(wù)器的元數(shù)據(jù)信息,并且通過這些數(shù)據(jù)來將數(shù)據(jù)讀寫路由到正確的分片上您没,當(dāng)配置服務(wù)器的元數(shù)據(jù)有更新時(shí)她肯,Mongos同時(shí)也會(huì)更新緩存。
注意: 不同的分片集群必須使用不同的配置服務(wù)器(Config Servers)间影,不能使用同一個(gè)配置服務(wù)器(Config Servers)
分片實(shí)例的搭建與副本集類似米者,都是配置不同的配置文件,然后啟動(dòng)相應(yīng)的實(shí)例:
- Shards: 按照架構(gòu)圖宇智,每個(gè)Shards節(jié)點(diǎn)可以是單個(gè)Mongod實(shí)例蔓搞,也可以是副本集,比如: 每個(gè)Shards節(jié)點(diǎn)由一個(gè)副本集構(gòu)成随橘,而副本集由3個(gè)Mongod實(shí)例構(gòu)成喂分,每個(gè)Mongod實(shí)例的配置文件如下:
這里只給出了關(guān)鍵配置項(xiàng),其他配置項(xiàng)根據(jù)自己的實(shí)際情況配置机蔗,圖中的replSetName
表示當(dāng)前實(shí)例屬于哪個(gè)副本集蒲祈,該副本集中的每個(gè)節(jié)點(diǎn)的該配置項(xiàng)必須一致,clusterRole
表示當(dāng)前節(jié)點(diǎn)在分片中的的角色萝嘁,可選值有: shardsvr
和configsvr
梆掸,shardsvr
表示該節(jié)點(diǎn)是作為Shards節(jié)點(diǎn)提供服務(wù),而configsvr
表示該節(jié)點(diǎn)作為Config Server節(jié)點(diǎn)提供服務(wù)牙言。
- Config Servers: 按照架構(gòu)圖中所示酸钦,Config Servers為一個(gè)副本集,配置方式與Shards一樣咱枉,不同的是
clusterRole
配置項(xiàng)的值應(yīng)該配置為configsvr
, 如下圖:
- Mongos: 路由服務(wù)器作為分片架構(gòu)中開放給應(yīng)用服務(wù)器的唯一節(jié)點(diǎn)卑硫,可以存在多個(gè)路由服務(wù)器指向同一個(gè)分片系統(tǒng)。路由服務(wù)器也需要配置啟動(dòng)項(xiàng)蚕断,而啟動(dòng)項(xiàng)中需要指定對(duì)應(yīng)的配置服務(wù)器副本集欢伏,如下圖:
-
配置成功后,先啟動(dòng)Shards節(jié)點(diǎn)亿乳,然后啟動(dòng)Config Servers節(jié)點(diǎn)硝拧,最后啟動(dòng)Mongos節(jié)點(diǎn),啟動(dòng)成功后葛假,需要通過Mongo客戶端連接進(jìn)Mongos障陶,然后執(zhí)行如下命令添加Shards節(jié)點(diǎn):
sh.addShard("replName/mongodb3.example.net:27327")
至此,分片搭建完成桐款。