背景
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