
# 开通RDS for MySQL数据库代理实现读写分离
创建RDS for MySQL实例后，您可以开通数据库代理，通过代理地址实现读写请求的自动转发。写请求自动访问主节点，读请求按照数据库代理的路由模式分发到各个节点，降低主节点的负载。
本章节介绍使用数据库代理实现读写分离的过程，主要流程如下：
- [步骤1：开通数据库代理]
- [步骤2：进行用户认证]
- [步骤3：检查安全组规则]
- [步骤4：使用读写分离地址连接RDS for MySQL实例]
- [步骤5：验证读写分离效果]
#### 使用须知
在使用数据库代理之前，请先了解以下内容：
- 在开通数据库代理前，需要有已购买成功的RDS for MySQL实例。
- 主实例和只读实例的状态必须均为"正常"。
- 数据库代理支持的区域和版本限制，请参见[数据库代理约束与限制](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0044.html)。
 
 #### 步骤1：开通数据库代理
- [购买单个数据库代理实例]：单个RDS for MySQL实例下仅能购买一个数据库代理实例，适用于单一业务场景，灵活性较低，无法实现业务隔离，仅有单一的数据库访问入口。
- [购买多个数据库代理实例]：华北-北京四、华东-上海一、华南-广州、西南-贵阳一区域默认开通多个数据库代理。单个RDS for MySQL实例下可以购买多个数据库代理实例，最多支持购买4个代理实例。适用于复杂的多业务场景，多代理可以使用多个入口，不同的业务通过不同的入口访问数据库，实现业务隔离，提高资源利用效率。
  更多功能介绍，请参见[RDS for MySQL数据库代理简介](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0016.html)。
  更多区域限制，请参见[数据库代理约束与限制](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0044.html)。
  
 
