復(fù)制集注意事項
關(guān)于復(fù)制集:
- 復(fù)制集為 MongoDB 提供了數(shù)據(jù)可靠性,當(dāng)某個節(jié)點掛掉,可以重新選舉出主節(jié)點;
- 復(fù)制集為 MongoDB 提供了數(shù)據(jù)安全性,當(dāng)節(jié)點宕機后,備份數(shù)據(jù)保證數(shù)據(jù)不丟失;
- 復(fù)制集為 MOngoDB 提供了高性能,可通過配置主從讀寫分離提高服務(wù)性能;
關(guān)于硬件:
- 因為正常的復(fù)制集節(jié)點都有可能成為主節(jié)點,它們的地位是一樣的,因此硬件配置上必須一致;
- 為了保證節(jié)點不會同時宕機,各節(jié)點使用的硬件必須具有獨立性;
- 此處用的 Docker 在同一個虛擬機上模擬三個節(jié)點;
關(guān)于軟件:
- 復(fù)制集各節(jié)點軟件版本必須一致,以避免出現(xiàn)不可預(yù)知的問題;
- 增加節(jié)點不會增加系統(tǒng)寫性能;
- 此處用的 MongoDB 6.0.5 版本;
環(huán)境準備
- Docker 安裝 MongoDB 并配置好環(huán)境變量;
- 確保有 10GB 以上的硬盤空間;
- 默認已安裝 Docker,沒安裝的話請參考我的 Docker 教程;
- 宿主機器為 CentOS7;
一主兩從架構(gòu)圖:
安裝步驟
(1)準備配置文件
復(fù)制集的每個 mongod 進程應(yīng)該位于不同的服務(wù)器。我們現(xiàn)在在一臺機器上運行 3 個進程,因此要為它們各自配置:
- 不同的端口(28017/28018/28019)
- 不同的數(shù)據(jù)目錄
mkdir -p /data/db{1,2,3}
- 不同日志文件路徑(例如:/data/db1/logs)
mkdir -p /data/db{1,2,3}/logs
創(chuàng)建配置文件/data/db1/mongod.conf
,內(nèi)容如下:
systemLog:
destination: file
path: /data/logs/mongod.log # log path
logAppend: true
storage:
dbPath: /data/db # data directory
net:
bindIp: 0.0.0.0
port: 27017 # port
replication:
replSetName: rs0 # 復(fù)制集名稱
# processManagement: # 設(shè)置了該項會導(dǎo)致docker exec -it mongodb1 bash 進入容器后馬上自動退出
# fork: true
將該配置文件復(fù)制都 db2、db3 對應(yīng)的目錄下,注意其中配置的是容器中的地址,而不是宿主機對應(yīng)的地址,且必須是 yaml 格式。
(2)啟動 docker
啟動第 1 個 mongod:
docker run --name mongodb1 -d --restart=always -v /data/db1:/data/db -v /data/db1/logs:/data/logs -v /data/db1/mongod.conf:/data/conf/mongod.conf -p 28017:27017 mongo:6.0.5 --config /data/conf/mongod.conf
–name:指定容器名稱
-d:后臺運行
–restart:設(shè)置容器的重啟策略,always 表示重啟宿主機自動運行 docker
-v:將宿主機文件掛載到容器中,注意格式為:“宿主機路徑 : 容器路徑”
-p:綁定宿主機和容器的端口,注意格式為:“宿主機端口 : 容器端口”
mongo:6.0.5:指定鏡像名和版本號
–config:指定啟動的配置文件,容器中的路徑
啟動第 2 個 mongod:
docker run --name mongodb2 -d --restart=always -v /data/db2:/data/db -v /data/db2/logs:/data/logs -v /data/db2/mongod.conf:/data/conf/mongod.conf -p 28018:27017 mongo:6.0.5 --config /data/conf/mongod.conf
啟動第 3 個 mongod:
docker run --name mongodb3 -d --restart=always -v /data/db3:/data/db -v /data/db3/logs:/data/logs -v /data/db3/mongod.conf:/data/conf/mongod.conf -p 28019:27017 mongo:6.0.5 --config /data/conf/mongod.conf
查看 docker 進程狀態(tài)及網(wǎng)絡(luò)端口:
注意 docker 啟動,宿主機的防火墻 firewalld 必須開啟,否則會報如下錯誤:
通過客戶端工具訪問 mongodb:
進入 docker 容器操作 mongodb:
# 宿主機進入容器
docker exec -it mongodb1 bash
# 進入容器mongodb的命令行模式
mongosh
# 查看mongodb數(shù)據(jù)庫
show dbs
至此,三個 mongod 節(jié)點安裝完成。
配置復(fù)制集
復(fù)制集通過 mongosh 的 rs.initiate()
進行初始化,初始化后各個成員間開始發(fā)送心跳消息,并發(fā)起 Priamry 選舉操作,獲得大多數(shù)成員投票支持的節(jié)點,會成為 Primary,其余節(jié)點成為 Secondary。
進入 mongdb1 節(jié)點后執(zhí)行 mongosh 命令后:
# mongosh --port 28017
# 初始化復(fù)制集
> rs.initiate({
_id: "rs0",
members: [{
_id: 0,
host: "192.168.10.101:28017"
},{
_id: 1,
host: "192.168.10.101:28018"
},{
_id: 2,
host: "192.168.10.101:28019"
}]
})
提示{ok:1}表示初始化成功:
驗證主從節(jié)點讀寫操作:
- MongoDB 主節(jié)點進行寫入
# mongosh --port 28017
rs0 [direct: primary] test> db.user.insertMany([{name:"firechou"},{name:"monkey"}])
- 切換到從節(jié)點寫入,拋出異常
MongoBulkWriteError: not primary
# mongosh --port 28018
rs0 [direct: secondary] test> db.user.insertMany([{name:"firechou"},{name:"monkey"}])
- MongoDB 從節(jié)點進行讀
# mongosh --port 28018
# 指定從節(jié)點可讀
rs0:SECONDARY> rs.secondaryOk() # 需要執(zhí)行該命令,否則會報錯
rs0:SECONDARY> db.user.find()
或者執(zhí)行如下命令開啟從節(jié)點讀:
db.getMongo().setReadPref("secondary")
- 模擬重新選舉 Master
停掉 mongodb1 服務(wù):
查看 mongodb2 服務(wù)已被選舉成了 Primary 節(jié)點:
啟動 mongodb1 后再次執(zhí)行寫入操作,提示非主節(jié)點不能寫入:
復(fù)制集狀態(tài)查詢
- 查看復(fù)制集整體狀態(tài):
rs.status()
可查看各成員當(dāng)前狀態(tài),包括是否健康,是否在全量同步,心跳信息,增量同步信息,選舉信息,上一次的心跳時間等。
說明:
members:數(shù)組,一列體現(xiàn)了所有復(fù)制集成員的狀態(tài),主要如下:
health:成員是否健康,通過心跳進行檢測。
state/stateStr:成員的狀態(tài),PRIMARY 表示主節(jié)點,而 SECONDARY 則表示備節(jié)點,如果節(jié)點出現(xiàn)故障,則可能出現(xiàn)一些其他的狀態(tài),例如 RECOVERY。
uptime:成員的啟動時間。
optime/optimeDate:成員同步最后一條 oplog 的時間。
optimeDurable/optimeDurableDate:成員同步最后一條 oplog 持久化的時間。
pingMs:成員與當(dāng)前節(jié)點的 ping 時延。
syncingTo:成員的同步來源。文章來源:http://www.zghlxwxcb.cn/news/detail-814090.html
- 查看當(dāng)前節(jié)點角色:
db.isMaster()
除了當(dāng)前節(jié)點角色信息,是一個更精簡化的信息,也返回整個復(fù)制集的成員列表,真正的 Primary 是誰,協(xié)議相關(guān)的配置信息等,Driver 在首次連接復(fù)制集時會發(fā)送該命令。文章來源地址http://www.zghlxwxcb.cn/news/detail-814090.html
Mongos 復(fù)制集常用命令
**命令 ** | 描述 |
---|---|
rs.add() | 為復(fù)制集新增節(jié)點 |
rs.addArb() | 為復(fù)制集新增一個 arbiter |
rs.conf() | 返回復(fù)制集配置信息 |
rs.freeze() | 防止當(dāng)前節(jié)點在一段時間內(nèi)選舉成為主節(jié)點 |
rs.help() | 返回 replica set 的命令幫助 |
rs.initiate() | 初始化一個新的復(fù)制集 |
rs.printReplicationInfo() | 以主節(jié)點的視角返回復(fù)制的狀態(tài)報告 |
rs.printSecondaryReplicationInfo() | 以從節(jié)點的視角返回復(fù)制狀態(tài)報告 |
rs.reconfig() | 通過重新應(yīng)用復(fù)制集配置來為復(fù)制集更新配置 |
rs.remove() | 從復(fù)制集中移除一個節(jié)點 |
rs.secondaryOk() | 為當(dāng)前的連接設(shè)置從節(jié)點可讀 |
db.getMongo().setReadPref(“secondary”) | 為當(dāng)前的連接設(shè)置從節(jié)點可讀,推薦使用 |
rs.status() | 返回復(fù)制集狀態(tài)信息 |
rs.stepDown() | 讓當(dāng)前的 primary 變?yōu)閺墓?jié)點并觸發(fā) |
electionrs.syncFrom() | 設(shè)置復(fù)制集節(jié)點從哪個節(jié)點處同步數(shù)據(jù),將會覆蓋默認選取邏輯 |
到了這里,關(guān)于MongoDB搭建復(fù)制集集群(Docker版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!