laravel5.6 使用指定字段作为key_MyRocks TTL使用姿势及Bugfix

一些业务场景是经过一段时间后删除过期的数据,MyRocks提供了TTL可以满足该场景。MyRocks 通过Compaction回收过期的数据。本文介绍MyRocks TTL使用姿势以及Bugfix。

TTL 通过 table comment 定义,有两种形式:

CREATE TABLE t1 (a INT, b INT, c INT, PRIMARY KEY (a), KEY(b)) ENGINE=ROCKSDB COMMENT "ttl_duration=3600;";CREATE TABLE t2 (a INT, b INT, c INT, ts BIGINT UNSIGNED NOT NULL, PRIMARY KEY (a), KEY(b)) ENGINE=ROCKSDB COMMENT "ttl_duration=3600;ttl_col=ts;";

ttl_duration: 指定过期时间,单位是秒

ttl_col : 指定过期时间列,列的数据类型必须是 bigint unsigned not null, 不能是datetime类型。

表t1没有指定ttl_col,record插入的时间作为created time 会记录在record中,注意更新(update)此记录不会更新created time。表t2 显式指定了ttl_col,created time 直接从ttl_col列获取。

MyRocks 在读数据时会判断表是否有TTL定义,是否开启了rocksdb_enable_ttl_read_filtering(默认是开启的),如果都满足则会读取created time,判断是否过期。

实际使用中还碰到了一个TTL的bug,该bug是由Percona小伙伴提出来的,我们分析修掉了该Bug,如果表定义了TTL,并且有varchar字段,执行一些聚合查询会导致mysqld crash。重现该bug的方法如下:

CREATE TABLE `t1` (
`a` bigint(20) NOT NULL,
`b` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`u` bigint(20) unsigned NOT NULL,
`d` bigint(20) DEFAULT NULL,
PRIMARY KEY (`a`,`b`),
KEY `d` (`d`)
) ENGINE=ROCKSDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='ttl_duration=1000;ttl_col=u';
INSERT INTO t1 VALUES (100, 'aaabbb', UNIX_TIMESTAMP(), 200);
EXPLAIN SELECT COUNT(*) FROM t1;
SELECT COUNT(*) FROM t1;

执行以上语句会导致mysqld crash,主要原因是在解析二级索引元组的时候忽略了TTL隐藏字段。如果表没有定义TTL,二级索引record的KV格式如下:

key: index number, NULL-flag, M(c), M(a)

value: empty or restore data

如果表定义了TTL字段,二级索引record的KV格式如下:

key: index number, NULL-flag, M(c), M(a)

value: timestamp or restore data

因为RocksDB存储的是KV格式的数据,MyRocks handler层负责把行记录格式的数据转成KV格式的数据,这个过程叫做pack,在查询的时候,再把底层KV格式的数据转换成行格式,这个过程叫做unpack。如果行记录中有特殊字段比如varchar、blob等,value还会存储unpack info,主要是为了能恢复出原来的varchar、blob。

该bug主要是在unpack_record函数中出错,

1f6de6179850b900f97454a50618b553.png

reader 保存二级索引KV中的key, unp_reader保存二级索引KV中的value,

f8ef83559064e7f72c339d2e08752ebd.png

注释中也说明了会按照unpack data 、checksum的顺序解析,但是如果表定义了TTL,value开始的8字节存储的是TTL时间戳,这么解析就出错了。解决的办法也很简单,就是要跳过TTL时间戳,

7f6213ea2542981b78229291ec606ebb.png

参考链接:

1、官方wiki: https://github.com/facebook/mysql-5.6/wiki/Time-to-Live-(TTL)

2、bug issue: https://github.com/facebook/mysql-5.6/issues/896

3、bug patch : https://github.com/facebook/mysql-5.6/pull/898

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a==b和a.equals(b)的区别

使用ab时 如果a和b都是对象时,是进行对象地址的判断,假如a和b指向的是堆中同一个对象才会返回ture 如果是字符串,会比较他们的值是否相等 使用a.equals(b)时 如果是对象,首先,进行了对象地址的判断,如果…

mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!

