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}; 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 "shared02"
done

sleep 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/bash

echo "创建分片3,三个节点"
for i in {7..9}; 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 "shared03"
done

sleep 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/bash

for i in {1..3}; do
  docker rm -f mongocfg0$i
  sudo rm  -rf mongocfg0$i/data/*
done

for i in {1..9}; do
   docker rm -f mongoshared0$i
   sudo rm  -rf mongoshared0$i/data/*	
done

docker rm -f mongoroute
sudo rm  -rf mongoroute/data/*

sleep 3
for i in {1..3}; do
  sudo rm  -rf mongocfg0$i/data/*
done

for i in {1..9}; do
   sudo rm  -rf mongoshared0$i/data/*
done

sudo rm  -rf mongoroute/data/*

echo "清除完毕"

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

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

相关文章

ViT:5 Knowledge Distillation

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

基于SpringBoot+Vue汽车配件销售管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

[SAP ABAP] 读取内表数据

1.读取单条数据 1.1 索引查找 语法格式 READ TABLE <itab> INTO <wa> INDEX <idx>.<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 <idx>&#xff1a;代表索引值 示例1 结果显示&#xff1a; 1.2 关键字查找 READ TABLE <…

JVM专题三:Java代码如何运行

通过前面的第一篇文章&#xff0c;对JVM整体脉络有了一个大概了解。第二篇文章我们通过对高级语言低级语言不同特性的探讨引出了Java的编译过程。有了前面的铺垫&#xff0c;咱们今天正式进入Java到底是如何运行起来的探讨。 目前大部分公司都是使用maven作为包管理工具&#x…

【华东南AWDP】第十七届全国大学生信息安全竞赛 CISCN 2024 创新实践能力赛区域赛 部分题解WP

前言&#xff1a;这次区域赛AWDP安恒作为支持&#xff0c;赛制风格遵循安恒&#xff0c;一小时check一次。室温35在室内坐了8小时&#xff0c;午饭是藿香正气水拌冰水。这场总体下来中规中矩吧。 WEB-welcome-BREAK CtrlU拿到flag WEB-submit-BREAK 文件上传&#xff0c;简单…

threejs视频融合 webgl

threejs三维视频融合 let objList []; const clock new THREE.Clock(); const container document.getElementById( container );const stats new Stats(); container.appendChild( stats.dom );const renderer new THREE.WebGLRenderer( { antialias: true } ); rendere…

时序预测 | Matlab基于Transformer多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于Transformer多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&#xff1b; 3…

sql资料库

1、distinct(关键词distinct用于返回唯一不同的值)&#xff1a;查询结果中去除重复行的关键字 select distinct(university) from user_profile select distinct university from user_profile distinct是紧跟在select后面的&#xff0c;不能在其他位置&#xff0c;不然就…

287 寻找重复数-类似于环形链表II

题目 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums…

光纤传感器十大品牌

十大光纤传感器品牌-光纤光栅传感器厂家哪家好-Maigoo品牌榜

如和完全免费快速访问外网?有亿点点不便利罢了

很鸡肋&#xff0c;但是可以试试 这个手机是真的可以使用谷歌的 不得不说有点意思&#xff0c;但肯定没啥用 地址跳转

软考高级论文真题“论湖仓一体架构及其应用”

论文真题 随着5G、大数据、人工智能、物联网等技术的不断成熟&#xff0c;各行各业的业务场景日益复杂&#xff0c;企业数据呈现出大规模、多样性的特点&#xff0c;特别是非结构化数据呈现出爆发式增长趋势。在这一背景下&#xff0c;企业数据管理不再局限于传统的结构化OLTP…

前端自动化

前端自动化的内容 自动化代码检查自动化测试自动化构建自动化部署自动化文档 前端自动化的最佳实践

【C#】使用数字和时间方法ToString()格式化输出字符串显示

在C#编程项目开发中&#xff0c;几乎所有对象都有格式化字符串方法&#xff0c;其中常见的是数字和时间的格式化输出多少不一样&#xff0c;按实际需要而定吧&#xff0c;现记录如下&#xff0c;以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如&#xff0c;保留…

.NET C# 使用GDAL读取FileGDB要素类

.NET C# 使用GDAL读取FileGDB要素类 目录 .NET C# 使用GDAL读取FileGDB要素类1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.7.5 2 Nuget 3 Code using OSGeo.OGR; using OSGeo.OSR;namespace TestGDAL {internal class Program{static void Main(string[] a…

操作系统实验四:openEuler安装(openEuler配置静态网络、编写C或C++)

目录 一、实验要求 二、具体任务安排 1.安装openEuler &#xff08;1&#xff09;下载openEuler镜像 &#xff08;2&#xff09;使用vmware安装openEuler 2.在openEuler中编写C或者C测试程序 &#xff08;1&#xff09;安装g环境 &#xff08;2&#xff09;开始程序编码…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的测试用例执行计划(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…

【b站-湖科大教书匠】2 物理层-计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 物理层 2.1 物理层的基本概念 2.2 物理层下面的传输媒…

Linux——man帮助命令

一、man 获得帮助信息 基本语法&#xff1a;man [命令或配置文件] &#xff08;功能描述&#xff1a;获得帮助信息&#xff09; 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands &#xff08;标准命令&#xff09; 2、System…

【大数据 复习】第3章 分布式文件系统HDFS(重中之重)

一、概念 1.分布式文件系统把文件分布存储到多个计算机节点上&#xff0c;通过网络实现、文件在多台主机上进行分布式存储的文件系统。&#xff08;就是你的电脑存a&#xff0c;我的电脑存pple&#xff09; 2.降低了硬件开销: 与之前使用多个处理器和专用高级硬件的并行化处理装…