NoSQL | MongoDB入門實戰(zhàn)教程(2)

上一篇我們了解了MongoDB的基本概念與單節(jié)點環(huán)境搭建,本篇我們來學(xué)習(xí)如何搭建一個高可用的復(fù)制集集群。
MongoDB復(fù)制集的主要意義在于實現(xiàn)服務(wù)的高可用,它是MongoDB的一個原生的高可用設(shè)計,不需我們額外引入一些組件來實現(xiàn),因此實現(xiàn)起來相當(dāng)便利。
主要功能
一是數(shù)據(jù)寫入時將數(shù)據(jù)迅速地復(fù)制到另一個獨立的節(jié)點上;
二是在接受寫入的節(jié)點發(fā)生故障時自動選舉出一個新的替代節(jié)點;
附加功能
數(shù)據(jù)分發(fā):將數(shù)據(jù)從一個區(qū)域復(fù)制到另一個區(qū)域,減少另一個區(qū)域的度延遲;
讀寫分離:不同類型的壓力分別在不同的節(jié)點上執(zhí)行;
異地容災(zāi):在數(shù)據(jù)中心故障時快速切換到異地;
典型結(jié)構(gòu)
一個典型的MongoDB復(fù)制集由3個以上具有投票權(quán)的節(jié)點組成:
(1)一個主節(jié)點(Primary),接受寫入操作和選舉時投票;
(2)兩個(或多個)從節(jié)點(Secondary),復(fù)制主節(jié)點上的新數(shù)據(jù)和選舉時投票;

如何復(fù)制
當(dāng)一個Mongo的修改操作(CRUD)成功,在主節(jié)點時它對數(shù)據(jù)的操作會被記錄下來,這些記錄被稱為oplog,并傳遞給從節(jié)點。從節(jié)點通過不斷獲取新進(jìn)入主節(jié)點的oplog,并在自己的數(shù)據(jù)上進(jìn)行回放,以此保持和主節(jié)點的數(shù)據(jù)一致。

如何選舉
具有投票權(quán)的節(jié)點之間兩兩互相發(fā)送心跳,當(dāng)5次心跳未收到時則會判斷節(jié)點為失聯(lián)。如果失聯(lián)的是主節(jié)點,從節(jié)點會發(fā)起選舉,選出新的主節(jié)點。如果失聯(lián)的是從節(jié)點,不會產(chǎn)生新的選舉。

整個選舉過程基于Raft一致性算法實現(xiàn),選舉成功的必要條件是大多數(shù)投票節(jié)點存活(這也是為啥大多數(shù)需要選舉的中間件集群要保持奇數(shù)個節(jié)點的原因),整個復(fù)制集中可以<=50個,但具有投票權(quán)的節(jié)點<=7個。
準(zhǔn)備VMware Workstation
跟上一篇一樣,這次我們?nèi)匀粫ㄟ^VMware Workstation啟動幾個虛擬機(jī)來完成搭建實踐。
準(zhǔn)備三臺CentOS 7.x虛擬機(jī)
這里模擬的是三個Mongo節(jié)點的主從復(fù)制集,因此分別命名為mongo-master、mongo-slave1、mongo-slave2。

為了較好的模擬,在三個虛擬機(jī)中分別配置一下hosts文件:
vi /etc/hosts在hosts文件中加入以下內(nèi)容(IP地址為你配置的虛擬機(jī)IP):
192.168.58.100 mongo-master192.168.58.101 mongo-slave1192.168.58.102 mongo-slave2
可以驗證一下能否通過主機(jī)名互相ping通。
下載Mongo Server到三臺虛擬機(jī)
下載地址:https://www.mongodb.com/try/download/community
目前Server社區(qū)版最新版本為4.4.5:

