
# 使用RegionlessDB集群实现异地多活
#### 操作场景
业务部署在多区域时，可以使用RegionlessDB集群从就近区域访问数据库。如[图1]所示，一个RegionlessDB集群拥有一个主实例和两个从实例，主实例负责接收和处理读写请求，而从实例仅接收读请求。当开启写转发功能后，从实例接收到的写请求将自动转发到主实例进行处理。主实例完成写入操作后，会将数据同步到其他所有从实例，从而降低跨区域网络时延。使用写转发可以简化写数据流程，直接通过从实例IP地址接入数据库服务执行读写操作，同时在保持数据一致性的情况下，不影响就近读取的能力。
图1异地多活原理图   
![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002166476893.png)
#### RegionlessDB集群约束限制
请参见[约束与限制](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_11_3001.html#ZH-CN_TOPIC_0000001928569873__section93109339310)。
#### 写转发约束限制
- 写转发会创建用户"_@gdb_WriteForward@_"，请不要修改或者删除该用户，否则写转发功能无法正常运行。
- 针对会隐式提交的命令，在不支持写转发的情况下，也会自动提交当前节点和主节点对应的事务。
- 针对全局一致性级别，每个事务第一次访问数据之前，需要使用会话池中的连接，从主节点获取数据点位（LSN），如果没有可以使用的会话，可能会导致读取数据的命令失败。
- 如果用户使用写转发的会话出现连接错误，并且用户处于多语句事务中，服务端会主动关闭与客户端和主节点的连接，保证客户端能够感知到对应的错误。
- 主从实例的版本需要保持为最新版本。
- 由于写转发是转发到主节点上执行，如果只读节点有相同数据库下的同名临时表，最终以主节点的数据为准。
- 从实例如果参与了故障转移，写转发相关参数（"rds_open_write_forwarding"和"rds_write_forward_read_consistency"）会恢复为默认值。
- 支持与不支持的场景如[表1]所示。
   表1写转发支持与不支持的场景说明 
  | 约束限制  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
  |:---|:---|
  | 支持场景  | - 写转发只有在从实例的事务隔离级别为RR的场景下才支持。  - 写转发支持如下命令： - 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"为具体不支持的操作类型。    |
  | 不支持场景 | - 当前版本从实例进行写转发时，暂不支持显示WARNING和RECORD信息。  - 当前版本从实例进行写转发时，暂不支持中断执行中的SQL请求。  - 不支持SELECT FOR UPDATE语句。  - 不支持EXPLAIN写转发语句。  - 不支持写转发的语句包含SET VARIABLE。  - 在写转发开启的场景下，不支持SAVEPOINT。  - XA事务中不支持写转发。  - 当前不支持START TRANSACTION READ WRITE，可以直接使用START TRANSACTION进行测试写转发。  - 存储过程中不支持写转发。  - 写转发开启时，不支持创建临时表，如果需要创建临时表，可以暂时关闭写转发进行创建。                                                                                                                                                                                                                           |
     
  
 
#### 操作步骤
#### 步骤1：创建RegionlessDB集群
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"RegionlessDB"页面，单击右上角"创建RegionlessDB"。
   图2创建RegionlessDB   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001972129642.png "点击放大")
   
   
4. 在"创建RegionlessDB"弹框中，设置RegionlessDB名称、选择主实例地域和主实例。
   图3设置RegionlessDB信息   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001971969894.png "点击放大")
   
   表2参数说明 
   | 参数名称           | 说明                                                                                            |
   |:---|:---|
   | RegionlessDB名称 | 名称长度最小为4个字符，最大为64个字符且不超过64个字节（一个中文字符占用3个字节），必须以字母或中文开头，区分大小写，可以包含字母、数字、中划线、下划线或中文，不能包含其他特殊字符。 |
   | 主实例地域          | 选择已有实例目标区域。                                                                                   |
   | 主实例            | 选择按需计费或包年/包月的已有实例作为RegionlessDB的主实例。                                                          |
      
   
5. 单击"确定"。
6. 主实例创建成功后，可以对其进行查看和管理。 创建主实例过程中，状态显示为"创建中"。您可以通过"任务中心"查看详细进度和结果。创建完成的主实例状态为"正常"，此时才可以正常使用。
   
 
#### 步骤2：添加从实例
1. 在"RegionlessDB"页面，找到目标RegionlessDB。
2. 单击操作列"添加从实例"。
   图4添加从实例   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002008570217.png "点击放大")
   
   
