MongoDB数据量大于2亿后遇到的问题 及原因分析

一、数据增长情况

每月增长量最大达到了1.9亿,每天增长约300W-500W
    (增长数据具体可看页尾)

二、遇到的情况及解决方法

1.数据量过大,并且都集中在一个表,所以此表数据插入变慢。

表索引越多越明显,

优化处理方法:
            1.优化索引,以前的startTime日期字段索引,
            修改为客户端用日期生成ObjectId,再用_id 来进行查找。
            2.TraceId 字段(一个TraceId 对应多条记录)计划也删除,后面再用ES 系统先查询到_id 后,
            再从mongoDB 进行查找。

原因分析:
            当表数据增长到千万级后,内存数据中的索引数据增加,内存越来越不够用,需要刷新脏数据增多,            
            mongostat 分析的 dirty % > 3,后从16G 内存升级到32G 内存后,情况稍有好转。

2.数据量过大后,从节点时尔出现CPU load 负载过高,从节点尤其明显。

在把表重命名,新数据插入到新表处理后:
        db.TraceLogs.renameCollection("TraceLogs_bak170210");
        (新数据插入时,会自动生成表TraceLogs)

历史数据表统计信息    
            Log:PRIMARY> db.TraceLogs_bak170210.stats()
            {
                "ns" : "RavenLogs.TraceLogs_bak170210",
                "count" : 384453917,
                "size" : 865594958942,
                "avgObjSize" : 2251,
                "storageSize" : 444,613,255,168,
                .....
                "nindexes" : 2,
                "totalIndexSize" : 15275057152,
                "indexSizes" : {
                    "_id_" : 3,973,029,888,
                    "TraceId_1" : 11,302,027,264
                },
                "ok" : 1
            }
            从此统计信息中可以看到:
                    表存储大小:    444G,
                    索引 _id_ 3.9G, TraceId_1 大小:11G

再次查看数据库性能

从以前的:
        load average: > 5.47, 5.47, 5.47
        降到了:
        load average: 0.88, 1.34, 1.69
        (主从节点,皆已下降)

在做历史数据迁移期间,又升到了> 8 并且时频繁出现。

完成数据迁移后,回落到  2 < load avg <: 4 之间        (升级到MongoDB3.4 之后)

原因分析:
            个人认为,主因还是因为内存不够。索引+热数据远远超过了16G的MongoDB使用内存。
            从而导致大量的IO,相对的CPU load 也上去了。
            在把原大表TraceLogs 改名后(TraceLogs_bak170210),大量的热块数据已被清除出内存,

3.此前数据库从节点内存升级后(16G --> 32G),参数配置不当,节点实例当机情况:

wiredTiger:
            engineConfig:
          cacheSizeGB: 28    (限制mongoDB 使用内存最大值)

后调整为默认值
                #cacheSizeGB: 28    (限制mongoDB 使用内存最大值),默认值为50%
        mongoDB实例恢复正常,但CPU load 也一直居高不下。

原因分析:
            系统使用内存太少,可能是磁盘缓存过低,而无法读写数据,但在mongoDB 日志中,
            无法找到原因。只是看到实例被关闭。

4.因为oplog 同步表最大设置值(oplogSizeMB)为50G, 但50G 只能保存52h 的数量变化量。

想添加新的从节点时,当同步完成数据后,已过了oplog 的窗口期.
        
    (oplogSizeMB的大小要大于数据同步完成+索引建立完成的时间段内生成的数据量,
    当同步完成后,从节点从主节点读oplog表的数据,发现最小的同步时间,已大于从节点中
    同步开始时的时间了,这就是窗口期已过期)

数据量大后,重新创建索引的时间特别惊人,一个索引需要10多个小时。
        500G 存储量,总共需要3天左右的数据完成节点的数据同步及索引创建。

后面计划在添加节点前,做以下调整:
        1.把数据库升级到3.4 版本,此版本在新节点数据同步,创建索引上,号称已有很大的改善。
        2.删除能够优化的索引,如果索引无法优化,也可以考虑先把某个索引删除,节点完成后,再重新建立

经验总结:

1.索引的优化,尽可能的发挥主键索引的功能,比如上面说到的,使用日期范围自己生成_id 范围,用_id字段进行查询,
    能不建立索引,就不建立。在大增长的表中,极其重要。

2.数据库服务器的内存配置上,内存>索引大小,或者是配置到 内存>=索引大小+热数据大小 还是有必要的。
    
    3.数据库服务器的磁盘配置上,如果是云服务器,尽量采用高效云盘。使用EXT4,或者使用NFS 格式也是有必要的。

4.如果一个库有多个表的数据达到亿级时,可能也是考虑使用分片集群的时候,特别是如果此表是做为主业务
    数据库的情况。

---------- 表数据增长情况 ------------------
......
1/1/2017,4318897
1/2/2017,3619411
1/3/2017,2583555
1/5/2017,5523416
1/6/2017,3052537
1/7/2017,3482728
1/8/2017,3931742
1/9/2017,4732320
1/10/2017,4651948
1/11/2017,4438733
1/12/2017,4286169
1/13/2017,4405242
1/14/2017,5664654
1/15/2017,5623800
1/16/2017,3638656
1/17/2017,3617628
1/18/2017,3601569
1/19/2017,3738790
1/20/2017,3788641
1/21/2017,4603575
1/22/2017,4466660
1/23/2017,3913910
1/24/2017,3749316
1/25/2017,3969802
1/26/2017,4101293
1/27/2017,2581358
1/28/2017,3160561
1/29/2017,3051008
1/30/2017,3332417
1/31/2017,3476649
2/1/2017,    3152283
2/2/2017,    3394489
2/3/2017,    3524487
2/4/2017,    3511386
2/5/2017,    3870305
2/6/2017,    3056966
2/7/2017,    3022927
2/8/2017,    3484463
2/9/2017,    4033520