這里,我們復(fù)制到的目錄假設(shè)為:/usr/local/mongodb/tgz
復(fù)制完成后,分別進(jìn)行解壓壓縮包,然后將其重命名:
tar -zvxf mongodb-linux-x86_64-rhel70-4.4.5.tgzmv ./mongodb-linux-x86_64-rhel70-4.4.5 /usr/local/mongodb
準(zhǔn)備三個Mongo節(jié)點的目錄和文件
進(jìn)入目錄:cd /usr/local/mongodb
創(chuàng)建db目錄:mkdir /usr/local/mongodb/data/db
創(chuàng)建日志目錄:mkdir /usr/local/mongodb/logs
創(chuàng)建日志文件:touch /usr/local/mongodb/logs/mongodb.log
準(zhǔn)備三個Mongo節(jié)點的配置文件
進(jìn)入目錄:cd /usr/local/mongodb
創(chuàng)建mongo配置文件:vi mongodb.conf
復(fù)制以下內(nèi)容進(jìn)入mongodb.conf:
systemLog:destination: filepath: /usr/local/mongodb/logs/mongodb.log # log pathlogAppend: truestorage:dbPath: /usr/local/mongodb/data/db # data directorynet:bindIp: 0.0.0.0port: 27017 # portreplication:replSetName: localrsprocessManagement:: true
添加三個Mongo節(jié)點的環(huán)境變量
修改profile文件:
cat /etc/profile<<"EOF">export PATH=$PATH:/usr/local/mongodb/bin>EOF
刷新profile文件:
source /etc/profile修改.bashrc文件:
cat >>/root/.bashrc<<"EOF"export PATH="$PATH:/usr/local/mongodb/bin"EOF
這時可以在任何目錄下輸入mongo命令就可以進(jìn)入mongo了。
添加三個Mongo節(jié)點的開機(jī)啟動
進(jìn)入system目錄:cd /lib/systemd/system
執(zhí)行以下命令:
cat mongodb.service<<"EOF"在>提示符下復(fù)制以下內(nèi)容:
[Unit]Description=mongodbAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/mongodb.confPrivateTmp=true[Install]WantedBy=multi-user.target
輸入EOF結(jié)束。
然后,設(shè)置mongodb.service的執(zhí)行權(quán)限:
chmod +x mongodb.service最后,設(shè)置mongodb.service開機(jī)自啟動:
systemctl enable mongodb.service在主節(jié)點配置復(fù)制集
進(jìn)入mongo shell:mongo
>rs.initiate()localrs:SECONDARY> rs.add("mongo-slave1:27017") # 注意這里master節(jié)點還處于SECONDARY角色了localrs:PRIMARY> rs.add("mongo-slave2:27017") # 注意這里master節(jié)點已經(jīng)被選為PRIMARY角色了
在兩個從節(jié)點配置復(fù)制集
localrs:SECONDARY>rs.secondaryOk()測試復(fù)制集是否可用
首先,在主節(jié)點進(jìn)入shell并插入一條數(shù)據(jù):
localrs:PRIMARY>db.yzjc.insertOne({"name":"cscec-jc-team"})localrs:PRIMARY> db.yzjc.find().pretty(){ "_id" : ObjectId("608b74155839b06ac76a938d"), "name" : "cscec-jc-team" }
然后,分別在兩個從節(jié)點查詢剛剛在主節(jié)點新插入的數(shù)據(jù)是否已經(jīng)同步:
localrs:SECONDARY> db.yzjc.find().pretty(){ "_id" : ObjectId("608b74155839b06ac76a938d"), "name" : "cscec-jc-team" }
可以看到,已經(jīng)同步到了兩個從節(jié)點了。
本文介紹了如何在Linux下安裝部署一個三節(jié)點MongoDB的復(fù)制集集群。
下一篇,我們會學(xué)習(xí)如何借助Mongo Tools實現(xiàn)數(shù)據(jù)恢復(fù) 與 提升安全性的一些實踐。
參考資料
唐建法,《MongoDB高手課》(極客時間)
郭遠(yuǎn)威,《MongoDB實戰(zhàn)指南》(圖書)
