
# 开通数据库代理实现读写分离
本章节介绍使用数据库代理实现读写分离的过程，主要流程如下：
[步骤1：开通数据库代理]
[步骤2：进行用户认证]
[步骤3：检查安全组规则]
[步骤4：使用代理地址连接TaurusDB实例]
[步骤5：验证读写分离效果]
#### 使用须知
在使用数据库代理之前，请先了解以下内容：
- 在开通数据库代理前，需已购买TaurusDB实例。
- 请参见[数据库代理的约束与限制](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_03_0033.html)。
 
#### 操作步骤
#### 步骤1：开通数据库代理
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在实例管理页面，选择目标TaurusDB实例，单击实例名称，进入实例概览页面。
4. 在左侧导航栏中，单击"数据库代理"，进入数据库代理页面。
5. 单击"新增代理"。
6. 在新增代理页面，设置以下参数，并单击"立即购买"。 
   图1新增代理   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002698110293.png "点击放大")
   
   图2权重设置   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002689335611.png "点击放大")
   
    表1数据库代理参数 
   | **参数名称**  | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|
   | 代理实例名称    | 长度在4个到64个字符之间，必须以字母开头，区分大小写，可以包含字母、数字、中划线或下划线，不能包含其他特殊字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 代理模式      | TaurusDB数据库代理支持读写、TP只读和AP只读三种代理模式，可根据业务需要选择合适的代理模式。 - 读写模式：所有写请求只发往主节点，所有读请求按照读权重配比或者活跃连接数情况分发到已选节点。节点的读权重值默认为100。  - TP只读模式：不接收写请求。所有读请求按照读权重配比或者活跃连接数情况分发到已选只读节点，不会转发到主节点，即使主节点被选为服务节点。 - TP只读模式仅支持读请求业务，写业务请求会有异常提示。  - 在TP只读模式下，不支持DDL、DML操作和临时表操作。    - AP只读模式：不接收写请求。所有读请求按照读权重配比分发到已选节点。目前是公测阶段，如需使用，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。 - 路由模式只支持权重负载，AP节点权重不能全部为0。  - 不支持Binlog拉取功能。  - 不支持会话一致性，仅支持最终一致性。  - 不支持事务拆分。  - 不支持行列自动分流。  - 不支持会话连接池。  - 不支持ALT。  - 不支持新节点自动加入。     |
   | 一致性级别     | TaurusDB实例内核版本为2.0.28.1及以上时支持设置一致性级别。内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。 数据库代理支持如下一致性级别： - 最终一致性 开启数据库代理后，同一会话内，连续多次SELECT请求会根据权重配比，路由到不同的数据库节点，由于主节点与只读节点之间存在复制时延，并且各个只读节点的复制时延大小可能不同，可能会导致每次SELECT请求得到的结果存在差异，因此默认情况下，数据库代理只能保证数据的最终一致。 如果需要减轻主节点压力，让尽量多的读请求路由到只读节点，您可以选择最终一致性。   - 会话一致性 由于最终一致性可能会导致多次SELECT请求的结果存在差异，数据库代理进一步提供了会话级别的数据一致性，保证了在同一会话内，每次SELECT请求都可以获取到该会话中写入操作后的最新数据。 开启会话一致性需要数据库代理的内核版本为2.7.4.0及以上。   - 全局一致性 全局级别的数据一致性保证在不同会话内，数据一致，即写入数据后，立即执行查询类操作，能够准确查到修改后的数据。 建议在业务读多写少的场景下选择全局一致性。 全局一致性需要TaurusDB实例内核版本为2.0.57.240900及以上，还需要数据库代理内核版本为2.25.06.000及以上。 更多关于一致性级别的内容请参见[修改TaurusDB代理的一致性级别](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_11_0041.html)。                                                                                                                                                                                                                                                                                                                                                |
   | 路由模式      | 数据库代理支持如下路由模式： - 权重负载：根据您设置的读权重比例分发读请求。  - 负载均衡：根据数据库节点的活跃连接数情况进行读请求分发，将读请求分发到活跃连接数较少的节点上。 负载均衡模式需要保证数据库代理的内核版本为2.22.07.000及以上。   - 可用区就近负载：根据可用区匹配，代理节点将读请求优先分发到同一可用区的数据库节点。 可用区就近负载模式需要保证数据库代理引擎版本为2.23.12.000及以上。    更多关于路由模式的内容请参见[修改TaurusDB代理的路由模式](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_11_0053.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 代理实例规格    | 根据实际需要选择代理实例规格。 - 鲲鹏通用计算增强型：2 vCPUs \| 4 GB、4 vCPUs \| 8GB、8 vCPUs \| 16 GB  - 通用增强型：2 vCPUs \| 4 GB、4 vCPUs \| 8 GB、8 vCPUs \| 16 GB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 子网        | 该功能当前是公测状态，如需使用，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。 开通数据库代理时可指定代理实例子网。如果TaurusDB实例所在子网为扩展网段，则不支持跨子网开启数据库代理，需要与TaurusDB实例在同一子网。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | IP分配方式    | 支持自动分配和手动分配IPv4地址。 - 自动分配：开通数据库代理时TaurusDB会自动为您配置IPv4代理地址。  - 手动分配：您可以输入子网号段内未使用的IPv4地址，作为TaurusDB实例的代理地址。您可以单击"查看已使用IP地址"，查看已被使用的IP地址。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 代理实例节点数量  | 默认为2个节点。最小支持2个节点，最大支持16个节点。 推荐代理实例节点数量 =（主节点CPU核数+所有只读节点CPU核数总和）/（4\*代理实例CPU核数），计算结果向上取整。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 可用区分配方式   | 支持选择可用区分配方式。 - 自动分配：随机分配代理节点所在可用区，优先与TaurusDB节点所在可用区保持一致。  - 手动分配：按照用户指定的可用区进行分配                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 节点可用区     | 选择代理节点的可用区。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 新节点自动加入   | 开启新节点自动加入开关后，新增的只读节点会自动添加到该数据库代理实例中。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 新节点权重     | 当路由模式为权重负载时，需要设置新节点的读权重。节点的读权重默认为100，读权重越高，处理的读请求越多。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 行存/列存自动引流 | 自动分流功能开启后，数据库代理基于业务流入的SQL语句的实际执行代价来实现自动分流，从而实现SQL查询的最大性能。详细使用及约束请参见[使用行列分流实现OLAP的复杂查询](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_03_0165.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 选择数据库节点   | 勾选需要加入到数据库代理中处理读请求的节点，列表中展示的节点包含TaurusDB节点（主节点、只读节点）和HTAP节点（BE节点、FE节点）。 - 路由模式为负载均衡时，不需要配置读权重。数据库代理会根据节点的活跃连接数情况进行读请求分发，将读请求分发到活跃连接数较少的节点上。  - 路由模式为权重负载时，需要设置主节点和只读节点的读权重。数据库代理会根据您设置的读权重比例分发读请求。 例如：代理实例已选择1个主节点和2个只读节点，读权重配置为100、200、200。 在读写模式下，主节点和2个只读节点将按照1：2：2的比例处理读请求。即主节点处理20%的读请求，2个只读节点分别处理40%的读请求，写请求自动发往主节点。 在只读模式下，主节点权重在进行读请求处理分配时不生效，由2个只读节点分别处理50%的读请求。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
      
   
   
7. 确认数据库代理信息。 
   - 如果需要重新选择，请单击"上一步"，修改基本信息。
   
   - 信息确认无误，单击"提交"，提交创建数据库代理请求。
   
   
   
   
8. 查看代理实例及关联的数据库节点。 
   数据库代理开通后，在数据库代理页面可查看到已创建成功的代理实例。
   图3查看创建成功的代理实例   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002215127621.png "点击放大")
   
   单击左侧导航栏中的"实例概览"，进入TaurusDB实例概览页面。单击页面右上方![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002015402534.png)，选择"查看实例拓扑图"，在实例拓扑图中可查看对应代理实例关联的数据库节点。将鼠标悬浮在节点信息处，可查看该节点的详细信息。
   图4查看代理实例关联节点信息   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002179650470.png "点击放大")
   
   
   
 
