docker mongo 副本集 有权限

mongo 副本集 有权限

参照:https://monkeywie.cn/2020/03/10/mongodb-replica-set/

1.安装

1.1 构建镜像

  1. 准备秘钥用于节点之间的认证

    1.服务器运行生成密钥命令:
    openssl rand -base64 756 > auth.key
    
  2. 编写 Dockerfile

    #DockerFile 文件内容
    FROM mongo:3.4.10
    #将秘钥文件复制到镜像中
    COPY auth.key /app/auth.key
    RUN chown -R mongodb:mongodb /app/auth.key
    #设置秘钥文件权限,这一步非常关键
    RUN chmod 600 /app/auth.key
    
  3. 构建镜像 :

    docker build -t mongo-replset .
    

1.2 docker-compose 运行

  1. 主节点10.202.228.39 master docker-compose.yml 文件:

    version: "3.4"
    services:
      master:
        image: mongo-replset   # 记得要使用编译的生成的镜像
        container_name: "master" 
        restart: always
        ports:
          - 27017:27017
        environment:
          MONGO_INITDB_ROOT_USERNAME: cmdb
          MONGO_INITDB_ROOT_PASSWORD: cmdb
        volumes:
          - mongodb_data:/data/db
        command:
          - --replSet
          - mongoreplSet
          - --keyFile
          - /app/auth.key    #
      mongo-init:
        image: mongo:latest
        depends_on:
          - master
        restart: on-failure:5
        command:
          - mongo
          - mongodb://cmdb:cmdb@10.202.228.39:27017/admin
          - --eval
          - 'rs.initiate({ _id: "mongoreplSet", members: [{_id:1,host:"10.202.228.39:27017"},{_id:2,host:"10.202.228.8:27018"}]})'
      
    volumes:
      mongodb_data:
    
  2. 从节点10.202.228.8 slave docker-compose.yml 文件:

    version: "3.4"
    services:
      slave:
        image: mongo-replset  # 记得要使用编译的生成的镜像
        container_name: "slave" 
        restart: always
        ports:
          - 27018:27017
        command:
          - --mongoreplSet
          - xufang
          - --keyFile
          - /app/auth.key
    
  3. 先启动从节点,然后启动主节点服务

    原因:主节点中有初始化从节点命令,如果先不启动从节点,可能导致初始化检测失败,手动操作

    docker-compose up -d
    
  4. 配置从节点可读

    #进入容器 设置可读
    docker exec -it  slave mongo
    db.getMongo().setSecondaryOk()
    

2 检测

  1. 进去master 容器,查看状态

    进入容器,需要授权,才能查看状态
    docker exec -it master mongo
    use admin 
    # 授予用户权限 db.auth(username,password),查看副本集状态
    db.auth("cmdb","cmdb")
    rs.status()
    

    运行结果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8O0wdFON-1605763356733)(C:\Users\23138\AppData\Roaming\Typora\typora-user-images\image-20201119111418031.png)]

配置副本集和权限

  1. 进去master 容器 初始化副本集master节点信息和权限信息

    # 进入容器
    docker exec -it  m1 mongo
    #执行 主节点初始化命令
    config = {"_id" : "rs","members" : [{"_id" : 0,"host" : "10.202.228.8:27018"}]}
    rs.initiate(config)
    # 在数据库admin 创建用户为 超级权限:
    use admin
    db.createUser({user:"admin",pwd:"maxnerva",roles:[{role:"root",db:"admin"}]})
    
    # 授予用户权限 db.auth(username,password),查看副本集状态:
    db.auth("admin","maxnerva") 
    rs.status()
    

在这里插入图片描述

  1. 检测数据库是否可以连接:

    配置图:
    在这里插入图片描述

在这里插入图片描述

结果如下:
在这里插入图片描述

3 .额外:增加副本集节点

注意:增肌副本集节点:需要整个副本集必须有两个节点。

1.使用从节点上docker compose 文件,检测参数是否需要修改,然后在需要部署的服务器上docker compose 安装。

2.切换到主节点所在的服务器,进入主节点 docker exec -it master mongo

(1)使用 rs.add("ip:port")命令加入节点,如rs.add("10.202.228.8:27020")

(2)查看主节点状态rs.status()看是否从节点已经加入。

整个过程可能需要权限验证:

