当前位置: 首页 > news >正文

53.MongoDB分片集群高级集群架构详解

MongoDB分片集群架构详解

为什么要使用分片

分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。

一个复制集能承载的容量和负载是有限的,遇到以下场景就需要考虑使用分片

  • 存储容量需求超出单机的磁盘容量。
  • 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。
  • 写IOPS超出单个MongoDB节点的写服务能力。

分片集群架构

MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方式。MongoDB 使用 分片集群来支持大数据集和高吞吐量的业务场景。

  • 数据分片:分片用于存储真正的数据,并提供最终的数据读写访问。分片仅仅是一个逻辑的概念,它可以是一个单独的mongod实例,也可以是一个复制集。
  • 配置服务器(Config Server):配置复制集中保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等。
  • 查询路由(mongos):mongos是分片集群的访问入口,其本身并不持久化数据。mongos启动后,会从配置服务器中加载元数据。之后mongos开始提供访问服务,并将用户的请求正确路由到对应的分片。在分片集群中可以部署多个mongos以分担客户端请求的压力。

分片策略

通过分片功能,可以将一个非常大的集合分散存储到不同的分片上。

  • 范围分片
    • 范围分片能很好地满足范围查询的需求
    • 范围分片的缺点在于,如果Shard Key有明显递增(或者递减)趋势,则新插入的文档会分布到同一个chunk,此时写压力会集中到一个节点,从而导致单点的性能瓶颈。
  • 哈希分片
    • 哈希分片会先事先根据分片键计算出一个新的哈希值(64位整数),再根据哈希值按照范围分片的策略进行chunk的切分。适用于日志,物联网等高并发场景。
    • 在执行一些范围查询时,哈希分片并不是高效的。
    • 哈希分片只能选择单个字段,而范围分片允许采用组合式的多字段作为分片键。

分片标签

MongoDB允许通过为分片添加标签(tag)的方式来控制数据分发。

一个标签可以关联到多个分片区间(TagRange)。均衡器会优先考虑chunk是否正处于某个分片区间上(被完全包含),如果是则会将chunk迁移到分片区间所关联的分片,否则按一般情况处理。

分片键(ShardKey)的选择
  • 分片键的基数(cardinality),取值基数越大越有利于扩展。
  • 分片键的取值分布应该尽可能均匀
  • 业务读写模式,尽可能分散写压力,而读操作尽可能来自一个或少量的分片。
  • 分片键应该能适应大部分的业务操作。
分片键(ShardKey)的约束
  • ShardKey 大小无限制;
  • 支持复合哈希分片键;
  • Document 中可以不包含 ShardKey,插入时被当 做 Null 处理;
  • 为 ShardKey 添加后缀 refineCollectionShardKey 命令,可以修改 ShardKey 包含的 Field;

数据均衡

  1. 所有的数据应均匀地分布于不同的chunk上。
  2. 每个分片上的chunk数量尽可能是相近的。

手动均衡

通过splitAt、moveChunk命令进行手动切分、迁移。

自动均衡

MongoDB的数据均衡器运行于Primary Config Server(配置服务器的主节点)上,而该节点也同时会控制chunk数据的搬迁流程。

自动均衡流程

  • 分片shard0在持续的业务写入压力下,产生了chunk分裂。
  • 分片服务器通知Config Server进行元数据更新。
  • Config Server的自动均衡器对chunk分布进行检查,发现shard0和shard1的chunk数差异达到了阈值,向shard0下发moveChunk命令以执行chunk迁移。
  • shard0执行指令,将指定数据块复制到shard1。该阶段会完成索引、chunk数据的复制,而且在整个过程中业务侧对数据的操作仍然会指向shard0;所以,在第一轮复制完毕之后,目标shard1会向shard0确认是否还存在增量更新的数据,如果存在则继续复制。
  • shard0完成迁移后发送通知,此时Config Server开始更新元数据库,将chunk的位置更新为目标shard1。在更新完元数据库后并确保没有关联cursor的情况下,shard0会删除被迁移的chunk副本。
  • Config Server通知mongos服务器更新路由表。此时,新的业务请求将被路由到shard1。

mongodb6.0迁移条件

如果碎片之间的数据差异(对于该集合)小于该集合配置范围大小的三倍,则认为该集合是平衡的。对于128MB的默认范围大小,对于给定的集合,两个分片必须具有至少384MB的数据大小差异,才能进行迁移。


