有次技术交流当中,跟技术同人谈到MySQL能承载多少数据话题,觉得单点MySQL目前能很好的承载2TB的数据。确实可以,只是慢而已,5秒的一条SQL语句能接受吗。那就不能用了吗。
不是的,虽然到了MySQL能力瓶颈,但还可以做读写分离,分库分表。
带着这些想法。看下MySQL读写分离怎么做,实现都有哪些。
读写分离原则
MySQL读写分离是指 修改操作在主库上执行,而对于查询操作,可以在从库上执行。主要目的是分担主库的压力。主库压力太大,无法承载业务,通过实现读写分离还能进一步提升数据库的负载性能。对于高访问量的业务场景,MySQL读写分离显得格外重要。
读写分离最基本原则:
- 对于延迟敏感业务必须在主库读取,或采取主从验证机制,可在从库读取
- 报表,统计类,查询可以通过从库读取
MySQL主从延迟为什么:
MySQL是WAL机制,复制是通过binlog传输到从节点进行回放实现数据同步。
从早期的版本开始到目前发展:异步->半同步->增强半同步->并行复制->组复制
高负载下都无法保证从库延迟(比如:大表DDL,大事务,主库DML并发大,表上无主键 等等),所以读取的从库数据不是最新的。
实现方式:
以往积累的经验,实现方式如下:
-
代码层实现逻辑1:对读/写请求进行解析,针对性地分发到不同的数据库中,从而实现读写分离;
-
代码层实现逻辑2:二次验证方式,主库获取最新的gtid,到从库进行验证是否应用,成功就读取数据
-
基于类似proxysql,MyCat中间件来实现读写分离的效果.通过不同的端口或机制进行读写分离。
中间件实现读写分离,优点十分明显,只需要进行配置就可以实现读写分离,除此之外并且当主库宕机时,还可以通过配置方式进行主从自动切换,这样即使主库宕机整个集群也不会丧失写的功能. -
多副本写入方式:这种方式国产分布式数据库里有很多体现,确认写入另一个复制集群中。
不管哪种方式,请遵守读写账号必须分离(writehost,readhost),这部分需要应用端或中间件控制。这样实现双保险。writehost账号永远都在一个节点上。
中间件选择
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目前社区活跃度也非常好。其他中间件可以学习他们的思想和技术。
读写分离中间件的引入对于架构系统复杂度来说,比较可控范围之内,结合业务模型选择合理的读写分离方式。