天天看点

AliSQL开源功能特性

在2017在线技术峰会“阿里开源项目最佳实践”上,阿里云数据库内核专家赵建伟(冷香)为大家带来了“alisql开源功能特性”的演讲。本文先简要介绍了alisql以及其开源背景,重点说明了alisql已开源的功能,包括sequence engine、tokudb引擎支持和秒杀优化等,最后对alisql用户issue和典型问题作了解答。

3月1号下午,云栖社区将迎来2017在线技术峰会——“阿里开源项目最佳实践”。来自淘宝、天猫、阿里云、蚂蚁金服的8位项目核心成员将现场剖析阿里开源项目背后的技术实践,分享开源经验。其中,阿里云数据库内核专家赵建伟(冷香)为大家带来了“alisql开源功能特性”的演讲。本文先简要介绍了alisql以及其开源背景,重点说明了alisql已开源的功能,包括sequence engine、tokudb引擎支持和秒杀优化等,最后对alisql用户issue和典型问题作了解答。

以下是精彩内容整理:

alisql是基于mysql官方版本的一个分支,由阿里云数据库团队维护,目前也应用于阿里巴巴集团业务以及阿里云数据库服务。该版本在社区版的基础上做了大量的性能与功能的优化改进,增加更多监控指标,并针对电商秒杀、物联网大数据压缩、金融数据安全等场景提供个性化的解决方案。在通用基准测试场景下,alisql 版本比 mysql 官方版本有着 70% 的性能提升;在秒杀场景下,性能提升 100 倍。

alisql简介

alisql 于2016年10月份正式开源,我们也同步了github的开源地址:

按照内部制定的节奏,我们希望开源的alisql能持续地保持活跃,所以在主页上可以看到release notes自9月15号以来,一直不断地更新,release notes中有详细的本次发布的相关内容、使用方法和注意问题, 4月1日我们也将有重要的features发布。

alisql 也在主页提供必要的信息。最初的基础版本希望领先于官方版本,以及在性能上有质的飞跃,希望在特定场景下我们是遥遥领先的,所以我们给出了benchmark测试样例,在特定场景下有一些特定的优化,比如淘宝秒杀,我们专门做了benchmark,相对于其它分支有很大提升;16年11月份,我们合并了tokudb引擎,alisql以及官方提供的rds上都是支持tokudb引擎的,tokudb引擎对于大数据、物联网等数据量大的场景下,会有很大的压缩比,所以在特定场景下tokudb的支持也做了配套工具的改良,如alisqlbackup,多引擎支持上,我们希望对用户是透明的,也开放出物理备份的工具在github上;我们也提供doc文档,其中sequence engine这个feature,在官方和业界mysql分支上都还没有这个功能,我们提供从设计到语法到使用配套工具,以及非常详细的中英文文档,用户可以在主页上看到一级的重要链接,对大家使用alisql有一定帮助。

alisql开源背景

alisql并不是一个从零开始的项目,它起于开源,汲取社区红利,拥抱开源,促进社区发展。

alisql社区背景是基于官方大版本(mysql &

mariadb),紧跟小版本,汲取不同开源分支(percona,mariadb)技术红利。集团背景是基于alibaba集团业务进行性能的改进。

alisql已开源功能介绍

<b>sequence</b>

engine

最初想法是在集团大范围使用mysql之前,使用oracle时大量使用sequence,sequence用来生成单调的文件,文件又被业务方进行包装加上日期或用户标识,便于进行天然用户维度的分库分表。这样大范围推广mysql时,我们发现使用上不舒服的地方,如果想定制化递增的补偿等,相对于orcale或pg提供的sequence有一些不足,基于此,我们在mysql上移植sequence特性,希望在语法上兼容到其它相关数据库。

AliSQL开源功能特性

我们提供的语法基本和orcale类似,在获取maxvalue提供两个语法,一是select

from sequence,一是select for sequence,from子句希望兼容到现有mysql方法,for获取方法同时也兼容了sqlserver的方法,我们先行在这部分做了兼容和支持,现在alisql可以用select maxvalue for sequence获取下一个值,每一次都会迭代步长,如果用select

maxvalue from sequence,获得的是定义的数据,本身sequence在alisql中提供这样的语法,在设计阶段基于sequence engine实现语法,sequence本身设计是通过sequence handler来访问。数据存储是以一张二维表的方式,所有属性保存在一行上,sequeence初始化是,先创建一张表,再插入一条记录,如果在create sequence中设置了cache,我们会在sequence handler保留cache,从sequence获取nextvalue时,只需迭代cache里面的值就可以了,不需要访问sequence handler底层基表,每当迭代nextvalue会有cache用完时,会面临sequence的更新,select语句内部已经变成update语句,另外,sequence获取的值是不允许回滚的,所以我们开启了autonomous transaction,我们也将sequence的逻辑备份更改成create table+insert语法。

