链接复制成功!
使用RegionlessDB集群实现异地多活
操作场景
业务部署在多区域时,可以使用RegionlessDB集群从就近区域访问数据库。如图1所示,一个RegionlessDB集群拥有一个主实例和两个从实例,读请求发往就近区域进行处理,写请求会从就近区域自动转发到主实例进行处理。主实例完成写入后,将数据同步到其他所有从实例,从而降低跨区域网络时延。
使用须知
请参见约束与限制。
操作步骤
步骤1:创建RegionlessDB集群
- 登录管理控制台。
- 单击管理控制台左上角的,选择区域和项目。
- 在页面左上角单击,选择“数据库 > 云数据库 GaussDB(for MySQL)”。
- 在“RegionlessDB”页面,单击右上角“创建RegionlessDB”。
图2 创建RegionlessDB
- 在“创建RegionlessDB”弹框中,设置RegionlessDB名称、选择主实例地域和主实例。
图3 设置RegionlessDB信息
表1 参数说明 参数名称
说明
RegionlessDB名称
名称长度最小为4个字符,最大为64个字符且不超过64个字节(一个中文字符占用3个字节),必须以字母或中文开头,区分大小写,可以包含字母、数字、中划线、下划线或中文,不能包含其他特殊字符。
主实例地域
选择已有实例目标区域。
主实例
选择已有实例作为RegionlessDB的主实例。
- 单击“确定”。
- 主实例创建成功后,可以对其进行查看和管理。
创建主实例过程中,状态显示为“创建中”。您可以通过“任务中心”查看详细进度和结果。创建完成的主实例状态为“正常”,此时才可以正常使用。
步骤2:添加从实例
- 在“RegionlessDB”页面,找到目标RegionlessDB。
- 单击操作列“添加从实例”。
图4 添加从实例
- 在“创建从实例”页面,设置相关参数。
表2 基本信息 参数
描述
区域
从实例所在区域。
须知:不同区域内的产品内网不互通,且购买后不能更换,请谨慎选择。
创建方式
选择“新创建”。
实例名称
名称长度在4个到64个字符之间,必须以字母开头,可以包含字母、数字、中划线或下划线,不能包含其他特殊字符。
数据库引擎
GaussDB(for MySQL)。
兼容的数据库版本
MySQL 8.0。
内核版本
从实例的内核版本,内核版本需要大于等于2.0.46.231000。
关于各个内核小版本的更新说明请参见内核版本发布记录。
说明:如需设置内核版本,请联系客服人员申请权限。
实例类型
仅支持主备:RegionlessDB主备版包含最少2个最多10个只读节点。
存储类型
共享存储。
可用区类型
可用区指在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。有的区域支持单可用区和多可用区,有的区域只支持单可用区。
- 单可用区:主节点和只读节点部署在同一个可用区。
- 多可用区:您选择主可用区,创建的只读节点会均匀分布在各可用区之间,保证高可靠性。
时区
由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。时区可在创建实例时选择,后期不可修改。
性能规格
GaussDB(for MySQL)支持的性能规格,请参见数据库实例规格。
GaussDB(for MySQL)是基于共享存储架构的云原生数据库。为了保证实例在极高读写压力场景下的业务稳定,会根据规格对实例读写峰值进行智能平滑控制,将实例读写能力稳定在一个较高水平,请您参照性能白皮书,选择合适的性能规格。
CPU架构
实例的CPU和内存,CPU架构分为X86和鲲鹏。
节点数量
从实例所有节点均为只读节点,“按需计费”实例单次创建最多可批量申请10个只读节点。
实例创建成功后,您可根据业务需要,添加只读节点,一个从实例最多可以创建15个只读节点。
存储设置
无需选择存储容量,存储费用按照实际使用量每小时计费。
虚拟私有云
- GaussDB(for MySQL)数据库实例所在的虚拟专用网络,可以对不同业务进行网络隔离。您需要创建或选择所需的虚拟私有云。如何创建虚拟私有云,请参见《虚拟私有云用户指南》中的“创建虚拟私有云基本信息及子网”。
如果没有可选的虚拟私有云,GaussDB(for MySQL)数据库服务默认为您分配资源。
须知:- 请确保从实例选择的虚拟私有云和主实例选择的虚拟私有云已通过VPN连通。
- 目前GaussDB(for MySQL)实例创建完成后不支持切换虚拟私有云,请谨慎选择所属虚拟私有云。
- 通过子网提供与其他网络隔离的、可以独享的网络资源,以提高网络安全性。
内网安全组
内网安全组限制实例的安全访问规则,加强GaussDB(for MySQL)数据库服务与其他服务间的安全访问。请确保所选取的内网安全组允许客户端访问数据库实例。
如果不创建内网安全组或没有可选的内网安全组,GaussDB(for MySQL)数据库服务默认为您分配内网安全组资源。
说明:- 为了保证后续数据库的连接和访问,选择内网安全组时,需在安全组的入方向放开3306端口和ICMP协议。
- 请确保主从实例之间的内网安全组规则是放开的。
参数模板
数据库参数就像是数据库引擎配置值的容器,参数模板中的参数可应用于一个或多个相同类型的数据库实例。实例创建成功后,参数模板可进行修改。
须知:创建数据库实例时,为确保数据库实例正常创建,自定义参数模板中相关规格参数如下不会下发,而是采用系统默认的推荐值。
“innodb_buffer_pool_size”
“innodb_log_buffer_size”
“max_connections”
“innodb_buffer_pool_instances”
“innodb_page_cleaners”
“innodb_parallel_read_threads”
“innodb_read_io_threads”
“innodb_write_io_threads”
“threadpool_size”
您可以在实例创建完成之后根据业务需要进行调整。具体请参见编辑参数模板。
企业项目
该参数针对企业用户使用,如需使用该功能,请联系客服申请开通。
企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。
请在下拉框中选择所在的企业项目,其中,default为默认项目。
标签
可选配置,对关系型数据库的标识。使用标签可以方便识别和管理您拥有的数据库服务资源。每个实例最多支持20个标签配额。
实例创建成功后,您可以单击实例名称,在标签页签下查看对应标签。关于标签的详细操作,请参见标签。
实例密码及大小写敏感与主实例一致,无需单独设置。
- 参数配置完成后,单击页面右下角“立即购买”。
- 确认从实例信息无误后,单击页面右下角“提交”,完成创建从实例的申请。
- 从实例创建成功后,可以在“实例管理”页面对其进行查看和管理。
创建从实例过程中,状态显示为“创建中”。您可以通过“任务中心”查看详细进度和结果。创建完成的实例状态为“正常”,此时,从实例才可以正常使用。
如果主实例的存量数据较多,由于添加从实例需要对新创建的从实例进行全量备份恢复,该流程耗时可能会较长。
步骤3:开启写转发
正常情况下,RegionlessDB集群创建完成后,主实例接收并处理读写请求,从实例只接收读请求。当开启写转发功能后,从实例接收到写请求会自动由从实例转发到主实例进行处理。主实例完成写入后,将数据同步到其他所有从实例。使用写转发可以简化写数据流程,直接通过从实例IP接入数据库服务执行读写操作,并且在满足一致性的同时,不影响就近读能力。
- 写转发只有在从实例的事务隔离级别为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”页面,找到目标RegionlessDB集群。
- 单击操作列“设置写转发”,创建写转发账号。
图5 创建写转发账号
系统会为您自动创建一个内部账号(_@gdb_WriteForward@_)用于支持写转发,便于写请求转发到主实例进行处理。设置写转发账号后请不要自行修改或删除内部账号,否则会影响写转发功能。
- 在“设置写转发”弹框中,确认信息并单击“确定”。
图6 设置写转发
- 在“实例管理”页面,选择指定的RegionlessDB从实例,单击实例名称。
- 在左侧导航栏,选择“参数修改”。
- 在参数页面右上角搜索“rds_open_write_forwarding”,将该值修改为“ON”。
- 单击左上角“保存”,开启写转发功能。
- 在参数页面右上角搜索“rds_write_forward_read_consistency”,修改写转发读一致性级别。
可通过修改参数设置写转发的读一致性范围,具体选项说明详见表3。
表3 参数说明 参数名称
说明
NONE
不启用写转发。
EVENTUAL
在主实例真正执行写操作之前,写入数据是不可见的。查询不会等待RegionLess内主从实例数据同步完成,所以在该级别下,可能读取到未更新的过期数据。
SESSION
通过开启写转发的从实例执行的所有查询,都会看到在本会话中进行的所有数据写入的结果。查询将等待复制中的写转发执行的结果。
GLOBAL
会话可以看到RegionlessDB中所有会话和实例上全部已提交的更改,查询可能会等待一定时间,该等待时间和复制延迟相关。
- 如果业务有读一致性要求,建议一致性级别配置为SESSION。谨慎设置成GLOBAL,GLOBAL会导致所有的读请求花费较大的额外代价,例如使用任一客户端连接GaussDB(for MySQL),且使用GLOBAL级别时,导致进入MySQL命令行的时间变长。
- 事务中无法修改写转发读一致性级别为SESSION。
- 开启写转发参数前,需要确保从实例的事务隔离级别为RR。
- 写转发开启的情况下,不允许修改当前会话的事务隔离级别。
- 事务中不允许修改读一致性级别。
- 单击左上角“保存”。
步骤4:连接RegionlessDB集群进行业务管理
RegionlessDB集群创建成功后,不提供统一的连接地址,但是RegionlessDB集群中的主实例和从实例都提供了独立的连接地址。您可以根据业务接入区域就近连接主实例或从实例,从而连接到RegionlessDB集群。RegionlessDB集群会自动将写请求转发到主实例进行处理,读请求发往就近区域进行处理。
- 连接主实例,向数据库中写入数据。
mysql> CREATE DATABASE mydatabase; mysql> CREATE TABLE orders (order_id INT PRIMARY KEY, customer_name VARCHAR(255), order_date DATE); 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');
- 根据业务接入区域就近使用从实例接入数据库,可以查询到1中写入的数据。
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 | +----------+---------------+------------+
- 通过主实例接入数据库,执行如下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可以查询到4中由从实例写转发插入的数据。
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)