聊聊MySQL架构演进:从主从复制到分库分表

MySQL高级讲座篇之:高可用备份恢复方案:如何设计一个满足RTO/RPO的灾难恢复计划。 所以,在制定灾难恢复计划时,要根据业务的重要性、成本等因素综合考虑,找到一个平衡点。比如,RPO是5分钟,意味着你最多只能接受丢失5分钟的数据,超过这个时间的数据,就得想办法找回来或者接受丢失。话说,以前有个程序员,数据库挂了,他淡定地拿出备份恢复,老板问:“这么快?”,程序员说:“平时备份就像存老婆本,不用的时候希望永远用不上,用的时候必须顶用!白话讲,就是数据库挂了到恢复正常,你允许的最长时间。光有备份和高可用架构还不够,还需要制定详细的恢复流程,并且定期进行演习,才能保证在灾难发生时能够快速恢复。 阅读详情

背景

业务飞速发展导致数据规模急速膨胀,单机的数据库已经无法满足互联网业务的发展。

传统的将数据集中存储单一数据结节的方案,在容量、性能、可用性和可维护性方面已经难以满足互联网海量数据的场景。

从容量方面考虑,单机数据库容量有限,难以扩容。

从性能方面来说,由于关系型数据库大多数采用B+树类型索引,在数据量超过一定的阈值后,索引的深度增加导致对磁盘的随机IO次数增加,进而导致性能问题。

从可用性方面来说,服务通常设计成无状态的,这必然导致系统的存储压力都集中在数据库层面,而单一的数据节点,或者简单的主从架构,已经越来越难以承担。

从运维角度来看,当数据都集中在一个节点上时,数据备份和恢复的时间成本也随之数据量上升变得不可控。同时数据丢失导致影响的范围也会被放大。

聊聊MySQL架构演进:从主从复制到分库分表

 

主从复制

  • 主库将事务操作(除了查询以外的操作)记录到binlog
  • 从库通过relay log同步数据,实现数据的同步

聊聊MySQL架构演进:从主从复制到分库分表

 

binlog日志格式

  • row 记录数据库操作详细记录,包括上线文信息等,文件较大。
  • statement 记录事务相关的SQL文件。
  • mixed 混合式, 基于row和statement两种文件格式。

异步复制

2000年,MySQL3.23.15版本引入复制功能,采用异步复制的方式,当网络或者机器故障,会导致数据不一致。

聊聊MySQL架构演进:从主从复制到分库分表

 

半同步复制

2010年, MySQL 5.5版本引入半同步复制, 半同步复制是指只要一个salve节点返回ack,master节点就可以提交事务了,保证数据库至少有一个节点完成了数据的同步。

聊聊MySQL架构演进:从主从复制到分库分表

 

组复制

2016年,MysQL在5.7.17中引入InnoDB Group Replication,该方案基于paxos协议实现组内复制,保证数据一致性,paxos协议核心在于过半选举。

聊聊MySQL架构演进:从主从复制到分库分表

 

主从复制的问题

  • 主从复制延迟,导致"写完读"数据不一致问题。从库读取失败,再去主库执行一遍SQL,存在性能问题。业务层保证系统核心功能可用,将核心功能的CRUD操作都路由到主库,非核心业务功能即使存在短暂数据不一致也影响不大。
  • 路由问题,需要业务层根据SQL路由到不同的数据库,路由到SLAVE节点时,还需要保证系统负载均衡。业务层通过框架(如sharding-jdbc)或者手动实现,对业务的侵入性较大,已存在的旧系统改造不友好。通过数据库中间件实现(如mycat、sharding-proxy),需要部署一个中间件(中间件实现SQL标准),规则配置在中间件,执行过程中会多一次网络转发。
  • 不能保证系统高可用通过一系列高可用的解决方案保证数据库高可用

数据库高可用

什么是高可用?

高可用意味着,更少的服务不可用的时间,一般用SLA(服务级别协议)衡量。

1年 = 365天 = 8760小时

99 = 8760 * 1% = 8760 * 0.01 = 87.6小时

