docker搭建mongo分片集群

1、mongo分片集群

MongoDB分片集群是一种可扩展的数据库架构,用于处理大量数据和高并发访问。它将数据分成多个分片,并将这些分片分布在多个服务器上,从而实现数据的平衡存储和并行处理 。

通过使用MongoDB的分片集,可以实现数据库的水平拓展,提供更大的存储容量和处理能力。分片集还提供了高可用性和冗余备份,以及更好的负载均衡和查询性能。但是在部署和维护分片集时需要考虑一些额外的因素和复杂性。

mongo分片集群节点角色

配置服务器(Config Server):

  • 配置服务器存储了分片集群的元数据和配置信息,包括分片节点信息、分片键范围和分片副本集信息等。
  • 配置服务器通常是一个复制集,由多个节点组成。
  • 配置服务器由路由服务器使用,以确定查询如何路由到相应的分片服务器。

分片服务器(Shard Server):

  • 分片服务器存储实际的数据,它们负责处理读写操作和存储分片数据。
  • 分片服务器可以是独立的MongoDB实例或者是一个副本集。
  • 通过将数据按照分片键进行分发,分片服务器实现了数据的分散存储。

路由服务器(mongos):

  • 路由服务器是MongoDB分片集群的入口点,负责将客户端请求路由到适当的分片服务器。
  • 客户端连接到路由服务器,并通过它来与整个分片集群进行通信。
  • 路由服务器维护了整个集群的元数据和配置信息,并使用此信息来正确路由请求。
  • 客户端在连接到路由服务器时,不需要关心分片和配置服务器的具体细节,所有操作都通过路由服务器进行。

分片集群部署架构图如下:

2、docker搭建分片集群

2.1、分片集节点分配

本文演示案例,集群总共10个节点,每个节点信息如下:

目录名称作用端口
mongocfg01配置服127018
mongocfg01配置服227019
mongocfg01配置服327020
mongoshared01分片1子节点127021
mongoshared02分片1子节点227022
mongoshared03分片1子节点327023
mongoshared04分片2子节点127024
mongoshared05分片2子节点227025
mongoshared06分片2子节点327026
mongoroute01路由服27030

2.2、配置配置服节点

创建config副本集(3个节点)

新建mongocfg01目录,并创建conf,data,logs三个子目录

conf子目录新建mongod.conf文件

##设置数据存储目录
dbpath=/data/db
##设置日志存储文件
##logpath=data/log/mongod.log
##日志追加模式
logappend=true
##允许客户端任意ip连接
bind_ip=0.0.0.0
##绑定端口
port=27017
##副本集名称
replSet=cfg

复制多2个子目录

cp -r mongocfg01 mongocfg02
cp -r mongocfg01 mongocfg03

同时启动3个conf服容器,注意启动参数--configsvr ,标记实例作为分片集群中的配置服务器

echo "创建config服,三个节点"
for i in {1..3}; do let "port=27017+i"docker run -d --name mongocfg0$i -p $port:27017 --privileged=true -v ./mongocfg0$i/data:/data/db -v ./mongocfg0$i/conf:/data/configdb -v ./mongocfg0$i/logs:/data/log/ mongo -f /data/configdb/mongod.conf --configsvr
done

配置conf服副本集

##进入其中一个conf服容器
docker exec -it mongocfg01 mongo 
##配置副本集
rs.initiate({_id:"cfg",configsvr:true,members:[{_id:0,host:"192.168.0.121:27018"},{_id:1,host:"192.168.0.121:27019"},{_id:2,host:"192.168.0.121:27020"}]})

也可以不进入容器,利用mongo的--eval参数,直接在命令行执行

docker exec -it  mongocfg01 mongo --eval 'rs.initiate({_id:"cfg",configsvr:true,members:[{_id:0,host:"192.168.0.121:27018"},{_id:1,host:"192.168.0.121:27019"},{_id:2,host:"192.168.0.121:27020"}]});'

2.3、配置分片服节点

分片即可以选择单节点部署。但为了提高可用性,推荐用副本集进行部署。

创建分片1(3个节点),分片2(3个节点),注意启动参数--shardsvr  ,标记实例作为分片集群中的分片服务器

echo "创建分片1,三个节点"
for i in {1..3}; do let "port=27020+i"docker run -d --name mongoshared0$i -p $port:27017 --privileged=true -v ./mongoshared0$i/data:/data/db -v ./mongoshared0$i/conf:/data/configdb -v ./mongoshared0$i/logs:/data/log/ mongo -f /data/configdb/mongod.conf --shardsvr  --replSet "shared01"
done

