• docker+mongo主从仲裁+用户密码认证


    服务器信息:CentOS
    docker版本:version 20.10.17
    mongoDB:3.6.18
    在两台服务器上部署mongo主从
    机器A:192.168.214.111 (部署mongo主节点)
    机器B:192.168.214.222 (部署mongo从节点+仲裁节点)

    1 环境配置

    1.1 准备mongo映射路径

    机器A和机器B都操作

    # 数据文件
    mkdir -p /usr/local/mongo/data
    # 日志文件
    mkdir -p /usr/local/mongo/log
    # 配置文件
    mkdir -p /usr/local/mongo/conf
    # key文件
    mkdir -p /usr/local/mongo/key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1.2 准备mongo配置文件

    机器A和机器B都操作

    cd /usr/local/mongo/conf
    vi mongo.conf
    
    • 1
    • 2

    mongo.conf内容如下:

    net:
        #启动端口
        port: 27017
        #允许连接的IP(0.0.0.0作用与--bind_ip_all类似)
        bindIp: 0.0.0.0
    systemLog:
        #重新启动mongodb的时候日志拼接在以前的日志文件上
        logAppend: true
    security:
        #路径是容器内的路径
        keyFile: "/data/mongodbKey.key"
        #开启客户端连接认证 disabled 关闭授权
        authorization: "enabled"
    replication:
        replSetName: "mongo"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1.3 准备仲裁服务映射路径

    在机器B 192.168.214.222上执行

    # 数据文件
    mkdir -p /usr/local/mongo-arbiter/data
    # 日志文件
    mkdir -p /usr/local/mongo-arbiter/log
    # 配置文件
    mkdir -p /usr/local/mongo-arbiter/conf
    # key文件
    mkdir -p /usr/local/mongo-arbiter/key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1.4 准备仲裁服务配置文件

    在机器B 192.168.214.222上执行

    cd /usr/local/mongo-arbiter/conf
    vi mongo.conf
    
    • 1
    • 2

    mongo.conf内容如下:

    net:
        #启动端口
        port: 27017
        #允许连接的IP(0.0.0.0作用与--bind_ip_all类似)
        bindIp: 0.0.0.0
    systemLog:
        #重新启动mongodb的时候日志拼接在以前的日志文件上
        logAppend: true
    security:
        #路径是容器内的路径
        keyFile: "/data/mongodbKey.key"
        #开启客户端连接认证 disabled 关闭授权
        authorization: "enabled"
    replication:
        replSetName: "mongo"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1.5 准备key文件

    在机器A或机器B上执行都行,我是在机器A 192.168.214.111上执行的

    cd /usr/local/mongo/key
    # 生成key文件
    openssl rand -base64 756 > mongodbKey.key
    # key文件必须设置成400,否则将会失败(设置成其他都会失败了,不知道是不是这个权限问题)
    chmod 400 mongodbKey.key
    # 赋予容器内key权限(主从仲裁节点都需要执行)
    chown 999:999 mongodbKey.key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后,将mongodbKey.key分别复制到机器B的 /usr/local/mongo/key 和 /usr/local/mongo-arbiter/key 路径下
    并分别进入/usr/local/mongo/key 和 /usr/local/mongo-arbiter/key 路径下给mongodbKey.key授予权限

    # 授予权限
    chmod 400 mongodbKey.key
    chown 999:999 mongodbKey.key
    
    • 1
    • 2
    • 3

    2. 安装mongo主从、仲裁

    在机器A 192.168.214.111上执行

    # mongo主节点
    # replSet "mongo" 和mongo.conf中的replSetName要保持一致
    docker run -di -p 27017:27017 -e TZ=Asia/Shanghai --restart always \
    -v /usr/local/mongo/conf/:/data/conf \
    -v /usr/local/mongo/data/:/data/db \
    -v /usr/local/mongo/log:/data/log \
    -v /usr/local/mongo/key/mongodbKey.key:/data/mongodbKey.key \
    --name mongo_master mongo:3.6.18 --auth \
    --replSet "mongo" \
    --bind_ip_all -f /data/conf/mongo.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在机器B 192.168.214.222上执行

    # mongo从节点
    docker run -di -p 27017:27017 -e TZ=Asia/Shanghai --restart always \
    -v /usr/local/mongo/conf/:/data/conf \
    -v /usr/local/mongo/data/:/data/db \
    -v /usr/local/mongo/log:/data/log \
    -v /usr/local/mongo/key/mongodbKey.key:/data/mongodbKey.key \
    --name mongo_slave mongo:3.6.18 --auth \
    --replSet "mongo" \
    --bind_ip_all -f /data/conf/mongo.conf
    
    # 仲裁节点
    docker run -di -p 27018:27017 -e TZ=Asia/Shanghai --restart always \
    -v /usr/local/mongo-arbiter/conf/:/data/conf \
    -v /usr/local/mongo-arbiter/data/:/data/db \
    -v /usr/local/mongo-arbiter/log:/data/log \
    -v /usr/local/mongo-arbiter/key/mongodbKey.key:/data/mongodbKey.key \
    --name mongo_arbiter mongo:3.6.18 --auth \
    --replSet "mongo" \
    --bind_ip_all -f /data/conf/mongo.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3. 初始化主从+仲裁节点

    在机器A或机器B上执行都行,我是在机器A 192.168.214.111上执行的

    # 进入容器中mongo客户端
    docker exec -it mongo_master mongo
    # 带仲裁节点的初始化
    # _id:"mongo",mongo为副本集名称(mongo.conf中的replSetName,注意保持一致),对应--replSet后的名称
    # priority数值大的优先级高,即为默认主节点
    config={  
         _id:"mongo",
        members:[
            {_id:0,host:"192.168.214.111:27017",priority:3},     
            {_id:1,host:"192.168.214.222:27017",priority:2},
            {_id:2,host:'192.168.214.222:27018',arbiterOnly:true}
           ]
        }
        #初始化
     rs.initiate(config) 
     # 初始化完成后可以查看状态
     rs.status() 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4. 创建用户名密码

    在mongo主节点上执行

    docker exec -it mongo_master mongo   
    #切换至admin
    use admin
    #添加用户
    db.createUser({user:'root',pwd:'root',roles:[{role:'userAdminAnyDatabase',db:'admin'},{role:'root',db:'admin'}]})
    #登录
    db.auth('root','root')
    #切换至测试库
    use test
    #给测试库添加账户
    db.createUser({user:'test',pwd:'123321',roles:[{role:'dbOwner',db:'test_db'}]})
    # 认证用户
    db.auth('test','123321')
    #给测试库添加数据
    db.userinfo.insert({"name":"李四","sex":"男"})
    # 使用user:'test',pwd:'123321'连接mongo数据库,可以看到数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5. 注意事项

    (1)注意开防火墙端口
    (2)如果在初始化时出现连接错误,可以在步骤2创建docker的命令上加上–network=host参数(仅mongo主从容器加,仲裁节点不需要)
    (3)如果在搭建过程中出现错误,需要重新搭建,记得一定要将主从和仲裁的data路径下的数据删光,再重新搭建

  • 相关阅读:
    亚马逊国际获得AMAZON商品详情 API 返回值说明
    C#学习以及感受
    【附源码】Python计算机毕业设计宁夏源沣医药线上销售平台
    windows mysql解压缩版安装指南
    【算法面试必刷Java版四】合并两个排序的链表
    godot引擎学习3
    Spring中如何获取JavaBean呢?
    中高级前端开发需要掌握的vue知识点
    html网页代码块高亮加行号
    【校招VIP】前端JS语言考点之px rem等单位
  • 原文地址:https://blog.csdn.net/weixin_45753881/article/details/126747256