云妹导读:
互联网公司业务往往都有着高并发、大数据量等特点,为了在激烈的市场竞争中占得先机,需要不断推陈出新,并做大量的促销运营活动。但由于互联网的特殊性,企业无法提前预判这些活动给技术架构带来的压力,只能寄希望于 IT 的伸缩能力,所以互联网公司对于系统的扩展能力都有着执着追求。本篇文章将为大家揭秘互联网圈最受欢迎的数据库MySQL,是如何通过读写分离方法保障数据库的高性能与高扩展的。
数字化时代,数据库对任何企业而言都是其应用的核心资源。MySQL作为当前最流行的关系型数据库,虽然是开源软件,但是其简单易懂、易于部署管理,且具有ACID特性、强大的SQL查询等特点,被各种业务系统作为关键的核心存储。
随着业务量的发展和数据量的增长,单机版本的数据库很难满足业务需要,而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主从实例或者只读实例触发扩容、缩容的业务流程时,“读写分离代理”会自动调整将读写请求转发到新的实例;
只读实例的创建和删除,“读写分离代理”会在用户添加新只读实例后,根据负载均衡算法,自动转发请求到新只读实例;当用户删除只读实例后,“读写分离代理”会自动停止转发请求到已删除的只读实例。
“读写分离代理”虽然会在客户端与数据库之间引入代理转发请求,会有性能损耗,但是后端是有多个只读节点响应请求,京东智联云的只读实例数据量最大是8个,所以在用户业务读请求很大的情况下,使用“读写分离代理”是提升性能的最佳方法。
通过上述内容,想必大家已经对MySQL是如何用读写分离的方法保障高性能扩展有了初步了解,如果还想进一步体验MySQL 服务,请点击【产品详情】链接体验试用。