配置分片1副本集

echo "配置分片1副本集"
docker exec  -it mongoshared01 mongo --eval 'rs.initiate({_id:"shared01",members:[{_id:0,host:"192.168.0.121:27021"},{_id:1,host:"192.168.0.121:27022"},{_id:2,host:"192.168.0.121:27023"}]})'

分片2类似脚本

echo "创建分片2,三个节点"
for i in {4..6}; dolet "port=27020+i"docker run -d --name mongoshared0$i -p $port:27017 --privileged=true -v ./mongoshared0$i/data:/data/db -v ./mongoshared0$i/conf:/data/configdb -v ./mongoshared0$i/logs:/data/log/ mongo -f /data/configdb/mongod.conf --shardsvr  --replSet "shared02"
donesleep 3
echo "配置分片2副本集"
docker exec  mongoshared04 mongo --eval 'rs.initiate({_id:"shared02",members:[{_id:0,host:"192.168.0.121:27024"},{_id:1,host:"192.168.0.121:27025"},{_id:2,host:"192.168.0.121:27026"}]})'

2.4、配置路由服节点

创建路由服务器,启动参数-configdb,该参数与 mongos(MongoDB分片路由器)一起使用,指定配置服务器的连接字符串。mongos 需要知道配置服务器的位置,以便能够访问集群的元数据。

--entrypoint "mongos" 修改容器入口为mongos,默认为mongo

echo "创建路由服务器"
docker run --name mongoroute -d -p 27030:27017 --privileged=true -v ./mongoroute/data:/data/db -v ./mongoroute/conf:/data/configdb --entrypoint "mongos" mongo --configdb rs_configsvr/192.168.0.121:27018,192.168.0.121:27019,192.168.0.121:27020

将分片添加到集群

echo "添加分片到集群"
docker exec -it mongoroute mongo --eval 'sh.addShard("shared01/192.168.0.121:27021,192.168.0.121:27022,192.168.0.121:27023")'
docker exec -it mongoroute mongo --eval 'sh.addShard("shared02/192.168.0.121:27024,192.168.0.121:27025,192.168.0.121:27026")'

3、分片集测试数据

3.1、进入mongos容器

##进入route服
docker exec -it mongoroute mongo

3.2、分片sh命令

分片sh命令,是类似副本集rs的操作,相关命令如下:

命令作用
sh.shardCollection("<database>.<collection>", <shard key>)将集合设置分片
sh.addShard("<shard connection string>")添加分片
 sh.removeShard("<shard identifier>")删除分片
sh.enableSharding("<database>")启动分片
sh.disableSharding("<database>")停用分片

3.3、数据库启动分片

要对一个特定的集合进行分片,首先需要在集合的数据库上启用分片。如下所示:

mongos> sh.enableSharding("game")
{"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1718881323, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1718881323, 1)
}

3.4、选择合理的分片键类型

对表字段增加分片键

在MongoDB分片集群中,可以使用哈希分片和范围分片两种方式进行数据的分片。

  1. 哈希分片(Hash Sharding):哈希分片通过对分片键的哈希值进行取模运算来确定数据应该存储在哪个分片上。这种分片方式可以保证数据的均匀分布,但会导致数据的局部性降低。

  2. 范围分片(Range Sharding):范围分片根据分片键的值范围来确定数据应该存储在哪个分片上。例如,可以将分片键设置为时间戳,按照时间范围进行分片。这种分片方式可以保持数据的局部性,但可能导致数据在分片上的分布不均衡。

选择使用哪种分片方式取决于具体的业务需求和数据特征。如果对数据的读写操作具有随机访问模式,可以考虑使用哈希分片,以保证数据的均匀分布,从而获得更好的吞吐量。如果对数据的读写操作具有顺序访问模式,并且希望保持数据的局部性,可以考虑使用范围分片。

mongos> sh.shardCollection("game.player", {"_id":"hashed"})
{"collectionsharded" : "game.player","ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1718881394, 36),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1718881394, 30)
}

3.5、插入测试数据

mongos> for (i=1; i<=1000; i=i+1){
... db.player.insert({"i":i})
... };
WriteResult({ "nInserted" : 1 })mongos> db.player.find().count()
1000

确定分片分布

##进入分片1的主节点
docker exec -it mongoshared01 mongo
##查询分片里的数据
shared01:PRIMARY> db.player.find().count()
487##进入分片2的主节点
docker exec -it mongoshared04 mongo
##查询分片里的数据
shared04:PRIMARY> db.player.find().count()
513