99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时

99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟

99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟

为什么要做高可用?

通过故障转移,提供failover的能力,加上业务侧连接池的心跳重试,实现断线重连,业务不间断,降低RTO(Recovery Time Objective,复原时间目标)和RPO(Recovery Point Objective,复原点目标)。

  • 容灾恢复:冷备和热备,冷备和热备的区别在于运行期间是否提供服务。
  • 对于主从来说,简单的来说就是Master节点挂了,某一个从节点,自动切换成主。
  • 从集群来看,即便是个别节点挂了,能正常对外提供服务。

常见的策略:

  • 多实例部署
  • 跨机房部署
  • 两地三中心容灾高可用方案等。

手动切换

即如果主节点宕机,手动将某个从节点修改成主节点。

存在的问题:

  • 可能数据不一致
  • 需要人工干预
  • 代码和配置的侵入性,需要配置其他节点,修改应用数据源的配置。

MHA

MHA全称叫做MySQL Master High Availability,是由Facebook工程师 Yoshinori Matsunobu开发的一款MySQL高可用框架,基于Perl语言开发,一般能在30秒内实现主从切换,切换时通过SSH复制主节点的日志信息。

MHA负责MySQL主库的高可用,当主库发生故障时,MHA会选择一个数量最接近原主库的候选节点作为新的主节点,并且补齐和之前宕机的Master差异的Binlog。数据补齐后,即将写VIP漂移到新的主库上。具体的架构图如下:

聊聊MySQL架构演进:从主从复制到分库分表

 

优点

  • 可以进行根据具体的故障实现自动检测和故障转移
  • 扩展性好,可以任意的扩展数据节点数量

缺点:

  • 极限情况下,可能会发生脑裂现象,出现多个Master。
  • 需要配置SSH信息。
  • 至少需要三台。

MGR

MGR是数据库支持的,只需要配置插件即可,如果主节点挂掉,将自动选择某个从改为主。无需人工干预,并且基于组复制(paxos算法),保证数据一致性。

聊聊MySQL架构演进:从主从复制到分库分表

 

MGR的特点

  • 高一致性,基于分布式Paxos协议实现复制,保证数据一致性。
  • 高容错性,自动检测机制,只要大多数节点都宕机的情况下,数据库可以继续工作,内置防爆裂保护机制。
  • 高可扩展性,加入新节点后,自动实现增量同步,直到与其他节点数据一致。
  • 高灵活性,提供了单主和多主模式,单主模式支持主节点宕机,自动选主,多主模式支持多节点写入。

MySQL InnoDb Cluster,一个完整的数据库高可用解决框架,由多个组件组成

  • MySQL Group Replication,提供DB的扩展,故障迁移
  • MySQL Router,轻量级中间件,提供应用程序连接目标的故障转移。
  • MySQL shell,新的MySQL客户端,多种接口模式,可以设置群组复制和Router。

聊聊MySQL架构演进:从主从复制到分库分表

 

Orchestrator

一款MySQL高可用和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障迁移和手动切换的功能等,直接拖拽UI,就可以实现主从切换。

分库分表

分库分表通常是指垂直分库和水平分表,对于垂直分表其实就是将宽表拆分成小表,没有太多的技术挑战,这里侧重讲讲垂直分库和水平分表。

垂直分库

垂直分库是指将数据库进行纵向切分,通常按照业务的维度进行划分。

如典型的微服务的架构,将系统按照业务维度垂直拆分,划分成多个服务。如一个电商网站可以拆分成:订单、商品、会员、支付等服务。

聊聊MySQL架构演进:从主从复制到分库分表

 

垂直分库后业务更加单纯,职责单一,同时可以解决部分数据库容量问题,但是同时也引入了新的技术复杂度,如下:

  • 分布式事务,跨数据库的事务操作需要分布式事务支持,否则系统将会面临数据不一致的问题。方案一,采用XA事务,XA事务是数据库本身支持规范,具备强一致性的特征,但是性能比较差,对于追求高性能的场景不适合使用XA事务。方案二,采用柔性事务,柔性事务是指,数据库保证局部事务,全局事务实现由业务层实现(如通过调度补偿,重试补偿,人工介入等),柔性事务常见的解决方案有:TCC、利用消息队列实现事务。
  • join问题,分库后,表分散到不同的数据库,无法直接使用SQL进行JOIN操作,需要业务层自己实现聚合操作,增加了开发成本。

水平分表

水平分表是指,将表按照某种规则分成多张表,拆分后的表结构和拆分前完全一致,但是数据分散到多张表中,也可以成为数据分片。

聊聊MySQL架构演进:从主从复制到分库分表

 

通过水平分表,解决了单表的容量和性能问题。但同时,水平分表后,引入了新的技术复杂度,主要有以下几点:

  • 路由问题,当业务层通过SQL对数据库进行DML操作时,到底该查询哪张表呢?方案一:范围路由。根据表中某一列(分片键)的取值范围进行分表,如根据创建时间将主表分成多张表,每个月的数据单独存储在一个表中。范围路由可能出现数据分配不均匀的现象,但是表数量易于扩展。方案二:哈希路由。根据表中某一列与分片数量取模运算(field_value % table_num)。hash路由和范围路由相反。表数量扩展时都会导致数据重新分布,但是数据分布较为均匀。
  • join问题,由于分表后,数据分散到多个表中,JOIN的条件语句中如果没有分片键,那么需要将全部的分片表都JOIN一遍,这种操作会存在性能问题。
  • count问题,分表后,如果需要统计表记录总和,需要遍历所有的表,然后再将结果进行汇总,可以通过一张单独的汇总表来解决,但这种解决方案需要每次insert或者delete的时候就需要更新汇总表,如果有一次没有更新,就会导致数据不一致。
  • order by问题,分表后,如果需要进行排序,需要遍历所有的表,然后在代码层进行重新排序,这个操作一看就会存在性能问题。

分库分表解决方案

  • 业务代码层解决,可以通过SQL手动处理路由,但是和业务的耦合很严重,不易于维护。通常采用集成jar包的方式进行解决,如集成成熟的开源项目:sharding-jdbc。
  • 数据库中间件,数据库中间件实现了对应数据库的SQL标准,路由规则配置在数据库中间件,业务代码操作数据库中间件和直接操作数据库没有任何区别。

总结

从单节点数据库到主从复制,再到数据库高可用,再到分库分表,很好的解决了数据的性能、容量、高可用、运维性等问题,但是会带来分布式事务、复杂SQL难以操作、SQL路由等问题。

架构设计应该遵循:"简单性"、"合适性"、"演化性"的原则,符合当前的业务发展,所以系统设计没有必要一上来就考虑分库分表,而应该是数据量达到一定的量,出现性能瓶颈的时候再对系统进行改造和优化。

MySQL性能优化实战:从硬件配置、索引设计到架构演进全解析 数据库性能优化是后端开发与系统架构中的核心课题,其本质在于通过系统性的方法减少数据存取延迟、提升吞吐量。其原理涉及存储引擎的工作机制、索引数据结构(如B+树)以及查询执行计划等底层知识。掌握这些技术对于构建高并发、低延迟的应用具有重要价值,能直接提升用户体验和系统稳定性。在应用场景上,无论是应对用户量激增导致的查询变慢,还是处理海量数据下的存储瓶颈,都需要一套从底层硬件、SQL语句到系统架构的完整优化体系。本文聚焦MySQL这一主流关系型数据库,深入探讨如何通过配置调优、索引设计、查询重构及读写分离、分库分 阅读详情

相关推荐

什么是恢复时间目标(RTO)

恢复时间目标(recovery time objective,RTO)是指在故障或灾难发生之后,一台电脑、系统、网络或应用程序停止工作的最高可承受时间。恢复时间目标是一项职能,用于评估灾难扰乱正常运营的程度和灾难在单位时间里所造成的收入损失。这些因素又取决于受影响的设备和应用程序。恢复时间目标(RTO)是以秒、分钟、小时或天数来衡量的,它是灾难恢复规划(DRP)中的一个重要考虑因素。

rpo rto mysql_【重点】RTO和RPO详解

容灾与备份之间是之间关系容灾与备份之间是之间关系1.容灾和备份的目的不同容灾系统的目的在于保证系统数据和服务的“在线性”,即当系统发生故障时,仍然能够正常地向网络系统提供数据和服务,以使系统不致停顿。而备份技术的目的与此并不相同,备份是“将在线数据转移成离线数据的过程”,其目的在于应付系统数据中的逻辑错误和历史数据保存。所以,在各种容错技术非常丰富的今天,备份系统仍然是不可替代的。2.备份是基石备...

weixin_36387104的博客 1553

nRF5340双核实战:从Zephyr环境搭建到蓝牙协议栈部署

本文详细介绍了nRF5340双核处理器的开发实践,包括Zephyr环境搭建、蓝牙协议栈部署及双核协同工作配置。通过实战案例展示了如何利用nRF5340的双核异构架构提升蓝牙应用性能,并提供了调试技巧与资源优化建议,帮助开发者高效实现低功耗蓝牙设备开发。

weixin_42525385的博客 382

MySQL-备份与恢复、binlog日志

数据库服务状态。

it_zhenxiaobai的博客 1065

1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

上市公司企业劳动生产率数据集为企业和市场参与者提供了一个深入分析企业生产效率和劳动效益的工具。通过这些数据,企业可以不断探索创新的发展模式和管理方式,努力提高生产效率,为提升市场竞争力和盈利能力做出贡献。数据名称:上市公司-企业劳动生产率数据数据年份:1999-2022年数据来源:国泰安数据库1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

2401_84585615的博客 882

windows10系统上安装最新版mysql 8.0详细步骤

windows10系统上安装最新版mysql 8.0详细步骤

glei20的博客 6716

MySQL数据库运维的五大指标

如何评价一个公司数据库运维水平的高低?用什么来进行横向与纵向对比?自动化平台建设的目标是什么?必须有相应的指标体系来指导,此指标体系必须满足以下条件: 可以用数字来测算和衡量 最终指标,而不是中间指标 比如有时DBA会关注数据库的吞吐量,但吞吐量越高不能代表数据库提供的服务质量越好,开发人员关心这个指标的原因也是因为担心过高的吞吐量会影响响应时间或者造成系统不可用,所以这只是一个中

lxpbs8851的专栏 3181

centos7安装Ambari 2.7.5 + HDP3.1.5

准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9

kxq的博客 5092

云计算MySQL

前面已经介绍了单表的查询操作,在数据库中有时为了提高数据的检索和存储效率,会将一些内容量比较大的表拆分成多个子表,并通过一些特殊的属性将这些子表关联起来。一对一关系主表和从表,主表的一条数据对应从表的一条数据,两个表一一对应数据表的一对一关系主要应用于以下几个方面。(1)分割列数较多的表。(2)为了加强数据安全性而隐藏数据表中的一部分内容。(3)保存临时数据,当不需要时可以直接删除从表,减少了操作步骤一对多关系定义。

MG444555的博客 381

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

Python 爬虫实战:解析 JSON 数据爬取今日头条热点新闻(API 接口逆向与字段提取)

在当今信息爆炸的时代,新闻资讯的获取变得尤为重要。今日头条作为国内领先的新闻聚合平台,其热点新闻数据具有很高的价值。本文将详细介绍如何通过 Python 爬虫技术,逆向解析今日头条的 API 接口,提取并解析 JSON 数据,最终获取热点新闻信息。

yansideyucsdn的博客 3211

高可用与扩展:主从复制、读写分离与分库分表

分库分表是架构演进的“核武器”,威力大但副作用也大(运维复杂、跨库查询难)。不到万不得已(单表 500w-1000w+),不要轻易使用。 最后,送上金句: “分库分表是架构演进的‘核武器’,威力大但副作用也大(运维复杂、跨库查询难)。不到万不得已(单表 500w-1000w+),不要轻易使用。”