- [购买单个数据库代理实例]
  
  1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
  
  2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
  
  3. 在实例列表中，单击目标实例的名称，进入实例的"概览"页面。
  
  4. 在左侧导航栏中，单击"数据库代理"。 
     您还可以在实例的"概览"页面，单击"读写分离地址"后的"设置"，跳转到"数据库代理"页面。
     
     
  
  5. 在"数据库代理"页面单击"创建数据库代理"。
  
  6. 在开启数据库代理页面，设置以下参数，单击"下一步"。 
     图1选择权重负载   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212223580.png "点击放大")
     图2选择负载均衡   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212063772.png "点击放大")
     表1基本信息 
     | 参数     | 描述                                                                                                                                                                                                                                                                                                                                                                                                   |
     |:---|:---|
     | 计费模式   | - 按需计费实例开启数据库代理时，仅支持选择按需计费的代理实例。  - 包周期实例开启数据库代理时，支持选择按需计费或包周期的代理实例。其中，如果选择按需计费的代理，创建成功后支持[转为包周期代理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0053.html)。                                                                |
     | 路由模式   | - 权重负载：开启读写分离功能后，用户自行设置主备实例和只读实例的权重。  - 负载均衡：开启了Proxy负载均衡，可以选择该模式。支持基于负载的自动调度策略，读请求将在多个只读节点中按照活跃连接数自动调度，来保证多个只读节点间的负载均衡。   开启数据库代理后，可以修改路由模式，具体操作请参见[设置延时阈值和路由模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html)。 |
     | 主库接受读  | "负载均衡"模式需设置。 - 选择"是"，查询SQL可以发送到主节点和只读节点。  - 选择"否"，查询SQL将仅发送到只读节点，来降低主节点的负载，确保主节点稳定。                                                                                                                              |
     | 性能规格   | 选择代理实例的规格。创建后可以根据业务需求变更规格，具体请参见[变更数据库代理的规格](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0028.html)。 如需查看性能指标，请参见[表2](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0001.html#rds_06_0001__table1377262611585)。                                                                                                                            |
     | 子网     | 选择代理实例所在的子网。                                                                                                                                                                                                                                                                                                                                                                                         |
     | 代理节点数量 | 支持2\~8个节点。创建后可以修改，具体请参见[调整代理节点数量](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0045.html)。                                                                                                                                                                                                                                                                                            |
        
     - 读写分离具备连接保持、读写分离能力。开启读写分离后，将新增1个读写分离连接地址，请将应用连接切换到新地址。
     
     - 读写分离地址：通过读写分离地址连接数据库，可实现读写分离功能。 该读写分离地址与实例的内网IP地址处于同一VPC和子网，且与实例的内网IP地址并存，互不影响。
       
     
     - 延时阈值：对于成功开启读写分离功能的实例，您可以设置其延时阈值。具体操作请参见[设置延迟阈值](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html#rds_11_0018__zh-cn_topic_0200110322_section125241526194010)。
     
     - 负载均衡实例选择：对于成功开启读写分离功能的实例，您可以选择负载均衡实例。
     
     
     
     
  
  7. 确认数据库代理信息。 
     - 如果需要重新选择，单击"上一步"，修改基本信息。
     
     - 信息确认无误，单击"提交"，下发创建数据库代理请求。
     
     
     
     
  
  8. 创建完成后，可以在"数据库代理"页面查看并管理代理服务信息。 
     在"概览"页面查看读写分离地址，通过读写分离地址连接数据库，可实现读写分离功能。
     该读写分离地址与实例的内网IP地址处于同一VPC和子网，且与实例的内网IP地址并存，互不影响。
     图3查看读写分离地址   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212063776.png "点击放大")
     
     
   
- [购买多个数据库代理实例]
  
  1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
  
  2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
  
  3. 在实例列表中，单击目标实例的名称，进入实例的"概览"页面。
  
  4. 在左侧导航栏中，单击"数据库代理"。 
     您还可以在实例的"概览"页面，单击"读写分离地址"后的"设置"，跳转到"数据库代理"页面。
     图4开启读写分离入口   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002287594852.png "点击放大")
     
     
  
  5. 在"数据库代理"页面单击"创建数据库代理"。 
     图5创建数据库代理   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002287700822.png "点击放大")
     
     
  
  6. 在"开启数据库代理服务"页面，填选如下信息后，单击"下一步"。 
     图6选择权重负载   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002736636867.png "点击放大")
     图7选择负载均衡   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002706917802.png "点击放大")
      表2基本信息 
     | 参数       | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
     |:---|:---|
     | 计费模式     | - 按需计费实例开启数据库代理时，仅支持选择按需计费的代理实例。  - 包周期实例开启数据库代理时，支持选择按需计费或包周期的代理实例。其中，如果选择按需计费的代理，创建成功后支持[转为包周期代理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0053.html)。                                                                                                                                                                                                                                                                                  |
     | 代理名称     | 实例名称长度最小为4个字符，最大为64个字符，如果名称包含中文，则不超过64字节（注意：一个中文字符占用3个字节），必须以字母或中文开头，区分大小写，可以包含字母、数字、中划线、下划线、英文句号或中文，不能包含其他特殊字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 读写属性     | - 读写：读写分离。  - 只读：不连接主实例，无法接收写请求。                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 路由模式     | - 权重负载：开启读写分离功能后，用户自行设置主备实例和只读实例的权重。  - 负载均衡：支持基于负载的自动调度策略，读请求将在多个只读节点中按照活跃连接数自动调度，来保证多个只读节点间的负载均衡。   开启数据库代理后，可以修改路由模式，具体操作请参见[设置延时阈值和路由模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html)。                                                                                                                                                                                                                                               |
     | 主库接受读    | 仅"负载均衡"模式需设置。 - 选择"是"，读请求可以发送到主节点和只读节点，这在一定程度上，会增加主节点的负载，请您根据业务需求配置该开关。  - 选择"否"，读请求仅发送到只读节点，来降低主节点的负载，确保主节点稳定。                                                                                                                                                                                                                                                                                                                               |
     | 性能规格     | 选择代理实例的规格。创建后可以变更规格，具体请参见[变更数据库代理的规格](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0028.html)。 如需查看性能指标，请参见[表2](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0001.html#rds_06_0001__table1377262611585)。                                                                                                                                                                                                                                                                                                                                                        |
     | 代理节点数量   | 支持2\~8个节点。创建后可以修改，具体请参见[调整代理节点数量](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0045.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
     | 权重设置     | 仅"权重负载"模式需设置。选择需要分配权重的主实例和只读实例。 读权重分配： - 读权重越高，处理的读请求越多，假设已选2个实例，权重分别设置为100，200，则当前proxy全部读请求自动按照1:2的比例发往已选实例（未选择的实例权重会设置为0）。  - 一个只读实例可以关联多个代理，建议您根据当前主实例下只读实例的已有代理权重和流量拓扑设置当前代理的权重，尽量避免一个只读实例承载过多读请求。  - 对于成功开启读写分离功能的实例，您可以设置其主实例和只读实例的权重。具体操作请参见[设置延时阈值和路由模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html)。   |
     | 负载均衡实例选择 | 仅"负载均衡"模式需设置。选择需要参与负载均衡的只读实例。 选择负载均衡时，数据库代理会按照后端数据库节点的活跃连接数情况，来进行读请求的转发，将读请求转发到活跃连接数少的数据库节点上。 对于成功开启读写分离功能的实例，您可以设置负载均衡实例。具体操作请参见[设置延时阈值和路由模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html)。                                                                                                                                                                                                                                                                                                                                            |
        
     
     
  
  7. 确认数据库代理信息。 
     - 如果需要重新选择，单击"上一步"，修改基本信息。
     
     - 信息确认无误，单击"提交"，下发创建数据库代理请求。
     
     
     
     
  
  8. 创建完成后，可以在"数据库代理"页面查看并管理代理服务信息。
     
     在"概览"页面查看读写分离地址，通过读写分离地址连接数据库，可实现读写分离功能。
     该读写分离地址与实例的内网IP地址处于同一VPC和子网，且与实例的内网IP地址并存，互不影响。
     图8查看读写分离地址   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247143585.png "点击放大")
     
     
   
 #### 步骤2：进行用户认证
在使用数据库代理连接RDS for MySQL实例前，需要确保当前数据库账号具有访问数据库代理地址的权限，否则将无法通过数据库代理连接到RDS for MySQL实例。
您可以通过以下步骤来检查权限并授权该账号访问数据库代理地址的权限。
1. [连接RDS for MySQL实例](https://support.huaweicloud.com/usermanual-rds-mysql/rds_mysql_connect_00.html)。
2. 实例连接成功后，执行下列SQL语句，查看当前数据库账号的host是否包含数据库代理地址。 
   ```
   SELECT user,host FROM mysql.user;
   ```
   图9查看host地址   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247223645.png "点击放大")
   如果地址为%，表示host包含全部网段。
   
   
3. 如果查询的host不包含数据库代理所在网段，则需要赋予远程访问权限。 
   例如：使用root用户想要从192.168.0网段连接到RDS for MySQL实例，您可以在DAS用户管理界面将当前账号的主机设置为192.168.%。具体操作请参见[编辑用户信息](https://support.huaweicloud.com/usermanual-das/das_13_0072.html)。
   图10设置主机IP   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247223657.png "点击放大")
   
   
 
 #### 步骤3：检查安全组规则
确保安全组入方向规则允许数据库代理地址访问，默认端口号为3306。
1. 在"实例管理"页面，选择目标实例，单击实例名称，进入实例的"概览"页面。
2. 在左侧导航栏，单击"连接管理"，在"安全组规则"模块，单击安全组名称，查看安全组规则。
3. 在入方向页签下，默认允许3306端口访问。 
   图11放通3306端口   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247223661.png "点击放大")
   如果没有该条规则，单击"添加入方向规则"或者"一键添加"，设置安全组规则。
   图12添加入方向规则   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212063780.png "点击放大")
   
   
 
 #### 步骤4：使用读写分离地址连接RDS for MySQL实例
