MySQL · 功能介绍 · binlog拉取速度的控制

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: binlog拉取存在的问题 MySQL 主备之间数据同步是通过binlog进行的,当主库更新产生binlog时,备库需要同步主库的数据,通过binlog协议从主库拉取binlog进行数据同步,以达到主备数据一致性的目的。但当主库tps较高时会产生大量的binlog,以致备库拉取主库产生的binlo

binlog拉取存在的问题

MySQL 主备之间数据同步是通过binlog进行的,当主库更新产生binlog时,备库需要同步主库的数据,通过binlog协议从主库拉取binlog进行数据同步,以达到主备数据一致性的目的。但当主库tps较高时会产生大量的binlog,以致备库拉取主库产生的binlog时占用较多的网络带宽,引起以下问题:

  1. 在MySQL中,写入与读取binlog使用的是同一把锁(Lock_log),频繁的读取binlog,会加剧Lock_log冲突,影响主库执行,进而造成TPS降低或抖动;
  2. 当备库数量较多时,备库拉取binlog会占用过多的带宽,影响应用的响应时间。

为了解决上面提到的问题,需要对binlog的拉取速度进行限制。

问题存在的原因

备库或应用通过binlog协议向主库发送消息,告诉主库要拉取binlog,主库经过权限认证后,以binlog_event为单位读取在本地的binlog,然后将这些binlog_event发送给应用,其过程简单描述如下:

  1. 从mysql-bin.index中找到用户消息中的指定文件,如果没有指定要拉取的binlog文件名称,则用第一个;
  2. 上Lock_log锁,从1)或4) 中的binlog file中读取一个binlog_event,释放Lock_log锁,判断binlog_event的类型;
  3. 如果是普通binlog_event,则将binlog_event发送到net 缓冲区;
  4. 如果是Rotate_log_event,则取出要Rotate到的文件,执行2);
  5. 如果当前读的文件是最后一个文件且已经读到了文件的结尾,则会释放Lock_log锁,并等待新的Log_event信号。

从以上过程可以看出,binlog的发送速度和IO、网络有很大的关系,只要这三者不受限制,程序会就尽力发送binlog而没有限制。

解决问题的方法

由3、4可以看出,程序在读取和发送之间是没有其它工作的,如果IO很强,读取的速度很快,那么binlog的发送速度就会很快且不受限制,进而造成本文开始所描述的问题;针对binlog发送速度的问题,rds_mysql 通过设置binlog发送线程的发送频率、休眠时间来调整binlog的发送速度,因此 rds_mysql 引入了两个新的参数:
1. binlog_send_idle_period binlog发送线程的每次休眠时间,单位微秒,默认值100;
2. binlog_send_limit_users binlog发送线程的速度配置,默认值”“。

举例如下:
set global binlog_send_limit_users=”rep1:3,rep2:10” 的作用是设置rep1拉取binlog的上限速度是3M/s, rep2拉取binlog的上限速度是10M/s,其中rep2、rep2指的是应用连接的用户名,对于binlog的拉取速度控制主要分为两个方面:

binlog 发送速度监控线程

速度监控线程随着mysqld的启动而启动,用于定时扫描限速列表,计算列表中的每一个binlog dump线程的binlog发送速度,并根据计算的速度调整binlog的发送频率,其工作过程描述如下:

  1. 速度监控线程随着mysqld的启动而启动,并初始化限速列表;
  2. 对限速列表进行依次扫描,如果取到的线程不为空,转2);
  3. 计算当前线程的发送速度,与用户设定的速度进行比较,大于设定的发送速度,转3),如果小于用户设定的发送速度,则转4)
  4. 通过调整当前线程的net_thread_frequency 成员,降低发送频率;
  5. 通过调整当前线程的net_thread_frequency 成员,增加发送频率;
  6. 遍历完限速列表后让出CPU 1毫秒,转1)

由以上描述可以看出,监控线程每毫秒执行一次,根据发送的字节数来计算binlog发送线程的发送速度是否超过设定的速度,并通过调整发送频率来调整binlog的发送速度,监控线程的限速列表是这样构造的:

  1. binlog dump 线程在拉取binlog前会先根据连接的用户名判断是否应该对该用户限速,如果需要限速,则需要将当前dump线程加入限速列表;
  2. 当binlog dump结束或断开连接时,从限速列表移除;
  3. 当设置参数binlog_send_limit_users时,会对当前所有线程进行遍历,将被限制的用户加入限速列表,对不受限制的用户移出限制列表,所有受影响的线程不需要重新连接,可以实时生效。

binlog dump 线程

dump 线程用于发送binlog,在发送过程中会根据监控线程设置的发送频率来调整binlog发送的速度,可以分为以下几步:
1. binlog dump 线程在拉取binlog前会先根据连接的用户名判断是否将本用户的线程加入限速列表;
2. 读取binlog,并查看是否需要休眠,需要休眠转3),否则转4);
3. 休眠binlog_send_idle_period;
4. 发送读取到的binlog event,转2。

因此可以通过设置binlog的发送频率及休眠时间精确调整binlog的发送速度

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
484 4
|
3月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
286 2
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
3月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
2天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
6 0
|
2月前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
209 11
|
9天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
12 0
|
3月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
50 3
|
16天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
50 3
Mysql(4)—数据库索引
|
1天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
17 2

相关产品

  • 云数据库 RDS MySQL 版