#### 步骤2：进行用户认证
在使用数据库代理连接TaurusDB实例前，需要确保当前数据库账号拥有访问数据库代理地址的权限，否则将无法通过数据库代理连接到TaurusDB实例。
您可以通过以下步骤检查权限并授权该账号访问数据库代理地址的权限。
1. 推荐您使用DAS连接TaurusDB实例。 
   1. 在"实例管理"页面，选择目标实例，单击操作列的"登录"，进入数据管理服务实例登录界面。 您也可以在"实例管理"页面，单击目标实例名称，进入"实例概览"页面。在页面右上角，单击"登录"，进入数据管理服务实例登录界面。
      
   
   2. 输入数据库用户名和密码，单击"测试连接"。
   
   
   其他连接方式请参见[连接TaurusDB实例方式介绍](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_03_4005.html)。
   
   
2. 实例连接成功后，执行SQL语句，查看当前数据库账号的host是否包含数据库代理地址。 
   **代理地址获取方式：**单击目标TaurusDB实例，进入基本信息页面。在左侧导航栏单击"数据库代理"，在代理实例列表中查看数据库代理地址。
   ```
   SELECT user,host FROM mysql.user;
   ```
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001987607900.png)
   如果地址为%，表示host包含全部网段。
   
   
3. 如果查询的host不包含数据库代理所在网段，则需要赋予远程访问权限。 
   例如：使用root用户从192.168.0网段连接到TaurusDB实例，您可以在DAS用户管理界面将当前账号的主机设置为192.168.%。具体操作请参见[编辑用户信息](https://support.huaweicloud.com/usermanual-das/das_13_0072.html)。
   图5设置主机IP   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002024167913.png "点击放大")
   
   
   
 
