
# 修改TaurusDB代理的一致性级别
#### 操作场景
使用TaurusDB 读写分离功能，会将SELECT分发至只读节点以降低主节点负载。TaurusDB主节点与只读节点共享底层存储，保证只读节点数据的最终一致性。但主节点的数据更新仍需通过redo日志同步到只读库，存在与写入压力相关的时延，因此在最终一致性下，无法保证分发至只读节点的SELECT能够获取到最新数据。
为解决SELECT无法获取最新数据问题，TaurusDB提供了三种一致性级别：最终一致性、会话一致性、全局一致性，满足您在不同业务场景下对一致性级别的要求。
云数据库 TaurusDB支持在创建数据库代理时设置一致性级别，具体请参见[开通数据库代理](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_11_0017.html#ZH-CN_TOPIC_0000001882727556__section331014103811)。也支持数据库代理创建成功后修改一致性级别。
本章节主要介绍数据库代理创建成功后修改一致性级别的方法。
#### 一致性级别介绍
- [最终一致性（默认）]
  - **功能介绍**
    开启数据库代理后，同一会话内，连续多次SELECT请求会根据权重配比，路由到不同的数据库节点，由于主节点与只读节点之间存在复制时延，并且各个只读节点的复制时延大小可能不同，可能会导致每次SELECT请求得到的结果存在差异，因此默认情况下，数据库代理只能保证数据的最终一致。
    
  
  - **适用场景**
    需要减轻主节点压力，让尽量多的读请求路由到只读节点，或您的业务读写比例为写多读少，您可以选择最终一致性。
    
   
- [会话一致性]
  - **功能介绍**
    由于最终一致性可能会导致多次SELECT请求的结果存在差异，数据库代理进一步提供了会话级别的数据一致性，保证了在同一会话内，每次SELECT请求都可以获取到该会话中写入操作后的最新数据。
    
  
  - **工作原理**
    数据库代理会记录每个数据节点的日志序号（Log Sequence Number，简称LSN），同时针对每一个会话也会维护对应的LSN，即Session LSN。当某个会话有数据更新操作执行完成时，数据库代理会根据当时主节点的LSN来更新对应的Session LSN，后续有读请求进来时，数据库代理会比较Session LSN以及各个数据节点的LSN，将请求发往LSN大于或等于Session LSN的数据节点，从而保证当前会话内，SELECT请求总能获取到上一次更新操作后的最新数据。
    **开启会话一致性后，如果主节点与读节点复制时延较大，各个读节点LSN均小于Session LSN，会导致SELECT请求发送到主节点，从而增大主节点的压力。**
    图1会话一致性实现原理   
    ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002396937620.png "点击放大") 
  
  - **适用场景**
    TaurusDB的一致性级别越高，对主库的压力越大。若您的业务中存在同一会话内即写即查场景，您可以选择会话一致性。
    
   
