docker-compose 部署mongo副本集集群,主從仲裁


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 映射到容器內



3.建立副本集
進入Mongo容器鏈接Mongo
# 選擇第一個容器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恢復后會重新成為主節點。



4.驗證副本集
 

切換節點查看同步狀態:

rs.printReplicationInfo()

僅當建立了集合后副節點才會進行同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM