1、大量删除数据问题及解决方案
- 在线消息定时删除
- 请求量增加,垃圾数据需要进行删除
- 离线批量删除
- msgid
- content
- timestamp
- flag
- objectid
- from
- to
- 针对flag=1时进行删除时的问题,并非索引或者分片结果;
- 更新方式
- 业务层优化
- 逻辑删除转为直接物理删除
- 离线删除优化
- 每晚定时从库导出要删除的数据
- 通过脚本按照objectid方式进行删除
- 删除速度基本可控
- 避免对线上服务影响
2、大量数据空洞问题及其解决问题方案
- 出现原因
- 项目上线时间畅
- 积累了很多“无用”历史数据
- 为了提高性能,删除“无用”利用历史数据
- 减少了数据存储大小,期房提高数据库服务能力
- 问题
- 大量删除数据,存储空洞
- 空洞数据加载内存
- 导致内存有效服务低
- 数据不断在swap
- 数据库性能没有明显提高
- 解决方案
- MongoDB数据空间的分配以DB为单位
- 不是以Collection单位
- 问题大量碎片无法使用与整理
- 碎片整理、空洞合并收缩
- 方法
- Online Compress
- Compact
- db.yourCollection.runCommand("compact");
- Collection级别压缩
- 影响服务
- 压缩效果差,不推荐使用
- 方案二:
- remove空洞,重新生成一份无空洞数据
- 预热从库,并将从库提升为主库
- 将之前主库数据全部删除
- 重新同步
- 同步完成后预热词库
- 将此库提升为主库
- 完全无碎片,收缩率100%
- 持续时间长、投入维护成本高
- 收缩过程单点有风险
3、存储量及并发量增大,CPU飙升问题及解决方案
- MongoDB集群存储量变大,请求量变大
- 请求高峰期,请求高峰期,数据库报警不断,业务报警不断
- 业务请求数据超时,业务无法正常提供服务,确定业务模块正常
- 查看主库进程,上下文切换极高
4、MonogDB数据迁移抖动及问题
- AutoSharding自动迁移,对应用程序完全透明
- 使用单库单表一样简单
- 解决方案
- 禁用Auto-Sharding
- 开启数据库分片
- 特定库固定到某一分片
- 手动分片
5、内存频繁swap、磁盘IO性能不足问题及解决方案
- 业务发展,存储,请求量不断升级,内存无法完全存储热点数据
- swap严重,队列堆积,枷锁严重
- 解决方案
- scale up
- 硬件升级
- 软件升级
- 缓存
- 收缩
- 查询语句优化
- scale out
- repliset
6、地理空间索引查询及重构消耗多CPU资源问题及解决方案
- 查询附近,构建和使用
- 速度较慢读写
- 内存消耗大量CPU
- 解决方案
- 方案一
- 数据规模拆分
- GB界别
- 情况好转
- 方案二
- MongoDB地理空间问题初期稳定性有待验证
- 不再使用MongoDB空间索引
- 针对空间地理查询修改服务,直接接入使用,服务能力大大提升