3. 在"创建从实例"页面，设置相关参数。
   表3基本信息 
   | 参数    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|
   | 计费模式  | - 包年/包月：一种预付费模式，即先付费再使用，按照订单的购买周期进行结算。购买周期越长，享受的折扣越大。一般适用于需求量长期稳定的成熟业务。  - 按需计费：一种后付费模式，即先使用再付费，按照实际使用时长计费，秒级计费，按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用，无需提前预置资源，从而降低预置过多或不足的风险。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 区域    | 从实例所在区域。 不同区域内的产品内网不互通，且购买后不能更换，请谨慎选择。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 创建方式  | 选择"新创建"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 实例名称  | 名称长度在4个到64个字符之间，必须以字母开头，可以包含字母、数字、中划线或下划线，不能包含其他特殊字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 数据库引擎 | TaurusDB。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 内核版本  | 从实例的内核版本，内核版本需要大于等于2.0.54.240600。 关于各个内核小版本的更新说明请参见[内核版本发布记录](https://support.huaweicloud.com/kerneldesc-taurusdb/taurusdb_20_0003.html)。 说明： 如需设置内核版本，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 实例类型  | 仅支持集群：RegionlessDB集群版包含最少2个最多10个只读节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 存储类型  | 共享存储。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 可用区类型 | 可用区指在同一区域下，电力、网络隔离的物理区域，可用区之间内网互通，不同可用区之间物理隔离。有的区域支持单可用区和多可用区，有的区域只支持单可用区。 - 单可用区：主节点和只读节点部署在同一个可用区。  - 多可用区：您选择主可用区，创建的只读节点会均匀分布在各可用区之间，保证高可靠性。                                                                                                                                                                                                                                                                                                                                                                                               |
   | 时区    | 由于世界各国家与地区经度不同，地方时也有所不同，因此会划分为不同的时区。时区可在创建实例时选择，后期不可修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 性能规格  | TaurusDB支持的性能规格，请参见[数据库实例规格](https://support.huaweicloud.com/productdesc-taurusdb/taurusdb_01_0004.html)。 TaurusDB是基于共享存储架构的云原生数据库。为了保证实例在极高读写压力场景下的业务稳定，会根据规格对实例读写峰值进行智能平滑控制，将实例读写能力稳定在一个较高水平，请您参照[性能白皮书](https://support.huaweicloud.com/pwp-taurusdb/taurusdb_pwp_0004.html)，选择合适的性能规格。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | CPU架构 | 实例的CPU和内存，CPU架构分为X86和鲲鹏。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 节点数量  | 从实例所有节点均为只读节点，"按需计费"实例单次创建最多可批量申请10个只读节点。 实例创建成功后，您可根据业务需要，添加只读节点，一个从实例最多可以创建15个只读节点。详情请参见[创建只读节点](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_03_0111.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 存储设置  | 无需选择存储容量，存储费用按照实际使用量每小时计费。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 虚拟私有云 | - TaurusDB数据库实例所在的虚拟专用网络，可以对不同业务进行网络隔离。您需要创建或选择所需的虚拟私有云。如何创建虚拟私有云，请参见《虚拟私有云用户指南》中的"[创建虚拟私有云基本信息及子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)"。 如果没有可选的虚拟私有云，TaurusDB数据库服务默认为您分配资源。 注意： - 请确保从实例选择的虚拟私有云和主实例选择的虚拟私有云已通过VPN连通。  - 目前TaurusDB实例创建完成后不支持切换虚拟私有云，请谨慎选择所属虚拟私有云。     - 通过子网提供与其他网络隔离的、可以独享的网络资源，以提高网络安全性。 创建实例时TaurusDB会自动为您配置读写内网地址，您也可输入子网号段内未使用的读写内网地址。    |
   | 内网安全组 | 内网安全组限制实例的安全访问规则，加强TaurusDB数据库服务与其他服务间的安全访问。请确保所选取的内网安全组允许客户端访问数据库实例。 如果不创建内网安全组或没有可选的内网安全组，TaurusDB数据库服务默认为您分配内网安全组资源。 为了保证后续数据库的连接和访问，选择内网安全组时，需在安全组的入方向放开3306端口和ICMP协议。 请确保主从实例之间的内网安全组规则是放开的。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 参数模板  | 数据库参数就像是数据库引擎配置值的容器，参数模板中的参数可应用于一个或多个相同类型的数据库实例。实例创建成功后，参数模板可进行修改。 创建实例时，自定义参数模板中相关规格参数不会下发，是采用系统默认的推荐值，详情请参考[创建实例时需要关注哪些参数](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0159.html)。 您可以在实例创建完成之后根据业务需要进行调整。具体请参见[编辑参数模板](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_configuration.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 企业项目  | 企业项目是一种云资源管理方式，企业项目管理服务提供统一的云资源按项目管理，以及项目内的资源管理、成员管理。 请在下拉框中选择所在的企业项目，其中，default为默认项目。 如果需要自定义企业项目，请在控制台右上角单击"企业 \> 项目管理"，进入"创建企业项目"页面创建，具体请参见[创建企业项目](https://support.huaweicloud.com/usermanual-em/zh-cn_topic_0108763964.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 标签    | 可选配置，对关系型数据库的标识。使用标签可以方便识别和管理您拥有的数据库服务资源。每个实例最多支持20个标签配额。 实例创建成功后，您可以单击实例名称，在标签页签下查看对应标签。关于标签的详细操作，请参见[标签](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_tag.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
      
   ![](https://support.huaweicloud.com/usermanual-taurusdb/public_sys-resources/note_3.0-zh-cn.png)
   实例密码及大小写敏感与主实例一致，无需单独设置。
   
4. 参数配置完成后，单击页面右下角"立即购买"。
5. 确认从实例信息无误后，单击页面右下角"提交"，完成创建从实例的申请。
6. 从实例创建成功后，可以在"实例管理"页面对其进行查看和管理。 创建从实例过程中，状态显示为"创建中"。您可以通过"任务中心"查看详细进度和结果。创建完成的实例状态为"正常"，此时，从实例才可以正常使用。
   如果主实例的存量数据较多，由于添加从实例需要对新创建的从实例进行全量备份恢复，该流程耗时可能会较长。
   
 
#### 步骤3：开启写转发
1. 在"RegionlessDB"页面，找到目标RegionlessDB集群。
2. 单击操作列"设置写转发"，创建写转发账号。 
   图5创建写转发账号   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001972268490.png "点击放大")
   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/public_sys-resources/note_3.0-zh-cn.png)
   系统会为您自动创建一个内部账号（_@gdb_WriteForward@_）用于支持写转发，便于写请求转发到主实例进行处理。设置写转发账号后请不要自行修改或删除内部账号，否则会影响写转发功能。
   
   
3. 在"设置写转发"弹框中，确认信息并单击"确定"。 
   图6设置写转发   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001972428286.png "点击放大")
   
   
   
4. 在"实例管理"页面，选择指定的RegionlessDB从实例，单击实例名称。
5. 在左侧导航栏，选择"参数修改"。
6. 在参数页面右上角搜索"rds_open_write_forwarding"，将该值修改为"ON"。 
   图7开启写转发   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001972268534.png "点击放大")
   
   
7. 单击左上角"保存"，开启写转发功能。
8. 在参数页面右上角搜索"rds_write_forward_read_consistency"，修改写转发读一致性级别。 
   图8修改写转发读一致性级别   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002008828849.png "点击放大")
   可通过修改参数设置写转发的读一致性范围，具体选项说明详见[表4]。
   - 如果业务有读一致性要求，建议一致性级别配置为SESSION。谨慎设置成GLOBAL，GLOBAL会导致所有的读请求花费较大的额外代价，例如使用任一客户端连接TaurusDB，且使用GLOBAL级别时，导致进入MySQL命令行的时间变长。
   
   - 事务中无法修改写转发读一致性级别为SESSION。
   
   - 开启写转发参数前，需要确保从实例的事务隔离级别为RR。
   
   - 写转发开启的情况下，不允许修改当前会话的事务隔离级别。
   
   - 事务中不允许修改读一致性级别。
   
   
    表4参数说明 
   | **参数名称** | **说明**                                                                     |
   |:---|:---|
   | NONE     | 不启用写转发。                                                                    |
   | EVENTUAL | 在主实例真正执行写操作之前，写入数据是不可见的。查询不会等待RegionLess内主从实例数据同步完成，所以在该级别下，可能读取到未更新的过期数据。 |
   | SESSION  | 通过开启写转发的从实例执行的所有查询，都会看到在本会话中进行的所有数据写入的结果。查询将等待复制中的写转发执行的结果。                |
   | GLOBAL   | 会话可以看到RegionlessDB中所有会话和实例上全部已提交的更改，查询可能会等待一定时间，该等待时间和复制延迟相关。              |
      
   
   
9. 单击左上角"保存"。
 
#### 步骤4：连接RegionlessDB集群进行业务管理
RegionlessDB集群创建成功后，不提供统一的连接地址，但是RegionlessDB集群中的主实例和从实例都提供了独立的连接地址。您可以根据业务接入区域就近连接主实例或从实例，从而连接到RegionlessDB集群。RegionlessDB集群会自动将写请求转发到主实例进行处理，读请求发往就近区域进行处理。
示例：
1. 连接主实例，向数据库中写入数据。
   ```
   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');
   ```
   
2. 根据业务接入区域就近使用从实例接入数据库，可以查询到[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 |
   +----------+---------------+------------+
   ```
   
3. 通过主实例接入数据库，执行如下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)
   ```
   
4. 通过从实例接入数据库，执行如下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)
   ```
   
5. 通过主实例接入数据库，执行如下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)
   ```
   
 
