MySQL Binlog存储系统的架构如何设计

  1. kingbus简介

  1.1 kingbus是什么?

  kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统。它能够充当一个MySQL Slave从真正的Master上同步binlog,并存储在分布式集群中。同时又充当一个MySQL Master将集群中的binlog 同步给其他Slave。 kingbus具有如下特性:

  兼容MySQL 复制协议,通过Gtid方式同步Master上的binlog,同时支持slave通过Gtid方式从kingbus拉取binlog。

  跨地域数据复制,kingbus通过raft协议支持跨地域间的数据复制。写入到集群的binlog数据在多个节点间保证强一致,并保证binlog顺序与master上完全一致。

  高可用,由于kingbus是构建在Raft强一致协议之上,能够实现集群中过半数节点存活的情况下,整个binlog拉取和推送服务高可用。

  1.2 kingbus能解决什么问题?

  kingbus能降低Master的网络传输流量。在一主多从的复制拓扑中,Master需要发送binlog到各个slave,如果slave过多的话,网络流量很有可能达到Master的网卡上限。例如在Master执行delete大表或者online DDL等操作,都有可能造成瞬间生成大量的binlog event,如果master下面挂10台slave的话,master上的网卡流量就会放大10倍。如果master使用千兆网卡,产生了10MB/S以上的流量就有可能将其网卡跑满。通过kingbus连接master的方式,可以将slave分散到多台机器上,从而均衡传输流量。

  简化Master Failover流程,只需将连接在kingbus上的一台Slave提升为Master,并将kingbus重新指向新的Master,其他slave依旧连接在kingbus上,复制拓扑保持不变。

  节省Master存储binlog文件的空间。一般MySQL上都是较为昂贵的SSD,如果binlog文件占用空间较多,就使得MySQL存储的数据不得不降低。可以通过将binlog都存储到kingbus中,从而降低Master上binlog文件的存储数量

  支持异构复制。通过阿里巴巴开源的canal连接到kingbus,kingbus源源不断推送binlog给canal,canal接收完binlog再推送给kafka消息队列,最终存入HBase里,业务部门通过Hive直接写SQL的方式来实现业务的实时分析。

  2.kingbus总体架构

  kingbus整体架构如下图所示:

  storage负责存储raft log entry和Metadata,在kingbus中,将raft log和mysql binlog融合在一起了,通过不同的头部信息区分,raft log的数据部分就是binlog event,这样就不需要分开存储两类log,节省存储空间。因为kingbus需要存储一些元信息,例如raft 节点投票信息、某些特殊binlog event的具体内容(FORMAT_DESCRIPTION_EVENT)。

  raft复制kingbus集群的Lead选举、日志复制等功能,使用的是etcd raft library。

  binlog syncer,只运行在Raft集群的Lead节点上,整个集群只有一个syncer。syncer伪装成一个slave,向Master建立主从复制连接,Master会根据syncer发送的executed_gtid_set过滤syncer已经接受的binlog event,只发送syncer没有接收过的binlog event,这套复制协议完全兼容MySQL 主从复制机制。syncer收到binlog event后,会根据binlog event类型做一些处理,然后将binlog event封装成一个消息提交到raft 集群中。通过raft算法,这个binlog event就可以在多个节点存储,并达到强一致的效果。

  binlog server,就是一个实现了复制协议的Master,真正的slave可以连接到binlog server监听的端口,binlog server会将binlog event发送给slave,整个发送binlog event的过程参照MySQL 复制协议实现。当没有binlog event发送给slave时,binlog server会定期发送heartbeat event给slave,保活复制连接。

  api server,负责整个kingbus集群的管理,包括以下内容:

  raft cluster membership操作,查看集群状态,添加一个节点、移除一个节点,更新节点信息等

  binlog syncer相关操作,启动一个binlog syncer,停止binlog syncer,查看binlog syncer状态。

  binlog server相关操作,启动一个binlog server,停止binlog server,查看binlog server状态。 server层的各种异常,都不会影响到raft层,server可以理解为一种插件,按需启动和停止。以后扩展kingbus时,只需要实现相关逻辑的server就行。例如实现一个kafka协议的server,那么就可以通过kafka client消费kingbus中的消息。

  3.kingbus核心实现

  3.1 storage的核心实现

  storage中有两种日志形态,一种是raft日志(以下称为raft log),由raft算法产生和使用,另一种是用户形态的Log(也就是mysql binlog event)。Storage在设计中,将两种Log形态组合成一个Log Entry。只是通过不同的头部信息来区分。Storage由数据文件和索引文件组成,如下图所示:

  segment固定大小(1GB),只能追加写入,名字为first_raft_index-last_raft_index,表示该segment的raft index范围。

  只有最后一个segment可写,其文件名为first_raft_index-inprogress,其他segment只读。

  只读的segment和对应的index file都是通过mmap方式写入和读取。

  最后一个segment的index 内容同时存储在磁盘和内存。读取索引是只需要在内存中读取。

  3.2 etcd raft库的使用

  Etcd raft library在处理已经Apply的日志、committed entries等内容时,是单线程处理的。具体函数参考链接,这个函数处理时间要确保尽可能短,如果处理时间超过raft 选举时间,会造成集群重新选举。这一点需要特别注意。

  3.3 binlog syncer的核心实现

  binlog syncer主要工作就是:

  拉取binlog event

  解析并处理binlog event

  提交binlog event到raft 集群。 很明显可以通过pipeline机制来提个整个过程的处理速度,每个阶段kingbus都使用单独的goroutine来处理,通过管道来衔接不同阶段。 由于binlog syncer是按照binlog event一个一个接收的,syncer并不能保证事务完整性,有可能在syncer挂了后,需要重新连接Master,这时候最后一个事务有可能不完整,binlog syncer需要有发现事务完整性的能力,kingbus实现了事务完整性解析的功能,完全参考MySQL源码实现。

  3.4 binlog server的核心实现

  binlog server实现了一个master的功能,slave与binlog server建立复制连接时,slave会发送相关命令,binlog server需要响应这些命令。最终发送binlog event给slave。对于每个slave,binlog server会启动一个goroutine不断读取raft log,并去掉相关头部信息,就变成了binlog event,然后再发送给slave。

