MongoDB副本集

Se7eN_HOU發表於2022-01-12

一、副本集(Replication Set)

  複本集解決的問題的:

  1. 資料高可用,當主節點當機,從節點可以馬上頂上去,但是隻是解決當機問題,如果被黑了,或者資料被誤刪除了,從節點的資料依然也是被刪除,這一點上是不可以保證資料的安全的
  2. 副本集可以解決mongodb的事務問題。

  MongoDB的副本集至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的資料,建議提供仲裁節點,側節點不儲存資料,作用是當主節點出現故障時,選舉出某個備用節點成為主節點,保證MongoDB的正常服務。客戶端只需要訪問主節點或者從節點,不需要訪問仲裁節點。

  MongoDB各個節點常見的搭配方式為:一主一從一仲裁,一主多從一仲裁,一主多從多仲裁。

  主節點記錄在其上的所有操作oplog(操作日誌),從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作,從而保證從節點與主節點一致。

 

二、副本集實現思路

  無論是主節點還是從節點,都是獨立的mongo程式,可以放在不同的伺服器上,也可以放在同一個伺服器上,使用不同的埠號區分,即偽複本集,可以解決mongodb的事務問題

  主節點和從節點,最好都配置開機自動啟動,詳細請見《Centos8上安裝MongoDB4.X

  主從節點的配置檔案要配置同樣的複本集名字

 

三、副本集配置舉例

  在伺服器啟動四個mongodb整合,模擬四個不同的伺服器的mongo,使用不同的埠號區分

  1. primary: 192.xx.xx.xx:2727 (主節點)
  2. secondary1:192.xx.xx.xx:27278 (從節點1 或者 副本集1)
  3. secondary2:192.xx.xx.xx:27279  (從節點2 或者 副本集2)
  4. arbiter:192.xx.xx.xx:27280 (仲裁節點,只參與主從節點切換的選舉,不儲存資料)

  需要為這四個節點,都單獨配置data路徑,log路徑,pid檔案路徑,conf檔案,已經副本之間的驗證檔案mongo.keyfile

  

 

四、配置data路徑

[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd data
[root@VM-16-13-centos data]# ls
db  rs
[root@VM-16-13-centos data]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter  primary  secondary1  secondary2
[root@VM-16-13-centos rs]#

 

五、配置log日誌

[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin conf data LICENSE-Community.txt logs mongo.keyfile MPL-2 pids README THIRD-PARTY-NOTICES THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd logs
[root@VM-16-13-centos logs]# ls
mongodb.log rs
[root@VM-16-13-centos logs]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.log primary.log secondary1.log secondary2.log secondary.log

 

六、生產mongo.keyfile

[root@VM-16-13-centos mongodb4]# openssl rand -base64 90 > ./mongo.keyfile

 

七、配置pids檔案路徑

只需要建立到rs檔案即可,裡面具體的pid檔案會在執行的時候自動建立。

[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd pids
[root@VM-16-13-centos pids]# ls
rs
[root@VM-16-13-centos pids]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.pid  primary.pid  secondary1.pid  secondarys.pid

 

八、配置conf檔案

[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd conf
[root@VM-16-13-centos conf]# ls
mongodb.conf  rs
[root@VM-16-13-centos conf]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.conf  primary.conf  secondary1.conf  secondary2.conf

primary.conf配置內容,secondary1.conf,secondary2.conf 以及 arbiter.conf 雷同,只需修改其中部分配置的路徑

port=27277 #埠 預設埠是27017,但是mongodb特別容易被攻擊,所以這裡不建議使用預設埠
dbpath= /opt/mongodb4/data/rs/primary #資料庫存檔案存放目錄,副本集中的主資料庫
logpath= /opt/mongodb4/logs/rs/primary.log #日誌檔案存放路徑
logappend=true #使用追加的方式寫日誌
fork=true #以守護程式的方式執行,建立伺服器程式
maxConns=100 #最大同時連線數
auth=true #不啟用驗證,先不開啟,配完使用者在更改開啟
journal=true #每次寫入會記錄一條操作日誌(通過journal可以重新構造出寫入的資料)。
#即使當機,啟動時wiredtiger會先將資料恢復到最近一次的checkpoint點,然後重放後續的journal日誌來恢復。
storageEngine=wiredTiger #儲存引擎有mmapv1、wiretiger、mongorocks
bind_ip = 0.0.0.0 #0.0.0.0代表任何IP地址,如果寫127.0.0.1那就只能本機訪問,其他同理
replSet=rs # 設定副本集的名稱,這裡主節點的名稱和從節點的名稱一定要一致 (副本集需要的)
pidfilepath=/opt/mongodb4/pids/rs/primary.pid # 這裡的pid mongo會自己建立 (副本集需要的)
oplogSize=1024 # 日誌的大小,單位是M (副本集需要的)
keyFile=/opt/mongodb4/mongo.keyfile #主從節點之間做認證的 (副本集需要的)

 

九、初始化副本集

  副本集配置好了之後,還要在主節點中先登入mongo的客戶端,然後再註冊複本集

# mongodb 的複製集配置
rs.initiate({
    "_id":"rs",
        "members":[
        {"_id":0, "host":"192.xx.xx.xx:27277", "priority":3},
        {"_id":1, "host":"192.xx.xx.xx:27278", "priority":1},
        {"_id":2, "host":"192.xx.xx.xx:27279", "priority":1},
        {"_id":3, "host":"192.xx.xx.xx:27280", "arbiterOnly":true}
    ]      
});

 至此副本集的基礎配置完畢了

 

十、副本集的安全驗證

# 設定查詢mongodb的所有使用者
db.system.users.find().pretty()
# 建立使用者
db.createUser({user:"admin",pwd:"Se7eN521",roles:[{role:"root",db:"admin"}]});
# 副本集,只需要在主節點上設定密碼,其他從節點會自定被設定上密碼

 

# 如果作為主節點關機不成功,可以先使用下面的命令,在關機
# 可以通過replSetStepDown命令下架主節點。這個命令可以登入主節點使用
db.adminCommand({replSetStepDown : 1})
# 如果殺不掉可以使用強制開關
db.adminCommand({replSetStepDown : 1, force : true})
# 或者使用 rs.stepDown(120)也可以達到同樣的效果,中間的數字指不能在停止服務這段時間成為主節點,單位為秒。

db.shutdownServer()

 

十一、副本集配置開機自動啟動

  其步驟命令和《Centos8上安裝MongoDB4.X》中講解的配置開機自啟一致的

# mongodb副本集的開機自動啟動
在/lib/systemd/system/ 建立檔案 mongodb-primary.service
[Unit]
Description=mongodb-arbiter
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/opt/mongodb4/bin/mongod --config /opt/mongodb4/conf/rs/arbiter.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/mongodb4/bin/mongod --shutdown --config /opt/mongodb4/conf/rs/arbiter.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

上面是配置主節點的路徑和程式碼,副本節點和仲裁節點一樣,換成對應的路徑和名稱即可

副本集的服務命令:具體後面的命令的名字是自己起的。

  • systemctl enable mongodb-primary.service
  • systemctl enable mongodb-secondary1.service
  • systemctl enable mongodb-secondary2.service
  • systemctl enable mongodb-arbit.service

 

相關文章