1. 引言

  云原生数据库跟分布式mpp数据库是有差异的,虽然两者都是计算与存储分离,但是在资源的占用上有所不同。云原生数据库是shard everything架构,其依赖的存储资源、内存资源、事务资源在云中都是共享、弹性伸缩的。由分布式文件系统提供按需分配、租户隔离的块存储,由分布式内存池提供buffer pool占用的大块内存。分布式mpp数据库则是shard nothing架构,其依赖的存储资源、内存资源、事务资源是单个物理节点上的资源,在SQL计算层进行了分布式计算逻辑的分发。

  本文重点介绍共享存储,如果分布式文件系统的iops、每秒刷盘数能够比单个物理节点上的性能线性提升,那么云原生数据库mysql的tps也会随之提升,而且mysql的原生SQL语法都是支持的,包括嵌套子查询、存储过程、函数等。分布式mpp在SQL计算层做分布式计算逻辑的分发,这些可能会被裁减掉。

  单机mysql的事务型存储引擎innodb的表空间数据存储依赖于单个linux节点的VFS提供的posix标准的文件操作接口。VFS作为各个具体文件系统(ext4、xfs、ext3等)的抽象层,屏蔽了各个具体文件系统的实现差异,对应用层提供了统一、标准的posix文件操作接口。类似于阿里云的polardb对polarfs的依赖,其实polardb就是mysql的内核源码的二次开发而成的。本文重点罗列云原生数据库mysql在各个场景下对posix文件操作接口需求。

  分布式弹性文件系统要具体地实现这些接口,各个接口的语义要完全符合posix标准。并提供mount挂载的功能,将其实现的具体接口注册到VFS内部,mysql将表空间放置到挂载了分布式弹性文件系统的路径下,innodb内部对表空间文件操作时候,实际上就调用了分布式文件系统提供的文件操作的api。

  innodb的表空间有用户表空间、系统表空间、Redo日志、Undo表空间。本文重点分析用户表空间对文件操作接口的需求,应该也涵盖了其余的表空间对文件操作接口的需求。

用户对用户表空间的操作主要有两类,一类是表空间数据的读写,另一类是表空间DDL操作,对应到posix标准的文件操作接口,一类是文件数据读写IO,另一类是文件的元数据操作。

2. 表空间数据的读写操作

2.1 同步IO

  同步IO会阻塞调用线程,直到IO完成,调用线程才返回,pwrite/pread函数是线程安全的同步IO,lseek+read/write函数非线程安全,需要加互斥锁,并发量大的时候,对性能有一定的影响。以下几种场景下,会使用同步IO。

场景一. linux不支持native aio, Page cleaner线程刷脏,同步写

  从buffer pool中刷脏页时候,如果不支持native aio,则通过simulated aio模拟异步写进行dirty page的写入表空间操作,本质上是同步写

  调用栈:

 buf_flush_page_cleaner_worker → pc_flush_slot → buf_flush_do_batch →  buf_do_flush_list_batch → buf_flush_page_and_try_neighbors → buf_flush_try_neighbors → buf_flush_page  → buf_flush_write_block_low → fil_io(sync=false) → os_aio → os_aio_func →AIO::wake_simulated_handler_thread

场景二. 刷脏时,如果double write buffer写满,将double write buffer中数据写入系统表空间ibdata文件,同步写

  调用栈:

buf_flush_page → buf_dblwr_flush_buffered_writes → fil_io(sync=true) 

场景三. 事务buffer中数据写入Redo log file,同步写

  调用栈:

 innobase_commit_low → trx_commit_for_mysql → trx_commit → trx_commit_in_memory → trx_flush_log_if_needed_low → log_write_up_to → log_group_write_buf → log_group_write_buf → fil_io(sync=true) 

场景四,用户线程触发的数据块请求读写,同步读写

  调用栈:

 ha_innobase::index_read → row_search_mvcc →  row_sel_get_clust_rec_for_mysql→  buf_page_get_gen → buf_read_page → buf_read_page_low → fil_io(sync=true)

2.2异步IO

  异步IO不会阻塞调用线程,提交IO请求后,调用线程就返回,可以做其余的操作,后台线程会轮询IO的完成情况,如果执行完成可以调用相关的回调函数。

在支持native aio的情况下,innodb的后台 Page cleaner线程刷脏,预读走的就是异步IO流程,主要以下两个场景。

场景一. linux支持native aio ,Page cleaner线程刷脏,异步写

  从buffer pool中刷脏页时候,如果支持native aio,则通过 io_submit异步io接口进行dirty page的表空间写入操作。

 buf_flush_page_cleaner_worker → pc_flush_slot → buf_flush_do_batch →  buf_do_flush_list_batch → buf_flush_page_and_try_neighbors → buf_flush_try_neighbors →buf_flush_page  → buf_flush_write_block_low → fil_io(sync=false)→ os_aio → os_aio_func → AIO::linux_dispatch  →  io_submit

