MySQL读写分离怎么实现
这篇文章主要介绍“MySQL读写分离怎么实现”,在日常操作中,相信很多人在MySQL读写分离怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL读写分离怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了秀洲免费建站欢迎大家使用!
随着业务量的发展和数据量的增长,单机版本的数据库很难满足业务需要,而MySQL最常见的性能扩展方法是“读写分离”,其本质是将访问压力分散到多个MySQL节点上,但存储压力并没有分散,“分库分表”可以分散访问和存储压力,但是实现难度维护成本都会大幅增加。
▲读写分离架构图▲
需要主从的集群架构,一主一从或者一主多从;
主库响应写请求,从库响应读请求;
主库通过复制将数据同步到从库,每个节点都保存一份业务数据。
业界实现MySQL的“读写分离”有两种常见方法,客户端实现和代理实现,两种方法各有利弊,需要结合各自业务特点、系统架构、运维能力来选择实现。因为引入代理会使系统架构更加复杂,同时代理自身要考虑性能、高可用、稳定性等因素,中小公司一般使用客户端方法实现读写分离。而大公司有资源去投入数据库代理的开发和维护,当接入的业务越多,带来的价值就越明显。
首先说下客户端实现方法,例如java语言可以基于MyBatis和Hibernate简单封装后,即可实现读写分离,架构图如下:
代理实现方法,需要引入数据库代理,实现读写分离和数据库管理功能,代理兼容SQL协议,对于客户端来说代理就是数据库,架构图如下:
对比两种架构的优缺点:
无论哪种架构,实现逻辑并不复杂,但是有一个细节需要特别注意:MySQL主从复制延迟。
MySQL的复制是异步的,尽管针对不同延迟的原因有响应的优化方案,但是延迟是客观存在的,是不可能百分百避免的。当只读出现较大延迟的时候,就会出现数据不一致,读到的数据是主库提交前的,称之为“过期读”,这时业务上可能就会出现问题。常见的解决方法有:
核心业务读写都指向主库,非核心业务采用读写分离。比如金融类业务,为了保证数据的一致性,牺牲扩展性。比如论坛业务,发帖后会晚一些查询到,它带来的影响会小很多,是可以忍受的;
二次读取,读失败后再查一遍,它和业务逻辑无关,只需要对数据库访问层重新封装即可,实现代价小。不过某些场景下,它扩大的读请求的数量,增加了数据库的压力,比如DDoS攻击,很容易把数据库压垮;
判断延迟再读取,读取从库前判断是否有延迟,没有延迟再从库查询,如果有延迟到主库查询。MySQL自身提供判断延迟的监控方法,如果开启了GTID,直接比较从库的Retrieved_Gtid_Set和Executed_Gtid_Set值,它们相同则表示从库没有延迟;没有开启GTID的情况下,需要比较两组值, Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos这两组值完全相同,则表示从库没有延迟。
京东智联云RDS-MySQL支持“读写分离代理”功能,创建只读实例后,开启读写分离代理,就可以在程序中配置读写代理的地址,由读写代理实现读请求被自动转发到只读实例,写请求被自动转发到主实例。目前MySQL5.6-8.0,Percona和Mariadb都支持开启只读代理。详细介绍信息见:https://docs.jdcloud.com/cn/rds/create-readwriteproxy
下面从该功能的数据面和控制面来介绍下基本原理和最佳实践。
用户在创建读写分离代理的时候会配置只读库延迟、健康检查、负载均衡策略等参数,根据用户业务特点,实现读写分离功能。
京东智联云“读写分离代理”创建界面如下:
只读实例延迟阈值:只读实例与主实例的延迟超过阈值后,只读实例将从读写代理后端被移除。
负载均衡策略:读写代理分发读写请求的负载均衡策略,支持最少活跃连接数、最少连接数、最小同步时延、平均响应时延。
连接超时时间:只读实例健康检查的方法。超时后只读实例将从读写代理后端被移除。
重复次数:只读实例健康检查的方法。重试次数超过指定次数后,只读实例健康检查失败,将从读写代理后端被移除。
检查时间间隔:只读实例健康检查的方法,根据时间间隔对读写代理后端的只读实例进行健康检查。
最佳实践:只读实例延迟阈值根据业务特点配置,默认时间是100s,强烈建议该值大于检查时间间隔时间。
通过RDS控制台,可以管理“读写分离代理”的整个生命周期,包括创建、修改配置、删除和开启公网访问。除此之外,“读写分离代理”还可以感知转发MySQL实例的高可用切换、修改配置流程、只读实例的创建和删除。
高可用切换,当转发的MySQL发生主从高可用切换的时候,“读写分离代理”会自动调整写请求转发到新的主库上;
修改配置,当转发的MySQL主从实例或者只读实例触发扩容、缩容的业务流程时,“读写分离代理”会自动调整将读写请求转发到新的实例;
只读实例的创建和删除,“读写分离代理”会在用户添加新只读实例后,根据负载均衡算法,自动转发请求到新只读实例;当用户删除只读实例后,“读写分离代理”会自动停止转发请求到已删除的只读实例。
到此,关于“MySQL读写分离怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
分享标题:MySQL读写分离怎么实现
标题路径:http://ybzwz.com/article/igsijj.html