操作指南

API 文档

自动读写分离介绍

最近更新时间:2022-05-18 18:59:13

本文主要介绍云数据库 MySQL 数据库代理服务的自动读写分离、功能优势、读写分离路由规则。

自动读写分离

目前大量现网用户业务场景中存在读多写少、业务负载无法预测等场景,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压力,可以创建一个或多个只读实例,利用只读实例满足大量的数据库读取需求。但此类解决方案需要业务侧支持读写分离改造,其代码的健壮性决定了业务读写分离的质量,对客户的技术要求较高,而且灵活性和可扩展性较差。

故创建只读实例后,可以通过购买数据库代理开启读写分离功能,在应用程序中配置数据库代理地址,就可以使写请求自动转发到主实例,读请求自动转发到各个只读实例。除此之外也能为其他业务痛点提供天然的解决方案,具体如下:

  • 负载无法预测或波动不规律/负载“洪峰”现象明显的场景
    在互联网业务场景中,业务负载和访问压力往往是不可预估、不平稳的,会出现频繁的波动和“洪峰”。如果业务侧大量使用短连接访问数据库,那么在这些场景中很容易产生大量的新建连接,即数据库与应用程序间的连接数容易随着业务访问压力的频繁变动而波动,并且这种场景往往是很难提前预测的。
    数据库专属代理的连接管理,使客户可以通过有效重用数据库连接来适当扩展处理不可预测其工作负载的应用程序。首先,使多个应用程序连接可以共享数据库连接,以有效利用数据库资源。其次,允许客户通过调节打开的数据库连接数来保持可预测的数据库性能。最后,可删除无法使用的应用程序请求,以保留应用程序的整体性能和可用性。

  • 应用程序与数据库频繁建立和断开连接的场景
    基于无服务器、PHP 或 Ruby on Rails 等技术构建的应用程序,可能会频繁打开和关闭数据库连接来满足应用程序请求。
    数据库专属代理可以帮助客户维护数据库连接池,以避免对数据库计算和用于建立新连接的内存造成不必要的压力。

  • 数据库访问连接长时间处于空闲状态并未释放的场景
    SaaS 或电子商务行业中的传统应用程序可能会使数据库连接保持空闲状态,以最大程度减少客户重新参与的响应时间。客户可以使用数据库专属代理来保留空闲连接,仅根据需要建立数据库连接,而不是为支持大多数空闲连接过度调大阈值或提供更高配的数据库。

  • 提高数据库 PaaS 服务故障转移场景下的平滑和稳定
    使用数据库专属代理,用户可以构建可透明容忍数据库故障转移(主动/被动)的应用程序,而无需编写复杂的故障处理代码。数据库专属代理自动将读流量路由到新的数据库实例,同时保留应用程序连接。

功能优势

  • 自助读写分离,统一访问地址。
  • 原生链路支持,提升性能,减少维护成本。
  • 可设权重和阈值,可供用户灵活选择。
  • 具备故障转移能力,即使数据库代理故障请求也能正常访问主库。
  • 主实例发生切换、变配、只读实例增减等情况,数据库代理可动态热加载配置,不会出现网络中断或重启。

读写分离路由规则

发送到主实例

  • CREATE、ALTER、DROP、RENAME 等 DDL 语句。
  • INSERT、UPDATE、DELETE 等 DML 语句。
  • SELECT FOR UPDATE 语句。
  • 临时表相关语句。
  • 部分系统函数调用(如 last_insert_id())以及所有自定义函数调用。
  • LOCK 相关语句。
  • 开启事务后的语句(包括 set autocommit=0)。
  • 存储过程。
  • 用“;”连接的多语句。
  • KILL(SQL 语句中的 KILL,非命令 KILL)。
  • 所有对用户变量的查询和更改。

发送到只读实例

  • 事务外的读(SELECT)语句。

发送到所有实例

  • show processlist 语句。
  • 所有系统变量的更改(SET 命令)。
  • USE 命令。
目录