构建 TiFlash 副本
本文档介绍如何按表和库构建 TiFlash副本,以及如何设置可用区来调度副本。
按表构建 TiFlash 副本
TiFlash 接入 TiKV 集群后,默认不会开始同步数据。可通过 MySQL 客户端向 TiDB 发送 DDL 命令来为特定的表建立 TiFlash 副本:
ALTER TABLE table_name SET TIFLASH REPLICA count;
该命令的参数说明如下:
- count 表示副本数,0 表示删除。
对于相同表的多次 DDL 命令,仅保证最后一次能生效。例如下面给出的操作 tpch50
表的两条 DDL 命令中,只有第二条删除副本的命令能生效:
为表建立 2 个副本:
ALTER TABLE `tpch50`.`lineitem` SET TIFLASH REPLICA 2;
删除副本:
ALTER TABLE `tpch50`.`lineitem` SET TIFLASH REPLICA 0;
注意事项:
假设有一张表 t 已经通过上述的 DDL 语句同步到 TiFlash,则通过以下语句创建的表也会自动同步到 TiFlash:
CREATE TABLE table_name like t;如果集群版本 \< v4.0.6,若先对表创建 TiFlash 副本,再使用 TiDB Lightning 导入数据,会导致数据导入失败。需要在使用 TiDB Lightning 成功导入数据至表后,再对相应的表创建 TiFlash 副本。
如果集群版本以及 TiDB Lightning 版本均 >= v4.0.6,无论一个表是否已经创建 TiFlash 副本,你均可以使用 TiDB Lightning 导入数据至该表。但注意此情况会导致 TiDB Lightning 导入数据耗费的时间延长,具体取决于 TiDB Lightning 部署机器的网卡带宽、TiFlash 节点的 CPU 及磁盘负载、TiFlash 副本数等因素。
不推荐同步 1000 张以上的表,这会降低 PD 的调度性能。这个限制将在后续版本去除。
v5.1 版本及后续版本将不再支持设置系统表的 replica。在集群升级前,需要清除相关系统表的 replica,否则升级到较高版本后将无法再修改系统表的 replica 设置。
查看表同步进度
可通过如下 SQL 语句查看特定表(通过 WHERE 语句指定,去掉 WHERE 语句则查看所有表)的 TiFlash 副本的状态:
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
查询结果中:
- AVAILABLE 字段表示该表的 TiFlash 副本是否可用。1 代表可用,0 代表不可用。副本状态为可用之后就不再改变,如果通过 DDL 命令修改副本数则会重新计算同步进度。
- PROGRESS 字段代表同步进度,在 0.0~1.0 之间,1 代表至少 1 个副本已经完成同步。
按库构建 TiFlash 副本
类似于按表构建 TiFlash 副本的方式,你可以在 MySQL 客户端向 TiDB 发送 DDL 命令来为指定数据库中的所有表建立 TiFlash 副本:
ALTER DATABASE db_name SET TIFLASH REPLICA count;
在该命令中,count
表示 TiFlash 的副本数。当设置 count
值为 0 时,表示删除现有的 TiFlash 副本。
命令示例:
执行以下命令可以为 tpch50
库中的所有表建立 2 个 TiFlash 副本。
ALTER DATABASE `tpch50` SET TIFLASH REPLICA 2;
执行以下命令可以删除为 tpch50
库建立的 TiFlash 副本:
ALTER DATABASE `tpch50` SET TIFLASH REPLICA 0;
查看库同步进度
类似于按表构建,按库构建 TiFlash 副本的命令执行成功,不代表所有表都已同步完成。可以执行下面的 SQL 语句检查数据库中所有已设置 TiFlash Replica 表的同步进度:
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = '<db_name>';
可以执行下面的 SQL 语句检查数据库中尚未设置 TiFlash Replica 的表名:
SELECT TABLE_NAME FROM information_schema.tables where TABLE_SCHEMA = "<db_name>" and TABLE_NAME not in (SELECT TABLE_NAME FROM information_schema.tiflash_replica where TABLE_SCHEMA = "<db_name>");
设置可用区
在配置副本时,如果为了考虑容灾,需要将 TiFlash 的不同数据副本分布到多个数据中心,则可以按如下步骤进行配置:
在集群配置文件中为 TiFlash 节点指定 label:
tiflash_servers: - host: 172.16.5.81 config: logger.level: "info" learner_config: server.labels: zone: "z1" - host: 172.16.5.82 config: logger.level: "info" learner_config: server.labels: zone: "z1" - host: 172.16.5.85 config: logger.level: "info" learner_config: server.labels: zone: "z2"注:旧版本中的
flash.proxy.labels
配置无法处理可用区名字中的特殊字符,建议使用learner_config
中的server.labels
来进行配置。启动集群后,在创建副本时为副本调度指定 label,语法如下:
ALTER TABLE table_name SET TIFLASH REPLICA count LOCATION LABELS location_labels;例如:
ALTER TABLE t SET TIFLASH REPLICA 2 LOCATION LABELS "zone";此时 PD 会根据设置的 label 进行调度,将表
t
的两个副本分别调度到两个可用区中。可以通过监控或 pd-ctl 来验证这一点:> tiup ctl:<version> pd -u<pd-host>:<pd-port> store ... "address": "172.16.5.82:23913", "labels": [ { "key": "engine", "value": "tiflash"}, { "key": "zone", "value": "z1" } ], "region_count": 4, ... "address": "172.16.5.81:23913", "labels": [ { "key": "engine", "value": "tiflash"}, { "key": "zone", "value": "z1" } ], "region_count": 5, ... "address": "172.16.5.85:23913", "labels": [ { "key": "engine", "value": "tiflash"}, { "key": "zone", "value": "z2" } ], "region_count": 9, ...
关于使用 label 进行副本调度划分可用区的更多内容,可以参考通过拓扑 label 进行副本调度,同城多数据中心部署 TiDB 与两地三中心部署。