MongoDB 復制集(Replica Set)搭建

通常钳吟,為了防止單點故障應用程序需要做集群。然而在數(shù)據(jù)庫中除了防止單點故障贴见,還需要做到數(shù)據(jù)庫備份烘苹,讀寫分離,故障轉(zhuǎn)移等片部。而 MongoDB 的 Replica Set 恰恰都能滿足這些要求镣衡。

復制集成員

Replica Set 的成員是一堆有著同樣的數(shù)據(jù)內(nèi)容 mongod 的實例集合,包含以下三類角色:

  1. 主節(jié)點(Primary)
    是 Replica Set 中唯一的接收寫請求的節(jié)點,并將寫入指令記錄到 oplog 上廊鸥。副本節(jié)點通過復制 oplog 的寫入指令同步主節(jié)點的數(shù)據(jù)望浩。Secondary。一個 Replica Set 有且只有Primary 節(jié)點惰说,當Primar掛掉后磨德,其他 Secondary 或者 Arbiter 節(jié)點會重新選舉出來一個主節(jié)點。應用程序的默認讀取請求也是發(fā)到 Primary節(jié)點處理的吆视。

  2. 副本節(jié)點(Secondary)
    通過復制主節(jié)點 oplog 中的指令與主節(jié)點保持同樣的數(shù)據(jù)集典挑,當主節(jié)點掛掉的時候,參與主節(jié)點選舉啦吧。

  3. 仲裁者(Arbiter)
    不存儲實際應用數(shù)據(jù)您觉,只投票參與選取主節(jié)點,但不會被選舉成為主節(jié)點授滓。

復制集搭建(3個成員)

  1. 節(jié)點目錄結構說明


    節(jié)點目錄結構

    其中琳水,instance 、instance_1般堆、instance_2 分別代表3個節(jié)點炫刷。每個節(jié)點都有相同的目錄結構,包含了數(shù)據(jù)目錄 data 郁妈,日志目錄 logs , JavaScript 文件目錄 js绍申, 啟停腳本 mongod-server.sh噩咪,節(jié)點配置文件 mongod.conf 等

  2. 節(jié)點配置文件 mongod.conf

# syslog配置
logpath=/mnt/mongodb/instance/logs/mongod.log #日志目錄
logappend=true
timeStampFormat=iso8601-utc
# storage 存儲配置
dbpath=/mnt/mongodb/instance/data/db #數(shù)據(jù)存儲目錄
directoryperdb=true
# processManagement 進程管理配置
fork=true
pidfilepath=/mnt/mongodb/instance/var/run/mongod.pid # 進程 PID 文件保存目錄
# net 網(wǎng)絡配置
bind_ip=127.0.0.1
port=27017 
# security 配置
#auth=true
# 復制集
replSet=test-set    # 復制集 name         

其中 logpath 、dbpath极阅、 pidfilepath 需要根據(jù)節(jié)點修改到對應目錄(路徑中的instance 改為 instance_1或 instance_2)胃碾。此外還需要修改每個節(jié)點的 port,在我的配置當中筋搏,instance 仆百、instance_1、instance_2 的端口分別為 27017奔脐、27018俄周、27019。

  1. 啟動三個節(jié)點
    這里啟動需要用到上面提到的 mongod-server.sh 服務啟停腳本(這個腳本是我自己編寫的用于管理 mongod 進程啟停髓迎,詳細了解猛戳這里
    分別在 instance峦朗、instance_1、 instance_2 目錄中執(zhí)行一下命令./mongod-server.sh start
[root@iZu1qhttxe5Z instance]# ls
data  dump  js  logs  mongod.conf  mongod-server.sh  var
[root@iZu1qhttxe5Z instance]# ./mongod-server.sh start
about to fork child process, waiting until server is ready for connections.
forked process: 680
child process started successfully, parent exiting
Started [680]
[root@iZu1qhttxe5Z instance]# 

這個時候3個節(jié)點已經(jīng)啟動了排龄,接下來需要初始化復制集波势。

  1. 初始化復制集
    選擇任意的節(jié)點,進入 js 目錄:
[root@iZu1qhttxe5Z js]$ ls
initiate_rs.js  user.js
[root@iZu1qhttxe5Z js]# cat initiate_rs.js 
rs.initiate()
rs.add("iZu1qhttxe5Z:27017")
rs.add("iZu1qhttxe5Z:27019")
rs.conf()
[root@iZu1qhttxe5Z js]# 

這里的 initiate_rs.js 文件適用于初始化復制集的js文件,其實這些操作可以在 mongo shell中操作尺铣,但是為了方便運維管理拴曲,所以將此操作提取到 js 文件(如何將 mongo shell 命令提出到 js 文件猛戳這里)。

執(zhí)行初始化凛忿,這里選取端口 27018 的節(jié)點澈灼。

[root@iZu1qhttxe5Z instance_1]# mongo --port 27018 ./js/initiate_rs.js 
MongoDB shell version v3.4.5
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.4.5
[root@iZu1qhttxe5Z instance_1]# 

連接到其中一個節(jié)點,查看是否初始化成功

test-set:SECONDARY> rs.status()
{
    "set" : "test-set",
    "date" : ISODate("2017-06-28T02:57:33.424Z"),
    ......
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "10.117.225.127:27018",
            ...........
            "stateStr" : "SECONDARY",
            ...........
        },
        {
            "_id" : 1,
            "name" : "iZu1qhttxe5Z:27017",
            .............
            "stateStr" : "PRIMARY",
            ..............
        },
        {
            "_id" : 2,
            "name" : "iZu1qhttxe5Z:27019",
            .........
            "stateStr" : "SECONDARY",
            .........
        }
    ],
    "ok" : 1
}
test-set:SECONDARY> 