场景二. 线性或者逻辑预读,异步读

逻辑预读调用栈:

 ha_innobase::index_read → row_search_mvcc → row_sel_get_clust_rec_for_mysql → buf_page_get_gen → buf_read_ahead_random → fil_io(sync=false)

线性预读调用栈:

 ha_innobase::index_read → row_search_mvcc → row_sel_get_clust_rec_for_mysql → buf_page_get_gen → buf_read_ahead_linear→ fil_io(sync=false)

2.3 刷盘

如果innodb_flush_method设置了O_DSYNC,日志文件(ib_logfileXXX)使用O_SYNC打开,因此写完数据不需要调用函数fsync刷盘,数据文件(ibd)使用default模式打开,因此写完数据需要调用fsync刷盘。

如果innodb_flush_method设置了fsync或者不设置,数据文件和日志文件都使用default模式打开,写完数据都需要使用fsync来刷盘。

如果innodb_flush_method设置了O_DIRECT,日志文件(ib_logfileXXX)使用default模式打开,写完数据需要调用fsync函数刷盘,数据文件(ibd)使用O_DIRECT模式打开,写完数据需要调用fsync刷盘。

如果innodb_flush_method设置为O_DIRECT_NO_FSYNC,文件打开方式与O_DIRECT模式类似,区别是,数据文件写完后,不调用fsync来刷盘,主要针对O_DIRECT能保证文件的元数据也落盘的FS

如果使用linux native aio,innodb_flush_method一定要配置成O_DIRECT,否则会退化成同步IO。

3. 表空间DDL操作

3.1 create table

创建表时候调用,调用流程如下:

ha_innobase::create → dict_build_tablespace_for_table → fil_idb_create

依次依赖于 os_file_create 、os_file_flush、os_file_set_size、os_file_close、os_file_delete, 这些函数依次依赖于open\ fsync\lseek\close\unlink posix文件标准接口。

3.1 drop table

删除表的时候调用,调用栈如下。

ha_innobase::delete_table → row_drop_table_for_mysql → row_drop_single_table_tablespace → fil_delete_tablespace → unlink

3.2 rename table

重命名表的时候调用,调用栈如下。

ha_innobase::rename_table → row_rename_table_for_mysql → row_rename_table_for_mysql → dict_table_rename_in_cache→ fil_rename_tablespace → rename

3.3 truncate table

截断表时候调用,默认表空间截留4个page的大小。调用栈如下。

ha_innobase::truncate → row_truncate_table_for_mysql → row_truncate_complete → truncate_t::truncate → os_file_truncate_posix → ftruncate

3.4 extend  tablespace

innodb表空间文件大小是动态扩展的,如果表空间中的数据页不够,则需要对表空间文件进行预扩展,比如往聚集索引中大量插入数据的时候。调用栈如下

row_ins_clust_index_entry_low → btr_cur_pessimistic_insert → fsp_try_extend_data_file → fsp_try_extend_data_file → fil_space_extend → posix_fallocate

4.posix标准的文件操作接口列表

4.1 文件元数据操作

 open(const char *__file, int __oflag, …)
close (int __fd);
rename (const char *__old, const char *__new)
fcntl(int __fd, int __cmd, ...)
unlink(const char *__name)
mkdir(const char *__path)
rmdir(const char *__path)
ftruncate(int __fd, __off64_t __length)
posix_fallocate(int __fd, __off64_t __offset,__off64_t __len)

4.2 同步IO接口

 lseek(int __fd, __off64_t __offset, int __whence)
