自动读写分离介绍

最后更新时间:2021-08-30 17:09:47

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

    自动读写分离

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

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

    • 具有无法预测的工作负载的应用程序
      支持高度可变工作负载的应用程序可能会尝试打开新的数据库连接突发。数据库专属代理的连接管理使客户可以通过有效地重用数据库连接,来适当地扩展处理不可预测的工作负载的应用程序。
      首先,使多个应用程序连接可以共享数据库连接,以有效利用数据库资源。其次,允许客户通过调节打开的数据库连接数来保持可预测的数据库性能。第三,可删除无法使用的应用程序请求,以保留应用程序的整体性能和可用性。

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

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

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

    功能优势

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

    读写分离路由规则

    发送到主实例

    • 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 命令。