MySQL从库扩展探索

2023-10-09 10:49

本文主要是介绍MySQL从库扩展探索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[导读]本文主要介绍Booking网站在业务发展过程中碰到MySQL主库挂载几十甚至上百个从库时探索的解决方案:使用Binlog Server。Binlog Server可以解决五十个以上从库时主库网络带宽限制问题,并规避传统的级联复制方案的缺点;同时介绍了使用Binlog Server还可以用于优化异地机房复制和拓扑重组后的主库故障重组。作者探索问题循序渐进的方式以及处理思路值得我们学习。

Booking网站后台有着非常复杂的MySQL主从架构,一台主库带五十个甚至有时带上百个从库并不少见。当从库到达这个数量级之后,一个必须重点关注的问题是主库的网络带宽不能被打满。业界有一个现成的但是有缺陷的的解决方案。我们探索了另外一种能更好适应我们需求的方案:Binlog Server。我们认为Binlog Server可以简化灾难恢复过程,也能使故障后从库迅速升级为新主库变得容易。下面会详细描述。

一个MySQL主库带多个复制的从库的时候,每次对主库的修改都会被每个从库请求复制,提供大量二进制日志服务会导致主库的网络带宽饱和。产生大量二进制日志的修改是很常见的,下面是两个例子:

  • 在使用行模式binlog日志复制方式的实例中执行大事务删除操作
  • 对一个大表执行在线结构修改操作(online schema change)

在图1的拓扑图中,假设我们在一个MySQL主库上部署100个从库,主库每产生1M字节的修改每秒都会产生100M字节的复制流量。这和千兆网卡的流量上线很接近了,而这在我们的主从复制结构中很常见。

图片描述

图1: 多从库的MySQL主从架构

这个问题的传统解决方案是在主库和它的从库之间部署中继主库。在图2的拓扑部署中,与很多从库直接连到主库不同的是我们有几个从主库复制的中继主库,同时每个中继主库有几个下级从库。假设有100个从库和10个中继主库,这种情况下允许在打满网卡流量之前产生10倍于图1架构的二进制日志。

图片描述

图2: 包含中继主库的MySQL主从架构

然而,使用中继主库是有风险的:

  • 中继主库上的主从复制延迟将影响它的所有从库。
  • 如果一个中继主库出现异常,所有该中继主库的从库将停止复制并必须重新初始化,[1] (这会带来很高的维护成本并有可能产生在线故障,译者注)

针对图2第二个问题我们可以做深入研究,一个思路是,如果M1出现故障,可以把它的从库的主库配置指向到其他中继主库,但是没那么简单。

  • S1从M1复制的二进制日志依赖于M1
  • M1和M2有不同的二进制日志位置(这两个库是不同的数据库,在同一时间二进制日志状态、位置可能不同,译者注)
  • 手工推进S1的二进制日志位置到M2是非常难而且可能导致数据不一致。

GTID可以协助我们指向从库,但是它不能解决第一个关于延迟的问题。

实际上我们不需要中继主库的数据,我们只是需要提供Binlog二进制日志服务。同时,如果M1和M2可以提供二进制日志服务并且日志位置是相同的,我们可以很容易地交换各自的从库。根据这两点观察,我们构思了Binlog Server二进制日志服务。

Binlog Server替代图2中的中继主库,每个Binlog Server做如下事情:

  • 从主库下载二进制日志
  • 与主库使用相同结构(文件名和内容)保存二进制日志到磁盘
  • 提供二进制日志给从库就像它们是这些从库的二级主库

当然,如果一个Binlog Server异常了,我们可以很容易地把它的从库指向到其他Binlog Server就可以。更惊喜的是,由于这些Binlog Server没有本地数据的变化,只是给下游提供日志流,相对有数据的中继主库来说,可以很好的解决延迟的问题。
我们与SkySql合作实施了Binlog Server作为一个模块的MaxScale的插件框架。你可以阅读这篇博客上的介绍SkySql MySQL复制,MaxScale和Binlog Server。

另一个案例1:避免远程站点上的深度嵌套复制
Binlog Server还能用于规避远程站点上的深度嵌套复制的问题。

假设有两个不同地域机房,每个机房需要四个数据库服务器,当网络带宽需要特别关注的时候(E、F、G和H在远程站点),图3的拓扑图是一个典型的部署方式。

