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

news2025/7/18 18:08:51

使用 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

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

插入数据

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

装备制造行业云MES解决方案

一、装备制造行业发展现状&#xff1a; 机械制造业主要是通过对金属原材料物理形状的改变、加工组装进而成为产品。机械制造业生产的主要特点是&#xff1a;离散为主、流程为辅、装配为重点。 工业生产基本上分为两大方式&#xff1a; 1.离散型&#xff1a;离散型是指以一个…

智能问答进阶之路:RAG(大模型检索增强生成)框架详解与实战,融合检索与生成助力智能系统更上层楼

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

市场洗牌,全新一代MiniLED背光技术大放异彩

MiniLED背光是一种采用微小尺寸LED灯珠作为背光源的技术。相比传统的LED背光&#xff0c;MiniLED采用更小的LED尺寸&#xff08;通常在100微米至200微米之间&#xff09;&#xff0c;使得显示屏幕的亮度和对比度得以大幅提升。MiniLED背光技术作为显示行业的新宠儿&#xff0c;…

外汇天眼:3大假投资诈骗手法公开,助你识破假券商及黑平台!

去年以来物价持续上涨&#xff0c;不少人的薪水涨幅却不如预期&#xff0c;导致资产实质缩水。 面对生活成本不断增加&#xff0c;愈来愈多人意识到投资的重要性&#xff0c;并且开始寻找各种获利的渠道与机会。 与此同时&#xff0c;诈骗集团也利用人们想赚钱的心理&#xff0…

家用小型洗衣机哪款性价比高?好用不贵内衣洗衣机测评

很多人在休息的时候&#xff0c;都会抽出一些时间来清洗自己的衣物&#xff0c;但是他们忽略了一个问题&#xff0c;内裤不能和平时穿的外套一起用洗衣机清洗&#xff0c;主要原因是一般的洗衣机不能把内衣清洗干净&#xff0c;而且如果和平时穿的外套一起洗的话&#xff0c;内…

【嵌入式项目应用】__用于搭建调试输出、建立时间系统的嵌入式框架“Zorb Framework”

目录 一、什么是Zorb&#xff1f; 二、嵌入式环境搭建 三、调试输出 四、实现断言 五、建立时间系统 六、结束语 (*&#xffe3;︶&#xffe3;)创作不易&#xff01;期待你们的 点赞、收藏和评论喔。 一、什么是Zorb&#xff1f; Zorb Framework是一个基于面向对象的思…

visinextek的sdk编译

编译sdk 1、修改编译链路径 cd customer-rel/board/package/mk/ vi common.mksudo echo ‘PATH“/home/johan/share/vs839/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin:$PATH”’ >> /etc/profile source /etc/profile 2、bypass DSP 编译&#xff0c;…

Leetcode循环队列

这道题十分考验我们对队列的理解。 文章目录 队列的介绍队列的实现进入正题 队列的介绍 队列是一种只允许在一段进行插入&#xff0c;在另一端进行删除的数据操作的特殊线性结构&#xff0c;&#xff0c;因此决定了他具有先入先出的特点&#xff0c;其中进行插入操作的一段叫做…

MFC打开控制台的常用方式

工程项目中&#xff0c;想打开控制台的&#xff0c;简单打印日志 &#xff08;1&#xff09;依次打开&#xff1a; 项目配置属性——>生成事件——>后期生成事件&#xff1a;命令行 &#xff08;2&#xff09;输入&#xff1a; editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$…

pppoe拨号案例

R3服务端 interface LoopBack0 ip address 1.1.1.1 255.255.255.255 aaa local-user test password cipher admin local-user test service-type ppp ip pool test network 100.0.0.0 mask 255.255.255.0 interface Virtual-Template0 ppp authentication-mode chap remote …

【设计模式】第23节:行为型模式之“策略模式”

一、简介 策略模式&#xff1a;定义一族算法类&#xff0c;将每个算法分别封装起来&#xff0c;让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端&#xff08;这里的客户端代指使用算法的代码&#xff09;。 二、适用场景 动态选择算法多种类似的行为 …

CondConv 动态卷积学习笔记 (附代码)

论文地址:https://arxiv.org/abs/1904.04971 代码地址&#xff1a;https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/condconv 1.是什么&#xff1f; CondConv是一种条件参数卷积&#xff0c;也称为动态卷积&#xff0c;它是一种即插即用的模块&…

数据结构之集合框架

1.Java集合框架的定义 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中&#xff0c;用于对这些元素进行…

向上管理中的沟通技巧

一. 背景 我们要弄清楚两个问题为什么要向上管理呢&#xff0c;向上管理主要是要做什么呢&#xff1f; 首先&#xff0c;第一个问题为什么要向上管理&#xff1f;向上管理的本质是为了同时给公司、上司和自己带来最好的结果&#xff0c;并有意识地配合和改变工作方法&#xf…

iPhone连不上Wi-Fi?看完这篇文章你就知道了!

大家在使用苹果手机的过程中有没有遇到过这样的情况&#xff1a;手机突然连接不上Wi-Fi&#xff0c;或者连接了也根本使用不了。遇到上述情况请不要着急&#xff0c;iphone连不上wifi是由很多种原因导致的。那么&#xff0c;iPhone连接不上Wi-Fi时该怎么办呢&#xff1f; 我们…

测试可用的安防视频分析软件:烟火检测、车型检测、玩手机打电话检测、厨帽检测、抽烟检测、人员入侵检测

下载地址&#xff1a;https://pan.baidu.com/s/1R1MvD_KQ3uB-0KL_N3is-w?pwdwa33 随着AI、大数据、云计算和边缘计算等技术的迅猛发展&#xff0c;我国的视频监控市场正处于全新的阶段。借助AI深度学习技术的进步&#xff0c;现代化的安防视频监控系统通过边缘计算设备上的AI识…

用友NC BeanShell RCE漏洞

一、漏洞简介 用友 NC 是面向集团企业的管理软件&#xff0c;其在同类市场占有率中达到亚太第一。用友 NC 由于对外开放了 BeanShell 接口&#xff0c;攻击者可以在未授权的情况下直接访问该接口&#xff0c;并构造恶意数据执行任意代码从而获取服务器权限。 二、影响版本 NC …

误删的文件不在回收站如何找回?分享3个简单方法!

“我前段时间清理电脑的时候误删了一些比较重要的文件&#xff0c;通常我都会使用回收站来还原这些文件的&#xff0c;但昨天不小心清空了回收站&#xff0c;想问问还有机会找回我的文件吗&#xff1f;” 为了保证用户的权益&#xff0c;误删的文件通常会先被移入电脑回收站中。…

SpringBootWeb案例——Tlias智能学习辅助系统(1)

目录 需求与准备环境搭建REST风格的API接口开发规范-统一响应结果 部门管理部门列表查询功能删除部门新增部门请求路径优化查询部门修改部门 员工管理分页查询分页插件PageHelper分页查询(带条件) (难点)删除员工 需求与准备 1、部门管理 包括&#xff1a; 查询部门列表 删除部…

解决远程连接数据库缓慢的问题【图文】【非常详细】

问题概述 当我们远程访问数据库&#xff0c;遇到连接不上或者连接等待时间较长&#xff0c;问题大概率就出在数据库远程链接解析的问题&#xff0c;就是在MySQL的配置文件中增加如下配置参数&#xff1a; [mysqld] skip-name-resolve 具体操作如下 解决步骤 打开mysql所在文…