1. 参考[8]，获取读写分离地址和端口。
   
   图13获取读写分离地址和端口   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212223556.png "点击放大")
   
   
2. 登录弹性云服务器。 
   详细内容请参考[《弹性云服务器用户指南》](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0134.html)。
   
   
3. 执行如下命令，通过读写分离地址连接RDS for MySQL实例。 
   ```
   mysql -h <host> -P <port> -u <userName> -p
   ```
   示例：
   ```
   mysql -h 192.168.0.61 -P 3306 -u root -p
   ```
   出现如下提示时，输入数据库账号对应的密码：
   ```
   Enter password:
   ```
   表3参数说明 
   | 参数             | 说明                                            |
   |:---|:---|
   | \<*host*\>     | [1]中获取到的读写分离地址。 |
   | *\<port\>*     | [1]中获取到的数据库端口。  |
   | \<*userName*\> | 用户名，即数据库管理员账号，默认为root。                        |
      
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   当您使用MySQL8.0客户端访问数据库代理时，可能会报错**auth** **user failed**。
   在连接数据库时添加 **--default-auth=mysql_native_password**。
   
   
 
 #### 步骤5：验证读写分离效果
您可以在每次执行完对应的读操作后，通过**show last route**命令来查看本次读操作的路由结果。
以下步骤以一条读操作为例，介绍查看读请求的路由结果。
1. 连接到RDS for MySQL实例后，执行读操作。
   
   示例：
   ```
   select 1;
   ```
   图14执行读操作   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247143569.png)
   
   
2. 执行如下命令，查看[1]中读操作的路由结果。
   
   ```
   show last route;
   ```
   图15结果查询   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002247143577.png)
   回显中的IP地址为读操作路由到的节点IP。根据设置的[路由模式]，读操作会路由到主节点或只读节点IP。
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   请勿将**show last route**用于业务代码或包在Multi-Statements中执行。
   
   
 
#### 常见问题
#### 如何查看主节点和只读节点IP地址？
- 查看主节点IP：
  1. 在"实例管理"页面，单击主实例名称，进入主实例"概览"页。
  
  2. 在"内网地址"处，查看主节点IP。
   

- 查看只读节点IP：
  1. 在"实例管理"页面，单击![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002287894156.png)展开只读实例，单击只读实例名称，进入只读实例"概览"页。
  
  2. 在"内网地址"处，查看只读节点IP。
   
 
#### 相关API
- [开启数据库代理](https://support.huaweicloud.com/api-rds/rds_11_0033.html)
- [查询数据库代理信息列表](https://support.huaweicloud.com/api-rds/rds_11_0034.html)
- [查询数据库代理规格信息](https://support.huaweicloud.com/api-rds/rds_11_0035.html)
- [设置读写分离路由模式](https://support.huaweicloud.com/api-rds/rds_11_0036.html)
- [关闭数据库代理](https://support.huaweicloud.com/api-rds/rds_11_0038.html)
 