图片描述

图3: 使用中继主库部署的MySQL异地主从架构

但是这个拓扑结构会受到上述讨论问题的影响(复制延迟将从E传递至F、G和H,同时E异常之后,F、G、H就会失败)。如果我们用图4的架构就好很多,但是这种架构需要更多的网络带宽,而且一旦主复制节点发生问题,异地机房从库需要重建一套新的主从架构。

图片描述

图4: 不包含中继主库的异地机房MySQL主从部署

在异地机房主从架构中使用Binlog Server,我们可以综合上面两种方案的优势(低带宽使用和中继数据库不产生延迟)。拓扑图如下面图5。

图片描述

图5: 包含Binlog Server的异地机房MySQL主从架构

图5中的MySQL主从架构中,Binlog Server (X)看起来是一个单点,但是如果它异常了, 重新启动另外一个Binlog Server是很容易的。而且也可以像图6示例的在异地机房运行两个Binlog Servers。在这个部署中,如果Y异常了,G和H可以指向到X,如果X异常了,E和F可以指向到Y,Y可以指向到A。

图片描述

图6:包含两个Binlog Server的异地机房MySQL主从架构

运行Binlog Servers其实不需要更多更好的硬件,在图6中,X、E、Y、G可以安装在同一台硬件服务器上。

最后,这种架构(有1个或2个Binlog Servers)有一个很有意思的属性:如果主站点的主库发生故障,异地机房从库可以收敛到完全一致的状态(只要X服务器的二进制正常)。这使得重组MySQL主从架构变得很容易:

  • 任何一个从可以成为新主库
  • 新主库的二进制日志位置在发送写之前会标注出来
  • 其他的节点成为新主库的从库,在之前提到的二进制日志位置。

另一个案例2:简单的高可用实现

Binlog Server可以用于高可用架构的实现。假如图7主库故障了,我们希望尽快选出新的主库,我们可以部署GTIDS或使用MHA,但是他们都有缺点。

图片描述

图7: 6个从库直连主库的MySQL主从架构

  • 如果我们像图8一样在主库和从库之间部署一个Binlog Server。
  • 如果X异常,我们能把所有从库指向A
  • 如果A异常,所有从库会达到一个一致的状态,使得将从库重组成一个复制树变得很容易(像上面提到的)。

图片描述

图8: 包含Binlog Server的MySQL主从架构

如果我们希望实现高扩展性和高可用性,我们可以部署成图9的主从架构。

图片描述

图9:包含多个Binlog Servers的MySQL主从架构

如果一个Binlog Server异常,它的从库将指向到其他Binlog Servers。如果I1失败了:

  • 我们找到有跟多二进制日志的Binlog Server (我们假定在这个例子中是I2)
  • 我们将其他Binlog Servers 指向到I2像图10一样。
  • 当所有的从库都达到一个共同的状态,我们重新组MySQL主从架构。

图片描述

图10: 主库异常后调整Binlog Server指向的MySQL主从架构

结论:

我们在我们的MySQL主从架构中引入了一个新的组件:Binlog Server。它使从库水平扩展不会超越网络带宽的的限制,同时也没有传统的级联复制解决方案的缺点。
我们觉得Binlog Server还可以用于解决其他两个问题:远程站点复制和拓扑重组后的主库故障重组。后续我们将带来的Binlog Server的其他使用案例,敬请期待更多细节。

[1] 从库重新初始化的大量工作可以通过GTIDS或通过采用高可用的中继主库(DRBD或Netapp的Snapshot)来避免,但是这两个解决方案分别会带来新的问题。

英文首发网址:http://blog.booking.com/mysql_slave_scaling_and_more.html
译者简介:王林平,搜狗商业广告数据库负责人。主要负责商业广告数据库的维护、优化、架构设计、流程体系建设、自动化运维平台建设等工作,目前比较关注数据库备份恢复、性能优化、运维自动化等几个领域。
审校介绍: 柳阳,数据架构师,就职于平安健康互联网公司
责任编辑:夏梦竹(xiamz@csdn.net,关注数据库领域,欢迎投稿。)
文章来源:《程序员》2月期
版权声明:本文为《程序员》原创文章,未经允许不得转载,订阅2016年《程序员》请点击 http://dingyue.programmer.com.cn

这篇关于MySQL从库扩展探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/172306

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key: