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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-用户体验监控,每月100OCU免费额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 背景业务飞速发展导致数据规模急速膨胀,单机的数据库已经无法满足互联网业务的发展。传统的将数据集中存储单一数据结节的方案,在容量、性能、可用性和可维护性方面已经难以满足互联网海量数据的场景。

背景

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

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

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

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

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

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

主从复制

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

binlog日志格式

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

异步复制

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

半同步复制

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

组复制

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

主从复制的问题

  • 主从复制延迟,导致"写完读"数据不一致问题。从库读取失败,再去主库执行一遍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漂移到新的主库上。具体的架构图如下:

优点

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

缺点:

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

MGR

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

MGR的特点

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

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

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

Orchestrator

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

分库分表

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

垂直分库

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

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

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

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

水平分表

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

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

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

分库分表解决方案

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

总结

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

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

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
1月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
163 3
Mysql高可用架构方案
|
8天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
66 24
|
1月前
|
SQL 存储 缓存
【赵渝强老师】MySQL的体系架构
本文介绍了MySQL的体系架构,包括Server层的7个主要组件(Connectors、Connection Pool、Management Service & Utilities、SQL Interface、Parser、Optimizer、Query Caches & Buffers)及其作用,以及存储引擎层的支持情况,重点介绍了InnoDB存储引擎。文中还提供了相关图片和视频讲解。
【赵渝强老师】MySQL的体系架构
|
23天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
123 1
MySQL主从复制原理和使用
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
SQL 缓存 NoSQL
MySQL架构与SQL的执行流程_2
MySQL架构与SQL的执行流程_2
153 0
MySQL架构与SQL的执行流程_2
|
SQL 缓存 网络协议
MySQL架构与SQL的执行流程_1
MySQL架构与SQL的执行流程_1
150 0
MySQL架构与SQL的执行流程_1
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3