如何理解MySQL高可用数据库内核深度优化的四重定制

47次阅读
没有评论

共计 2648 个字符,预计需要花费 7 分钟才能阅读完成。

如何理解 MySQL 高可用数据库内核深度优化的四重定制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

近期我们的数据库团队对原生复制的多个方面进行了深度优化,提升了 UDB 高可用数据库的功能和性能。今天借社群这个平台,跟大家分享一二。

一、UDB 高可用数据库架构

UDB 以虚拟 IP、HAProxy、单节点 UDB 数据库搭建双节点高可用架构:

双节点的 UDB 数据库保证数据库数据的全量冗余,同时保证数据库的可用性;

HAProxy 在同一时间只连接一个 UDB 节点,避免多点写入带来的数据冲突问题;

双节点 HAProxy 保证 Proxy 的可用性;

虚拟 IP 在 HAProxy 发生宕机时通过 IP 漂移的方式对 HAProxy 进行切换,用户不需要再次修改 IP。

在上述架构中,从节点 UDB 的数据是否完整、是否与主库保证数据一致性是整个高可用架构的关键,所以用于数据传输的半同步复制起着至关重要的作用。针对原生的半同步复制,我们作了内核层面的深度优化。

二、UDB 数据库深度优化

UDB 是以开源数据库 MySQL Community Server 5.7.16 为基线版本,围绕高可用架构做内核深度优化。

复制流程,如上图所示,主要经过如下几个步骤:

MySQL Server 执行 SQL 成功后,记录 binlog;

Dump 线程读取 binlog 后,发送到从机 IO 线程;

IO 线程将接收到的 binlog 记录到 relay log 中,同时记录接收进度到 master.info 中;

SQL 读取 relay log 中的日志内容进行复现,同时记录复制日志的进度到 relay-log.info 中。

我们在原生复制的基础上做了内核的深度优化,针对上述流程中的部分步骤,在功能和性能上做了改进,使得 UDB 更加稳定。

1、Binlog 日志复制优化

存在的问题

原生半同步复制存在退化问题,在网络抖动导致超时或者从库追赶主库日志进度时,复制会由半同步复制退化为异步复制。

相比于可靠的半同步复制,异步复制过程中,从库是没有办法感知接收到 relay  log 与主库的 binlog 是否一致。如果发生宕机,也就没有办法确认从库数据是否与主库一致,是否可以发生数据库切换,这种不确定的情况是我们不希望看到的。

优化方案

建立双通道复制,在原有半同步复制的基础上增加一条 UDB 复制通道:

建立一条新的复制通道与原有的复制并行,两条通道互相独立;

新的复制通道不传输数据,只传输主库的 SQL 执行进度 (binlog 的文件名和位置);

新的复制通道使用半同步复制协议,但是不退化,超时后重连,只接收 *** 的 SQL 执行进度 ;

新的复制通道不存在追补数据的问题,只要网络正常的情况下,从库永远可以感知 SQL 的执行进度。

如上图所示,当从库发生宕机或者网络发生故障后,主从复制停止。当从库复制恢复正常后,原生复制通道通过异步复制的方式进行数据追补,UDB 复制通道只接收 *** 的 binlog 记录位置,这样可以 *** 限度地减少主从之间异步复制的时间。即在网络可连通的情况下,无论何时发生宕机,从库均知道与主库是否处于数据一致的状态(或者落后了多少)。

2、Relay log 文件记录的优化

存在的问题

在 MySQL 中,binlog 是以 event 为基本单位进行记录,以 MySQL 5.7  ROW 格式 (开启 GTID) 的 binlog 为例,一个 DML(insert)会以 5 个 event 的格式记录到 binlog 中(其他操作均以一个或者多个 event 组成,不再一一罗列),分别为:

GTID_EVENT:记录当前事务的 GTID

QUERY_EVENT:事务开始

TABLE_MAP_EVENT:操作对应的表

WRITE_ROW_EVENT:插入记录

XID_EVENT:提交事务

全部 event 组成一个完整的事务,完整的事务才会被 SQL 线程正确复现到从库上。当前 IO 线程接收 binlog 时,是以 event 为单位进行接收,即接收到一个 event,记录到 relay  log 中后再继续接收下一个。这种做法是低效的,也没有充分利用到 MySQL 本身的文件缓存。

优化方案

优化 IO 线程记录 relay log 的方式,将以 event 为单位记录,修改为以事务为单位进行记录。合并 IO 线程小的 IO 操作,提高 IO 性能。

将单个的 event 写操作合并为多个 event 统一写操作,将小的 IO 操作合并成较大的 IO 操作,提高 IO 性能。

3、Master.info 文件记录的优化

存在的问题

Master.info 文件在搭建复制时,记录主库 IP、PORT 等连接主库的相关信息,在复制过程中,记录 IO 线程从主库接收到的 binlog 的文件名和位置,文件和位置会在每次记录 relay  log 成功后更新。

在基于 GTID 搭建复制后,master.info 中记录的 binlog 文件和位置不再作为复制的依据,所以 master.info 中记录的 binlog 的文件和位置不再是有效的数据,也就没有必要每次进行更新。

优化方案

在 IO 线程记录 relay  log 成功后,更新 master.info 文件之前,添加判断。如果开启了 GTID 并且使用 GTID 作为复制的依据(auto_position=1),那么不再更新 master.info 中 binlog 的文件和位置。

其它的 master.info 操作仍然保留,如 change master、shutdown 等操作。

4、Relay log 锁的优化

存在的问题

在 IO 线程和 SQL 线程复制进度相似的情况下,在操作 relay  log 时,会使用同一块文件缓存,在读写文件缓存时,需要加锁来保证操作的正确性。而 IO 线程和 SQL 线程需要频繁地读写这块公共内存,就需要对同一把锁频繁的竞争,从而导致性能下降。

优化方案

将 IO 线程和 SQL 线程对 relay  log 的操作拆分开来,不再使用同一块文件缓存。虽然这样做会导致 SQL 线程增加一次读 IO 操作。但是消除了对锁的竞争,大大地提高了 IO 线程和 SQL 线程整体的性能。

三、总结

优化后的复制流程图如下:

数据库原生复制流程中包括记录 binlog、记录 relay  log、记录 master.info、relay-log.info 等,针对上述流程中的部分步骤以及其它未列出的优化,在功能和性能上进行改进,UDB 高可用数据库在功能和性能上均得到了明显的提升。

看完上述内容,你们掌握如何理解 MySQL 高可用数据库内核深度优化的四重定制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2648字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)