天生我材必有用,千金散尽还复来。 384

把入库交货单的 GOS 附件自动带进审批 Work Item:用 SOFM 对象打通 SAP Workflow 附件链路

本文介绍了一种在SAP ECC系统中将入库交货单的GOS附件自动附加到Workflow审批项中的解决方案。通过使用BOR对象引用列表和SOFM业务对象,审批人可直接在Work Item中查看附件,无需返回原单据界面。文章详细阐述了从BUS2015业务对象获取附件连接、转换LOIO_ID为SOFM对象引用,并将附件列表绑定到User Decision步骤的具体实现方法。该方案适用于经典SAP Business Workflow+BOR架构,核心ABAP代码可直接复用,有效解决了审批流程中的附件可见性问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

数据库架构设计的最佳实践:从单机到分布式

数据库架构设计是一个系统工程,需要从业务需求、数据特性、性能要求等多个方面考虑。源码之下,没有秘密。理解数据库的底层原理是设计好架构的基础Show me the benchmark, then we talk. 所有设计都需要通过实际测试验证高并发不是吹出来的,是压测出来的。在生产环境部署前,一定要进行充分的性能测试作为一名技术人,我们的尊严不在于职级,而在于最后一次把生产事故从边缘拉回来的冷静。希望这篇文章能帮助你设计一个可扩展、高可用的数据库架构,支持业务的快速发展。

guoyizhongxing的博客 4286

用MATLAB计算卡方值

然后,我们计算了期望频数,即在两个分类变量独立的情况下,每个单元格的预期频数。接下来,我们使用卡方检验的公式计算了卡方值。卡方检验是一种常用的统计方法,用于确定两个分类变量之间是否存在相关性。它基于观察到的频数和期望频数之间的差异来评估分类变量之间的独立性。在MATLAB中,我们可以使用。请注意,这只是一个简单的示例代码,用于说明如何使用MATLAB计算卡方值。在实际应用中,您可能需要根据您的具体数据和研究问题进行相应的修改和调整。在上面的代码中,我们首先创建了两个分类变量。函数显示了计算得到的卡方值。

CodeNexus的博客 2659

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【MYSQL篇】mysql性能优化总结

说到MYSQL性能调优,大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的,每个环节都会消耗时间,我们要减少查询所消耗的时间,就要从每一个环节入手。

初念初恋的博客 1289

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

聊聊Redis

聊聊Redis 1、 NoSql概述 1.1、 为什么要用nosql ​ 要了解NoSql的背景,首先要先简单了解下架构的演进。 单机MySQL时代 在这个阶段,一个网站的访问量基本不会太大,单机的MySql完全足够用了。 更多的是使用静态页面Html~,服务器没有什么太大的压力 这个阶段的瓶颈就是: ​ 1、 如果数据量太大话,一个机器放不下; ​ 2、 数据的索引(B+Tree),一个机器也放不下 ​ 3、 访问量太大(包含读写操作),一个服务器承受不了 Memcached缓存 + MySql

weixin_44372868的博客 1248

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据库架构入门到进阶:单机、主从、分库分表到分布式的选型实战

数据库架构不是选个库就完事。结合踩坑经历,讲清楚架构是什么、怎么演进、三层设计法怎么用、存储选型怎么避坑。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 301

企业低成本万能架构

它的主要的复制原理是:当应⽤程序客户端发送⼀条更新命令到数据库的时候,数据库会把这条更新命令同步记录到Binlog中,然后由另外⼀个线程从Binlog中读取这条日志,然后通过远程通讯的方式将它复制到从服务器上面去,从服务器获得这条更新日志后,将其加入到自己的Relay log中,然后由另外⼀个SQL执⾏线程从Relay log中读取这条新的日志,并把它在本地的数据库中重新执行一遍。最开始是使用MySQL方案,一主多从,多主多从,分库分表各方案都试过根本顶不住,线上经常出现假死、满载等问题,搞得焦头烂额的。

Gefangenes的博客 279
上一篇: JVM又曾放过谁,垃圾终将被回收
下一篇: 趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值