数据库

【mongoDB】MongoDB分片集群方案

2022-07-31  本文已影响0人  Bogon

一、为什么要使用分片?

MongoDB副本集实现了数据的多副本复制及高可用,但是一个复制集能承载的容量和负载是有限的。

目前业务模块库单节点配置32核256G内存2T硬盘,而已存数据量达1.5T,索引大小超过400G。

MongoDB认为内存冗余量不足,就会触发内存数据清理动作,清理策略是依据LRU算法,将旧数据踢出内存;一旦内存使用率高于95%,那么代表MongoDB数据库承受着巨大的写入压力,就会阻塞其他操作,尽可能多地淘汰内存中的数据,当业务通过索引查询时,如果内存没有查询到就会读磁盘导致性能下降。

在数据量较大的情形下,MongoDB副本集的可能就会遇到的问题:

1、业务数据存储容量需求即将超出单机的磁盘容量。

2、活跃的数据集超出单机内存容量,索引数据大小超过内存大小,MongoDB会丢弃部分索引数据,导致很多请求都要从磁盘读取数据,影响性能。

3、写IOPS超出单个MongoDB节点的写服务能力。

二、扩容方案选择

冷热分离,垂直扩容(ScaleUp)

mongoDB架构: 副本集PSS集群

优点: 查询灵活、维护成本低

缺点:容量和负载有限

备注:冷热分离业务改动成本大、涉及产品页面、前端、后端改动,数据迁移有风险,有可能会引起客户投诉。

分片水平扩容(ScaleOut)

mongoDB架构: 分片集群

优点: 数据分片存储,支持水平扩展,存储容量无上限,高并发、读写性能好,可灵活针对大客户、大数据进行某个标签分片节点硬件升级

缺点:高效查询需要带分片键、维护成本较高

备注:分片数据迁移过程比较久,只涉及后端改动,用户无感知

三、MongoDB分片集群架构

shard数据分片

分片用于存储真正的数据,并提供最终的数据读写访问。分片仅仅是一个逻辑的概念,它可以是一个单独的mongod实例,也可以是一个复制集。图中的Shard1、Shard2都是一个复制集分片。在生产环境中也一般会使用复制集的方式,这防止数据节点出现单点故障。

配置服务器(Config Server)

配置服务器包含多个节点,并组成一个复制集结构,对应于图中的ConfigReplSet。配置复制集中保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等。

查询路由(mongos):

mongos是分片集群的访问入口,其本身并不持久化数据。mongos启动后,会从配置服务器中加载元数据。之后mongos开始提供访问服务,并将用户的请求正确路由到对应的分片。在分片集群中可以部署多个mongos以分担客户端请求的压力。

四、实施方案

1. 分片策略

分片对象:

模板表单、设计表单相关数据做分片

实例数据,表单实例、流程实例等纯增长数据

超过1000万条记录以上的集合可考虑做分片策略

分片键选择:

分片键的基数,取值基数越大越有利于扩展

分片键的取值分布应该尽可能均匀

业务读写模式,尽可能分散写压力,而读操作尽可能来自一个或少量的分片

分片键应该能适应大部分的业务操作

2. 数据迁移

编写迁移脚本,如果老的集合没有分片键字段需要新增分片键字段并写入数据

执行迁移脚本,每天凌晨2-6点执行

全部迁移完成时,打开业务双写开关

业务切换到新MongoDB分片集群上线同时停止双写

五、参考

有关分库分表你想知道的,都在这儿了

https://mp.weixin.qq.com/s/8eej1CMmW7FONnMtuzIoWQ

分库分表后,如何不停机迁移数据?

https://blog.csdn.net/a1064447034/article/details/120433106

全面剖析 MongoDB 高可用架构

https://mp.weixin.qq.com/s/jLsviuQ0wCcsmkskXSFdEQ

MongoDB--分片(shard)和分块(chunk)

https://blog.csdn.net/ITgagaga/article/details/103458111

mongoDB 系列~ chunk原理

https://www.cnblogs.com/danhuangpai/p/15138519.html

MongoDB sharding chunk 分裂与迁移详解

https://mongoing.com/archives/4368

MongoDB Sharding Chunk分裂与迁移详解

https://blog.csdn.net/joy0921/article/details/80131276

一文读懂MongoDB chunk 迁移

https://cloud.tencent.com/developer/article/1794766

Data Partitioning with Chunks

https://www.mongodb.com/docs/manual/core/sharding-data-partitioning

MongoDB – db.collection.Find() Method

https://www.geeksforgeeks.org/mongodb-db-collection-find-method

db.collection.find()

https://www.mongodb.com/docs/manual/reference/method/db.collection.find

上一篇下一篇

猜你喜欢

热点阅读