【mongoDB】MongoDB分片集群方案
一、为什么要使用分片?
MongoDB副本集实现了数据的多副本复制及高可用,但是一个复制集能承载的容量和负载是有限的。
目前业务模块库单节点配置32核256G内存2T硬盘,而已存数据量达1.5T,索引大小超过400G。
MongoDB认为内存冗余量不足,就会触发内存数据清理动作,清理策略是依据LRU算法,将旧数据踢出内存;一旦内存使用率高于95%,那么代表MongoDB数据库承受着巨大的写入压力,就会阻塞其他操作,尽可能多地淘汰内存中的数据,当业务通过索引查询时,如果内存没有查询到就会读磁盘导致性能下降。
在数据量较大的情形下,MongoDB副本集的可能就会遇到的问题:
1、业务数据存储容量需求即将超出单机的磁盘容量。
2、活跃的数据集超出单机内存容量,索引数据大小超过内存大小,MongoDB会丢弃部分索引数据,导致很多请求都要从磁盘读取数据,影响性能。
3、写IOPS超出单个MongoDB节点的写服务能力。
二、扩容方案选择
冷热分离,垂直扩容(ScaleUp)
mongoDB架构: 副本集PSS集群
优点: 查询灵活、维护成本低
缺点:容量和负载有限
备注:冷热分离业务改动成本大、涉及产品页面、前端、后端改动,数据迁移有风险,有可能会引起客户投诉。
分片水平扩容(ScaleOut)
mongoDB架构: 分片集群
优点: 数据分片存储,支持水平扩展,存储容量无上限,高并发、读写性能好,可灵活针对大客户、大数据进行某个标签分片节点硬件升级
缺点:高效查询需要带分片键、维护成本较高
备注:分片数据迁移过程比较久,只涉及后端改动,用户无感知
三、MongoDB分片集群架构
![](https://img.haomeiwen.com/i12979420/c00415c9fc62ffd2.png)
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