一致性级别

最近更新时间:2024-07-09 14:15:51

我的收藏
TDSQL-C MySQL 版的自动读写分离功能,会在 TDSQL-C MySQL 版与应用程序间建立好连接,进而解析发送进来的每一条 SQL,如果是 CREATE、ALTER、DROP、RENAME 等语句则直接发往读写实例,如果是事务外的读(SELECT)语句则发送到只读实例,从而实现了读写分离。但是当数据库负载很高,如大批量插入数据的时候,延迟会非常严重,导致无法从只读节点中读取最新数据。
当读写实例有数据更新后,相关的更新会应用到只读实例,其中数据同步的延迟时间与写入压力有关。TDSQL-C MySQL 版通过提供不同的一致性级别,来保证业务访问数据库的数据一致性要求。
TDSQL-C MySQL 版提供了以下三种一致性级别,满足您在不同场景下对一致性的要求:
最终一致性
会话一致性
全局一致性

最终一致性

功能简介 TDSQL-C MySQL 版的数据库代理实现了自动读写分离功能,在自动读写分离场景下默认提供数据的最终一致性,从而保证只读实例对已改变写的数据的读取,最终都能取得已更新的数据,但不完全保证能立即取得。已更新的数据主从复制延迟会导致从不同节点查询到的结果不同。
适用场景 如需要减轻读写实例压力,让尽量多的读请求路由到只读实例,对一致性要求不是很高的场景您可以选择最终一致性。

会话一致性

功能简介 有些场景要求一致性较高,而最终一致性会导致查询的结果有所不同,通常需要对业务进行拆分,将一致性要求高的请求直接发往读写实例,而可以接受最终一致性的请求则通过读写分离发往只读实例。这既会增加读写实例的压力,影响读写分离的效果,又会增加应用开发的负担。
为解决上述问题,TDSQL-C MySQL 版提供会话一致性。会话一致性保证了同一个会话内,一定能够查询到读请求执行前已更新的数据,确保了数据单调性。
在 TDSQL-C MySQL 版的链路中间层做读写分离的同时,中间层会追溯各个节点已经应用的日志位点,即日志序号(Log Sequence Number,简称 LSN)。同时每次数据更新时 TDSQL-C MySQL 版会记录此次更新的位点为 Session LSN。当有新请求到来时, TDSQL-C MySQL 版会比较 Session LSN 和当前各个实例的 LSN,仅将请求发往 LSN 大于或等于 Session LSN 的实例,从而保证了会话一致性。

在上述场景中,当更新完成后,返回客户端结果时复制也在同步进行,而当下一个读请求到来时,读写实例和只读实例之间的数据复制有可能已经完成。且大多数应用场景都是读多写少,所以在该机制下保证了会话一致性。
适用场景 适用于对一致性有较高要求的场景,TDSQL-C MySQL 版的一致性级别越高,对主库的压力越大,集群性能也越低。推荐使用会话一致性,该级别对性能影响很小而且能满足绝大多数应用场景的需求。
注意:
开启会话一致性后,如果读写实例与只读实例复制时延较大,各个读节点 LSN 均小于 Session LSN,会导致 SELECT 请求发送到读写实例,从而增大读写实例的压力,整个集群的读写性能会有一定的降低。

全局一致性

功能简介 某些场景对一致性要求极高,除了会话内部有逻辑上的因果依赖关系,会话之间也存在依赖关系,例如在使用连接池的场景下,同一个线程的请求有可能通过不同连接发送出去。对数据库来说这些请求属于不同会话,但是业务逻辑上这些请求有前后依赖关系,此时会话一致性便无法保证查询结果的一致性。因此 TDSQL-C MySQL 版提供了全局一致性来解决该问题。
适用场景 适用于对一致性要求极高的场景,当主从延迟较高时,使用全局一致性可能会导致更多的请求被路由到读写实例,造成读写实例压力增大,业务延迟也可能增加。因此建议在读多写少的场景下选择全局一致性。

设置一致性级别

说明:
设置一致性级别需先开启读写分离功能,在开启读写分离的步骤中即可设置会话一致性级别,如已开启功能,但需修改一致性级别,请参考以下步骤。
1. 登录 TDSQL-C MySQL 版控制台,在集群列表,选择已开启代理的集群,单击集群 ID,进入集群管理页面。
2. 集群管理 > 集群详情下的拓扑图中,鼠标移动到数据库代理板块,然后单击详情进入数据库代理管理页面。或在集群管理页面直接选择数据库代理页进入数据库代理管理页面。
3. 在连接地址下找到目标访问地址,在其操作列单击调整配置

4. 在配置窗口下,选择所需的一致性级别,单击确定
说明:

若一致性设置为会话一致性或全局一致性,您需对读写实例和只读实例之间的数据复制设置超时时间,取值范围:0~1000000微秒,设置为0,则表示若只读实例出现延迟,导致一致性策略不满足,请求将一直等待,设置为非0,如设置1000微秒,则表示若只读实例出现延迟,超过设置的1000微秒后,请求将由系统自动转发到主实例。
温馨提示,当前同一云账号下多个数据库代理实例不支持单独设置各自的超时时间,多个数据库代理实例的超时时间只能统一生效一份,单个数据库代理实例修改超时时间,会导致多个数据库代理实例的超时时间都统一修改。