--------------------------
 2016/12:    191914076
 2017/01:    119106985
 2017/02:    31050826

MongoDB数据量大于2亿后遇到的问题 及原因分析相关推荐

  1. 优化 cesium 界面广告牌(billboard)数据量大于 10w +时,地图加载缓慢、卡顿、加载完成后浏览器严重卡顿甚至崩溃问题

    优化 cesium 界面广告牌(billboard)数据量大于 10w +时,地图加载缓慢.卡顿.加载完成后浏览器严重卡顿甚至崩溃问题 前言: 项目之前的设计,billboard 广告牌是绑在 ent ...

  2. flink读取不到文件_日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践...

    简介: 友信金服公司推行全域的数据体系战略,通过打通和整合集团各个业务线数据,利用大数据.人工智能等技术构建统一的数据资产,如 ID-Mapping.用户标签等.友信金服用户画像项目正是以此为背景成立 ...

  3. MySQL单表数据量超1亿,根据 索引列 批量删除数据

    我的场景:MySQL8有个表数据量超1亿,然后我要根据某个例(一对多)删除数据, 我直接用:delete from 表 where 字段 in (select 其他表)     条件用in的方式执行报 ...

  4. 【linux】ARM开发板上设置RTC时间,断电重启后,设置失效的原因分析

    问题描述 linux中使用date设置时间后用hwclock -w同步到RTC,断电重启后,有时会失效 原因分析 保存时间戳 1.使用命令关机(halt)会调用rc0.d中的脚本: 2.使用命令重启( ...

  5. 计算机登陆用户显示黑屏,win7系统电脑开机输入登录账号密码后出现黑屏的原因分析及两种解决方法...

    一位用户说win7开机输入登录账号密码后出现黑屏,这是怎么回事呢?这种情况怎么解决呢?下面脚本之家的小编就带来win7系统电脑开机输入登录账号密码后出现黑屏的原因分析及解决方法,一起来看看吧. 故障原 ...

  6. 路由器级联后网速慢的原因分析和问题解决

    路由器级联后网速慢的原因分析和问题解决 参考文章: (1)路由器级联后网速慢的原因分析和问题解决 (2)https://www.cnblogs.com/jackkwok/p/5233342.html ...

  7. elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理

    一.前言 数据平台已迭代三个版本,从头开始遇到很多常见的难题,终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的 实现参考,少走些弯路,在此篇幅中偏重于ES的优化,关于HBase,Hadoop ...

  8. 利用python编写爬虫程序,从招聘网站上爬取数据,将数据存入到MongoDB数据库中,将存入的数据作一定的数据清洗后做数据分析,最后将分析的结果做数据可视化

    教程演示 创建爬虫项目 编写需要爬取的字段(items.py) 编写spider文件(wuyou.py) 编写数据库连接(pipelines.py) 编写反爬措施(settings.py) Mongo ...

  9. PHP大数据量(大于50万)导出到Excel解决方案

    综述 最近在工作中遇到这样一个问题,公司项目要求订单有导出功能,以前虽然也使用PHPExcel做过几个导出功能,但是这次所需导出的数量巨大,因此在开发中遇到一些导出的坑,在此进行总结记录一下. 吐槽 ...

最新文章

  1. EBU6042 Paper A ‐ SOLUTIONS
  2. Per-Title编码优化
  3. 【转】oracle数据库中varchar2陷阱
  4. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
  5. linux进程管理与调度
  6. oracle按数据条件进行更新_SQL 基础教程, 创建表,按条件选取数据,数据更新,删除...
  7. LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算(三)
  8. 补码,反码,原码的范围总结
  9. python函数myproduct_OpenERP与Python 元编程
  10. 清除Mac OS X文件系统的附加属性@
  11. 于仕琪的人脸检测算法
  12. uibot自动登陆163邮箱发送邮件
  13. 《了不起的Markdown》之第1章 人人都应学会Markdown
  14. java随机生成名字_java随机生成一个名字和对应拼音的方法
  15. pycharm使用清华镜像源提高下载速度 只需要五步完成
  16. ngx_http_core_module模块提供的变量
  17. Mac下AndroidStudio无法识别安卓手机问题解决
  18. 浏览美国大学最新排名以便确立目标 备战雅思助力目标达成
  19. Grad-CAM论文总结
  20. item2 + oh-my-zsh

热门文章

  1. jzoj_3385_黑魔法师之门
  2. CodeForces 940E
  3. SPOJ 3267: DQUERY 树状数组,离线算法
  4. 缓存插件 Spring支持EHCache缓存
  5. Kinect v2.0 for windows开发环境说明
  6. Repeater 绑定下拉列表
  7. PL/SQL 存储过程学习2 条件语句
  8. android开发学习之路——连连看之游戏逻辑(五)
  9. 深入SQL SERVER 2000的内存管理机制
  10. Redis自定义动态字符串(sds)模块(二)