暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

MySQL 读写分离初衷,方案有哪些

原创 Hulong Cui 2021-05-25
11782

有次技术交流当中,跟技术同人谈到MySQL能承载多少数据话题,觉得单点MySQL目前能很好的承载2TB的数据。确实可以,只是慢而已,5秒的一条SQL语句能接受吗。那就不能用了吗。
不是的,虽然到了MySQL能力瓶颈,但还可以做读写分离,分库分表。
带着这些想法。看下MySQL读写分离怎么做,实现都有哪些。

读写分离原则

MySQL读写分离是指 修改操作在主库上执行,而对于查询操作,可以在从库上执行。主要目的是分担主库的压力。主库压力太大,无法承载业务,通过实现读写分离还能进一步提升数据库的负载性能。对于高访问量的业务场景,MySQL读写分离显得格外重要。

读写分离最基本原则:
  • 对于延迟敏感业务必须在主库读取,或采取主从验证机制,可在从库读取
  • 报表,统计类,查询可以通过从库读取
MySQL主从延迟为什么:

MySQL是WAL机制,复制是通过binlog传输到从节点进行回放实现数据同步。

从早期的版本开始到目前发展:异步->半同步->增强半同步->并行复制->组复制

高负载下都无法保证从库延迟(比如:大表DDL,大事务,主库DML并发大,表上无主键 等等),所以读取的从库数据不是最新的。

实现方式:

以往积累的经验,实现方式如下:

  • 代码层实现逻辑1:对读/写请求进行解析,针对性地分发到不同的数据库中,从而实现读写分离;

  • 代码层实现逻辑2:二次验证方式,主库获取最新的gtid,到从库进行验证是否应用,成功就读取数据

  • 基于类似proxysql,MyCat中间件来实现读写分离的效果.通过不同的端口或机制进行读写分离。
    中间件实现读写分离,优点十分明显,只需要进行配置就可以实现读写分离,除此之外并且当主库宕机时,还可以通过配置方式进行主从自动切换,这样即使主库宕机整个集群也不会丧失写的功能.

  • 多副本写入方式:这种方式国产分布式数据库里有很多体现,确认写入另一个复制集群中。

不管哪种方式,请遵守读写账号必须分离(writehost,readhost),这部分需要应用端或中间件控制。这样实现双保险。writehost账号永远都在一个节点上。

中间件选择

image.png

1.Cetus开源
项目地址:https://github.com/cetus-tools/cetus/releases
由C语言开发的关系型数据库MySQL的中间件,基于MySQL Proxy开发,分为读写分离版和分库版本两个版本,是MySQL Router前身了。社区目前活动轨迹非常少,但还有企业使用。

2.MaxScale闭源
一款由mariadb公司出品的中间件Maxscale,该中间件能实现读写分离和读负载均衡
MaxScale虽是开放源代码的,但并不是一个“Open Source”的项目使用了特有的授权协议:BSL协议(https://mariadb.com/projects-using-bsl-11/)

3.Vitess开源
Youtube生产在使用的中间件,架构确实很复杂。 与以往中间件不同,使用Vitess应用改动比较大要 使用他提供语言的API接口。支持读写分离,分库分表,故障切换和数据备份。

4.MySQL Router开源
MySQL官方推荐的读写分离中间件,MySQL Router是MySQL Proxy的替代方案,

  • 读写分离
  • 无法动态更改配置。
  • MGR中充当代理

5.ProxySql开源
ProxySQL是percona用C++语言开发的,一个轻量级开源软件,性能和功能满足读写中间件所需的绝大多数功能,其配置数据基于SQLite存储,目前已到v2.1.1版本

  • 读写分离,语句级的规则,实现简单的sharding。
  • 动态更改配置
  • 请求SQL都要经过ProxySQL服务器,对CPU,内存有一定的要求
  • MGR中充当代理

GitHub官网:https://github.com/sysown/proxysql/releases
percona官网:https://www.percona.com/downloads/proxysql

7.MyCAT开源
基于阿里开源的Cobar产品而二次研发的开源产品。

  • 应用端链接MyCAT服务器,
  • 能支持读写分离
  • 支持多种分库分表算法。
  • MyCAT配置文件MySQL路由相关信息。
  • 单独维护。
  • 支持mysql,pg,oracle ,sql server。
    -性能损耗 20%~50%
    整体设计思路和实现都很好,也是比较成熟的解决方案,在那个年代,MyCAT的整体设计思路和实现方式都是比较成熟的解决方案。
    但目前社区现状很不好,基本慢慢被抛弃,原因可以自行了解。目前爱可生维护的衍生版本 DBLE。

8.ShardingSphere(Shardingjdbc+ShardingProxy+ShardingSidecar)开源

  • Shardingjdbc:轻量级Java架构,在Java的JDBC层提供的额外服务,就是jdbc驱动二次包装jar,实现读写分离,复杂的分库分表逻辑 ,性能损耗7%
  • ShardingProxy:类似与MyCAT,中间件软件实现读写分离,复杂分库分表。性能损耗20%
  • 已于2020年4月16日成为 Apache 软件基金会的顶级项目。

除此之外 商业版本的淘宝的DRDS,平民软件OneProxy 等

总结

  • 从MySQL读写分离理解,由于能分担主库的压力,很多情况会考虑读写分离,但是在使用时,就应该考虑到延迟是否敏感。存在延迟则把读请求放到主库,没延迟就读从库。

  • 中间件方面:目前社区活跃度,关注度来说,Shardingjdbc发展趋势非常好。轻量级方面ProxySQL,MySQL Router目前社区活跃度也非常好。其他中间件可以学习他们的思想和技术。

读写分离中间件的引入对于架构系统复杂度来说,比较可控范围之内,结合业务模型选择合理的读写分离方式。

最后修改时间:2022-12-27 13:44:59
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论