当前位置:   article > 正文

使用 Docker 部署高可用 MongoDB 分片集群_docker安装mongodb分片

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/407829
推荐阅读
相关标签
  

闽ICP备14008679号