分布式架构MySQL读写分离技术分析

发布时间:2021-12-07 17:38:34
概览MySQL的读取和写入。
MySQL读写分离原理。
简而言之,读写分离只是在主服务器上写入,从服务器上执行,其基本原理是让主数据库处理事务查询,而数据库处理select查询,使用数据库复制将事务查询所引起的更改更新与集群中的从数据库同步。
这种并发问题是典型的,单个数据库会产生过多的请求,不能让作者提交编辑过的内容。一种本能的想法是,增加更多的服务器,在多个服务器中分担压力,但这将产生一个问题,在多个数据库之间进行数据同步是一个比较复杂的问题,简化了主从结构-一台主库来实现数据的写入。负责多个从库负责读,因此可以简化数据同步方案,使所有从库都能及时地与主库同步数据。而且这也是前面提到的-MySQL主从复制(BinaryLog)。
有两种实施方法:

当使用SpringJDBC/myBatis/Hibernate访问数据库等应用层实现时,可以在应用层配置大多数数据源,从而将请求重新分配到不同的数据源。
Agent实现的方法是在应用层和数据库群集之间添加代理服务,代理根据请求类型(读/写)自动分流到不同的数据库服务器。
以下将对两个方案进行简要介绍:

应用层实现

以这样一种基于应用层实现的独立读写型拓扑,这是网络层上的读写方向,即向Master写入写,而通过一定的算法,将所有的读都分流到不同的Slave服务器。
根据此方案的实现,由于应用框架的不同实现方法有所不同,对于SpringJDBC框架来说,定义多个数据库连接是一种简单的方法,主数据源和SlaveDataSource。在更新数据时,我们读取MasterDataSource,在查询数据时读取SlaveDataSource。
这一方法在只有一种来自库(Slave)的情况下也是一种好方法,但当有多个来自库时就不行了。还有很多方法可以解决,比如集成AbstractRoutingDataSource自己实现算法。
以下提供包含其他组件配置的链接:

Spring实现了数据库的读取和写入。
大多数Spring数据源的配置和使用。
Spring和Mybatis实现了MySQL数据库的主、从读和写分离。
读取/写入计划。
程序层实现读写分离无需做底层复杂的配置,且性能较好,但对应用具有较强的侵入性,不利于扩展。Agent实现完全屏蔽了读取和写入分离的细节,从工程上来说,这是一个较好的实现方法。
代理实现

一个代理执行像这样的拓扑,Web请求集中在一个数据源(代理)上,但是代理重新将请求分流到基于读/写不同的数据服务器上。
MySQL-ProxyMySQL官方提供了一种基于代理的负载平衡,它可以理解SQL语言,当收到SQL请求之后,它会自动将请求分流到Master和Slaves。
注意:MySQL-Proxy现在是Alpha版本,不推荐用于生产环境。
安装

MySQL-Proxy提供了多种安装方法,比较推荐还是通过官方提供的二进制文件进行安装(如果平台不支持,可以考虑自行编译安装)。
shell>cd/usr/local。
shell>tarzxfmysql-proxy-0.8.5-platform.tar.gz。
在安装之后,您可以将$MYSQL-PROXY-DIR/bin目录添加到环境变量中,便于使用。mysql-proxy命令主要用于启动SQL代理,该命令可用于:

>mysql-proxy--proxy-backend-addresses192.168.0.1:3306--proxy-backend-addresses192.168.0.2:3306。
主库和从库的地址都是一样的,这个命令可以被使用多次,这样就可以设置多个库位址(mysql-proxy有很多参数没有仔细研究)。
这种用法也是:

>mysql-proxy-proxy-backend-addresses=MySQL.example.com:3306。
简单地将SQL代理用作普通代理服务。
MySQL-Proxy的工作模式实际上不只是这样,它可以通过lua脚本实现更复杂的逻辑,从而更加精确地控制代理服务的行为。更好的方法是查看文档,了解如何使用lua脚本控制代理行为,

其中提供了一些基本的系统化方法,可以将复杂的路由分布逻辑结合起来。
MySQL-Proxy目前仍处于Alpha阶段,官方建议不用于生产,而且网络上的总体评论不够稳定,而且性能不佳。因此不大愿意作过详细的介绍。当前使用的HAProxy更多,它工作于传输层(TCP/IP),并不能直接解释SQL,因此将比MySQL-Proxy有更高的性能,并且在实际环境中使用得更多。
HAProxy稍微不同于MySQL-Proxy的用法,它需要在应用层进行读写分离,而HAProxy需要分别配置读/写端口,一个用于写入,另一个用于执行读操作。接着,应用层需要做一些修改,这样就会回到最初的应用层做读写分离的情形,唯一的不同就是将情况从最初的一写多读转变为一写。
因此,再次考虑我们最初的解决方案——复杂的负载平衡处理。该方案的不足之处是所有数据库节点都是相同的,而且多个节点之间的同步比较复杂,但幸运的是,现在有许多好的解决方案,如MySQLCLUSTER或GALERACLUSTER,这种群集结构完全屏蔽了复杂的读写分离设计,外部开发界面简单、统一。
虽然每个人都在分享Java架构师学习路线,但是有多少人能够认真实践,这是很难的。网络寒冷的冬天已经来临,身为程序员,此时更应该提高自己,有更高的追求。
上一篇 Java版的5大功能优势
下一篇 返回列表