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.rhkb.cn/news/357940.html

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

相关文章

艺体培训机构管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教师管理&#xff0c;学员管理&#xff0c;活动管理&#xff0c;课程管理&#xff0c;选课信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论…

Spring Boot+vue社区养老系统(智慧养老平台)

使用技术&#xff1a; springbootvueMySQL 主要功能&#xff1a; 管理员 登录个人资料密码管理, 用户管理:床位类型管理,床位管理,护工管理,老人管理 咨询登记管理&#xff0c;预约登记管理,老人健康信 息管理,费用管理等功能.护工角色包含以下功能: 护工登录&#xff0c;个…

数据库精选题(二)(引言+关系代数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 常见概念 一、什么是数据库&#xf…

查找和排序

目录 一、查找 1.1查找的基本概念 1.2顺序查找 1.3折半查找&#xff08;二分查找&#xff09; 1.4散列表的查找 1.4.1基本概念 1.4.2散列函数的构造方法 1.4.3解决冲突的方法 二、排序 2.1排序的基本概念 2.2插入排序 2.2.1直接插入排序&#xff1a; 2.2.2希尔排序…

C++回溯算法(2)

棋盘问题 #include<bits/stdc.h> using namespace std; void func(int,int); bool tf(int,int); void c(); int n,k; char a[110][110]; int cnt20; int main() {cin>>n>>k;for(int i0;i<n;i){for(int j0;j<n;j){cin>>a[i][j];}}func(0,0);cout…

北京BJ90升级新款迈巴赫大连屏四座头等舱行政四座马鞍

北京BJ90升级奔驰迈巴赫头等舱行政四座大联屏的内饰效果会非常出色&#xff0c;将为车辆带来更豪华、高端的内饰氛围。以下是升级后可能的效果&#xff1a; • 科技感提升&#xff1a;奔驰的中控系统一直以来都以其先进的科技和用户友好的界面而闻名。升级后&#xff0c;北京B…

EndNote 21 for Mac v21.3 文献管理软件安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行安装EndNote212、升级 三、运行1、打开软件&#xff0c;测试 安装完成&#xff01;&#xff01;&#xff01;四、注意事项 效果 一、下载软件 下载软件 链接&#xff1a;http://www.macfxb.cn 二、开始安装 1、双击…

深信服科技:2023网络钓鱼趋势分析报告

随着互联网的快速发展和广泛应用&#xff0c;网络钓鱼活动带来的安全隐患愈演愈烈。因应威胁发展&#xff0c;我 们编撰了此份分析报告&#xff0c;旨在全面了解其发展态势&#xff0c;并提醒相关部门、企业和公众加强防范。 在本报告中&#xff0c;我们将详细梳理网络钓鱼的近…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

USB - USB在消费领域的应用

Switching in USB Consumer Applications 通用串行总线&#xff08;USB&#xff09;已成为满足终端设备之间日益增长的快速数据传输需求的主流接口--例如&#xff0c;在个人电脑和便携式设备&#xff08;如手机、数码相机和个人媒体播放器&#xff09;之间下载和上传数据。 The…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-37微调

37微调 import os import torch import torchvision from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt from d2l import torch as d2l# 获取数据集 d2l.DATA_HUB[hotdog] (d2l.DATA_URL hotdog.zip,fba480ffa8aa7e0febbb511d181409f899b9baa5…

已解决javax.management.BadStringOperationException异常的正确解决方法,亲测有效!!!

已解决javax.management.BadStringOperationException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 分析错误日志 检查字符串值合法性 确认字符串格式 优化代码逻辑 增加…

pcl::PointXYZRGBA造成点云无法显示

如果pcd文件没有rgba信息&#xff0c;使用pcl::PointXYZRGBA类型打开会提示以下信息&#xff1a; Failed to find match for field rgba另外&#xff0c;显示出来的点云是黑色&#xff0c;如果使用默认背景色为黑色&#xff0c;就无法显示点云了。 如果设置其它背景色&#xf…

多分类情绪识别模型训练及基于ChatGLM4-9B的评论机器人拓展

你的下一个微博罗伯特何必是罗伯特 这是一篇我在使用开源数据集(Twitter Emotion Dataset (kaggle.com))进行情绪识别的分类模型训练及将模型文件介入对话模型进行应用的过程记录。当通过训练得到了可以输入新样本预测的模型文件后&#xff0c;想到了或许可以使用模型文件对新样…

LLM漫谈(七)| 使用PyTorch从零构建LLM

LLM是最流行AI聊天机器人的核心基础&#xff0c;比如ChatGPT、Gemini、MetaAI、Mistral AI等。在每一个LLM&#xff0c;有个核心架构&#xff1a;Transformer。我们将首先根据著名的论文“Attention is all you need”-https://arxiv.org/abs/1706.03762 来构建Transformer架构…

三国之家网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;公告管理&#xff0c;三国视频管理&#xff0c;基础数据管理&#xff0c;三国图文管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#…

Inception_V2_V3

Inception_V2_V3 CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的…

Flume基础教程

Apache Flume教程 资料来源&#xff1a;Apache Flume - Introduction (tutorialspoint.com) Flume是一个标准的、简单的、健壮的、灵活的、可扩展的工具&#xff0c;用于将从各种数据生产者(web服务器)中所产生的数据抽取到Hadoop中。在本教程中&#xff0c;我们将使用简单的…

NeRF从入门到放弃4: NeuRAD-针对自动驾驶场景的优化

NeuRAD: Neural Rendering for Autonomous Driving 非常值得学习的一篇文章&#xff0c;几乎把自动驾驶场景下所有的优化都加上了&#xff0c;并且也开源了。 和Unisim做了对比&#xff0c;指出Unisim使用lidar指导采样的问题是lidar的垂直FOV有限&#xff0c;高处的东西打不…

Python18 数据结构与数据类型转换

1.python中的数据结构 在Python中&#xff0c;数据结构是用来存储、组织和管理数据的方式&#xff0c;以便有效地执行各种数据操作。Python提供了几种内置的数据结构&#xff0c;每种都有其特定的用途和操作方法。以下是Python中一些主要的数据结构&#xff1a; 1.列表&#…