也可以直接用stats()查询

3.5、动态增加分片

#!/bin/bashecho "创建分片3,三个节点"
for i in {7..9}; dolet "port=27020+i"docker run -d --name mongoshared0$i -p $port:27017 --privileged=true -v ./mongoshared0$i/data:/data/db -v ./mongoshared0$i/conf:/data/configdb -v ./mongoshared0$i/logs:/data/log/ mongo -f /data/configdb/mongod.conf --shardsvr  --replSet "shared03"
donesleep 3
echo "动态配置分片3副本集"
docker exec  mongoshared07 mongo --eval 'rs.initiate({_id:"shared03",members:[{_id:0,host:"192.168.0.121:27027"},{_id:1,host:"192.168.0.121:27028"},{_id:2,host:"192.168.0.121:27029"}]})'echo "添加分配到route服"
docker exec -it mongoroute mongo --eval 'sh.addShard("shared03/192.168.0.121:27027,192.168.0.121:27028,192.168.0.121:27029")'

需要注意的是,通过命令行执行--eval参数的时候,需要稍微停顿片刻,确保容器内部完成。前面的脚本也是同样的道理。如果确实报错了,那就等待片刻之后,再手动执行吧。

然而,动态添加分片之后,发现,数量变多了。分别到各个分片查询之后,发现有些数据重复了。这是因为数据迁移的临时数据,等数据迁移完毕,数量就会正常了。至于什么时候迁移完成,笔者还没找到方法,只能等。

3.6、编写重置脚本

每次搭建的过程中,如果配置不小心弄错了,需要重新开始,一行一行命令写很麻烦,写个脚本,一键清除下吧。(除了删除容器,同时一定要把卷的数据删除)