use admin
db.auth("cmdb","cmdb")
# doc 文档
## 一.Mongodb 副本集
### 1.docker compose 安装。
servers: 10.202.228.8,10.202.228.9,10.202.228.10 分别运行docker compose 命令;
容器名称分别为master-01;slave-01; slave-02;

version: "3"
services:
  master-01:
    image: mongo:latest
    container_name: "master-01" 
    ports:
      - "27017:27017"
command: mongod --replSet mongoreplset
volumes:
- mongodb_data:/data/db
volumes:
  mongodb_data:

### 2.修改配置:
1.1 主节点master-01 
(1) 容器:docker exec -it master-01 mongo
(2)执行config = {"_id" : "mongoreplset","members" : [{"_id" : 0,"host" : "10.202.228.8:27017"},{"_id" : 1,"host" : "10.202.228.9:27017"},{"_id" : 2,"host" : "10.202.228.10:27017"}]}
rs.initiate(config)
(1)执行rs.status() 查看状态。
1.2 从节点slave-01; slave-02;
(1)db.getMongo().setSecondaryOk()
(2)执行rs.status() 查看状态。


### 额外:增加从节点slave-03;
在服务器10.202.228.11上
version: "3"
services:
 slave-04:
    image: mongo:latest
    container_name: "slave-04" 
    ports:
      - "27017:27017"
command: mongod --replSet mongoreplset
volumes:
- mongodb_data:/data/db
volumes:
  mongodb_data:
(1)进入主节点,执行
rs.add("10.202.228.11:27017"); #移除rs.remove("10.202.228.11:27017"); 、
(2)进入从节点slave-03:执行
db.getMongo().setSecondaryOk()
(2)执行rs.status() 查看状态。
### 配置和运行 MongoDB 4.2 副本使用 Docker Compose 要通过 `docker-compose` 配置并运行 MongoDB 4.2 的副本,可以按照以下方法完成。以下是完整的配置过程以及注意事项。 #### 1. 创建 `keyFile` 为了确保节点之间的安全通信,需要生成一个密钥文件用于身份验证。可以通过以下命令生成: ```bash openssl rand -base64 756 > mongodb-keyfile chmod 400 mongodb-keyfile ``` 此命令生成了一个名为 `mongodb-keyfile` 的密钥文件,并将其权限设置为仅允许当前用户读取[^1]。 #### 2. 编写 `docker-compose.yml` 文件 下面是一个适用于 MongoDB 4.2 副本的 `docker-compose.yml` 文件示例: ```yaml version: '3.8' services: mongo-primary: image: mongo:4.2 container_name: mongo-primary hostname: mongo-primary volumes: - ./data/primary:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile ports: - 27017:27017 restart: always mongo-secondary1: image: mongo:4.2 container_name: mongo-secondary1 hostname: mongo-secondary1 volumes: - ./data/secondary1:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile expose: - 27017 restart: always mongo-secondary2: image: mongo:4.2 container_name: mongo-secondary2 hostname: mongo-secondary2 volumes: - ./data/secondary2:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile expose: - 27017 restart: always ``` 在此配置中: - 定义了三个服务:`mongo-primary`, `mongo-secondary1`, 和 `mongo-secondary2`。 - 每个服务都绑定了本地磁盘上的数据目录 `/data/[node-name]/` 并挂载了之前生成的 `mongodb-keyfile` 密钥文件。 - 设置了环境变量来定义管理员用户名和密码。 - 使用 `--replSet rs0` 参数指定副本名称为 `rs0`[^3]。 #### 3. 启动容器 启动容器前,请确保已经保存好 `docker-compose.yml` 文件及其关联的数据目录结构。执行以下命令启动所有容器: ```bash docker-compose up -d ``` 这将以分离模式启动所有的 MongoDB 实例[^2]。 #### 4. 初始化副本 一旦所有容器成功启动,进入主节点 shell 执行初始化脚本: ```bash docker exec -it mongo-primary mongo --username admin --password password <<EOF rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo-primary:27017" }, { _id: 1, host: "mongo-secondary1:27017" }, { _id: 2, host: "mongo-secondary2:27017" } ] }) EOF ``` 这段脚本会在主节点上发起一个新的副本实例,并将其他两个次级节点加入到该合中[^4]。 --- ### 注意事项 - 如果尝试在启用认证的情况下立即初始化副本,则可能会遇到错误提示无法连接至数据库;此时应先禁用认证再重新添加成员[^2]。 - 确保网络连通性良好以便各节点能够互相发现彼此的服务地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值