1. 明确需求在设计之初,sys_role表的enabled字段有2个可选值,其中0 代表禁用,1代表启用,而且实体类中我们使用的是Interger类型:/*** 有效标志*/ private Integer enabled;public Integer getEnabled() {return enable…

filter函数使用出现的问题

需求: 需要在筛选框中,输入筛选条件,筛选出当前列表中符合的数据。 indexList:[] 是数组存储的数据e是获取输入框中的值 query(e){this.indexListthis.indexList.filter(function (item) {return item.goodsname.indexOf(e) ! -…

python根据模板生成pdf文件_程序生成word与PDF文档的方法(python)

程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob、Apache POI、Java2Word、iText等各种方式,以及使用freemarker这样的模板引擎这样的方式。php中也有一些相应的方法,但在python中将…

js将object转化为json数据,json数据转js对象

json数据转js对象: JSON.parse(); js对象转json数据: JSON.stringify();

本地更新github项目_GitHub开源项目2019-03-29更新精选

1.etcd:一个高可用的分布式键值数据库,k8s 全家桶标配的注册与发现服务etcd:一个高可用的分布式键值数据库,k8s 全家桶标配的注册与发现服务。它采用 raft 一致性算法,基于 Go 语言实现。可以通过该项目了解、学习 raf…

js中for循环调用回调函数,一直循环最后一个

js的for循环中使用回调函数,获取到的值总是最后一个值?_MLAY-CSDN博客_js 循环回调函数

maven default aliyun_大家看看大佬对Maven仓库的讲解,有何高明之处?

概念Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地方)。分类maven的仓库只有两大类:1.本地仓库 2.远程仓库,在远程仓库中又分成了3种:中央仓库、 私服…

形参和实参的区别

形参就是函数声明时的变量,实参是我们调用该函数时传入的具体参数。 function function(a,b){ console.log(a,b) }function(1,2) 这里1,2就是实参 a,b是形参

JAVA八种基本类型

基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)

计算差分方程的收敛点_数值计算(五十九)热传导方程组的差分数值求解

1 问题描述Chenglin Li:数值计算(三)matlab求解一般的偏微分方程组​zhuanlan.zhihu.com因为给出的边界条件包含导数,因此需要同时考虑前向差分和后向差分;遍历循环,先计算每个坐标的时间节点,或…

python树莓派编程_python树莓派编程

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!例如,你可以用树莓派搭建你自己的家用云存储服务器。? 树莓派用python来进行编程。 树莓派项目的…

Java 引用类型变量的声明和使用

引用类型变量的声明和使用 (1)把类名当作是一种类型来声明变量,这种变量叫引用类型变量。如:People people; (2)引用类型变量保存对象的“引用”,即对象的地址。 (3)对象的创建  new 类名()  如:new People(); (4)new创建对象后…

se是什么职位_女皇大学PSE&SE 独家解析!

坐落于圣劳伦斯河畔的女皇大学成立于1841年,至今已经有178年的历史了。作为加拿大传统的四大名校“Old Four”之一,女王大学一直以来在学术成就(常年位列麦考林排名医博类前5),学生满意度(麦考林排名医博类…

js中new操作符

1.什么是new? 在JS中,new的作用是通过构造函数来创建一个实例对象(和普通函数不一样,当函数用作构造函数时,首字母一般要大写) function Foo(name) {this.name name; } console.log("new Foo(mm)的类型&#…

charles 安装 ssl_「从零开始Python爬虫」1.7.1 Charles的安装与配置

Charles的安装Charles是一个网络抓包工具,相比Fiddler,其功能更为强大,而且跨平台支持得更好,所以这里选用它来作为主要的移动端抓包工具。相关链接官方网站:https://www.charlesproxy.com下载链接:https:/…

Git创建本地分支并提交到远程仓库

1.建立本地仓库 查看当前项目根目录中有没有 .git文件(隐藏文件),如果没有,右键->Git bash here ,然后输入命令git init建立本地仓库 git init 2.将代码提交到本地仓库 git add git commit -m "new branch…

python删除一个文件_Python 实现一个小功能: 删除某路径下文件及文件夹的脚本...

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。 编程之家小编现在分享给大家,也给大家做个参考。 #!/usr/bin/env python import os import shutil delList [] delDir "/home/test" delList os.listdir(delDir ) for f in delList: filePath o…

uniapp防抖操作

1.新建common文件并创建common.js文件 // 防止处理多次点击function noMultipleClicks(methods, info) {// methods是需要点击后需要执行的函数, info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick false;if(info && inf…

JS去除字符串去除最后的逗号

let str"1,2,3,"str str.substring(0, str.lastIndexOf(,));