#在每天的凌晨2点到4点运行数据均衡操作
use config
sh.setBalancerState(true)
db.settings.update({_id:"balancer"},{$set:{activeWindow:{start:"02:00",stop:"04:00"}}},{upsert:true}
)#对分片集合中执行count命令可能会产生不准确的结果
使用db.collection.countDocuments({})方法代替
#查看均衡器是否开启
sh.getBalancerState()
#查看均衡器是否正在运行
sh.isBalancerRunning()
#查看当前均衡的窗口设定
sh.getBalancerWindow()

MongoDB高级集群架构设计

MongoDB 集群两地三中心部署的考量点

• 节点数量建议要5个,2+2+1模式

• 主数据中心的两个节点要设置高一点的优先级,减少跨中心换主节点

• 同城双中心之间的网络要保证低延迟和频宽,满足 writeConcern: Majority 的双中心写需求

• 使用 Retryable Writes and Retryable Reads 来保证零下线时间

• 用户需要自行处理好业务层的双中心切换

两地三中心复制集搭建

#配置域名解析
echo "192.168.139.135  mongo1 mongo01.com mongo02.com" >> /etc/hosts
echo "192.168.139.136 mongo2 mongo03.com mongo04.com" >> /etc/hosts
echo "192.168.139.137 mongo3 mongo05.com " >> /etc/hosts#启动5个 MongoDB 实例
mkdir -p /data/member1/db  /data/member1/log /data/member2/db  /data/member2/log
mongod --dbpath /data/member1/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member1/log/member1.log
mongod --dbpath /data/member2/db --replSet demo --bind_ip 0.0.0.0 --port 10002 --fork --logpath /data/member2/log/member2.logmkdir -p /data/member3/db  /data/member3/log /data/member4/db  /data/member4/log
mongod --dbpath /data/member3/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member3/log/member3.log
mongod --dbpath /data/member4/db --replSet demo --bind_ip 0.0.0.0 --port 10002 --fork --logpath /data/member4/log/member4.logmkdir -p /data/member5/db  /data/member5/log
mongod --dbpath /data/member5/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member5/log/member5.logmongo mongo01.com:10001
# 初始化复制集
rs.initiate({"_id" : "demo","version" : 1,"members" : [{ "_id" : 0, "host" : "mongo01.com:10001" },{ "_id" : 1, "host" : "mongo02.com:10002" },{ "_id" : 2, "host" : "mongo03.com:10001" },{ "_id" : 3, "host" : "mongo04.com:10002" },{ "_id" : 4, "host" : "mongo05.com:10001" }]
})
#查看复制集状态
rs.status()#配置选举优先级
mongosh mongo01.com:10001
conf = rs.conf()
conf.members[0].priority = 5
conf.members[1].priority = 10
rs.reconfig(conf)#使用Retryable Writes以后,即使出现数据中心故障,对前端业务没有任何中断
mongosh --retryWrites mongodb://mongo01.com:10001,mongo02.com:10002,mongo03.com:10001,mongo04.com:10002,mongo05.com:10001/test?replicaSet=demo ingest-script#vim ingest-script
db.test.drop()
for(var i=1;i<1000;i++){db.test.insert({item: i});inserted = db.test.findOne({item: i});if(inserted)print(" Item "+ i +" was inserted " + new Date().getTime()/1000);elseprint("Unexpected "+ inserted)sleep(2000);
}

相关文章:

53.MongoDB分片集群高级集群架构详解

MongoDB分片集群架构详解 为什么要使用分片 分片&#xff08;shard&#xff09;是指在将数据进行水平切分之后&#xff0c;将其存储到多个不同的服务器节点上的一种扩展方式。 一个复制集能承载的容量和负载是有限的&#xff0c;遇到以下场景就需要考虑使用分片 存储容量需…...

Servlet 上下文参数

7)Servlet上下文对象&#xff1a;ServletContext生活中的例子&#xff1a;张三和李四在不远处窃窃私语&#xff0c;并且频繁的对着你坏笑。你肯定会跑过去问&#xff1a;你们俩在聊什么&#xff1f;注意&#xff1a;此处的聊什么&#xff0c;其实就是你在咨询他们聊天的上下文&…...

ChatGPT正在测试原生文件分析功能,DALL·E 3能P图啦!

10月29日&#xff0c;有部分用户在社交平台上分享&#xff0c;ChatGPT Plus正在测试原生文件上传、分析功能&#xff0c;可以通过文本问答的方式&#xff0c;对上传的PDF等数据文件进行提问、搜索。 例如&#xff0c;上传一份50页的员工手册PDF文件&#xff0c;然后向ChatGPT提…...

三相马达的电机故障维护

目录 电机故障维护​编辑 更换电机操作 三相电路 热继电器 今天继续小编的工作经验的分享&#xff0c;今天就说说遇到的问题吧&#xff0c;今天组立熔接机出现故障&#xff0c;后面部分出现了“咕噜噜”的杂声&#xff0c;走到后面一听是电机发出的声音。没有办法了就开始拆…...

