mongodb每天上亿数据量定期清理

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 背景:mongodb(应用运营数据分析与自动自助化支持平台)每分钟有30w~40w的insert,20w~30w的update。数据保留一天,一天之前的数据可以清理。一天的数据量大概1亿左右。由于数据量较大,清理数据对系统造成了较大影响,入库会出现堵塞。

背景:mongodb(应用运营数据分析与自动自助化支持平台)每分钟有30w~40w的insert,20w~30w的update。数据保留一天,一天之前的数据可以清理。一天的数据量大概1亿左右。由于数据量较大,清理数据对系统造成了较大影响,入库会出现堵塞。经过和开发多次讨论,尝试了不同的方案。最终选择了合适的清理方式,系统也开始比较稳定地运行。

除了这个mongodb库外,也遇到其他库询问关于mongodb如何进行数据清理问题。这里将常见的清理方法列出来供大家参考。

清理方法:

  1. 采用定期一分钟删除一次的方法。方法如下:

                        "op" : "remove",
    
                        "ns" : "fla.logGset",
    
                        "query" : {
    
                                "time" : {
    
                                        "$lt" : NumberLong(1495693140),
    
                                        "$gte" : NumberLong(1495693080)
    
                                }
    
                        },
    

对于数据量较小的表,这种方法比较合适。但是对于数据量较较大的库,删除速度太慢,跟不上入库的速度。比如mrcache这个库,单次删除执行时间需要大概10分钟~20分钟不等。这个远远追不上入库的速度。

  1. 采用晚上定期执行删除任务,删除小于某个时间的所有数据。

                        "op" : "remove",
    
                        "ns" : "fla.logGset",
    
                        "query" : {
    
                                "time" : {
    
                                        "$lt" : 1495752371
    
                                }
    
                        },
    

对于一个晚上能够清理完某个时间点之前的数据,这种方法还是比较合适的。如果表太大,该语句晚上没有执行完成,一直持续到白天,就会严重影响白天的业务,特别是高并发的情况下,会导致mongodb变得非常缓慢。比如mrcache这个库,有个22:00开始执行删除小于一天前的数据,数据量大概12个亿,执行到白天10:00也没有完成。mongodb变得非常缓慢,当停掉客户端程序后,发现已执行的删除语句其实还在继续执行。将mongodb切换到从库后,仍然非常缓慢。只有从后台将删除会话kill后,mongodb性能才会恢复。

db.currentOp().inprog.forEach(function(item){if(item.ns == "fla.logGset"&&item.op == "remove" )db.killOp(item.opid)})

  1. 采用mongodb的TTL索引功能。

db.person.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 60 } )

查看了ttl索引实际进行的操作,mongodb在后台使用的类似于delete tab where time <某个时间的方式。

ns: ycsb.personkey:{ lastModifiedDate: 1.0 } query:

{ lastModifiedDate: { $lt: new Date(1495696792487) } }

TTL deleted: 58397

使用TTL index不需要自己写代码,mongodb自动清理数据,而且不用同步删除的数据到从库,ttl的从库操作是在从库独立运行的。

但是TTL index的清理操作对数据库有一定的影响。而且是单线程操作。

例如fla库单表的一分钟的数据30多万的数据,根据负载不同删除一分钟需要耗时从10分钟到20分钟不等,不能满足删除需求。

  1. 根据单位时间的数据量,分批删除,并启用多个线程。

例如fla库,每分钟删除一次,需要大概10分钟。大概20个线程同时运行,能够追的上入库的速度。另外一种方法是根据object id分批删除。效率和根据时间删除差不多。程序放在晚间执行,不影响白天的入库操作。到早上8:00停止。

                    "op" : "remove",

                    "ns" : "fla.logGset",

                    "query" : {

                            "time" : {

                                    "$lt" : NumberLong(1495693140),

                                    "$gte" : NumberLong(1495693080)

                            }

                    },

或者

                    "op" : "remove",

                    "ns" : "fla.logGset",

                    "query" : {

                            "_id" : {

                                    "$lt" : ObjectId("5928c66cf1516ce0f261b444"),

                                    "$gte" : ObjectId("5928c630f1516ce0f261b445")

                            }

                    },

 

mrcache库采用这种方式,目前30W/min insert操作、20w/min的update操作,无删除时mongodb还是比较稳定的; 在夜间业务低峰执行删除时, 观察过几次, 都会有一些抖动; 不过可以接受。

  1. 采用分表的方式,类似于oracle的分区操作。不过程序代码需要处理oracle的分区功能,比如创建新collection、查询新collection和删除旧collection操作。

为每天创建一个collection,比如logGset170605,logGset170606,logGset170607。

这种方式清理时很简单,只要drop相应日期的collection即可。但是程序代码需要进行额外处理,需要能够识别分表的情况,每天需要动态的创建新collection,DML操作也要切换到新的collection。在进行查询统计时,需要跨多个collection访问。

  1. 采用分库分表的方式,和第5步类似,只是collection的db也是新建的。

为每天创建一个db+collection,比如db170605.logGset170605,db170606.logGset170606,db170607.logGset170607。

清理时直接drop db,这样可以从物理磁盘释放空间。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
安全 大数据 测试技术
Mongodb亿级数据量的性能测试比较完整收藏一下
原文地址:http://www.cnblogs.com/lovecindywang/archive/2011/03/02/1969324.html 进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插...
3517 0
|
1月前
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
3天前
|
存储 NoSQL 关系型数据库
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
【5月更文挑战第10天】本文对比了MongoDB与传统关系型数据库在数据模型、存储结构、扩展性、性能、事务支持、数据一致性和适用场景等方面的差异。MongoDB以其灵活的文档模型、优秀的扩展性和高性能在处理非结构化数据和高并发场景中脱颖而出,而关系型数据库则在事务处理和强一致性上更具优势。两者各有适用场景,选择应根据实际需求来定。随着技术发展,两者正相互融合,共同构建更丰富的数据库生态。
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
|
7天前
|
存储 NoSQL 关系型数据库
MongoDB非关系型数据库实战
【5月更文挑战第6天】MongoDB,流行的NoSQL数据库,以其灵活的数据模型和高性能备受青睐。本文介绍了MongoDB的基础,包括文档型数据库特性、安装配置、数据操作。通过电商订单管理的实战案例,展示了MongoDB在处理复杂数据结构和大规模数据时的优势,适用于电商、游戏、视频直播等场景。MongoDB的索引、全文搜索和地理空间功能进一步增强了其实用性。注意性能优化和扩展性以确保系统稳定性和可靠性。
|
14天前
|
弹性计算 NoSQL Shell
一键安装 MongoDB 数据库脚本
【4月更文挑战第29天】
18 4
|
20天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
24天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
315 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
1月前
|
存储 SQL NoSQL
mongodb数据库使用
mongodb数据库使用