- [全局一致性（公测）]
  - **功能介绍**
    会话一致性保证了同一个会话内，一定能够查询到读请求执行前已更新的数据，例如[图2]中读请求R(x1)依赖写请求W(x1, 4)的更新场景。但是在部分场景中，会话间也有依赖关系。例如[图3]中，Conn_2连接的R(x1)依赖Conn_1连接W(x1, 4)的更新数据，此时会话一致性无法保证查询结果的一致性，因此TaurusDB提供了全局一致性功能来解决该问题，保证在不同会话内，数据一致，即写入数据后，立即执行查询类操作，能够准确查到修改后的数据。
    图2会话内依赖关系   
    ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002397202640.png "点击放大")
    图3会话间依赖关系   
    ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002430684021.png "点击放大") 
  
  - **工作原理**
    TaurusDB利用很短的复制延时和共享式分布式日志存储技术，在纯内核层面提供了只读节点强一致性读服务。在全局一致性功能开启之后，当某一个会话的数据更新操作执行完成后，此时主节点的LSN会被更新为最新的LSN，后续读请求进来时，数据库代理会按照代理的路由模式直接路由到预期的节点上。由于存在主从复制延迟间隙，只读节点上当前LSN可能仍滞后于主节点。内核层面此时会立即加快只读节点的LSN推进，在毫秒级内完成只读节点和主节点的LSN同步。同步完成后，再对该读请求进行响应，保证读请求能够读到至请求发起时刻为止，任意一条已经完成更新的数据。
    如下图，当UPDATE语句下发到主机后，主机的LSN会从6推进到10，那么当下发到只读节点的第一个SELECT语句查询结果时，需要等备机的LSN从2推进到10后再返回最新结果；当下发到只读节点的第二个SELECT语句查询结果时，需要等备机的LSN从5推进到10后再返回最新结果。
    图4全局一致性原理图   
    ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002430797069.png "点击放大")
    
    
  
  - **适用场景**
    当主节点与只读节点之间延迟较高时，使用全局一致性可能会导致更多的请求被路由到主节点，造成主节点压力增大，业务延迟也可能增加。因此建议您在读多写少的场景下选择全局一致性。
    
  
  - **参数配置**
    全局一致性提供以下两个配置参数：
    表1全局一致性参数说明 
    | **参数**                   | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
    |:---|:---|
    | **consistTimeout**       | 全局一致性读超时时间，允许只读节点的LSN更新至主节点最新LSN的时间。 取值范围0-60000，默认值为20，单位为毫秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
    | **consistTimeoutPolicy** | 全局一致性读超时策略，若未能在参数consistTimeout设置的时间内将只读节点的LSN更新至主节点最新LSN，数据库代理将根据consistTimeoutPolicy参数设置进行对应操作。 取值范围： - 1（默认）：将读请求发送至主节点。  - 0：代理返回如下错误： ``` ERROR 7550: Query execution was interrupted, wait replication complete timeout,please retry ```    |
       
    
  
  - **注意事项**
    - 全局一致性开通只对新连接生效、仅支持通过Proxy连接的场景。
    
    - 全局一致性开关跟数据库代理实例绑定，在多个数据库代理实例场景下，可以根据不同业务的需要，按需提供全局一致性服务。
    
    - 只读模式的数据库代理在开启全局一致性功能后，无法修改consistTimeoutPolicy参数，只会返回错误报文到客户端。
    
    - 打开只读节点的查询缓存功能，将不支持全局一致性。
    
    - 开启全局一致性并选择默认的**consistTimeoutPolicy** 参数后，整个数据库集群的读写性能可能会因主节点与只读节点之间的复制延迟而有所下降。**consistTimeout**作为调优参数，可根据实际业务变化调整。
    
    - 开启全局一致性，读节点存在复制延迟，当读节点并发读压力大时，对应读节点上活跃连接数会升高、数据库实例读性能下降，建议客户将代理的路由模式配置为负载均衡，通过活跃连接数情况进行读请求分发，来充分发挥数据库实例的读性能。
    
    - 开启全局一致性，若业务压力较大导致CPU满载，服务可能出现闪断的情况。
    
    - 全局一致性当前支持的语法如下：SELECT，HANDLER READ。 请在此SQL范围内使用全局一致性，请勿使用其他查询语句，否则最终实现的可能是最终一致性。
      
    
    - 当前全局一致性仅保证数据行（SELECT/HANDLER READ）的一致性，不保证元数据（表结构、索引、存储过程等）的一致性。SHOW类语句及USE DATABASE无法保证获取到执行DDL后的最新元数据，如需获取最新元数据，请通过SELECT查询information_schema替代。
     
   
#### 版本约束
- 会话一致性需要TaurusDB实例内核版本为2.0.28.10及以上，还需要数据库代理内核版本为2.7.4.0及以上。
- 全局一致性需要TaurusDB实例内核版本为2.0.57.240900及以上，还需要数据库代理内核版本为2.25.06.000及以上。
内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
#### 使用须知
- 全局一致性功能当前处于公测状态，如需使用，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。
- 修改一致性级别后，需要您在管理控制台上手动重启数据库代理或与数据库代理重新建立连接。重启数据库代理实例请参见[重启TaurusDB代理](https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_11_0046.html)。
 
#### 操作步骤
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. 单击目标代理实例名称，在"实例信息"模块的"一致性级别"处，单击"修改"。 
   图5修改一致性级别   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002247245066.png "点击放大")
   
   
   
6. 单击下拉箭头，选择对应的一致性级别。 
   图6修改一致性级别   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002247408714.png "点击放大")
   
   
   
   
7. 单击"确定"，代理实例运行状态变为"修改一致性级别中"，此过程大概需要几分钟。
8. 修改完成后，代理实例运行状态变为"正常"，您可查看到一致性级别已更新。
 
#### 相关API
[修改代理会话一致性](https://support.huaweicloud.com/api-taurusdb/UpdateProxySessionConsistence.html)
