数字化时代,数据库对任何企业而言都是其应用的核心资源。MySQL做为当前最流行的关系型数据库,虽然是开源软件,可是其简单易懂、易于部署管理,且具备ACID特性、强大的SQL查询等特色,被各类业务系统做为关键的核心存储。java
随着业务量的发展和数据量的增加,单机版本的数据库很难知足业务须要,而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/r...
下面从该功能的数据面和控制面来介绍下基本原理和最佳实践。
用户在建立读写分离代理的时候会配置只读库延迟、健康检查、负载均衡策略等参数,根据用户业务特色,实现读写分离功能。
京东智联云“读写分离代理”建立界面以下:
- _只读实例延迟阈值:_只读实例与主实例的延迟超过阈值后,只读实例将从读写代理后端被移除。
- 负载均衡策略:读写代理分发读写请求的负载均衡策略,支持最少活跃链接数、最少链接数、最小同步时延、平均响应时延。
- 链接超时时间:只读实例健康检查的方法。超时后只读实例将从读写代理后端被移除。
- _重复次数:_只读实例健康检查的方法。重试次数超过指定次数后,只读实例健康检查失败,将从读写代理后端被移除。
- 检查时间间隔:只读实例健康检查的方法,根据时间间隔对读写代理后端的只读实例进行健康检查。
最佳实践:只读实例延迟阈值根据业务特色配置,默认时间是100s,强烈建议该值_大于_检查时间间隔时间。
经过RDS控制台,能够管理“读写分离代理”的整个生命周期,包括建立、修改配置、删除和开启公网访问。除此以外,“读写分离代理”还能够感知转发MySQL实例的高可用切换、修改配置流程、只读实例的建立和删除。
- 高可用切换,当转发的MySQL发生主从高可用切换的时候,“读写分离代理”会自动调整写请求转发到新的主库上;
- 修改配置,当转发的MySQL主从实例或者只读实例触发扩容、缩容的业务流程时,“读写分离代理”会自动调整将读写请求转发到新的实例;
- 只读实例的建立和删除,“读写分离代理”会在用户添加新只读实例后,根据负载均衡算法,自动转发请求到新只读实例;当用户删除只读实例后,“读写分离代理”会自动中止转发请求到已删除的只读实例。
“读写分离代理”虽然会在客户端与数据库之间引入代理转发请求,会有性能损耗,可是后端是有多个只读节点响应请求,京东智联云的只读实例数据量最大是8个,因此在用户业务读请求很大的状况下,使用“读写分离代理”是提高性能的最佳方法。
经过上述内容,想必你们已经对MySQL是如何用读写分离的方法保障高性能扩展有了初步了解,若是还想进一步体验MySQL 服务,请点击_【阅读原文】_连接体验试用。