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 版提供了全局一致性来解决该问题。
适用场景
适用于对一致性要求极高的场景,当主从延迟较高时,使用全局一致性可能会导致更多的请求被路由到读写实例,造成读写实例压力增大,业务延迟也可能增加。因此建议在读多写少的场景下选择全局一致性。
设置一致性级别
说明:
设置一致性级别需先开启读写分离功能,在开启读写分离的步骤中即可设置会话一致性级别,如已开启功能,但需修改一致性级别,请参考以下步骤。
2. 在集群列表中,单击集群 ID 或操作列的管理,进入集群管理页面。
3. 在集群管理页面,选择数据库代理 > 读写分离 > 调整配置。
本页内容是否解决了您的问题?