一、适用场景
同步表的修改会通过 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);
五、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:目前不支持,同步表目前只支持在所有节点上都创建一个副本。