read(int __fd, void *__buf, size_t __nbytes)
write(int __fd, const void *__buf, size_t __n)
pread(int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
pwrite(int __fd, const void *__buf, size_t __nbytes, __off64_t __offset)
fsync(int __fd)

4.3 异步IO接口

 io_setup(int maxevents, io_context_t *ctxp);
io_destroy(io_context_t ctx);
io_submit(io_context_t ctx, long nr, struct iocb *ios[]);
io_cancel(io_context_t ctx, struct iocb *iocb, struct io_event *evt);
io_getevents(io_context_t ctx, long min_nr, long nr, struct io_event *events, struct timespec *timeout);

4.4 挂载

mount
umount

4.5 杂项

其余文件属性、权限类的操作,就不一一列举了。

云原生数据库mysql对共享存储分布式文件系统的接口需求分析的更多相关文章

  1. 云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析

    POLARDB是阿里巴巴自主研发的云原生关系型数据库,目前兼容三种数据库引擎:MySQL.PostgreSQL.Oracle.POLARDB的计算能力最高可扩展至1000核以上,存储容量可达100TB ...

  2. 比MySQL快6倍 深度解析国内首个云原生数据库POLARDB的“王者荣耀”

    随着移动互联网.电子商务的高速发展,被使用最多的企业级开源数据系统MySQL面临着巨大挑战——为迎接“双11"的高并发要提前做好分库分表;用户不断激增要将读写分离才能应对每天上亿次的访问,但 ...

  3. 为什么CynosDB叫真正的云原生数据库?

    本文由腾讯云数据库发表 注:本文摘自2018年11月22日腾讯云数据库CynosDB新品发布会的演讲实录.随着互联网信息的发展,大家也对云这个词汇也不是特别陌生了,作为全球首选的云服务厂商之一的腾讯云 ...

  4. 深度解析国内首个云原生数据库POLARDB的“王者荣耀”

    随着移动互联网.电子商务的高速发展,被使用最多的企业级开源数据系统MySQL面临着巨大挑战--为迎接"双11"的高并发要提前做好分库分表;用户不断激增要将读写分离才能应对每天上亿次 ...

  5. 又拿奖了!腾讯云原生数据库TDSQL-C斩获2021PostgreSQL中国最佳数据库产品奖

    日前,开源技术盛会PostgresConf.CN & PGconf.Asia2021大会(简称2021 PG亚洲大会)在线上隆重召开,腾讯云作为业内领先的云数据库服务商受邀出席,多位专家深入数 ...

  6. 腾讯云原生数据库TDSQL-C架构探索和实践

    作为云原生技术先驱,腾讯云数据库内核团队致力于不断提升产品的可用性.可靠性.性能和可扩展性,为用户提供更加极致的体验.为帮助用户了解极致体验背后的关键技术点,本期带来腾讯云数据库专家工程师王鲁俊给大家 ...

  7. 云原生数据库 TDSQL-C 产品概述、产品优势、应用场景

    云原生数据库 TDSQL-C(Cloud Native Database TDSQL-C,TDSQL-C)是腾讯云自研的新一代高性能高可用的企业级分布式云数据库.融合了传统数据库.云计算与新硬件技术的 ...

  8. 腾讯云原生数据库TDSQL-C入选信通院《云原生产品目录》

    近日,中国信通院.云计算开源产业联盟正式对外发布<云原生产品目录>,腾讯云原生数据库TDSQL-C凭借其超强性能.极致效率的弹性伸缩和完善的产品化解决方案体系,成功入围目录. 全球数字经济 ...

  9. 云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果!

    第六届世界互联网大会来了!千年水乡古镇乌镇又一次吸引了全世界的目光. 刚刚,阿里云自研数据库POLARDB在会上当选世界互联网领先科技成果.POLARDB解决了企业在云时代的数据库难题,帮助企业在数小 ...

随机推荐

  1. 3dTiles 数据规范详解[4.2] i3dm瓦片二进制数据文件结构

    i3dm,即 Instanced 3D Model,实例三维模型的意思. 诸如树木.路灯.路边的垃圾桶.长椅等具有明显 重复 特征的数据.这类数据用得较少(笑,现在都喜欢搞BIM.倾斜摄影.精模.白模 ...

  2. GitHub 热点速览 Vol.28:有品位程序员的自我修养

    作者:HelloGitHub-小鱼干 摘要:一个程序员除了技术好,还得品位高,有什么比一个高颜值的 GUI 更能体现你品味的呢?rocketredis 就是一个高颜值.简约的 Redis 管理界面,比 ...

  3. java实现判断时间是否为合法时间

    最近遇到一个需求,输入字符串,判断为日期的话再进行后面的比较大小之类的操作,但是合法日期的格式也是比较多的,利用正则表达式又太长了.所以后面利用的方法就是,先把输入的字符串转成一种固定的时间格式,然后 ...

  4. Go Pentester - HTTP CLIENTS(1)

    Building HTTP Clients that interact with a variety of security tools and resources. Basic Preparatio ...

  5. Ethical Hacking - Web Penetration Testing(11)

    SQL INJECTION Preventing SQLi Filters can be bypassed. Use a blacklist of commands? Still can be byp ...

  6. 洛谷P1063.能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  7. 题解 洛谷 P4694 【[PA2013]Raper】

    首先考虑题目的性质,不难发现光盘的花费是一个凸函数.当生产 \(0\) 张光盘时,其花费为 \(0\),随着光盘生产数的增加,最优情况肯定是先选择工厂便宜的时刻,所以花费会增长越来越快,因此其为一个下 ...

  8. I 2 C、 SPI、 USB驱动架构

    根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...

  9. MySQL之字段数据类型和列属性

    数据类型: 对数据进行统一的分类,从系统的角度出发,为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中将数据类型分成了三大类:数值类型.字符串类型.时间日期类型. 数值型: 数值型数据: ...

  10. 开源项目推荐 - 巨鲸任务调度平台(Spark、Flink)

    Big Whale(巨鲸),为美柚大数据研发的大数据任务调度平台,提供Spark.Flink等离线任务的调度(支持任务间的依赖调度)以及实时任务的监控,并具有批次积压告警.任务异常重启.重复应用监测. ...