MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

MongoDB该怎样分片,你用对了吗?

2025-01-17 11:53 huorong 精选文章 3 ℃ 0 评论

MongoDB简介

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。文档数据库,类似 JSON 文档内存储数据,在面对数据,这种方法非常自然,比传统的排/列模型更加直观和强大。

MongoDB分片简介

为了维护大规模的数据,或者满足大规模的并发访问,单台服务器已经达到瓶颈,需要通过服务器扩容来满足需求,这里就会涉及分片(Sharding)。

分片实际是对数据按照某种既定的规则进行数据切分存储,使用时,通过多线程(多服务器资源)实现数据库快速检索和返回,已达到加速的目的。

分片技术广泛应用于大数据、高并发、多维度计算、复杂检索等场景下。


分片的几个组件

主要有如下所述三个主要组件:

Shard(数据节点):

用于存储实际的数据。在分片中,每组shard存储不同的数据,同一组shard由多个Replica set(复制集)组成,不同的shard之间解决数据分片存储(分散存储),不同的Replica set解决高可用问题。

Config Server(配置节点):

用于存储MongoDB元数据信息,其中包括 chunk信息。

Query Routers(路由节点):

客户端的连接入口,可配置多个,使用应用连接高可用。

分片的几种方式

Hash Sharding

通过对分片键进行Hash计算,根据Hash值将数据分配对应的分片上(chunk)。

Hash分片基本可以实现数据的均衡分布,可以有效解决数据热点问题,常用于随机读写较多的应用场景。

Ranged Sharding

范围分区是根据分片键,安装一定的区间进行划分,落在同一区间的数据会被分配到同一个分片(chunk)上。


Zones in Sharded Clusters

Zones是在Ranged Sharding基础上进行了灵活配置,使其满足更复杂的业务场景。


一个zone可以包含一个或者多个Ranged Sharding Key,即一个zone可以分配在多个shard节点上,同一个shard节点上也可以包含多个zone。看到这里,也许会被这里的包含规则给弄晕了,MongoDB之所以会设计zone,通常用于异机房多中心数据存储中,实现本地数据快速读写的效果,解决跨机房(数据中心)数据传输。

剑有了,你会用吗?

通过上面的介绍,相信对MongoDB分片有了一点的了解,如何以正确的姿势去使用,需要通过大量的实践去检验。

分片是把双刃剑,用好了系统会像defu般丝滑,用不好,砸电脑的心都用,这里对如何进行系统优化、如何才能构建丝滑般的分片集群不做详解,但是有个大方向你必须知道,有了它,你才能知道如何去做一个好的分片架构设计。

没错,就是它,响应时间!

有人说,你不是废话吗,系统快不快,丝不丝滑不都是通过响应时间来判断的吗?

没错,但是你知道这个响应时间是怎么来的吗?

从应用对数据库发出一个查询操作,都需要经过哪些操作,每个操作都做了什么,瓶颈在哪里,应该怎么排查问题?

通过MongoDB的一个工具我们看下:

示例采用3分片架构,查询返回数据量26w左右,耗时374ms。从响应时间入手,看下374ms怎么来的。

分片rs1耗时:100+150+110+14=374

分片rs2耗时:10+10+20+14=54

分片rs3耗时:30+50+70+14=164

所以,最终的响应时间取决于最慢的那个分片。

本示例慢的原因和数据量大小有一定关系,数据分布不均衡导致查询结果耗时不同。

注意,这里的数据分布不均衡不是指分片存储数据不均衡,而是返回的结果集分布不均衡,即查询的结果数据主要集中在rs1分片上,导致这个问题的原因主要和分片涉及与业务逻辑不匹配导致的。

这里对这个问题不再做深入分析,只需明白耗时最多的那个节点将决定集群最终的响应时间,那么有哪些问题会导致不同分片之间响应时间的差异呢,遇到问题该如何优化呢,在数据库设计时,如何根据业务特性进行合理的分片呢?

欢迎大家一起讨论,期待与大家共同成长!

Tags:windows mongodb安装与配置

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言