使用 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 进行添加,然后根据条件将数据进行分片到分片的副本集中

使用 Docker 部署高可用 MongoDB 分片集群,Docker,MongoDB,综合,docker,mongodb,容器,MongoDB Cluster

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 host role port
    node-1.internal mongos 10900
    node-1.internal configsvr 10901
    node-1.internal shard-master 10902
    node-1.internal shard-slave 10903
    node-1.internal shard-arbiter 10904
    node-2.internal mongos 10900
    node-2.internal configsvr 10901
    node-2.internal shard-master 10902
    node-2.internal shard-slave 10903
    node-2.internal shard-arbiter 10904
    node-3.internal mongos 10900
    node-3.internal configsvr 10901
    node-3.internal shard-master 10902
    node-3.internal shard-slave 10903
    node-3.internal shard-arbiter 10904

MongoDB Cluster 实施

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

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

文件如下,我们,之后我们所以 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

配置并部署 MongoDB Cluster

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

配置 Mongos 环境

创建配置文件

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

填入配置文件,这里我们删除了认证的信息,因为 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

创建 keyfile

echo "${mongoKey}"  > /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key

#处理权限为400

chmod 400 /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key

配置 Config Server 环境

创建挂载文件目录

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

写入配置文件

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

写入 key 文件

echo "${mongoKey}"  > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key

#处理权限为400

chmod 400 /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key

配置 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}

配置配置文件

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

创建 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

部署

编写 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
docker-compose up -d

配置 MongoDB Cluster

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

初始化 config-server

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

docker exec -it mongo-cluster-config bash
mongosh -port 10901

输入

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" }
    ]
  }
)

如果返回 ok 则成功

然后我们创建用户

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

初始化 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 }
    ]
  }
)

返回 ok 后创建用户

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

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

配置所有 mongos

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

docker exec -it mongos bash
mongosh -port 10900

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

use admin;
db.auth("root","root");

进行配置分片信息

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")

全部返回 ok 则成功

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

功能测试

数据库分片
use test
sh.enableSharding("test")

对test库的test集合的_id进行哈希分片
db.users.createIndex({ _id: "hashed" })
sh.shardCollection("test.test", {"_id": "hashed" })

创建用户

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

插入数据文章来源地址https://www.toymoban.com/news/detail-738418.html

use test
for (i = 1; i <= 300; i=i+1){db.test.insert({'name': "bigkang"})}

到了这里,关于使用 Docker 部署高可用 MongoDB 分片集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OLAP系列:三、clickhouse Docker集群部署指南(3分片1副本模式)

    一是为了学习容器,另外也是帮助一些同学解决机器资源紧缺,能够在一台是宿主机部署一套clickhouse集群服务。 本章内容适合开发测试环境使用,生产环境还需要更多细节的处理工作,只能作为参考。 二、部署准备 1、机器准备 172.25.16.108 2、创建容器网络 3、镜像准备 1、下

    2024年02月12日
    浏览(40)
  • Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(44)
  • mongodb使用docker搭建replicaSet集群与变更监听

    在mongodb如果需要启用变更监听功能(watch),mongodb需要在replicaSet或者cluster方式下运行。 replicaSet和cluster从部署难度相比,replicaSet要简单许多。如果所存储的数据量规模不算太大的情况下,那么使用replicaSet方式部署mongodb是一个不错的选择。 mongodb版本:mongodb-6.0.5 两台主机:主

    2024年02月02日
    浏览(25)
  • CentOS7.9+Kubernetes1.28.3+Docker24.0.6高可用集群二进制部署

    查看版本关系 1.1 软件获取 所有软件均为开源软件,源文件从官方链接或官方镜像链接地址获取。 1.1.1 centos 7.9 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ 下载2009或2207其中任何一个版本都可以。 下载:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Min

    2024年02月04日
    浏览(41)
  • CentOS7.9+Kubernetes1.29.2+Docker25.0.3高可用集群二进制部署

    Kubernetes高可用集群(Kubernetes1.29.2+Docker25.0.3)二进制部署 二进制软件部署flannel v0.22.3网络,使用的etcd是版本3,与之前使用版本2不同。查看官方文档进行了解。 截至北京时间2024年2月15日凌晨,k8s已经更新至1.29.2版。从v1.24起,Docker不能直接作为k8s的容器运行时。因为Docker庞

    2024年02月19日
    浏览(43)
  • 使用 docker 一键部署 MongoDB

    目录 1. 前期准备 2. 导入镜像 3. 部署MongoDB脚本 4. 配置模板文件 5. 部署MongoDB 6. 部署后配置 7. 基本维护 新部署前可以从仓库(repository)下载 MongoDB 镜像,或者从已有部署中的镜像生成文件: 生成 MongoDB 副本集所需的 autokey 文件: mongodb-deploy.sh 文件内容如下: mongodb.conf.tem

    2024年02月14日
    浏览(67)
  • 使用docker容器部署httpd(绝对可用)

    创建文件夹存放httpd的数据和httpd的配置 mkdir -r /install/httpdData 在里面建4个文件   编写 Dockerfile FROM docker.io/centos:7 RUN echo \\\"Asia/Shanghai\\\" /etc/timezone RUN yum -y install httpd RUN mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak COPY run.sh /run.sh RUN chmod 777 /run.sh EXPOSE 80 ENTRYPOINT [ \\\"/run.sh

    2023年04月26日
    浏览(48)
  • 在k8s 中部署有状态服务MongoDB高可用集群详解(附带镜像)

    🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言  1、k8s简介 2、MongoDB介绍 3、为什么要使用MongoDB  4、Mongodb高可用方案  二、环境准备 1、k8s集群搭建 2、MongoDB镜像准备 3、NFS存储准备 4、PV准

    2024年04月16日
    浏览(20)
  • window10 使用docker 本地安装部署mongodb数据库

    一、window10 安装docker 可以参看笨鸟教程【Windows Docker 安装】 安装完后的Docker Desktop是这个样子: 原始的docker镜像拉取仓库速度较慢,为了方便docker拉取镜像,可以设置国内的加速镜像,如:阿里 云、有道等【镜像加速】: 二、docker下载运行mongodb镜像 1 直接在 windows powerShel

    2024年02月03日
    浏览(33)
  • 使用 Docker Compose 部署 Redis Sentinel 高可用架构

    在现代应用中,无法容忍系统中断或数据丢失。Redis 作为一种高性能的内存数据库,被广泛应用于缓存、会话管理等场景。然而,即使我们拥有可伸缩的 Redis Cluster 集群,也需要考虑在主节点故障时自动切换到从节点的机制。这时候 Redis Sentinel 就派上用场了。高可用性是分布

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包