以上就是MySQL Binlog存储系统的架构如何设计的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/261423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 09:10:46
下一篇 2025年11月4日 09:14:51

相关推荐

  • php源码怎么安装_用PHP环境安装源码步骤教程【教程】

    首先检查并搭建PHP运行环境,安装XAMPP等集成环境,启动Apache和MySQL服务,将源码放入htdocs或www目录,通过localhost访问项目;接着配置数据库连接信息,修改config.php等文件中的数据库参数,创建数据库并导入SQL文件;然后设置文件权限,确保uploads、cac…

    2025年12月13日
    000
  • ZKTeco考勤数据集成至Google Sheets或在线服务器实战教程

    本教程详细介绍了如何将ZKTeco考勤机(如K40、F18)的考勤数据集成到Google Sheets或自定义在线服务器。通过开发中间程序获取设备数据,并在服务器端进行处理,最终利用Google Apps Script的UrlFetch服务将JSON数据导入Google Sheets,有效解决了考勤…

    2025年12月13日
    000
  • SQL与PHP实现课程学生并发量精确统计教程

    本教程详细阐述了在mysql 5.6和php 7.2环境下,如何精确统计指定课程在特定日期范围内的学生并发量。针对传统查询无法准确处理日期区间重叠的问题,文章提出并演示了利用“日历表”结合sql聚合函数,有效计算每日活跃学生数,并从中找出指定时间段内的最大并发峰值,确保统计结果的准确性与可靠性。 挑…

    2025年12月13日
    000
  • PHP PDO实现用户密码条件更新:当输入为空时不修改密码

    本教程详细阐述了在php pdo应用中,如何实现用户密码的条件式更新。当用户在更新表单中未输入新密码时,系统将保留数据库中已有的密码,避免不必要的修改。文章通过优化sql的`if`语句,结合php的输入处理和安全实践,提供了一个健壮且高效的解决方案,同时纠正了常见的语法错误,确保数据更新的灵活性和准…

    2025年12月13日
    000
  • 怎么测试php源码_用PHP环境测试源码功能教程【教程】

    验证PHP源码功能需四步:一、用XAMPP/WAMP搭建本地环境,启动Apache后通过http://localhost访问;二、使用3v4l.org等在线平台粘贴代码运行;三、在VS Code中配置PHP插件与launch.json进行断点调试;四、命令行输入php 文件名.php直接执行。 如果…

    2025年12月13日
    000
  • PHP PDO 条件更新密码字段的教程

    本教程详细阐述了在php pdo应用中,如何实现用户密码的条件更新。当用户在表单中未输入新密码时,系统应保留数据库中现有密码;反之,若输入了新密码,则进行更新并安全地哈希。文章将重点介绍使用sql的`if`函数来处理这种条件逻辑,并纠正常见的sql语法错误,确保数据更新的准确性和安全性,同时强调使用…

    2025年12月13日
    000
  • PHP与MySQL:在单个表单中批量更新多条数据库记录的策略

    本教程探讨如何在包含循环生成的多组输入字段的单个HTML表单中,实现对MySQL数据库多条记录的批量更新。针对输入字段名称重复导致数据覆盖的问题,文章详细介绍了使用数组命名输入字段(`name=”field[]”`)的解决方案,并进一步优化,推荐通过数据库ID作为数组键名,实…

    2025年12月13日 好文分享
    000
  • php中Phalcon框架如何使用?

    Phalcon 是用 C 编写的高性能 PHP 框架,以扩展形式加载,需编译安装而非 Composer;支持 MVC、内置 ORM 和 Volt 模板引擎,配置依赖 DI 容器,版本推荐 5.x(PHP 8.0+)或 4.x(PHP 7.4)。 Phalcon 是一个用 C 语言编写的高性能 PHP…

    2025年12月13日
    000
  • PHP中mt_rand()与SQL查询结合:正确随机数据选择方法

    本文旨在解决php的`mt_rand()`函数在sql查询中直接使用时引发的常见错误。核心问题在于php函数不能直接嵌入sql字符串内部执行,必须在php端先行评估其结果。文章将详细阐述通过字符串拼接或参数绑定两种方式,将`mt_rand()`生成的随机值正确地融入sql查询,实现从数据库中随机选择…

    2025年12月13日
    000
  • 在Docker容器中通过Dockerfile安装PHPUnit的最佳实践

    本文详细阐述了在Docker容器中安装PHPUnit的正确方法与常见陷阱。我们将从分析直接下载PHAR文件可能遇到的问题入手,重点推荐并演示如何利用Composer这一PHP依赖管理工具,在Dockerfile中高效、可靠地安装PHPUnit,并提供优化的Dockerfile示例,确保测试环境的稳定…

    2025年12月13日
    000
  • 怎么用phpstudy安装php源码_用phpstudy安装php源码配置与法【教程】

    首先下载安装PhpStudy并选择合适路径,然后在面板中添加站点,设置域名和源码目录,选择PHP版本后保存;接着启动Apache或Nginx服务,浏览器访问对应域名或localhost端口即可运行PHP源码;通过修改php.ini可启用扩展、调整上传限制、开启错误显示,并支持伪静态规则,便于开发调试…

    2025年12月13日
    000
  • 解决XAMPP MySQL意外关闭:端口冲突与数据文件异常处理指南

    当xampp中mysql服务启动后立即意外关闭时,通常是由于端口占用或数据文件损坏导致。本教程将详细指导您如何通过检查错误日志、重置mysql数据目录以及识别并解决端口冲突来恢复mysql服务的正常运行,并提供数据恢复的注意事项。 XAMPP MySQL意外关闭问题概述 在使用XAMPP集成环境进行…

    2025年12月13日
    000
  • 网页php源码怎么_用环境安装网页PHP源码教程【教程】

    首先搭建PHP运行环境,下载XAMPP等集成软件并启动Apache和MySQL服务,将源码放入htdocs目录后通过localhost访问;接着配置数据库,使用phpMyAdmin创建数据库并导入.sql文件,修改config.php中的数据库连接信息;然后调整php.ini文件,启用mysqli、…

    2025年12月13日
    000
  • 解决Docker中Composer PHP扩展找不到的问题:以ext-gd为例

    本文旨在解决在docker环境中,使用composer时遇到的“php扩展找不到”问题,特别是针对ext-gd等常见扩展。文章将深入分析问题根源,并提供一个高效且推荐的解决方案:利用官方推荐的symfony-docker项目模板,通过预配置的dockerfile和docker-compose命令,确…

    2025年12月13日
    000
  • php源码怎么生成网站_php源码生成网站与发布步骤【方法】

    首先需搭建PHP运行环境,可使用XAMPP等集成工具在本地部署,或将源码上传至云服务器;接着将PHP文件放入Web根目录并启动Apache服务,通过浏览器访问localhost测试;若对外发布,则购买云服务器与域名,上传源码并配置Nginx或Apache虚拟主机;然后创建MySQL数据库,导入SQL…

    2025年12月13日
    000
  • 免费软件库php源码怎么用_用免费软件库php源码操作指引

    答案:部署PHP源码需先从可信源下载并检查文件完整性,确认含入口文件及依赖说明;接着安装XAMPP等环境,将源码放入htdocs目录并启动服务;然后修改config.php中的数据库配置,创建对应数据库并导入SQL文件;若有composer.json则运行composer install安装依赖,设…

    2025年12月13日
    000
  • php源码怎么关闭_php源码关闭进程与安全退出

    答案:使用exit()或die()可立即终止PHP脚本,配合状态码或消息确保流程可控;在PHP-FPM中可用fastcgi_finish_request()先返回响应再处理后台任务;通过register_shutdown_function()注册清理函数,确保资源释放;CLI下结合pcntl扩展捕获…

    2025年12月13日
    000
  • 精确管理事件过期:SQL查询中的日期与时间结合策略

    本文探讨了如何精确地使用sql查询来判断事件是否过期,尤其当事件的过期日期和时间分别存储在两个独立的数据库列中时。针对传统方法只检查日期导致事件在同一天内过期后仍显示的问题,文章提供了两种高效的解决方案,确保事件在指定时间点后立即不再可见。 在许多数据库应用中,事件的过期信息常常以独立的方式存储,例…

    2025年12月13日
    000
  • php源码怎么需要安装_php源码需安装依赖与环境配置法【教程】

    要运行PHP源码需先安装PHP环境,配置Web服务器,安装Composer依赖,设置数据库与配置文件,并调整目录权限与安全限制以确保正常运行。 如果您尝试运行PHP源码,但程序无法正常启动或功能异常,可能是由于缺少必要的依赖库或环境配置不完整。以下是解决此问题的步骤: 一、安装PHP运行环境 要运行…

    2025年12月13日
    000
  • php有源码怎么_php有源码运行与二次开发入门法

    首先搭建本地环境,安装XAMPP或WAMP,启动Apache和MySQL,将源码放入htdocs目录,通过浏览器访问localhost项目路径;接着配置数据库,找到config.php等文件修改数据库连接信息,用phpMyAdmin创建数据库并导入SQL文件;然后熟悉项目结构,查看index.php…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信