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()

仅当建立了集合后副节点才会进行同步。

posted @ 2022-02-28 18:27  水木神舟10  阅读(1177)  评论(0编辑  收藏  举报