从实例写转发
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”)会恢复为默认值。
开启写转发
- 登录管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。
- 在页面左上角单击
,选择 。
- 在“全球数据库”页面,找到目标RegionlessDB。
- 单击操作列“设置写转发”,创建写转发账号。
图1 创建写转发账号
系统会为您自动创建一个内部账号(_@gdb_WriteForward@_)用于支持写转发,便于写请求转发到主实例进行处理。设置写转发账号后请不要自行修改或删除内部账号,否则会影响写转发功能。
- 在“设置写转发”弹框中,确认信息并单击“确定”。
图2 设置写转发
- 在“实例管理”页面,选择指定的RegionlessDB从实例,单击实例名称。
- 在左侧导航栏,选择“参数修改”。
- 在参数页面右上角搜索“rds_open_write_forwarding”,将该值修改为“ON”。
图3 开启写转发
- 单击左上角“保存”,开启写转发功能。
- 在参数页面右上角搜索“rds_write_forward_read_consistency”,修改写转发读一致性级别。
图4 修改写转发读一致性级别
可通过修改参数设置写转发的读一致性范围,具体选项说明详见表1。
表1 参数说明 参数名称
说明
NONE
不启用写转发。
EVENTUAL
在主实例真正执行写操作之前,写入数据是不可见的。查询不会等待RegionLess内主从实例数据同步完成,所以在该级别下,可能读取到未更新的过期数据。
SESSION
通过开启写转发的从实例执行的所有查询,都会看到在本会话中进行的所有数据写入的结果。查询将等待复制中的写转发执行的结果。
GLOBAL
会话可以看到RegionlessDB中所有会话和实例上全部已提交的更改,查询可能会等待一定时间,该等待时间和复制延迟相关。
- 如果业务有读一致性要求,建议一致性级别配置为SESSION。谨慎设置成GLOBAL,GLOBAL会导致所有的读请求花费较大的额外代价,例如使用MySQL命令连接MySQL都会由于GLOBAL级别,导致进入MySQL命令行的时间变长。
- 事务中无法修改写转发读一致性级别为SESSION。
- 开启写转发参数前,需要确保从实例的事务隔离级别为RR。
- 写转发开启的情况下,不允许修改当前会话的事务隔离级别。
- 事务中不允许修改读一致性级别。
- 单击左上角“保存”。
验证写转发效果
- 通过主实例接入数据库,执行如下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)
- 通过从实例接入数据库,执行如下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)
- 通过主实例接入数据库,执行如下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)