【易售小程序项目】后端部署、Uniapp项目Web部署

文章目录 Uniapp项目Web打包部署为什么不部署小程序Web打包前对项目进行调整网站、小程序切换增加constant.js来控制常量将js绑定到main.js的全局变量中 WebSocket差异监听键盘呼出导航条打包部署 后端项目打包部署打包前准备打包部署 Uniapp项目Web打包部署 为什么不部署小程…...

prometheus监控kafka

一、前言 关于对kafka的监控&#xff0c;要求高的话可以使用kafka-exorter和jmx-exporter一起收集监控数据&#xff0c;要求不高的情况下可以使用kafka-exporter收集监控数据即可 二、部署 kafka-exporter 部署kafka-exporter&#xff0c;我是在k8s集群中部署的 编辑yaml文件…...

【STL】:list用法详解

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关list的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…...

SQL Wildcards 通配符

SQL Wildcards 通配符 通配符用于替换字符串中的任何其他字符。 通配符与 SQL LIKE 运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与 LIKE 运算符一起使用&#xff1a; &#xff05; - 百分号表示零个&#xff0c;一个或多个字符_ - 下…...

入门必学 | R语言for循环的常规应用

文章目录 何为判断语句在for循环中添加判断语句嵌套循环 在上一节中&#xff0c;我们介绍了迭代与for循环&#xff0c;并对for循环的结构与原理进行了深入的介绍。在这一节中&#xff0c;我们将分享for循环的常规应用&#xff0c;包括在其中加入判断语句与嵌套循环。 何为判断语…...

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包&#xff0c;用于构建跨平台应用程序&#xff0c;支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo&#xff0c;支持linux/windows/mac/android/ios操作系统&#xff0c;此demo在ubuntu桌面环境下测试成功。…...

int怎么转成QString?

2023年10月31日&#xff0c;周二晚上 要将 int 类型转换为 QString&#xff0c;可以使用 QString::number() 方法。 下面是一个示例代码&#xff1a; int number 123; QString str QString::number(number);还可以在转换时指定进制&#xff0c;比如将整数转换为十六进制的字…...

JavaScript进阶(二十九): 走近 es6 之 new.target

文章目录 一、前言二、new.target 重写三、拓展阅读 一、前言 源码阅读过程中&#xff0c;发现以下语句 new.target.prototype鉴于该语法为es6所有&#xff0c;项目在编译过程中&#xff0c;控制台报Unexpected token: punc(.)错误。按照常规处理&#xff0c;应用babel-loade…...

JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…...

RabbitMQ学习02

Hello World&#xff08;Java&#xff09; 1.导入依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration&g…...

android中的Package安装、卸载、更新替换流程

android系统在安装&#xff0c;删除&#xff0c;替换&#xff0c;清除数据等与应用相关的动作时&#xff0c;会发出对应的Broadcast&#xff0c;上层的应用通过注册相应的广播事件来做相应的处理。 官方文档中给出了详尽的罗列&#xff1a; ACTION_PACKAGE_ADDED 一个新应用包已…...

思维训练第三课 反意疑问句

系列文章目录 文章目录 系列文章目录前言一、什么是反意疑问句二、反意疑问句的回答&#x1f49a;主系表/主谓宾&#xff08;肯定&#xff09;&#xff0c;否定提问1、一般现在时2、一般过去时3、一般将来时4、现在完成时 &#x1f49b; 主谓宾1、一般现在2、一般过去3、一般将…...

nvm安装步骤

注意事项 不要安装任何版本的node.js&#xff0c;有的话卸载干净&#xff01;注意&#xff1a;要卸载干净了&#xff01; 安装步骤&#xff1a; nvm下载 点击exe文件安装 安装目录选择&#xff1a;D:\NVM 下一步创建nodejs文件放在D:\NVM 下&#xff0c;然后一直next到最后 …...

关于比较级(内含名词比较级)

在比较级中&#xff0c;修饰形容词一般使用more 或者-er的变体&#xff0c;但是怎么修饰名词呢&#xff1f; 即&#xff0c;如果我们想表达&#xff1a;你能不能表现得更马屁精一点&#xff1f;这种针对一个具体名词的程度升级怎么表达呢&#xff1f; 使用be more of 名词的…...

【算法|动态规划 | 线性dp | 最长上升子序列模型No.1】AcWing1017.怪盗基德的滑翔翼 AcWing1014.登山

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家…...

2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;道路运输企业主要负责人证模拟考试题库是根据道路运输企业主要负责人最新版教材&#…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...