美文网首页运维收藏already
【4.12】服务器安装 Docker Swarm中搭建 Mong

【4.12】服务器安装 Docker Swarm中搭建 Mong

作者: 王滕辉 | 来源:发表于2021-12-27 09:17 被阅读0次

    副本多分片

    https://blog.csdn.net/jianhao2010303/article/details/113541109

    创建网络 overly

    docker network create -d overlay  mongo_test 
    

    创建 keyfile

    mkdir -p /home/data/db/testm/mongos
    cd /home/data/db/testm/mongos
    
    openssl rand -base64 741 > key.file
    chmod 600 /home/data/db/testm/mongos/key.file
    chown 999 /home/data/db/testm/mongos/key.file
    

    创建数据存储路径

    rm -Rf  /home/data/db/testm/shard11 /home/data/db/testm/shard12 /home/data/db/testm/shard13
    mkdir -p /home/data/db/testm/shard11 /home/data/db/testm/shard12 /home/data/db/testm/shard13
    
    rm -Rf  /home/data/db/testm/shard21 /home/data/db/testm/shard22 /home/data/db/testm/shard23
    mkdir -p /home/data/db/testm/shard21 /home/data/db/testm/shard22 /home/data/db/testm/shard23
    
    rm -Rf  /home/data/db/testm/shard31 /home/data/db/testm/shard32 /home/data/db/testm/shard33
    mkdir -p /home/data/db/testm/shard31 /home/data/db/testm/shard32 /home/data/db/testm/shard33
    
    rm -Rf  /home/data/db/testm/config1 /home/data/db/testm/config2 /home/data/db/testm/config3
    mkdir -p /home/data/db/testm/config1 /home/data/db/testm/config2 /home/data/db/testm/config3
    
    

    创建配置文件

    cd /home/data/db/testm/mongos
    

    以下配置文件注意 security 需要先注释掉方便我们进行配置

    mongod.conf

    # mongod.conf
    storage:
      dbPath: /data/db
      journal:
        enabled: true
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod.log
    net:
      port: 27017
      bindIp: 0.0.0.0
    processManagement:
      timeZoneInfo: /usr/share/zoneinfo
    #security:
    #  #KeyFile鉴权文件
    #  keyFile: /etc/key.file
    #  #开启认证方式运行
    #  authorization: enabled
    replication:
      replSetName: cfg
    sharding:
      clusterRole: configsvr
    

    mongos.conf

    # mongos.conf
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod.log
    net:
      port: 27020
      bindIp: 0.0.0.0
    processManagement:
      fork: true
      timeZoneInfo: /usr/share/zoneinfo
    #security:
    #  #KeyFile鉴权文件
    #  keyFile: /etc/key.file
    sharding:
      configDB: cfg/config1:27017,config2:27017,config3:27017
    

    shard{1,2,3}.conf

    # shard1.conf
    storage:
      dbPath: /data/db
      journal:
        enabled: true
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod.log
    net:
      port: 27017
      bindIp: 0.0.0.0
    processManagement:
      timeZoneInfo: /usr/share/zoneinfo
    #security:
    #  #KeyFile鉴权文件
    #  keyFile: /etc/key.file
    #  #开启认证方式运行
    #  authorization: enabled
    
    replication:
      # 名称需要对应修改 我使用的是 rs{1,2,3}
      replSetName: rs1
    
    sharding:
      clusterRole: shardsvr
    

    docker-compose.yml

    version: '3.7'
    services:
      shard11:
        hostname: shard11
        container_name: shard11
        image: mongo:4.0.3
        restart: always
        networks:
          - mongo_test
        command: mongod -f /data/conf/shard1.conf
        privileged: true
        ports:
          - 19001:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard11:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard12:
        hostname: shard12
        container_name: shard12
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard1.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19002:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard12:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard13:
        hostname: shard13
        container_name: shard13
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard1.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19003:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard13:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard21:
        hostname: shard21
        container_name: shard21
        image: mongo:4.0.3
        restart: always
        networks:
          - mongo_test
        command: mongod -f /data/conf/shard2.conf
        privileged: true
        ports:
          - 19021:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard21:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard22:
        hostname: shard22
        container_name: shard22
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard2.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19022:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard22:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard23:
        hostname: shard23
        container_name: shard23
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard2.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19023:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard23:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
    
     shard31:
        hostname: shard31
        container_name: shard31
        image: mongo:4.0.3
        restart: always
        networks:
          - mongo_test
        command: mongod -f /data/conf/shard3.conf
        privileged: true
        ports:
          - 19031:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard31:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard32:
        hostname: shard32
        container_name: shard32
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard3.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19032:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard32:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      shard33:
        hostname: shard33
        container_name: shard33
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/shard3.conf
        privileged: true
        networks:
          - mongo_test
        ports:
          - 19033:27017
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/shard33:/data/db
          - /home/data/db/testm/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
    
      config1:
        image: mongo:4.0.3
        restart: always
        command:  mongod -f /data/conf/mongod.conf
        networks:
          - mongo_test
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/config1:/data/db
          - /home/data/db/mongo/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      config2:
        image: mongo:4.0.3
        restart: always
        command: mongod -f /data/conf/mongod.conf
        networks:
          - mongo_test
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/config2:/data/db
          - /home/data/db/mongo/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      config3:
        image: mongo:4.0.3
        restart: always
        command: mongod  -f /data/conf/mongod.conf
        networks:
          - mongo_test
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/testm/config3:/data/db
          - /home/data/db/mongo/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
        deploy:
          placement:
            constraints:
              - node.hostname == manager
      
      # router           
      mongos:
        image: mongo:4.0.3
        restart: always
        # command:  mongos -f /data/conf/mongos.conf
        networks:
          - mongo_test
        ports:
          - 19100:27017
          - 19101:27020
        depends_on:
          - config1
          - config2
          - config3
        volumes:
          - /etc/localtime:/etc/localtime
          - /home/data/db/mongo/mongos/key.file:/etc/key.file
          - /home/data/db/testm/mongos/mongos.conf:/etc/mongodb/mongos.conf      
        deploy:
          placement:
            constraints:
              - node.hostname == manager
              
    networks:
      mongo_test:
        external: true                   
    
    image.png image.png

    将docker-compose.yml 中的内容复制到这里 注意修改command中 conf路径,volumes中的路径和deploy的机器名 然后点击 update the stack

    image.png image.png

    用portainer 启动好后 开始配置角色信息

    首先知道哪里找到容器的id或者容器名


    image.png image.png
    # 初始化 分别进入
    docker exec -it {容器的id或者容器名} /bin/bash
    mongo
    
    #rs1 shard11 上执行
    rs.initiate( {_id : "rs1",members: [{ _id: 0, host: "shard11:27017",priority:2 },{ _id: 1, host: "shard12:27017",priority:1 },{ _id: 2, host: "shard13:27017", arbiterOnly:true }]})
    
    # rs2 shard21上
    rs.initiate( {_id : "rs2",members: [{ _id: 0, host: "shard21:27017",priority:1 },{ _id: 1, host: "shard22:27017", arbiterOnly:true },{ _id: 2, host: "shard23:27017",priority:2 }]})
    
    # rs3 shard32上 仲裁节点不允许创建
    rs.initiate( {_id : "rs3",members: [{ _id: 0, host: "shard31:27017", arbiterOnly:true},{ _id: 1, host: "shard32:27017",priority:2  },{ _id: 2, host: "shard33:27017",priority:1 }]})
    
    # config config1上
    rs.initiate( {_id : "cfg",members: [{ _id: 0, host: "config1:27017"},{ _id: 1, host: "config2:27017" },{ _id: 2, host: "config3:27017"}]})
    

    最后找到 mongos的容器

    image.png image.png

    进入容器内部,就和远程linux主机一样输入下面的命令完成搭建。


    image.png
    
    # 宿主机 
    #docker exec -it {mongos} /bin/bash
    # 容器中
    mongos -f /etc/mongodb/mongos.conf
    #可以就在其中一个mongos容器中使用mongo shell连接mongos进程配置分片集群
    # 连接mongos,端口号与mongos配置文件中设定一致
    mongo -port 27020
    # 将分片加入集群
    sh.addShard("rs1/shard11:27017,shard12:27017,shard13:27017")
    sh.addShard("rs2/shard21:27017,shard22:27017,shard23:27017")
    sh.addShard("rs3/shard31:27017,shard32:27017,shard33:27017")
    
    # 对数据库开启分片功能
    sh.enableSharding("company")
    
    #切换数据库并建立一张测试表才会真的创建数据库
    use company
    db.message.insert({"mid":"test"})
    #创建一个索引才能开启集合分片
    db.message.ensureIndex({uuid: 1}, {unique: true});
    use admin
    # 对数据库中集合开启分片,并指定片键
    sh.shardCollection("company.message",{"uuid":1})
    # sh.shardCollection("[dbName.collectionName]",{[keyName]:1})
    # 查看分片状态
    sh.status()
    
    use company
    # 新建角色
    db.createRole(
        { 
        role:"companyRole",//角色名称
        privileges: [ // 权限集
         { resource: { cluster: true }, actions: [ "addShard" ] },
         { resource: { //资源 
             db:"company", //创建的companyRole角色具有对company库的操作权限,具体权限建actions
             collection:"" //company库下对应的集合名.如果为""表示所有集合
           },
           actions: [ "find", "insert", "remove","update" ,"createCollection", "dropCollection","convertToCapped"] //角色可进行的操作,注意这里是一个数组
        } ],
        roles: [] // 是否继承其他的角色,如果指定了其他角色那么新创建的角色自动继承对应其他角色的所有权限,该参数必须显示指定
        }
    )
    # 给角色授权
    db.grantPrivilegesToRole(
        "companyRole",
        [{
           resource:{ //权限可操作的资源
                db:"company",  // 授予companyRole角色具有操作company库的权限
                collection:"" // company库下的集合 如果为"" 表示所有集合
            },                                                 
            actions:  // 权限允许的操作
            [ "createCollection", "dropCollection","convertToCapped"] //权限可进行的操作
      }]
    )
    # 新建用户 
    use company
    #  指定自定义角色来创建用户
    db.createUser({
            user:'wth', // 用户名
            pwd:'wth',    // 密码
            roles:[{
                    role:'companyRole',// 通过指定内建角色root 来创建用户
                    db:'company'  // 指定角色对应的认证数据库,内建角色通常认证库为admin
                }]
        }
    );
    
    # 指定内建角色来创建用户,这里是在admin下创建的用户故认证库也是admin
    use admin
    db.createUser(
        {  
            user:"admin",// 用户名
            pwd:"admin",   // 密码
            roles:[{
                    role:'root',// 通过指定内建角色root 来创建用户
                    db:'admin'  // 指定角色对应的认证数据库,内建角色通常认证库为admin
                } ]
        }
    )
    quit()
    

    修改配置文件 释放掉security 开启 权限 重启容器

    下面没有填写密码登录测试ok,但是提示authentication


    image.png image.png

    输入密码后登录正常可以查看数据库了


    image.png image.png

    tips MongoDB 集群重启需要重新执行mongos 否则连接不到

    # 宿主机
    docker exec -it mongos /bin/bash
    # 容器中
    mongos -f /etc/mongodb/mongos.conf
    

    点波关注 系统搭建(docker)

    相关文章

      网友评论

        本文标题:【4.12】服务器安装 Docker Swarm中搭建 Mong

        本文链接:https://www.haomeiwen.com/subject/rixwtrtx.html