#!/bin/bashfor i in {1..3}; dodocker rm -f mongocfg0$isudo rm  -rf mongocfg0$i/data/*
donefor i in {1..9}; dodocker rm -f mongoshared0$isudo rm  -rf mongoshared0$i/data/*	
donedocker rm -f mongoroute
sudo rm  -rf mongoroute/data/*sleep 3
for i in {1..3}; dosudo rm  -rf mongocfg0$i/data/*
donefor i in {1..9}; dosudo rm  -rf mongoshared0$i/data/*
donesudo rm  -rf mongoroute/data/*echo "清除完毕"

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

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

相关文章

NestJs 使用 RabbitMQ

NestJs 使用 RabbitMQ 既然是使用 RabbitMQ 那先不管其他的 把 RabbitMQ 装上再说 RabbitMQ 安装 这里直接找他们官网就行 Installing RabbitMQ | RabbitMQ 这里我们选择使用 docker 安装 快捷方便 这里直接参考&#xff1a; https://juejin.cn/post/719843080185010591…

鸿蒙面试心得

自疫情过后&#xff0c;java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照&#xff0c;却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…

宿主机无法通过ip连接wsl2解决方案

文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT&#xff0c;建议修改为镜像模式。在C:\Users\<User…

【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

为了便于使用&#xff0c;构建一个docker镜像来使用秋叶包。2024年6月26日。 docker run -it --gpus all -v /ssd/xiedong:/datax --net host kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers bashgit clone --recurse-submodules https://github.com/A…

408计算机网络--物理层

一、物理层概述 物理层是干嘛使得&#xff1f; 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性&#xff1a;定义物理连接…

Rill Data:实时数据分析的未来

欢迎来到 Rill Rill是从数据湖到仪表板的最快路径。 rilldata 与大多数 BI 工具不同&#xff0c;Rill 带有自己的嵌入式内存数据库。数据和计算位于同一位置&#xff0c;查询以毫秒为单位返回。 因此&#xff0c;您可以即时透视、切片和深入研究数据。 下载 Rill 开始建模数…

标签接口开发(富含完整CRUD开发流程)

文章目录 1.easyCode生成CRUD1.生成代码2.查看代码3.调整代码1.SubjectLabelDao.xml发现生成的select语句不带逗号&#xff01;&#xff01;&#xff01;1.解决方法&#xff1a;2.entity.java.vm3.dao.java.vm4.Mapper.xml.vm 2.重新生成代码3.SubjectLabelDao.java 删除Pageab…

【RedHat】使用VMware Workstation创建配置RedHat操作系统

目录 &#x1f31e;1.前言 &#x1f31e;2. 使用 VMware Workstation 创建配置RedHat &#x1f33c;2.1 VMware Workstation 创建虚拟机 &#x1f33c;2.2 安装RedHat 7.6 &#x1f30a;2.2.1 添加光盘 &#x1f30a;2.2.2 开始安装操作系统 &#x1f30a;2.2.3 系统初始…

从基础到前沿:PLM产品生命周期管理系统在物料管理中的应用

在当今竞争激烈的市场中&#xff0c;制造型企业必须不断寻求提高效率和降低成本的方法。物料管理作为企业内部物流的核心环节&#xff0c;对于控制成本、提高生产效率、加快产品上市时间具有至关重要的作用。本文将探讨物料管理的重要性&#xff0c;以及如何通过三品产品生命周…

Python数据可视化-地图可视化

1.首先绘制实现数据可视化的思维导图 具体要实现什么功能-怎么处理&#xff0c;先把思路写好 数据来源&#xff1a; 爬取的数据 运行结果&#xff1a; 部分代码&#xff1a; 完整代码请在下方↓↓↓&#x1f447;获取 转载请注明出处&#xff01;

75101A 1553B总线测试模块

75101A 1553B总线测试模块 75101A 1553B总线测试模块是单通道多功能&#xff0c;符合CPCI/PXI总线的标准3U尺寸模块&#xff0c;可同时用作BC、RTs和BM&#xff0c;其中BM具有比特误码、highbit、lowbit、highword、lowword、校验错误、消息错误检测以及最大256M字节的数据捕…

新能源革命风起云涌:创新科技引领可持续发展新篇章

随着全球气候变化和环境问题日益严峻&#xff0c;新能源革命正以其不可阻挡的势头&#xff0c;席卷着世界的每一个角落。 创新科技在这场革命中发挥着至关重要的作用&#xff0c;它不仅是新能源开发利用的引擎&#xff0c;更是推动可持续发展的关键力量。 新能源革命的核心在于…

ubuntu如何切换到root用户

1、主要指令&#xff1a; sudo -i su root 2、示例 3、其他说明 在Ubuntu&#xff08;以及大多数其他基于Linux的操作系统中&#xff09;&#xff0c;切换到root用户通常意味着获得了对系统的完全访问权限。这种权限允许执行以下操作&#xff08;但不限于这些&#xff09;…

Spring AI 实现调用openAi 多模态大模型

什么是多模态? 多模态(Multimodal)指的是数据或信息的多种表现形式。在人工智能领域,我们经常会听到这个词,尤其是在近期大型模型(如GPT-4)开始支持多模态之后。 模态:模态是指数据的一种形式,例如文本、图像、音频等。每一种形式都是一种模态。多模态:多模态就是将…

ctfshow 新春欢乐赛 web

web1 <?phphighlight_file(__FILE__); error_reporting(0);$content $_GET[content]; file_put_contents($content,<?php exit();.$content);?contentphp://filter/string.rot13|<?cuc flfgrz(yf /);?>|/resourceshell.php绕过死亡exit 但是我发现个问题就是…

Fragment与ViewModel(MVVM架构)

简介 在Android应用开发中&#xff0c;Fragment和ViewModel是两个非常重要的概念&#xff0c;它们分别属于架构组件库的一部分&#xff0c;旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件&#xff0c;它能够作为…

基于51单片机密码锁—六位密码LCD1602显示

基于51单片机密码锁设计 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.密码为六位数字&#xff0c;有键按下&#xff0c;LCD1602就会显示出字符 “*”&#xff1b; 2.当用户键入正确密码后&#xff0c;再按确认键&a…

是时候系统性的的学习那些开发中必备的软件了!

大家好&#xff0c;我是 王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 最近小组内心来了两个实习生&#xff0c;各方面都很不错&#xff0c;基础知识扎实&#xff0c;勤奋好学&#xff08;卷&…

记一次 APK 逆向动静调试 + so 动态链接库分析

0x00 前言&#xff1a; 好久没有做过安卓逆向了&#xff0c;最近重新系统地学习了安卓逆向技术。找到了一道较为典型的逆向分析题来练手&#xff0c;以锻炼动静态分析和动态链接库分析的基本能力。在这里记录基本的分析流程手法。 0x01 逆向分析&#xff1a; 一、使用 Genym…

IPython最简洁方便的Python语法测试工具

前言和需求 相信不少人使用JS时&#xff0c;最常用的快捷键是F12。网页调试&#xff0c;不仅可以调试我们的前端页面&#xff0c;对于多数后端JS程序员来讲&#xff0c;我们有个啥语法不确定了&#xff0c;直接开个网页F12确认一下就行了。甚至写了个方法&#xff0c;不确定对…