管理副本
本文描述如何管理 StarRocks 集群中的数据副本。
概述
StarRocks 采用多副本策略来保证数据的高可用性。当您创建表时,必须通过配置 replication_num
(默认值:3
)属性(Property)指定表的副本数量。发起导入事务后,数据会同时导入到指定数量的副本中,即在数据写入多数副本后,事务才会返回成功。详情请参考导入数据安全等级(Write quorum)。StarRocks 允许您设置导入更少的副本即可返回导入成功,从而实现更好的导入性能。
StarRocks 将多个副本存储在不同的 BE 节点上。例如,如果您想要为一个表存储三个副本,则必须在 StarRocks 集群中部署至少三个 BE 节点。如果任何副本发生故障,StarRocks 会从另一个 BE 节点克隆一个健康的副本的部分或全部数据来修复故障的副本。StarRocks 采用多版本并发控制(MVCC)技术,通过复制这些多版本数据的物理副本,保证版本修复的高效进行。
多副本写入
导入事务的常规流程如下:
-
客户端提交导入请求至 FE。
-
FE 节点选择一个 BE 节点作为该导入事务的 Coordinator BE 节点,并为该事务生成执行计划。
-
Coordinator 节点从客户端读取要导入的数据。
-
Coordinator 节点将数据分发到所有副本的 Tablet 中。
说明
Tablet 是表的逻辑分片。一张表可以有多个 Tablet,每个 Tablet 有
replication_num
个副本。一张表中 Tablet 的数量由建表属性bucket_size
决定。 -
数据导入并存储到所有 Tablet 后,FE 将导入的数据变为可见。
-
FE 向客户端返回导入成功。
以上流程确保了即使在极端情况下服务可用性依然不受影响。
导入数据安全等级(Write quorum)
将数据导入到多副本表的过程可能非常耗时。如果您希望提高导入性能并且能够容忍相对较低的数据可用性,可以为该表设置较低的导入数据安全等级。导入数据安全等级是指需要多少数据副本导入成功后 StarRocks 可返回导入成功。您可以在创建表时通过添加属性 write_quorum
来指定导入数据安全等级,或者通过 ALTER TABLE 为已有的表添加该属性。该属性从 v2.5 开始支持。
write_quorum
的取值及其对应描述如下:
MAJORITY
:默认值。当多数数据副本导入成功时,StarRocks 返回导入成功,否则返回失败。ONE
:当一个数据副本导入成功时,StarRocks 返回导入成功,否则返回失败。ALL
:当所有数据副本导入成功时,StarRocks 返回导入成功,否则返回失败。
自动副本修复
BE 节点崩溃或导入任务失败都可能导致副本异常。StarRocks 会自动修复这些异常的副本。
每隔 tablet_sched_checker_interval_seconds
中指定的周期,默认 20 秒,FE 中的 Tablet Checker 就会扫描 StarRocks 集群中所有表的 Tablet 副本,通过检查当前 Visible 的数据版本号和 BE 节点的健康状态来判断副本是否健康。如果一个副本的 Visible 版本落后于其他副本,StarRocks 会执行增量克隆以修复该落后的副本。如果一个后端节点无法接收心跳信号或被从集群中移除,或副本过于落后无法通过增量克隆修复,StarRocks 会执行全量克隆以修复丢失的副本。
在检测到需要修复的 Tablet 副本后,FE 生成 Tablet 调度任务,并将任务添加到调度任务队列中。FE 的 Tablet Scheduler 从队列中接收调度任务,为每个异常副本创建其所需类型的克隆任务,并将任务分配给 Executor BE 节点。
克隆任务本质上是从源 BE 节点(即拥有健康副本的节点)复制数据,并将数据导入到目标 BE 节点(即拥有异常副本的节点)。对于数据版本落后的副本,FE 会分配增量克隆任务给存储异常副本的 Executor BE 节点,并通知该节点可以从哪个 BE 节点找到健康副本克隆新数据。对于已丢失的副本,FE 会选择一个存活的 BE 节点作为 Executor 节点,在该 BE 节点创建一个空的副本,并为该 BE 节点分配全量克隆任务。
对于每个克隆任务,无论其类型如何,Executor BE 节点都会从健康副本中复制数据文件,然后更新相应元数据。克隆任务完成后,Executor BE 节点会向 FE 的 Tablet Scheduler 返回任务成功。在移除多余的 Tablet 副本后,FE 会更新其元数据,标志副本修复完成。
在修复 Tablet 期间,StarRocks 仍然可以执行查询。只要健康副本数满足 write_quorum
,导入就可以正常进行。
手动修复副本
手动副本修复包括两个步骤:
- 检查副本状态。
- 设置副本优先级。
检查副本状态
按照以下步骤检查副本状态,寻找状态为 Unhealthy(异常)的副本。
-
检查集群中所有副本的状态。
SHOW PROC '/statistic';
示例:
mysql> SHOW PROC '/statistic';
+----------+-----------------------------+----------+--------------+----------+-----------+------------+--------------------+-----------------------+
| DbId | DbName | TableNum | PartitionNum | IndexNum | TabletNum | ReplicaNum | UnhealthyTabletNum | InconsistentTabletNum |
+----------+-----------------------------+----------+--------------+----------+-----------+------------+--------------------+-----------------------+
| 35153636 | default_cluster:DF_Newrisk | 3 | 3 | 3 | 96 | 288 | 0 | 0 |
| 48297972 | default_cluster:PaperData | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5909381 | default_cluster:UM_TEST | 7 | 7 | 10 | 320 | 960 | 1 | 0 |
| Total | 240 | 10 | 10 | 13 | 416 | 1248 | 1 | 0 |
+----------+-----------------------------+----------+--------------+----------+-----------+------------+--------------------+-----------------------+UnhealthyTabletNum
:表示对应数据库中异常 Tablet 的数量。InconsistentTabletNum
:表示副本不一致的 Tablet 数量。
如果某个数据库中的
UnhealthyTabletNum
或InconsistentTabletNum
的值不为0
,您可以通过其DbId
检查该数据库中的异常 Tablet。SHOW PROC '/statistic/<DbId>'
示例:
mysql> SHOW PROC '/statistic/5909381';
+------------------+---------------------+
| UnhealthyTablets | InconsistentTablets |
+------------------+---------------------+
| [40467980] | [] |
+------------------+---------------------+Unhealthy Tablet 的 ID 会在
UnhealthyTablets
字段中返回。 -
检查特定表或分区中的 Tablet 状态。
您可以通过结合 ADMIN SHOW REPLICA STATUS 和 WHERE 子句来筛选具有特定状态的 Tablet。
ADMIN SHOW REPLICA STATUS FROM <table_name>
[PARTITION (<partition_name_1>[, <partition_name_2>, ...])]
[WHERE STATUS = {'OK'|'DEAD'|'VERSION_ERROR'|'SCHEMA_ERROR'|'MISSING'}]示例:
mysql> ADMIN SHOW REPLICA STATUS FROM tbl PARTITION (p1, p2) WHERE STATUS = "OK";
+----------+-----------+-----------+---------+-------------------+--------------------+------------------+------------+------------+-------+--------+--------+
| TabletId | ReplicaId | BackendId | Version | LastFailedVersion | LastSuccessVersion | CommittedVersion | SchemaHash | VersionNum | IsBad | State | Status |
+----------+-----------+-----------+---------+-------------------+--------------------+------------------+------------+------------+-------+--------+--------+
| 29502429 | 29502432 | 10006 | 2 | -1 | 2 | 1 | -1 | 2 | false | NORMAL | OK |
| 29502429 | 36885996 | 10002 | 2 | -1 | -1 | 1 | -1 | 2 | false | NORMAL | OK |
| 29502429 | 48100551 | 10007 | 2 | -1 | -1 | 1 | -1 | 2 | false | NORMAL | OK |
| 29502433 | 29502434 | 10001 | 2 | -1 | 2 | 1 | -1 | 2 | false | NORMAL | OK |
| 29502433 | 44900737 | 10004 | 2 | -1 | -1 | 1 | -1 | 2 | false | NORMAL | OK |
| 29502433 | 48369135 | 10006 | 2 | -1 | -1 | 1 | -1 | 2 | false | NORMAL | OK |
+----------+-----------+-----------+---------+-------------------+--------------------+------------------+------------+------------+-------+--------+--------+如果
IsBad
字段为true
,则表示该 Tablet 已损坏。有关
Status
字段提供的详细信息,参考 ADMIN SHOW REPLICA STATUS。您可以使用 SHOW TABLET 进一步查看表中 Tablet 的详细信息。
SHOW TABLET FROM <table_name>