• 使用 Docker 部署高可用 MongoDB 分片集群


    使用 Docker 部署 MongoDB 集群

    Mongodb 集群搭建

    mongodb 集群搭建的方式有三种:

    1. 主从备份(Master - Slave)模式,或者叫主从复制模式。
    2. 副本集(Replica Set)模式。
    3. 分片(Sharding)模式。

    其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。今天介绍副本集的方式搭建 mongodb 高可用集群

    简介以及概述

    首先我们先来了解一下 Mongo 集群的概念,Mongo 集群有 3 个主要组件

    ConfigServer:在集群中扮演存储整个集群的配置信息,负责配置存储,如果需要高可用的 ConfigServer 那么需要 3 个节点。

    Shard:分片,存储真实的数据,每一个 Shard 分片都负责存储集群中的数据,例如一个集群有 3 个分片,然后我们定义分片规则为哈希,那么整个集群的数据就会(分割)到 3 个分片中的某一个分片,那么分片是特别重要的,如果集群中的一个分片全部崩溃了那么集群将不可用,所以我们要保证集群的高可用,那么我们需要一个分片配置 3 个节点,2 个副本集一个仲裁节点,仲裁节点类似于 Redis 的哨兵模式,如果发现主节点挂了那么让另一个副本集进行数据存储。

    Mongos:Mongos 我们可以理解为整个集群的入口,类似于 Kafka 的 Broker 代理,也就是客户端,我们通过客户端连接集群进行查询。

    下面是 MongoDB 的官方集群架构图,我们看到 Mongos 是一个路由,他们的信息都存储在 ConfigServer 中,我们通过 Mongos 进行添加,然后根据条件将数据进行分片到分片的副本集中

    Mongo 分片集群高可用 + 权限 方案

    那么我们先来总结一下我们搭建一个高可用集群需要多少个 Mongo

    mongos : 3 台

    configserver : 3 台

    shard : 3 片

    每一片 shard 分别 部署两个副本集和一个仲裁节点 : 3 台

    那么就是 3 + 3 + 3 * 3 = 15 台,由于服务器数量限制暂时使用 3 台进行部署,设计如下

    • node-1.internal[Node 1]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组

    • node-2.internal[Node 3]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组

    • node-3.internal[Node 2]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组

    • 端口分配:

      ip hostroleport
      node-1.internalmongos10900
      node-1.internalconfigsvr10901
      node-1.internalshard-master10902
      node-1.internalshard-slave10903
      node-1.internalshard-arbiter10904
      node-2.internalmongos10900
      node-2.internalconfigsvr10901
      node-2.internalshard-master10902
      node-2.internalshard-slave10903
      node-2.internalshard-arbiter10904
      node-3.internalmongos10900
      node-3.internalconfigsvr10901
      node-3.internalshard-master10902
      node-3.internalshard-slave10903
      node-3.internalshard-arbiter10904

    MongoDB Cluster 实施

    为了达到高可用且控制权限的目的,这里 mongo 之间通信采用秘钥文件,所以我们先进行生成

    openssl rand -base64 756  > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key
    
    • 1

    文件如下,我们,之后我们所以 key 都采用这个(请采用自己生成的 key)

    tsUtJb3T...SomyNDISXDiSTJQEVym
    OhXXzwB+...FC1q39IrUDAEpCikSKS
    abGl8RTE...b4I4jzvgStcPcozRgOZ
    5kPvXByb...WZe4VcF+iU6jgw73juZ
    pbcZR5oT...E8LFPBZ+XLGYrtmDqo0
    9tA1x8R+...0afT4ou2w7QHsdF0WRn
    nskJ1FCA...pBkj4muKUk7OTHRV6bs
    qr2C73bq...BIGiSD1Kyr/iqO7gD4C
    GN8iA3Mq...Wt5XLOWP7CBGuTo7KST
    Y5HAcblq...gS0GZfUk4bndLTkHrJd
    tcR4WreH...Woukw/eViacLlBHKOxB
    QVgfo449...qx5MsOlIXiFwA3ue1Lo
    kiFq5c6I...ChYow7TkTLf/LsnjL3m
    rmkDRgzA...tGIxRnP07pMS9RP4TjS
    ZSd9an5y...gFl/Eq5NH60Zd4utxfi
    qM2FH7aN...6kA
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    配置并部署 MongoDB Cluster

    PS:由于使用 docker-compose 部署,每个宿主机配置一致,以下操作重复执行即可

    配置 Mongos 环境

    创建配置文件

    mkdir -p /mnt/data/docker/mongo-cluster/mongos/{data,conf}
    
    • 1

    填入配置文件,这里我们删除了认证的信息,因为 mongos 是不能设置认证的,他也是用的前面使用的密码即可,如 configserver 的密码

    echo "net:
      port: 10900  #端口号
    sharding:
      configDB: configsvr/node-1.internal:10901,node-2.internal:10901,node-3.internal:10901
    
    security:
      keyFile: /data/configdb/mongo.key #keyFile路径
    "  > /mnt/data/docker/mongo-cluster/mongos/conf/mongo.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建 keyfile

    echo "${mongoKey}"  > /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key
    
    #处理权限为400
    
    chmod 400 /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置 Config Server 环境

    创建挂载文件目录

    mkdir -p /mnt/data/docker/mongo-cluster/configsvr/{data,conf}
    
    • 1

    写入配置文件

    echo "
    # 日志文件
    #systemLog:
    #  destination: file
    #  logAppend: true
    #  path: /var/log/mongodb/mongod.log
    
    #  网络设置
    net:
      port: 10901  #端口号
    #  bindIp: 127.0.0.1    #绑定ip
    replication:
      replSetName: configsvr
    sharding:
      clusterRole: configsvr
    security:
      authorization: enabled #是否开启认证
      keyFile: /data/configdb/mongo.key #keyFile路径 "  > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    写入 key 文件

    echo "${mongoKey}"  > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key
    
    #处理权限为400
    
    chmod 400 /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置 Shard 分片组环境

    在同一台服务器上初始化一组分片

    创建挂载文件

    mkdir -p /mnt/data/docker/mongo-cluster/shard-master/{data,conf}
    mkdir -p /mnt/data/docker/mongo-cluster/shard-slave/{data,conf}
    mkdir -p /mnt/data/docker/mongo-cluster/shard-arbiter/{data,conf}
    
    • 1
    • 2
    • 3

    配置配置文件

    echo "
    # 日志文件
    #systemLog:
    #  destination: file
    #  logAppend: true
    #  path: /var/log/mongodb/mongod.log
    
    #  网络设置
    net:
      port: 10902  #端口号
    #  bindIp: 127.0.0.1    #绑定ip
    replication:
      replSetName: shard-{1|2|3}
    sharding:
      clusterRole: shardsvr
    security:
      authorization: enabled #是否开启认证
      keyFile: /data/configdb/mongo.key #keyFile路径 "  > /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.conf
    ------------------------------------------------------------------------------
    echo "
    # 日志文件
    #systemLog:
    #  destination: file
    #  logAppend: true
    #  path: /var/log/mongodb/mongod.log
    
    #  网络设置
    net:
      port: 10903  #端口号
    #  bindIp: 127.0.0.1    #绑定ip
    replication:
      replSetName: shard-{1|2|3}
    sharding:
      clusterRole: shardsvr
    security:
      authorization: enabled #是否开启认证
      keyFile: /data/configdb/mongo.key #keyFile路径 "  > /mnt/data/docker/mongo-cluster/shard-slave/conf/mongo.conf
    ------------------------------------------------------------------------------
    echo "
    # 日志文件
    #systemLog:
    #  destination: file
    #  logAppend: true
    #  path: /var/log/mongodb/mongod.log
    
    #  网络设置
    net:
      port: 10904  #端口号
    #  bindIp: 127.0.0.1    #绑定ip
    replication:
      replSetName: shard-{1|2|3}
    sharding:
      clusterRole: shardsvr
    security:
      authorization: enabled #是否开启认证
      keyFile: /data/configdb/mongo.key #keyFile路径 "  > /mnt/data/docker/mongo-cluster/shard-arbiter/conf/mongo.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    创建 keyfile

    echo "${mongoKey}"  > /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key
    
    #处理权限为400
    
    chmod 400 /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key
    
    #复制
    cp /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key /mnt/data/docker/mongo-cluster/shard-slave/conf/mongo.key
    
    cp /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key /mnt/data/docker/mongo-cluster/shard-arbiter/conf/mongo.key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    部署

    编写 docker-compose.yaml

    version: "3"
    services:
        mongo-cluster-mongos:
            image: mongo:6.0
            container_name: mongo-cluster-mongos
            privileged: true
            entrypoint: "mongos"
            network_mode: host
            ports:
                - "10900:10900"
            volumes:
                - /mnt/data/docker/mongo-cluster/mongos/conf:/data/configdb
                - /mnt/data/docker/mongo-cluster/mongos/data:/data/db
            command: -f /data/configdb/mongo.conf --bind_ip_all # bind all ip address
            restart: always
    
        mongo-cluster-config:
            image: mongo:6.0
            container_name: mongo-cluster-config
            privileged: true
            network_mode: host
            ports:
                - "10901:10901"
            volumes:
                - /mnt/data/docker/mongo-cluster/configsvr/conf:/data/configdb
                - /mnt/data/docker/mongo-cluster/configsvr/data:/data/db
            command: mongod -f /data/configdb/mongo.conf
            restart: always
    
        mongo-cluster-shard-master:
            image: mongo:6.0
            container_name: mongo-cluster-shard-master
            privileged: true
            network_mode: host
            ports:
                - "10902:10902"
            volumes:
                - /mnt/data/docker/mongo-cluster/shard-master/conf:/data/configdb
                - /mnt/data/docker/mongo-cluster/shard-master/data:/data/db
            command: mongod -f /data/configdb/mongo.conf
            restart: always
    
        mongo-cluster-shard-slave:
            image: mongo:6.0
            container_name: mongo-cluster-shard-slave
            privileged: true
            network_mode: host
            ports:
                - "10903:10903"
            volumes:
                - /mnt/data/docker/mongo-cluster/shard-slave/conf:/data/configdb
                - /mnt/data/docker/mongo-cluster/shard-slave/data:/data/db
            command: mongod -f /data/configdb/mongo.conf
            restart: always
    
        mongo-cluster-shard-arbiter:
            image: mongo:6.0
            container_name: mongo-cluster-shard-arbiter
            privileged: true
            network_mode: host
            ports:
                - "10904:10904"
            volumes:
                - /mnt/data/docker/mongo-cluster/shard-arbiter/conf:/data/configdb
                - /mnt/data/docker/mongo-cluster/shard-arbiter/data:/data/db
            command: mongod -f /data/configdb/mongo.conf
            restart: always
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    docker-compose up -d
    
    • 1

    配置 MongoDB Cluster

    由于 mongos 是客户端,所以我们先搭建好 config 以及 shard 之后再搭建 mongos。

    初始化 config-server

    进入第一台宿主机 (node-1.internal) 的 config-server 容器

    docker exec -it mongo-cluster-config bash
    mongosh -port 10901
    
    • 1
    • 2

    输入

    rs.initiate(
      {
        _id: "configsvr",
        members: [
          { _id : 1, host : "node-1.internal:10901" },
          { _id : 2, host : "node-2.internal:10901" },
          { _id : 3, host : "node-3.internal:10901" }
        ]
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果返回 ok 则成功

    然后我们创建用户

    use admin
    db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
    
    • 1
    • 2

    初始化 shard 分片组并制定第三个副本集为仲裁节点

     docker exec -it shard-master bash
     mongosh -port 10902
    
    #进行副本集配置
     rs.initiate(
      {
        _id : "shard-{1|2|3}",
        members: [
          { _id : 0, host : "node-1.internal:10902" },
          { _id : 1, host : "node-1.internal:10903" },
          { _id : 2, host : "node-1.internal:10904", arbiterOnly:true }
        ]
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    返回 ok 后创建用户

    use admin
    db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
    
    • 1
    • 2

    然后退出,第一台分片组搭建完成,其他两台分片组重复此操作

    配置所有 mongos

    进入第一台宿主机 (node-1.internal) 的 mongos 容器

    docker exec -it mongos bash
    mongosh -port 10900
    
    • 1
    • 2

    先登录(使用前面设置的 root 用户密码)

    use admin;
    db.auth("root","root");
    
    • 1
    • 2

    进行配置分片信息

    sh.addShard("shard-1/node-1.internal:10902,node-1.internal10903,node-1.internal:10904")
    sh.addShard("shard-2/node-2.internal:10902,node-2.internal10903,node-2.internal:10904")
    sh.addShard("shard-3/node-3.internal:10902,node-3.internal10903,node-3.internal:10904")
    
    • 1
    • 2
    • 3

    全部返回 ok 则成功

    去其他两台 mongos 上重复执行上述操作

    功能测试

    数据库分片
    use test
    sh.enableSharding("test")
    
    对test库的test集合的_id进行哈希分片
    db.users.createIndex({ _id: "hashed" })
    sh.shardCollection("test.test", {"_id": "hashed" })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建用户

    use admin;
    db.auth("root","root");
    use test;
    db.createUser({user:"kang",pwd:"kang",roles:[{role:'dbOwner',db:'test'}]})
    
    • 1
    • 2
    • 3
    • 4

    插入数据

    use test
    for (i = 1; i <= 300; i=i+1){db.test.insert({'name': "bigkang"})}
    
    • 1
    • 2
  • 相关阅读:
    python机器学习基础教程02-鸢尾花分类
    物联公司网页设计制作 简单静态HTML网页作品 静态企业网页作业成品 学生网站模板
    【毕业设计】Python、Java鲜花销售小程序源码
    图解LeetCode——782. 变为棋盘(难度:困难)
    淘宝商品详情API接口,解决滑块问题
    Spring IOC 常用注解与使用
    Kotlin学习之密封类
    G1 垃圾收集器深入剖析(图文超详解)
    k8s驱逐篇(4)-kube-scheduler抢占调度驱逐
    配电网重构|基于新颖的启发式算法SOE的随机(SDNR)配电网重构(Matlab代码实现)【算例33节点、84节点、119节点、136节点、417节点】
  • 原文地址:https://blog.csdn.net/github_38616039/article/details/134158118