更新时间:2024-08-02 GMT+08:00
分享

从实例写转发

RegionlessDB创建完成后,支持启用写转发功能,将从实例写操作转发到主实例。主实例完成写入后,将数据同步到其他所有从实例。用户使用写转发简化写数据流程,直接通过从实例IP接入数据库服务执行写操作,并且在满足一致性的同时,不影响就近读能力。

前提条件

已创建RegionlessDB,具体操作请参见创建RegionlessDB

使用须知

  • 请参见约束与限制
  • 写转发只有在从实例的事务隔离级别为RR的场景下才支持。
  • 当前版本从实例进行写转发时,暂不支持显示WARNING和RECORD信息。
  • 当前版本从实例进行写转发时,暂不支持中断执行中的SQL请求。
  • 写转发会创建用户“_@gdb_WriteForward@_”,请不要修改或者删除该用户,否则写转发功能无法正常运行。
  • 支持的写转发命令如下:
    • SQLCOM_UPDATE
    • SQLCOM_INSERT
    • SQLCOM_DELETE
    • SQLCOM_INSERT_SELECT
    • SQLCOM_REPLACE
    • SQLCOM_REPLACE_SELECT
    • SQLCOM_DELETE_MULTI
    • SQLCOM_UPDATE_MULTI
    • SQLCOM_ROLLBACK

      如果执行了不支持的写转发命令,会出现如下报错信息:

      ERROR xxx (yyy): This version of MySQL doesn't yet support 'operation with write forwarding'.

      其中“operation”为具体不支持的操作类型。

  • 不支持的场景:
    • SELECT FOR UPDATE语句。
    • EXPLAIN写转发语句。
    • 写转发的语句包含SET VARIABLE。
    • 在写转发开启的场景下,不支持SAVEPOINT。
    • XA事务中不支持写转发。
    • 当前不支持START TRANSACTION READ WRITE,可以直接使用START TRANSACTION进行测试写转发。
    • 存储过程中不支持写转发。
    • 写转发开启时,不支持创建临时表,如果需要创建临时表,可以暂时关闭写转发进行创建。
  • 针对会隐式提交的命令,在不支持写转发的情况下,也会自动提交当前节点和主节点对应的事务。
  • 针对全局一致性级别,每个事务第一次访问数据之前,需要使用会话池中的连接,从主节点获取数据点位(LSN),如果没有可以使用的会话,可能会导致读取数据的命令失败。
  • 如果用户使用写转发的会话出现连接错误,并且用户处于多语句事务中,服务端会主动关闭与客户端和主节点的连接,保证客户端能够感知到对应的错误。
  • 主从实例的版本需要保持为最新版本。
  • 由于写转发是转发到主节点上执行,如果只读节点有相同数据库下的同名临时表,最终以主节点的数据为准。
  • 从实例如果参与了区域切换或者故障转移,写转发相关参数(“rds_open_write_forwarding”“rds_write_forward_read_consistency”)会恢复为默认值。

开启写转发

  1. 登录管理控制台
  2. 单击管理控制台左上角的,选择区域和项目。
  3. 在页面左上角单击,选择数据库 > 云数据库 GaussDB(for MySQL)
  4. 在“全球数据库”页面,找到目标RegionlessDB。
  5. 单击操作列“设置写转发”,创建写转发账号。

    图1 创建写转发账号

    系统会为您自动创建一个内部账号(_@gdb_WriteForward@_)用于支持写转发,便于写请求转发到主实例进行处理。设置写转发账号后请不要自行修改或删除内部账号,否则会影响写转发功能。

  6. “设置写转发”弹框中,确认信息并单击“确定”

    图2 设置写转发

  7. 在“实例管理”页面,选择指定的RegionlessDB从实例,单击实例名称。
  8. 在左侧导航栏,选择“参数修改”。
  9. 在参数页面右上角搜索“rds_open_write_forwarding”,将该值修改为“ON”。

    图3 开启写转发

  10. 单击左上角“保存”,开启写转发功能。
  11. 在参数页面右上角搜索“rds_write_forward_read_consistency”,修改写转发读一致性级别。

    图4 修改写转发读一致性级别

    可通过修改参数设置写转发的读一致性范围,具体选项说明详见表1

    表1 参数说明

    参数名称

    说明

    NONE

    不启用写转发。

    EVENTUAL

    在主实例真正执行写操作之前,写入数据是不可见的。查询不会等待RegionLess内主从实例数据同步完成,所以在该级别下,可能读取到未更新的过期数据。

    SESSION

    通过开启写转发的从实例执行的所有查询,都会看到在本会话中进行的所有数据写入的结果。查询将等待复制中的写转发执行的结果。

    GLOBAL

    会话可以看到RegionlessDB中所有会话和实例上全部已提交的更改,查询可能会等待一定时间,该等待时间和复制延迟相关。

    • 如果业务有读一致性要求,建议一致性级别配置为SESSION。谨慎设置成GLOBAL,GLOBAL会导致所有的读请求花费较大的额外代价,例如使用MySQL命令连接MySQL都会由于GLOBAL级别,导致进入MySQL命令行的时间变长。
    • 事务中无法修改写转发读一致性级别为SESSION。
    • 开启写转发参数前,需要确保从实例的事务隔离级别为RR。
    • 写转发开启的情况下,不允许修改当前会话的事务隔离级别。
    • 事务中不允许修改读一致性级别。

  12. 单击左上角“保存”。

验证写转发效果

  1. 通过主实例接入数据库,执行如下SQL创建数据库mydatabase及表orders。

    mysql> CREATE DATABASE mydatabase;
    Query OK, 1 row affected (0.00 sec)
    mysql> USE mydatabase;
    Database changed
    mysql> CREATE TABLE orders (order_id INT PRIMARY KEY, customer_name VARCHAR(255), order_date DATE);
    Query OK, 0 rows affected (0.01 sec)

  2. 通过从实例接入数据库,执行如下SQL向orders表中写入3条数据,并查询写入的数据。

    mysql> INSERT INTO orders (order_id, customer_name, order_date) VALUES (1, 'UserA', '2023-12-18'), (2, 'UserB', '2023-12-17'), (3, 'UserC', '2023-12-16');
    Query OK, 3 rows affected (0.00 sec)
    mysql> SELECT * FROM mydatabase.orders;
    +----------+---------------+------------+
    | order_id | customer_name | order_date |
    +----------+---------------+------------+
    |        1 | UserA         | 2023-12-18 |
    |        2 | UserB         | 2023-12-17 |
    |        3 | UserC         | 2023-12-16 |
    +----------+---------------+------------+
    3 rows in set (0.01 sec)

  3. 通过主实例接入数据库,执行如下SQL可以查询到2中由从实例写转发插入的数据。

    mysql> SELECT * FROM mydatabase.orders;
    +----------+---------------+------------+
    | order_id | customer_name | order_date |
    +----------+---------------+------------+
    |        1 | UserA         | 2023-12-18 |
    |        2 | UserB         | 2023-12-17 |
    |        3 | UserC         | 2023-12-16 |
    +----------+---------------+------------+
    3 rows in set (0.00 sec)

相关文档