<b>tokudb</b><b>引擎支持</b><b></b>

AliSQL开源功能特性

tokudb引擎是在10月份版本释放出来的,在特定场景下可以有非常高的压缩比,有一些单机数据库在云上的客户,数据增长飞快,我们也希望在有限资源下尽量减少分库分表的需求,不断地压榨单机所能提供的资源;异步写、sata 盘亲合,吞吐量很高;事务 acid 完整支持,并没有牺牲任何事物特性;支持secondary clustering index,在innodb或其它树形结构上,对二级索引使用上,如果查询牵涉到二级索引以外的字段需要回表,如果主表与二级索引顺序反差比较大,回表就变成非常离散的图,为了减少离散图的情况,在tokudb树形结构上支持cluster。

<b>秒杀优化</b><b></b>

AliSQL开源功能特性

秒杀减库存并没有并行性可言(维护事务特性的情况下),10w的集中库存放到1s内减完是不现实的,应用服务器的反应是增加连接,大量的请求导致cpu无法调度,当数据库请求越来越慢时,应用服务器的线程会被耗尽,请求如果满足不了,会增加更多的数据库连接,这就是常说的雪崩效应,雪崩是没有办法缓解的,如图,当请求到2000量级时,数据库基本没有办法响应。针对这个情况,我们做了排队机制,当绵羊并发性可言时就不要消耗任何cpu等资源,在server上进行排队,排队只消耗内存,保证数据库请求到达率很高的情况下还有比较稳定的响应跟吞吐量。

<b>table/index</b>

statistics

AliSQL开源功能特性

我们还增加了一些统计信息:

table的统计:

核心业务的读写比例如何,后期的扩展性是读写分离,还是水平拆分哪个更适合,基于数据分析业务模型,在架构上做出数据库规划,在容量提升过程中是非常好的数据指导。

index的统计:

索引使用的频率和效率,哪些索引根本没有使用,

可以drop掉。

<b>persistent auto_increment</b>

在自增组件上,我们也做了feature,自增组件维持内存的值,获取值时会在内存中作计算,得到下一个值,插入时以此值插入到数据库当中。初始化过程是逻辑的初始化,数据库在这个表启动时初始化table对象时,从表中选择max id作为当前值,每次启动都会从表中获取当前最大值作为当前内存基准值使用,在历史数据归档导致数据冲突的背景下,我们提供了innodb_autoinc_persistent和innodb_autoinc_persistent_interval两个参数配置,每次变更的auto_increment进行一次持久化,持久化位置为root page page_max_trx_id官方保留位置,目前已经合并到mariadb。

<b>semisync</b><b>优化</b><b></b>

AliSQL开源功能特性

semisync希望在主备部署的过程中,如果主库提交时数据库写入日志能够传输到备库,传完返回ack在进行提交,保证主库数据的持久化及时传入到备库。我们做了semisync静态编译优化,也做了lock_log锁优化(lock_end_position)。

<b>表级别并行复制</b><b></b>

AliSQL开源功能特性

我们也在alisql开源了表级别的并行复制,对dba来说,备库delay是很困扰的问题,影响数据库安全和恢复时间等。我们在官方schema级别并行复制基础上,提供了table级别的并行复制,并不须要求是不同数据库,只要是不同的表,就可以做到并行复制。

<b>io</b><b>限速</b><b></b>

io限速提供了以下两个信息:

统计信息:logical_read、physical_sync_read和physical_async_read,可以对当前sql执行过程中产生多少读取、io操作和逻辑操作有比较直观的、可量化的信息;

sql 物理io限制:“set rds_sql_max_iops= 100;”,可以达到当前执行的100/s iops。

<b>动态加字段(</b><b>next release)</b>

AliSQL开源功能特性

我们希望在简单的加字段过程中做到动态的完成,通过变更innodb记录格式,在原本格式上增加了n_fields,n_fields代表记录中一共存储多少字段,通过这种方式加字段后,会发现每一条记录里可能的个数都不一样,所以我们加的每一个字段都是“非”,必须加在最后面,如果数据字典比记录fields值多,我们要填充len值,图中新的记录格式变更字段只需很少的时间,因为其中只需做数据字典结构的变更,数据本身不做任何迁移和变更。

alisql用户issue和典型问题

编译指南:现阶段不支持windows、不支持embeded,我们也提供了alisql

compiler guide,guide中详细介绍alisql在编译过程中需要的环境和参数。

参数优化:

AliSQL开源功能特性

我们给出了不同配置规格参数的样例供用户参考,其中有以前没有公开的,也是后面要逐步开放的。

秒杀使用指南:

AliSQL开源功能特性

针对特别的page,我们提供详细介绍和测试脚本供大家参考。