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的写入表空间操作,本质上是同步写

调用栈:

1 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,同步写

调用栈:

1 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)

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

调用栈:

1 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的表空间写入操作。

 1 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

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

逻辑预读调用栈:

1 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)

线性预读调用栈:

1 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

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

1 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.2 drop table

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

1 ha_innobase::delete_table → row_drop_table_for_mysql → row_drop_single_table_tablespace → fil_delete_tablespace → unlink
3.3 rename table

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

1 ha_innobase::rename_table → row_rename_table_for_mysql → row_rename_table_for_mysql → dict_table_rename_in_cache→ fil_rename_tablespace → rename
3.4 truncate table

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

1 ha_innobase::truncate → row_truncate_table_for_mysql → row_truncate_complete → truncate_t::truncate → os_file_truncate_posix → ftruncate
3.5 extend  tablespace

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

1 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

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

4.1 文件元数据操作

1 open(const char *__file, int __oflag, …)
2 close (int __fd);
3 rename (const char *__old, const char *__new)
4 fcntl(int __fd, int __cmd, ...)
5 unlink(const char *__name)
6 mkdir(const char *__path)
7 rmdir(const char *__path)
8 ftruncate(int __fd, __off64_t __length)
9 posix_fallocate(int __fd, __off64_t __offset,__off64_t __len)

4.2 同步IO接口

1 lseek(int __fd, __off64_t __offset, int __whence)
2 read(int __fd, void *__buf, size_t __nbytes)
3 write(int __fd, const void *__buf, size_t __n)
4 pread(int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
5 pwrite(int __fd, const void *__buf, size_t __nbytes, __off64_t __offset)
6 fsync(int __fd)

4.3 异步IO接口

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

4.4 挂载

mount
umount

mysql对存储分布式文件系统的存储需求总结相关推荐

  1. CLUSTER 05: 块存储应用案例 分布式文件系统 对象存储

    一.块存储应用案例 目的: KVM虚拟机调用Ceph镜像作为虚拟机的磁盘. 1.1 准备实验环境 1.1.1 创建磁盘镜像 •  为虚拟机创建磁盘镜像 [root@node1    ~]#    rb ...

  2. 云存储及其分布式文件系统

    转自: https://www.cnblogs.com/langren1992/p/5432517.html 随着信息化程度的不断提高,全球数据日益膨胀.面对当前PB级的海量数据存储需求,传统的存储系 ...

  3. 小滴课堂-项目大课学习笔记(2)海量数据存储-分布式文件存储系统

    在了解分布式文件存储之前,我们可以先来了解一下什么是分布式存储,分布式存储的系统又分为哪些 什么是分布式存储 在近些年来,随着各大的互联网公司的大数据应用的崛起,分布式系统被广泛的投入到实践当中.互联 ...

  4. 搭建自己的云存储空间|FastDFS分布式文件系统考虑一下?

    一. 前言 最近有很多小伙伴问壹哥,大规模的文件存储该怎么做? 这个感觉很难实现呢.其实这个需求,并没有大家想的那么难以实现.今天壹哥就带着各位,用10分钟的时间来搞定这个需求.不信?那你就跟着壹哥一 ...

  5. 分布式文件系统(GFS和HDFS)概述

    目录 背景意义 分布式存储相关概念 分布式存储系统的分类 复制副本 CAP理论 一致性 GFS架构 租约(lease)和变更顺序 容错机制 前言 因为我研一下学期有一门分布式的课,老师要求我们选择一个 ...

  6. 分布式文件系统KFS基础知识介绍

    Kosmos distributed file system,简称KFS,是一个类GFS的分布式文件系统,被设计用于分布式的结构化存储.下面将对KFS的体系结构进行简单介绍,最后给出一个使用KFS C ...

  7. 0.HDFS分布式文件系统

    HDFS分布式文件系统 1. Hadoop是什么(20分钟) 1.1 Hadoop架构 HDFS (Hadoop Distributed File System)文件系统:存文件读文件的一个系统 Ha ...

  8. PolarFS :一个用于共享存储云数据库的超低延迟和容错分布式文件系统

    目录 1. 简介 2. 背景 3. 架构 4. I/O 执行模型 5. 一致性模型 6. FS中层的实现 7. 设计选择和经验教训 8. 价值评估 9. 相关工作 10. 结论 PolarFS : A ...

  9. 分布式存储--理解分布式文件系统、分布式块存储、分布式对象存储、分布式数据库

    1. 单机文件系统 vs 分布式文件系统 传统单机文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式.在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化: ...

最新文章

  1. 比特币现金支付接入日本便利店
  2. 转:在windows通过Xrdp软件远程桌面连接Fedora
  3. Python运算符和编码
  4. ROS-Rtabmap:linux shell运行多个shell(运行多个程序)
  5. Spring系列教程八: Spring实现事务的两种方式
  6. PAT_B_1065_Java(17分)_C++(25分)
  7. 阿里巴巴后台的使用体验
  8. java list 截取_Java常用代码汇总,建议背会
  9. Antd Mobile Design输入框组件InputItem错误显示方式封装
  10. Windows环境下使用CMake编译OpenCV3.0和OpenCV_contrib
  11. ArcGIS 创建格网与图斑数据叠加;频数统计与面积比例计算
  12. 2021-06-18 链接标签
  13. QT虚拟小键盘设计--qt事件循环,事件发送的理解
  14. 华硕笔记本返厂维修流程_笔记本不能更换显卡为何又叫独立显卡?
  15. StudentManagerSystem(学生管理系统)(利用Result类,各种工具类)
  16. 更换新电池对iPhone手机性能的影响实测
  17. 下载文件时设置文件名的方法
  18. 领导者应该具备的基本素质
  19. esp8266-01s介绍与使用
  20. 小程序嵌入web-view网页后,点击网页中的按钮跳转回小程序

热门文章

  1. 汇编语言 王爽 第四版 前两章学习心得
  2. 指标公式c语言源码下载,通达信超赢天下指标公式源码(通达信)
  3. 数控机床传动装置机械及PLC电气控制系统设计
  4. 全网优秀的攻防渗透工具总结
  5. 交换机端口扫描工具小课堂
  6. 管家婆进销存创业板3.0.1.33
  7. 【技术分享】数据之道 笃行拓新
  8. Markdown编辑器模式使用LaTex编辑数学公式入门
  9. optisystem软件配合matlab出图快速保存实验图
  10. 桶内蓝色红色颜料比例