图数据库 Nebula Graph TTL技术特性介绍
-
资源ID:265413153
资源大小:947.58KB
全文页数:15页
- 资源格式: DOCX
下载积分:15金贝
快捷下载
账号登录下载
微信登录下载
微信扫一扫登录
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
|
下载须知 | 常见问题汇总
|
图数据库 Nebula Graph TTL技术特性介绍
图数据库 Nebula Graph TTL 特性 导读身处在现在这个大数据时代,我们处理的数据量需以 TB、PB, 甚至 EB 来计算,怎么处理庞大的数据集是从事数据库领域人员的共同问题。解决这个问题的核心在于,数据库中存储的数据是否都是有效的、有用的数据,因此如何提高数据中有效数据的利用率、将无效的过期数据清洗掉,便成了数据库领域的一个热点话题。在本文中我们将着重讲述如何在数据库中处理过期数据这一问题。在数据库中清洗过期数据的方式多种多样,比如存储过程、事件等等。在这里笔者举个例子来简要说明 DBA 经常使用的存储过程 + 事件来清理过期数据的过程。存储过程 + 事件清洗数据存储过程(procedure)存储过程是由一条或多条 SQL 语句组成的集合,当对数据库进行一系列的读写操作时,存储过程可将这些复杂的操作封装成一个代码块以便重复使用,大大减少了数据库开发人员的工作量。通常存储过程编译一次,可以执行多次,因此也大大的提高了效率。存储过程有以下优点:· 简化操作 ,将重复性很高的一些操作,封装到一个存储过程中,简化了对这些 SQL 的调用· 批量处理 ,SQL + 循环,减少流量,也就是“跑批”· 统一接口 ,确保数据的安全· 一次编译多次执行 ,提高了效率。以 MySQL 为例,假如要删除数据的表结构如下:mysql> SHOW CREATE TABLE person;+-+-+| Table | Create Table |+-+-+| person | CREATE TABLE person ( age int(11) DEFAULT NULL, inserttime datetime DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 |+-+-+1 row in set (0.00 sec)创建一个名为 person 的表,其中 inserttime 字段为 datetime 类型,我们用 inserttime 字段存储数据的生成时间。创建一个删除指定表数据的存储过程,如下:mysql> delimiter /mysql> CREATE PROCEDURE del_data(IN date_inter int)-> BEGIN-> DELETE FROM person WHERE inserttime < date_sub(curdate (), interval date_inter day);-> END /mysql> delimiter ;创建一个名为 _deldata 的存储过程,参数 _dateinter 指定要删除的数据距离当前时间的天数。当表 person 的 inserttime 字段值(datetime 类型)加上参数 date_inter 天小于当前时间,则认为数据过期,将过期的数据删除。事件(event)事件是在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理,也就是所谓的“事件调度器”。 < br /> 事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于它们彼此相似,所以事件也称为临时性触发器。事件调度器可以精确到每秒钟执行一个任务。如下创建一个事件,周期性的在某个时刻调用存储过程,来进行清理数据。mysql> CREATE EVENT del_event -> ON SCHEDULE -> EVERY 1 DAY -> STARTS '2020-03-20 12:00:00'-> ON COMPLETION PRESERVE ENABLE-> DO CALL del_data(1);创建一个名为 del_event 的事件,该事件从 2020-03-20 开始,每天的 12:00:00 执行存储过程 del_data(1)。然后执行:mysql> SET global event_scheduler = 1;打开事件。这样事件 del_event 就会在指定的时间自动在后台执行。通过上述的存储过程 del_data 和事件 del_event,来达到定时自动删除过期数据的目的。TTL(Time To Live) 清洗数据通过上述存储过程和事件的组合可以定时清理数据库中的过期数据。图数据库 Nebula Graph 提供了 更加简单高效的方式-使用 TTL 的方式来自动清洗过期数据 。使用 TTL 方式自动清洗过期数据的好处如下:1. 简单方便2. 通过数据库系统内部逻辑进行处理,安全可靠 < br />3. 数据库会根据自身的状态自动判断是否需要处理,如果需要处理,将在后台自动进行处理,无需人工干预。TTL 简介TTL,全称 Time To Live,用来指定数据的生命周期,数据时效到期后这条数据会被自动删除。在图数据库 Nebula Graph 中,我们实现 TTL 功能,用户设置好数据的存活时间后,在预定时间内系统会自动从数据库中删除过期的点或者边。在 TTL 中,过期数据会在下次 compaction 时被删除,在下次 compaction 之前,query 会过滤掉过期的点和边。图数据库 Nebula Graph 的 TTL 功能需 ttl_col 和 ttl_duration 两个字段一起使用,到期阈值是 ttl_col 指定的属性对应的值加上 ttl_duration 设置的秒数。其中 ttl_col 指定的字段的类型应为 integer 或 timestamp,ttl_duration 的计量单位为秒。TTL 读过滤针对 tag / edge,Nebula Graph 在 TTL 中将读数据过滤逻辑下推到 storage 层进行处理。在 storage 层,首先获取该 tag / edge 的 TTL 信息,然后依次遍历每个顶点或边,取出 ttl_col 字段值,根据 ttl_duration 的值加上 ttl_col 列字段值,跟当前时间的时间戳进行比较,判断数据是否过期,过期的数据将被忽略。TTL compactionRocksDB 文件组织方式图数据库 Nebula Graph 底层存储使用的是 RocksDB,RocksDB 在磁盘上的文件是分为多层的,默认是 7 层,如下图所示:SST文件在磁盘上的组织方式Level 0 层包含的文件,是由内存中的 Memtable flush 到磁盘,生成的 SST 文件,单个文件内部按 key 有序排列,文件之间无序。其它 Level 上的多个文件之间都是按照 key 有序排列,并且文件内也有序,如下图所示:非Level 0 层的文件数据划分RocksDB compaction 原理RocksDB 是基于 LSM 实现,但 LSM 并不是一个具体的数据结构,而是一种数据结构的概念和设计思想,具体细节参考 LSM论文 。而 LSM 中最重要部分就是 compaction,由于数据文件采用 Append only 方式写入,而对于过期的数据,重复的、已删除的数据,需要通过 compaction 进行逐步的清理。 < br />RocksDB compaction 逻辑我们采用的 RocksDB 的 compaction 策略为 Level compaction。当数据写到RocksDB 时,会先将数据写入到一个 Memtable 中,当一个 Memtable 写满之后,就会变成 Immutable 的 Memtable。RocksDB 在后台通过一个 flush 线程将这个 Memtable flush 到磁盘,生成一个 Sorted String Table (SST) 文件,放在 Level 0 层。当 Level 0 层的 SST 文件个数超过阈值之后,就会与Level 1 层进行 compaction。通常必须将 Level 0 的所有文件 compaction 到 Level 1 中,因为 Level 0 的文件的 key 是有交叠的。Level 0 与 Level 1 的 compaction 如下:Level 0 与 Level 1 的 compaction其他 Level 的 compaction 规则一样,以 Level 1与 Level 2 的 compaction 为例进行说明,如下所示:Level 1 与 Level 2 的 compaction当 Level 0 compaction 完成后,Level 1 的文件总大小或者文件数量可能会超过阈值,触发 Level 1 与 Level 2 的 compaction。从 Level 1 层至少选择一个文件 compaction 到 Level 2 的 key 重叠的文件中。compaction 后可能会触发下一个 Level 的 compaction,以此类推。如果没有 compaction,写入是非常快的,但这样会造成读性能降低,同样也会造成很严重的空间放大问题。为了平衡写入、读取、空间三者的关系,RocksDB 会在后台执行 compaction,将不同 Level 的 SST 进行合并。TTL compaction 原理除了上述默认的compaction操作外(sst文件合并),RocksDB 还提供了CompactionFilter 功能,可以让用户自定义个性化的compaction逻辑。Nebula Graph 使用了这个CompactionFilter来定制本文讨论的TTL功能。该功能是 RocksDB 在 compaction 过程中,每读取一条数据时,都会调用一个定制的Filter 函数。TTL compaction 的实现方法就是在 Filter 函数中实现 TTL 过期数据删除逻辑,具体如下:1. 首先获取 tag / edge 的 TTL 信息2. 然后遍历每个顶点或边数据,取出 ttl_col 列字段值3. 根据 ttl_duration 的值加上 ttl_col 列字段值,跟当前时间的时间戳进行比较,然后判断数据是否过期,过期的数据将被删除。TTL 用法在图数据库 Nebula Graph 中,edge 和 tag 实现逻辑一致,在这里仅以 tag 为例,来介绍 Nebula Graph 中 TTL 用法。创建 TTL 属性Nebula Graph 中使用 TT