在数据库的日常运维和性能优化中,数据库表数据的生命周期管理是一个常见且重要的工作场景。在oracle数据库中,数据生命周期管理包括历史分区的truncate、压缩、分区迁移分级存储管理以及delete等方案。而在mongodb中,没有表分区的概念,在分片中,要考虑业务均匀分布在所有数据片中,但是由于时间字段单调递增的特性,所以基本不会考虑将时间字段作为独立片键。同时,Mongodb的WiredTiger存储引擎默认采用snappy压缩算法,在我们的生产系统上,压缩比例大概在3:1,如果采用zlib算法,压缩比例可达10:1以上(会增大CPU开销),所以在一般情况下,mongodb的数据生命周期管理也不会使用手动压缩方式,如果要建设历史归档库,可考虑使用zlib算法进行压缩。Mongodb的数据生命周期管理可利用自身的功能特性实现,下面将对几种数据清理方案进行描述。
TTL(timetolive)索引是MongoDB中一种特殊的索引,是一种在除_id外的时间字段上创建的单列索引(复合索引无法拥有TTL属性)。在创建TTL索引后,后台线程将根据字段值再指定的秒数后自动删除数据。如:
db.Record.createIndex({"timestamp":1},{ expireAfterSeconds:2678400 , background:true});
表示根据timestamp字段时间的31天后过期删除数据。
如果字段值是一个数组,则以数组的最小时间为准。如果要修改TTL索引的数据过期时间,无需重建索引,可通过如下命令修改:
db.runCommand({ collMod: "test", --集合名称
index:{ name: "lastModifiedDate_1", --索引名称
expireAfterSeconds:60 --过期时间
}})
注意在复制集架构中,如果集合数据量较大,并且修改减少数据保留时间,命令执行完成后,后台线程会缓慢删除数据,此过程中会产生大量的oplog,需关注系统配置的oplogsize,确保有足够的空间存放Oplog,以便于在存在延迟从节点或者从节点IO性能较差的情况下,不至于出现主节点的oplog被覆盖丢失从而引起同步异常的情况。并且在大量数据被删除后,会出现集合碎片,类似oracle的高水位,空间再集合中可重用,但是不会释放给操作系统,需进行compact操作,此操作可导致库级锁,可以在进行主从切换的情况下,滚动在从节点操作。
capped集合是mongodb中的一种特殊的集合,其大小是固定的,数据写入是有序的,当存储的数据超过大小限制时,将采取先入先出的原则,自动清理旧数据。在限制集合大小的同时,capped集合还可以限制文档数量,当存储数据未达到文档数量限制但是达到大小限制,也会自动清理数据。oplog.rs就是一个固定集合。由于capped集合的大小是固定的,数据是有序的,所以其插入和查询的性能都优于普通集合。
示例:
db.createCollection("log", { capped: true, size: 10737418240 } ) --创建10GB的固定集合
db.createCollection("log",{ capped : true, size : 10737418240, max : 50000000 } ) --创建最大10GB,且不超过5千万行的固定集合。注意:固定集合无法手工删除数据,且无法进行分片。
在一个集合中,若存在时间字段时,可通过时间字段定位并删除历史数据,但是如果没有时间字段,怎么定位历史数据呢?在mongodb中,每个集合会默认创建一个_id字段,并且该字段上默认创建了主键索引,该字段类型为ObjectId。ObjectId是一个12字节的BSON类型字符串。按照字节顺序,依次代表:
4字节:UNIX时间戳
3字节:表示运行MongoDB的机器
2字节:表示生成此_id的进程
3字节:由一个随机数开始的计数器生成的值
通过js代码将时间值转换为objectid,按时间范围清理历史数据。利用objectid的有序性和唯一索引过滤,快速清理目标数据,避免清理条件字段无索引时产生低效的全表扫描。
详细方法如下:
1.获取时间条件时间范围转换为objectid
ObjectId(Math.floor((new Date(2019/8/9))/1000).toString(16) + "0000000000000000") ObjectId("5b6b13800000000000000000") |
2.将转换后的时间与objectid比较,按照objectid删除
var objIdMin = ObjectId(Math.floor((new Date(2019/8/9))/1000).toString(16) + "0000000000000000") var objIdMax = ObjectId(Math.floor((new Date(2018/9/11))/1000).toString(16) + "0000000000000000") db.test.remove({_id:{$gt: objIdMin, $lt: objIdMax}}) |
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130178.html
摘要:是以的形式来创建的组件的,是目前极为推荐的创建有状态组件的方式,最终会取代形式相对于可以更好实现代码复用。当然,有三种手动绑定方法可以在构造函数中完成绑定,也可以在调用时使用来完成绑定,还可以使用来绑定。 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归;具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件...
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
摘要:的三种工作模式服务器目前一共有三种稳定的,多进程处理模块模式。模式下所能同时处理的请求总数是由子进程总数乘以值决定的,应该大于等于。默认最大的子进程总数是,加大时也需要显式声明最大值是。 Apache 的三种工作模式(Prefork、Worker、Event) Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。 它...
阅读 1346·2023-01-11 13:20
阅读 1684·2023-01-11 13:20
阅读 1132·2023-01-11 13:20
阅读 1858·2023-01-11 13:20
阅读 4100·2023-01-11 13:20
阅读 2704·2023-01-11 13:20
阅读 1385·2023-01-11 13:20
阅读 3597·2023-01-11 13:20