MongoDB4.2.8副本集(複製集)環境搭建

背景

1)主要爲了解決SpringBoot集成MongoDB的事務問題

2)實際使用還是要搭配分片以及副本集使用,不要僅使用副本集。

副本集的特點

1)主節點唯一

主節點唯一,但是不固定(不確定的原因是:主節點掛了的話,會重新選舉出一個主節點)。

2)大多數原則

大多數原則,即1/2原則,一個複製集集羣中,如果有大於等於1/2的節點不可用的話,那麼整個進羣將不可寫,只可讀(注:實際上應該是投票權重的1/2。

3)從庫無法寫入

從庫無法寫入,使用root權限也不行,這一點與MySQL不同,MySQL從庫不能寫入,原因是設置了readOnly。

4)副本集可以自動進行容災

主節點服務不可用,會自動選舉出新的主節點。

副本集節點介紹

1)數據節點-------主節點

主節點負責數據的讀寫操作,並把寫的操作記錄到OpLog中(mongo隱藏的庫local的oplog集合)

2)數據節點-------從節點

複製主節點的數據,備份容災用,主節點掛掉,會重新選舉出新的主節點,從節點無法進行寫操作,即使擁有root權限也不行(不同於MySQL)

3)投票節點

不負責數據的存儲和複製,只負責投票。(注:理論上一個mongo複製集,可以有一個主節點,多個從節點,多個投票節點

複製集工作方式

1)客戶端驅動指向mongo數據庫,寫的時候只會在主節點上進行,寫的信息會記錄在oplog中,從節點根據oplog把寫入操作複製到從節點上。

2)複製集異步操作,刷盤下效率或者網絡問題影響下,從節點會有一定的延遲,所以讀操作默認也是指向主節點,如果對實時性要求不高,可以配置指向從節點,實現讀寫分離。

副本集環境的搭建

1)基礎條件

系統:Centos7.x

版本:mongo4.2.5

機器:單機多實例

角色分配: 

Primary localhost:27000 主節點 負責讀寫
Secondary localhost:27001 從節點,負責容災,主節點掛掉,則從節點成爲主節點
Arbiter localhost:27002 投票節點,不負責數據的存儲讀寫,存在的意義是,遵循下mongo複製集的1/2原則

2)搭建過程

1.下載安裝包

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz

2.解壓安裝包

tar -zxvf  mongodb-linux-x86_64-rhel70-4.2.8.tgz

#修改文件解壓後的文件名稱
mv mongodb-linux-x86_64-rhel70-4.2.8 mongodb4.2.8

3.創建目錄

cd mongodb4.2.8/

#在解壓後的mongodb目錄新建 data  log  config目錄
mkdir data|mkdir log|mkdir config

在data和config目錄分別創建rs1  rs2 rs3目錄
cd data && mkdir rs1|mkdir rs2|mkdir rs3
cd config && mkdir rs1|mkdir rs2|mkdir rs3

4.創建實例啓動配置

在config中的rs1 rs2 rs3分別增加mongod.cfg文件

touch mongod.cfg

#rs1配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs1        			 #mongo數據安裝目錄
logpath=/data/app/mongodb4.2.8/log/rs1.log    			 #日誌打印的目錄
journal=true                                             #數據是否故障恢復
port=27000                                               #端口
replSet=rs                                               #複製集名稱
logappend=true                                           #複製集日誌是以追加的方式進行
fork = true                                              #是否後臺啓動
bind_ip=0.0.0.0                                          #綁定主機


#rs2配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs2        			
logpath=/data/app/mongodb4.2.8/log/rs2.log    			 
journal=true                                             
port=27001                                               
replSet=rs                                               
logappend=true                                           
fork = true                                              
bind_ip=0.0.0.0


#rs3配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs3        			 
logpath=/data/app/mongodb4.2.8/log/rs3.log    			 
journal=true                                             
port=27002                                               
replSet=rs                                               
logappend=true                                           
fork = true                                              
bind_ip=0.0.0.0

5.啓動實例

#進入到mongodb家目錄
cd mongodb4.2.8/

bin/mongod --config /data/app/mongodb4.2.8/config/rs1/mongod.cfg &
bin/mongod --config /data/app/mongodb4.2.8/config/rs2/mongod.cfg &
bin/mongod --config /data/app/mongodb4.2.8/config/rs3/mongod.cfg &

#檢查實例啓動情況
ps -ef|grep mongo

6.加入副本集集羣

#使用命令行,進入到27000實例
bin/mongo -port 27000

#初始化一個副本集
rs.initiate()

#查看副本集狀態命令
rs.conf()

#加入secondary節點
rs.add("localhost:27001")

#加入投票節點
rs.addArb("localhost:27002")

#查看副本集狀態
rs.status()


#重要且必須, secondary節點允許讀取操作在當前節點進行,否則從節點無法複製主節點的數據
#進入secondary實例
bin/mongo -port 27001
rs.slaveOk()

7.驗證

1>驗證數據複製

#主節點
use test
db.createCollection('user')
db.user.insert({'name':'james'})
 
#從節點
use test
show collections
db.user.find()

2>驗證自動切換主節點

#關閉主節點實例
ps -ef|grep 27000
kill -2 進程號
 
#同時打開從節點,按幾次回車會發現,從節點名稱從secondary變成primary表示進行了自動切換節點

8.思考

主節點服務停掉後,secondary節點成爲新的主節點,當主節點恢復後,之前的主節點將會變成secondary節點,有什麼辦法讓他繼續成爲主節點呢?

#查看權重
rs.conf()

修改權重後再次查看權重:

cfg = rs.conf();
cfg.members[0].priority = 2;
rs.reconfig(cfg);
 
rs.conf()

按幾次回車鍵,神奇的發現

這時會發現之前的主節點再次成爲主節點,成爲主節點的secondary再次變成secondary

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章