docker搭建mongo分片集群

news2024/12/26 11:13:41

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 "清除完毕"

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

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

相关文章

mobaXterm上传文件进度一直为0%

在这里修改了senssion、重启都没有用 最后发现是文件存放的路径中不能有中文&#xff0c;改了之后就成功上传了

Pixea Plus for Mac:图像编辑的极致体验

Pixea Plus for Mac 是一款专为 Mac 用户设计的强大图像编辑软件。凭借其卓越的性能和丰富的功能&#xff0c;它为用户带来了前所未有的图像编辑体验。无论是专业的设计师&#xff0c;还是业余的摄影爱好者&#xff0c;Pixea Plus 都能满足您对于图像编辑的各种需求。 Pixea P…

Segment any Text:优质文本分割是高质量RAG的必由之路

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

权限 chmod

参考&#xff1a; Linux chmod 命令 | 菜鸟教程 (runoob.com) Linux chmod&#xff08;英文全拼&#xff1a;change mode&#xff09;命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者&#xff08;Owner Users&#xff09;用户组&#xff08…

音频数据集1--LJSpeech单人语音

LJ Speech Dataset 版本号: 1.1 , 文件大小: 2.6GB 1.简介 1. 1 内容简介 LJS是一个语音数据集&#xff0c;包含 13,100 个音频片段&#xff0c;内容为Linda Johnson(欧美女性)朗读的 7 本书籍段落(非小说类)。每个片段都提供文本转录&#xff0c;片段长度从 1 到 10 秒不等&…

Linux - 札记 - W10: Warning: Changing a readonly file

Linux - 札记 - W10: Warning: Changing a readonly file 这里写目录标题 一、问题描述1. 现象2. 原因 二、解决方案 一、问题描述 1. 现象 在使用 vim 编辑文件时&#xff08;我这里是要编辑 /root/.ssh/authorized_keys&#xff09;提示&#xff1a;W10: Warning: Changing…

成都晨持绪:抖店橱窗怎么卖货

在数字化浪潮席卷而来的今天&#xff0c;抖音平台凭借其强大的流量优势&#xff0c;为许多商家提供了一个新的销售渠道——抖店橱窗。通过有效地利用抖店橱窗&#xff0c;商家可以吸引更多潜在顾客&#xff0c;增加销售额。 要有效利用抖店橱窗进行销售&#xff0c;首要任务是精…

【曦灵平台】深度体验百度智能云曦灵平台之数字人3.0、声音克隆、直播等功能,AI加持就是不一样,快来一起体验

目录 资产数字人 2D数字人克隆声音克隆 AI卡片更多功能总结推荐文章 资产 可进行人像与声音的定制&#xff0c;让数字人形象和声音成为我们的专属资产&#xff0c;用于后续的内容生产工作 数字人 这里拍摄的视频分辨率和帧率必须要确保是官方要求&#xff0c;这里博主通过第…

【多模态】BEiT v2

链接&#xff1a;https://arxiv.org/pdf/2208.06366 论文&#xff1a;BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation&#xff1a;Masked image modeling (MIM) 任务在自监督表征学习上取得了不错的成绩&#xff0c;但是现…

ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!

在当今数字化办公时代&#xff0c;一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件&#xff0c;凭借其全面的功能、优异的性能和出色的用户体验&#xff0c;为用户带来了超越想象的办公体验。下面&#xff0c;我们将对ON…

程序员学长 | 快速学会一个算法,RNN

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;RNN 今天给大家分享一个超强的算法模型&#xff0c;RNN 循环神经网络&#xff08;Recurrent Neural Network, RNN&…

怎么打印加密的pfd文件,有那些方法?

现在人们的保密意识越来越强了,越来越多的人在完成pdf文档后就会对文档进行保护&#xff0c;但有的PDF文档被添加了密码&#xff0c;限制了打印的权限&#xff0c;导致我们想打印PDF文档的时候就提示我们要输入密码。面对这种情况&#xff0c;我们要怎样才能把PDF文档打印出来呢…

atcoder abc 359

A count takahashi 问题: 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {int n;cin >> n;int ans 0;for(int i 1; i < n; i ) {string s;cin >> s;if(s[0] T) ans ;}cout << ans;re…

BenchmarkSQL 对 MySQL 测试时请注意隔离级别!

BenchmarkSQL 是一款经典的开源数据库测试工具&#xff0c;内含了TPC-C测试脚本&#xff0c;可支持 Oracle、MySQL、PostgreSQL、SQL Server以及一些国产数据库的基准测试。 作者&#xff1a;李彬&#xff0c;爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问…

机器学习--概念理解

知识点 一、机器学习概述 人工智能 机器学习 深度学习 学习的范围&#xff1a;模式识别、数据挖掘、统计学习、计算机视觉、语音识别、自然语言处理 可以解决的问题&#xff1a;给定数据的预测问题 二、机器学习的类型 监督学习 分类 回归 无监督学习 聚类 降维 强化…

【Java Web】会话管理

目录 一、为什么需要会话管理&#xff1f; 二、会话管理机制 三、Cookie概述 四、HttpSession概述 4.1 HttpSession时效性 一、为什么需要会话管理&#xff1f; HTTP协议在设计之初就是无状态的&#xff0c;所谓无状态就是在浏览器和服务器之间的通信过程中&#xff0c;服务器并…

免费录屏软件哪个好?录屏软件,分享3款免费工具

在日常生活或者工作中&#xff0c;录屏软件已经成为我们的得力助手。无论是教学、演示、娱乐&#xff0c;录屏软件都能为我们带来极大的便利。然而&#xff0c;市面上有些录屏软件的价格却十分的昂贵&#xff0c;让人望而却步。那么市面上到底有没有免费的录屏软件&#xff1f;…

MySQL的jdbc、odbc驱动版本必须和MySQL版本一样吗?

MySQL的版本和JDBC&#xff0c;ODBC驱动版本大体一致就可以 比如说MySQL的版本是8.0.35&#xff0c;您可以用8.0.19版本的JDBC,ODBC。或者8.0.31的版本。 除此之外我也查看了其他资料&#xff0c;这个哥们总结的也不错&#xff0c;我把链接放到这里 MySQL JDBC驱动版本与数据…

电脑可以录屏吗?5个方法,珍藏分享

在数字化时代&#xff0c;电脑的录屏功能已经成为许多人工作和学习的必备工具。录屏可以帮助我们捕捉屏幕上的动态内容&#xff0c;记录下重要的瞬间。所以&#xff0c;录屏是一个非常实用的功能。那么&#xff0c;电脑可以录屏吗&#xff1f;答案是肯定的。本文将为您介绍5种电…

一文详细了解Bootloader

Bootloader是什么 bootloader是一个引导加载程序&#xff0c;它的主要作用是初始化硬件设备、设置硬件参数&#xff0c;并加载操作系统内核。在嵌入式系统中&#xff0c;bootloader是硬件启动后第一个被执行的程序&#xff0c;它位于操作系统和硬件之间&#xff0c;起到桥梁的…