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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…

Mac 上安装 Emscripten

背景&#xff1a;Web 端需要使用已有的 C 库&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 Emscripten 可以将 C 编译成 .wasm 一、下载源码 # 下载 emsdk 源码 git clone https://github.com/emscripten-core/emsdk.git# 下载完成后进入到 emsdk 项目根…

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models Paper: https://arxiv.org/abs/2106.09685 Code: https://github.com/microsoft/LoRA 大型语言模型的LoRA低秩自适应 自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。…

不容错过的2023年度线框图工具Top 8

线框图工具可以快速呈现设计师的灵感。在任何项目的开始阶段&#xff0c;选择一个方便的线框图工具都是最好的选择。如今&#xff0c;线框图工具的出现并不夸张。各种工具都很容易获得&#xff0c;但选择太多确实很容易给设计师的选择带来困难。 买东西都讲性价比&#xff0c;…

电商课堂|5分钟了解电商数据分析完整流程,建议收藏!

账户效果下降&#xff0c;如何能够快速找到问题并优化调整&#xff1f; 相信百分之90%的竞价员都会说&#xff1a;“做数据分析。” 没错&#xff0c;数据分析能够帮助我们快速锁定问题所在&#xff0c;确定优化方向&#xff0c;还可以帮助我们找到流量控制的方向。那么做电商&…

[RISC-V]verilog

小明教IC-1天学会verilog(7)_哔哩哔哩_bilibili task不可综合&#xff0c;function可以综合

206.反转链表

206.反转链表 力扣题目链接(opens new window) 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双双指针法&#xff1a; 创建三个节点 pre(反转时的第一个节点)、cur(当前指向需要反转的节点…

CodeWhisperer 初体验-手把手教导 给你飞一般的体验!

文章作者&#xff1a;燛衣 CodeWhisperer 有以下几个主要用途&#xff1a; 解决编程问题&#xff1a;CodeWhisperer 可以帮助您解决遇到的编程问题。您可以描述您的问题或需求&#xff0c;CodeWhisperer 将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻…

2023年十大地推网推拉新接单平台,都是一手单和官方渠道

2023年做拉新推广的地推人员&#xff0c;一定不要错过这十个接单平台&#xff0c;助你轻松找到一手单&#xff0c;这10个平台分别是&#xff1a; &#xff08;主推&#xff1a;聚量推客&#xff09; 我们也拿到了一手邀请码&#xff1a;000000 1&#xff1a;聚量推客 “聚量推…

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)

文章目录 刷题前唠嗑题目&#xff1a;参加会议的最多员工数题目描述代码与解题思路纳入收藏夹 结语 刷题前唠嗑 好好好&#xff0c;这么玩是吧&#xff0c;11 月刚准备开始刷每日一题&#xff0c;就给我来了一道 hard&#xff0c;我连题目都看不懂他在讲些什么&#xff0c;但是…

YApi接口管理平台远程代码执行漏洞复现

一、简介 YAPI是由去哪儿网移动架构组(简称YMFE&#xff0c;一群由FE、iOS和Android工程师共同组成的最具想象力、创造力和影响力的大前端团队)开发的可视化接口管理工具&#xff0c;是一个可本地部署的、打通前后端及QA的接口管理平台。YAPI旨在为开发、产品和测试人员提供更优…

CVE-2018-8174 IE浏览器远程代码执行漏洞

一、漏洞简介 该漏洞影响最新版本的IE浏览器及使用了IE内核的应用程序。用户在浏览网页或打开Office文档时都可能中招&#xff0c;最终被黑客植入后门木马完全控制电脑。微软在4月20日早上确认此漏洞&#xff0c;并于5月8号发布了官方安全补丁&#xff0c;对该0day漏洞进行了修…

【数智化案例展】江苏兴达——智昌蜂脑平台助力产业数智化腾飞

‍ 智昌集团案例 本项目案例由智昌集团投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 江苏兴达钢帘线股份有限公司是子午线轮胎用钢帘线的专业生产商&#xff0c;经…

【java学习—十一】注解:Annotation(3)

文章目录 1. 相关概念2. 基本的Annotation3. 自定义Annotation 注意&#xff1a;注解这部分内容&#xff0c;了解即可 1. 相关概念 从 JDK 5.0 开始 , Java 增加了对元数据 (MetaData) 的支持 , 也就是 Annotation( 注释 )Annotation 其实就是代码里的特殊标记 , 这些标记可以…

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…

chorme安装esay scholar及chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案

问题描述 如题&#xff0c;博主想安装easy scholar用于查询论文的分区&#xff0c;结果安装了半天一直出现chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案的问题。 解决方案 先从这个网址下载&#xff1a;https://www.easyscholar.cc/download 然后对下载好的文…

Spring源码分析篇一 @Autowired 是怎样完成注入的?究竟是byType还是byName亦两者皆有

1. 五种不同场景下 Autowired 的使用 第一种情况 上下文中只有一个同类型的bean 配置类 package org.example.bean;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class FruitCo…

tbh Cutter切割节点

在tbh过程中&#xff0c;如果想把一个元素置为一个位图图片某个图像的后边&#xff0c;如何做呢&#xff1f; 如&#xff1a;把圆形放到花的后边&#xff1a; 最后实现效果&#xff1a;&#xff08;请忽略边缘的细节&#xff0c;这里只是记录用法&#xff09; 第一步&#xf…

2023大湾区粤港澳金融数学建模思路代码分享

首先非常建议大家仔细的阅读这个题的题目介绍&#xff0c;还有附赠的就是那个附件里的那几篇材料&#xff0c;我觉得你把这些内容读透理解了&#xff0c;就可以完成至少第一、第二、第三问&#xff0c;嗯&#xff0c;好。然后对于题目里它主要第一部分给出了常用的估值模型&…

MySQL安装『适用于 CentOS 7』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…