概述
同步表(sync table)是 TDSQL Boundless 利用多副本提升性能的手段之一。与普通表不同,同步表会在集群的每一个节点上创建一个副本,且每一个副本都能提供强一致性读服务。这使得多个副本的能力都能被有效利用,大大增加了同步表的读取吞吐能力。
适用场景
同步表的修改会通过 Leader 强同步给所有副本,并在所有副本都修改完成后才返回给客户端,而普通表的写请求只需要成员副本达到多数派后即可返回。相对普通表,同步表的写入能力会受到一定限制。因此,同步表适合于读多写少的业务场景。
使用限制
目前同步表以广播表的形式对外提供服务,用户必须创建广播同步表来使用同步表。
任意一个 Follower 副本故障,可能导致写请求卡顿一个租约的时间。
读请求路由策略本地优先,本地访问失败则访问 Leader 。
目前暂不支持同步表的属性变换,即不支持从同步表变为非同步表,也不支持从非同步表变为同步表。
同步表不能是分区表。
广播同步日志流一旦被创建出来后就不会再被销毁,即使用户删除所有的同步表。
副本个数过多会导致写请求性能下降。
语法与示例
语法
CREATE TABLE table_name (column_definitions) sync_level = node(all) distribution = node(all);
同步表的读写访问语法和普通表保持一致。但读取时,具体访问的节点和连接有关。具体来说,TDSQL Boundless 会优先访问连接所在的本地节点的同步表副本,只有当本地节点不可读时(例如 lease 过期),才会退化为访问 Leader 节点。
示例
以创建一个用户表为例
CREATE TABLE `user_center`.`user_profiles` (`user_uuid` varchar(36) NOT NULL,`nick_name` varchar(50),`register_time` datetime,PRIMARY KEY (`user_uuid`)) SYNC_LEVEL = NODE(ALL) DISTRIBUTION = NODE(ALL);
常见问题 (FAQ)
Q: 建表语法中的“SYNC_LEVEL = NODE(ALL) DISTRIBUTION = NODE(ALL)”分别代表什么?
A:
SYNC_LEVEL = NODE(ALL)表示同步级别,修改需要同步到所有 node;DISTRIBUTION = NODE(ALL) 表示分布规则,每个节点上都要分布一个副本。Q: 可以不指定 ALL,指定部分吗?
A: 目前不支持指定副本,只支持 ALL。
Q: 建同步表可以不指定DISTRIBUTION = NODE(ALL)吗?
A:目前不支持,同步表目前只支持在所有节点上都创建一个副本。