可以看出復制集已經(jīng)初始化成功侄非。

  1. 連接Primary節(jié)點蕉汪,寫入數(shù)據(jù)。
test-set:PRIMARY> use test
switched to db test
test-set:PRIMARY> show collections
test-set:PRIMARY> db.test.insert({"name":"knight"});
WriteResult({ "nInserted" : 1 })
test-set:PRIMARY> show collections
test
test-set:PRIMARY> db.test.find()
{ "_id" : ObjectId("59531cd6000e29eae22a2f83"), "name" : "knight" }
test-set:PRIMARY> 

數(shù)據(jù)插入成功逞怨,驗證 SECONDARY 是否同步數(shù)據(jù)

# 27018 節(jié)點
[root@iZu1qhttxe5Z js]# mongo --port 27018
MongoDB shell version v3.4.5
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.4.5
....
test-set:SECONDARY>
test-set:SECONDARY> rs.slaveOk()
test-set:SECONDARY> use test
switched to db test
test-set:SECONDARY> show collections
test
test-set:SECONDARY> db.test.find()
{ "_id" : ObjectId("59531cd6000e29eae22a2f83"), "name" : "knight" }
test-set:SECONDARY> 
[root@iZu1qhttxe5Z js]#
[root@iZu1qhttxe5Z js]#
[root@iZu1qhttxe5Z js]#
# 27019 節(jié)點
[root@iZu1qhttxe5Z js]# mongo --port 27019
MongoDB shell version v3.4.5
connecting to: mongodb://127.0.0.1:27019/
MongoDB server version: 3.4.5
....
test-set:SECONDARY> rs.slaveOk()
test-set:SECONDARY> use test
switched to db test
test-set:SECONDARY> db.test.find()
{ "_id" : ObjectId("59531cd6000e29eae22a2f83"), "name" : "knight" }
test-set:SECONDARY> 
  1. 默認情況下者疤,Secondary不能讀和寫, 需要執(zhí)行 rs.slaveOk()(或者執(zhí)行db.getMongo().setSlaveOk())叠赦。
test-set:SECONDARY> use test
switched to db test
test-set:SECONDARY> db.test.find()
Error: error: {
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
}
test-set:SECONDARY> 

References:

MongoDB 執(zhí)行 js 文件
MongoDB 啟停腳本

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驹马,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子除秀,更是在濱河造成了極大的恐慌糯累,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册踩,死亡現(xiàn)場離奇詭異泳姐,居然都是意外死亡,警方通過查閱死者的電腦和手機暂吉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門胖秒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慕的,你說我怎么就攤上這事阎肝。” “怎么了肮街?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵风题,是天一觀的道長。 經(jīng)常有香客問我嫉父,道長沛硅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任绕辖,我火速辦了婚禮稽鞭,結果婚禮上,老公的妹妹穿的比我還像新娘引镊。我一直安慰自己朦蕴,他們只是感情好篮条,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吩抓,像睡著了一般涉茧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疹娶,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天伴栓,我揣著相機與錄音,去河邊找鬼雨饺。 笑死钳垮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的额港。 我是一名探鬼主播饺窿,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼移斩!你這毒婦竟也來了肚医?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤向瓷,失蹤者是張志新(化名)和其女友劉穎肠套,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猖任,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡你稚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朱躺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刁赖。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖室琢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情落追,我是刑警寧澤盈滴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站轿钠,受9級特大地震影響巢钓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疗垛,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一症汹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贷腕,春花似錦背镇、人聲如沸咬展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽破婆。三九已至,卻和暖如春胸囱,著一層夾襖步出監(jiān)牢的瞬間祷舀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工烹笔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裳扯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓谤职,卻偏偏與公主長得像饰豺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柬帕,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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