搭建MongoDB副本集&分片

副本集

什么是副本集锚贱?

顧名思義仔戈,副本集是一個(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)資料或者參考這里

  1. /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必須相同狮辽。

  1. 添加每一個(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)成功。

  1. 三個(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è)置。

  2. 至此钉赁,副本集已經(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ù)集合瓢对。

分片的目的
  1. 如果不進(jìn)行分割寿酌,則數(shù)據(jù)庫所有的讀寫操作都在同一個(gè)MongoDB實(shí)例或者同一臺(tái)機(jī)器上,對(duì)于資源有限(特別是CPU)的服務(wù)器來說硕蛹,隨著數(shù)據(jù)量增大以及數(shù)據(jù)IO越來越頻繁醇疼,最終將會(huì)導(dǎo)致服務(wù)器不堪重負(fù)。
  2. 對(duì)于大型系統(tǒng)來說法焰,一臺(tái)數(shù)據(jù)庫服務(wù)器或者一個(gè)數(shù)據(jù)庫實(shí)例無法滿足數(shù)據(jù)存儲(chǔ)的需求
  3. 數(shù)據(jù)分散存儲(chǔ)秧荆,可以多個(gè)實(shí)例同時(shí)執(zhí)行讀寫,滿足更高的并發(fā)需求埃仪。
搭建分片實(shí)例

分片包含三部分, 如下圖所示:

  1. 分片(Shards):一般來說乙濒,分片為一組MongoDB實(shí)例的集群,每個(gè)分片與副本集結(jié)合使用卵蛉,即每個(gè)分片是一組副本集颁股,數(shù)據(jù)存儲(chǔ)在每一個(gè)分片上。
  2. 配置服務(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ù)器來管理分布式鎖。
  3. 路由器(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í)例:

  1. 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)在分片中的的角色萝嘁,可選值有: shardsvrconfigsvr梆掸,shardsvr表示該節(jié)點(diǎn)是作為Shards節(jié)點(diǎn)提供服務(wù),而configsvr表示該節(jié)點(diǎn)作為Config Server節(jié)點(diǎn)提供服務(wù)牙言。

  1. Config Servers: 按照架構(gòu)圖中所示酸钦,Config Servers為一個(gè)副本集,配置方式與Shards一樣咱枉,不同的是clusterRole配置項(xiàng)的值應(yīng)該配置為configsvr, 如下圖:
  1. 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ù)器副本集欢伏,如下圖:
  1. 配置成功后,先啟動(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")
    

至此,分片搭建完成桐款。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咸这,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子魔眨,更是在濱河造成了極大的恐慌媳维,老刑警劉巖酿雪,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侄刽,居然都是意外死亡指黎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門州丹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醋安,“玉大人,你說我怎么就攤上這事墓毒∠啪荆” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵所计,是天一觀的道長(zhǎng)柠辞。 經(jīng)常有香客問我,道長(zhǎng)主胧,這世上最難降的妖魔是什么叭首? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮踪栋,結(jié)果婚禮上焙格,老公的妹妹穿的比我還像新娘。我一直安慰自己夷都,他們只是感情好眷唉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著损肛,像睡著了一般厢破。 火紅的嫁衣襯著肌膚如雪荣瑟。 梳的紋絲不亂的頭發(fā)上治拿,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音笆焰,去河邊找鬼劫谅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嚷掠,可吹牛的內(nèi)容都是我干的捏检。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼不皆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贯城!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霹娄,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤能犯,失蹤者是張志新(化名)和其女友劉穎鲫骗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踩晶,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡执泰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渡蜻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片术吝。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茸苇,靈堂內(nèi)的尸體忽然破棺而出排苍,到底是詐尸還是另有隱情,我是刑警寧澤学密,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布纪岁,位于F島的核電站,受9級(jí)特大地震影響则果,放射性物質(zhì)發(fā)生泄漏幔翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一西壮、第九天 我趴在偏房一處隱蔽的房頂上張望遗增。 院中可真熱鬧,春花似錦款青、人聲如沸做修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饰及。三九已至,卻和暖如春康震,著一層夾襖步出監(jiān)牢的瞬間燎含,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工腿短, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屏箍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓橘忱,卻偏偏與公主長(zhǎng)得像赴魁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钝诚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容