1.生成keyFile文件
-
MongoDB使用keyfile認證,副本集中的每個mongod實例使用keyfile內容作為認證其他成員的共享密碼。mongod實例只有擁有正確的keyfile才可以加入副本集。
-
keyFile的內容必須是6到1024個字符的長度,且副本集所有成員的keyFile內容必須相同。
-
有一點要注意是的:在UNIX系統中,keyFile必須沒有組權限或完全權限(也就是權限要設置成X00的形式)。Windows系統中,keyFile權限沒有被檢查。
-
可以使用任意方法生成keyFile。例如,使用openssl生成復雜的隨機的1024個字符串。然后使用chmod修改文件權限,只給文件擁有者提供讀權限。
在部署目錄中,新建conf文件夾,然后執行以下指令,使用openssl進行生成隨機字符串,存入mongodb.key文件
# 400權限是要保證安全性,否則mongod啟動會報錯 # 存放目錄隨意,只要對應yaml文件中的地址即可。 openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key
2.docker-compose.yml文件
version: "3"
services:
#主節點
mongodb0:
image: mongo:4.0.20
container_name: mongo0
restart: always
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb0/data:/data/db
- ./runtime/mongodb0/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
#副節點
mongodb1:
image: mongo:4.0.20
container_name: mongo1
restart: always
ports:
- 27018:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb1/data:/data/db
- ./runtime/mongodb1/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
#仲裁節點
mongodb2:
image: mongo:4.0.20
container_name: mongo2
restart: always
ports:
- 27019:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb2/data:/data/db
- ./runtime//mongodb2/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
networks:
mongo-network:
external: false
注:
chown 999:999 /mongodb.key:999用戶是容器中的mongod用戶,通過chown修改文件用戶權限
mongod --replSet rs0 --keyFile /mongodb.key 啟動命令,--replSet rs0 以副本集形式啟動並將副本集名字命名為 rs0
--keyFile /mongodb.key 設置keyFile,用於副本集通信,文件通過 volumes 映射到容器內
# 選擇第一個容器mongo0,進入mongo 容器 docker exec -it mongo0 bash # 登錄mongo mongo -u root -p root
或者通過以下方式進入Mongo容器鏈接Mongo
docker exec -it mongo0 mongo
通過以下指令配置mongo副本集集群
# 認證 use admin db.auth('root', 'meiyoumima2021')
成功返回1,失敗返回0
初始化副本集:
rs.initiate()
無參初始化后,當前節點默認是PRIMARY節點
添加節點:
# 副節點 rs.add('mongo1:27017') # 仲裁節點 rs.add('mongo2:27017', true)
查看副本集配置信息:
rs.conf()
查看副本集運行狀態:
rs.status()
增長mongo0的權重:
cfg = rs.conf() # 修改權重 cfg.members[0].priority=5 # 從新配置 rs.reconfig(cfg)
仲裁節點的權重默認為 0,其它節點默認為 1。調高mongo0節點的權重后,若是mongo0宕機,mongo1會成為新主節點,當mongo0恢復后會重新成為主節點。
切換節點查看同步狀態:
rs.printReplicationInfo()
僅當建立了集合后副節點才會進行同步。