#### 步骤3：检查安全组规则
确保入方向规则和出方向规则允许数据库代理地址访问，默认端口号为3306。
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入实例概览页面。
4. 在"网络信息"模块的"内网安全组"处，单击安全组名称，进入安全组页面。
5. 在入方向规则页签下，默认允许3306端口访问。 
   图6放通3306端口   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002449081273.png "点击放大")
   
   如果没有该条规则，单击"快速添加规则"，弹框页面中勾选"MySQL（3306）"，并设置入方向规则参数，单击"确定"。
   图7快速添加3306端口   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002449082829.png "点击放大")
   
   表2入方向规则参数说明 
   | 参数     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   |:---|:---|
   | 常见协议端口 | 选择"MySQL（3306）"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 类型     | 源地址支持的IP地址类型，如下： - IPv4  - IPv6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 源地址    | 在入方向规则中，用来匹配外部请求的源地址，支持以下格式： - IP地址：表示源地址为某个固定的IP地址。当源地址选择IP地址时，您可以在一个框内同时输入或者粘贴多个IP地址，不同IP地址以","隔开。一个IP地址生成一条安全组规则。 - 单个IP地址：IP地址/掩码。 单个IPv4地址示例为192.168.10.10/32。 单个IPv6地址示例为2002:50::44/128。   - IP网段：IP地址/掩码。 IPv4网段示例为192.168.52.0/24。 IPv6网段示例为2407:c080:802:469::/64。   - 所有IP地址： 0.0.0.0/0表示匹配所有IPv4地址。 ::/0表示匹配所有IPv6地址。     - 安全组：表示源地址为另外一个安全组，您可以在下拉列表中，选择同一个区域内的其他安全组。当安全组A内有实例a，安全组B内有实例b，在安全组A的入方向规则中，放通源地址为安全组B的流量，则来自实例b的内网访问请求被允许进入实例a。  - IP地址组：表示源地址为一个IP地址组，IP地址组是一个或者多个IP地址的集合。您可以在下拉列表中，选择可用的IP地址组。对于安全策略相同的IP网段和IP地址，此处[建议您使用IP地址组简化管理](https://support.huaweicloud.com/usermanual-vpc/vpc_IPAddressGroup_0018.html)。 如果没有可用的IP地址组，请您参见[创建IP地址组](https://support.huaweicloud.com/usermanual-vpc/vpc_IPAddressGroup_0003.html)进行创建。    |
   | 策略     | 安全组规则策略，支持的策略如下： - 如果"策略"设置为允许，表示允许源地址访问安全组内云服务器的指定端口。  - 如果"策略"设置为拒绝，表示拒绝源地址访问安全组内云服务器的指定端口。   安全组规则匹配流量时，首先按照优先级进行排序，其次按照策略排序，拒绝策略高于允许策略。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 优先级    | 安全组规则优先级。 优先级可选范围为1-100，默认值为1，即最高优先级。优先级数字越小，规则优先级级别越高。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 描述     | 安全组规则的描述信息，非必填项。 描述信息内容不能超过255个字符，且不能包含"\<"和"\>"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
      
   
   
 
#### 步骤4：使用代理地址连接TaurusDB实例
1. 在TaurusDB控制台查看代理地址和端口。
   
   单击目标TaurusDB实例，进入实例概览页面。在左侧导航栏单击"数据库代理"，在代理实例列表中查看代理地址和端口号。
   图8查看代理地址和端口   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002215142693.png "点击放大")
   
   
   
2. 登录弹性云服务器。 
   详细内容请参考[《弹性云服务器用户指南》](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0134.html)。
   
   
3. 执行如下命令，通过代理地址连接TaurusDB实例。 
   ```
   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* | 用户名，即TaurusDB数据库管理员账号，默认为root。                                |
      
   
   
 
#### 步骤5：验证读写分离效果
您可以在每次执行完对应的读操作后，通过**show last route**命令来查看本次读操作的路由结果。
以一条读操作为例，介绍查看读请求的路由结果。
1. 使用代理地址连接到TaurusDB实例后，执行读操作。
   
   例如：
   ```
   select 1;
   ```
   图9执行读操作   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001930580614.png)
   
   
2. 执行如下命令，查看[1]中读操作的路由结果。
   
   ```
   show last route;
   ```
   图10结果查询   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000001957940077.png)
   回显中的IP地址为读操作路由到的节点IP。根据设置的[路由模式]，读操作会路由到主节点或只读节点IP。
   ![](https://support.huaweicloud.com/usermanual-taurusdb/public_sys-resources/note_3.0-zh-cn.png)
   请勿将**show last route**用于业务代码或包含在Multi-Statements中执行。
   
   
 
#### 相关API
- [开启数据库代理](https://support.huaweicloud.com/api-taurusdb/CreateGaussMySqlProxy.html)
- [查询数据库代理信息列表](https://support.huaweicloud.com/api-taurusdb/ShowGaussMySqlProxyList.html)
- [查询数据库代理规格信息](https://support.huaweicloud.com/api-taurusdb/ShowGaussMySqlProxyFlavors.html)
- [关闭数据库代理](https://support.huaweicloud.com/api-taurusdb/DeleteGaussMySqlProxy.html)
 
