导入高可用性
Doris 在数据导入过程中提供了多种机制来确保高可用性。本文将详细介绍 Doris 的默认导入行为,以及为提高导入可用性而提供的额外选项,特别是最小写入副本数(Min Load Replica Num)功能。
阅读本文后,您将能够:
- 理解 Doris 默认的多数派写入策略及其工作原理。
- 在部分副本不可用的场景下,通过最小写入副本数提升导入成功率。
- 掌握表级和全局两种配置方式,以及它们的优先级关系。
适用场景
| 场景 | 推荐策略 | 说明 |
|---|---|---|
| 对数据可靠性要求最高 | 默认多数派写入 | 大部分副本写入成功才视为导入成功 |
| 部分 BE 节点临时不可用 | 设置 min_load_replica_num | 允许少于多数派的副本数即可导入成功 |
| 对导入速度有较高要求 | 设置 min_load_replica_num | 在一致性与可用性之间倾向于可用性 |
默认多数派写入策略
Doris 默认采用多数派写入策略来确保数据的可靠性和一致性:
- 当成功写入的副本数超过总副本数的一半时,导入被视为成功。
- 例如:对于三副本的表,至少需要 2 个副本写入成功才算导入成功。
工作原理
多数派写入的执行流程如下:
- 数据分发:导入任务首先将数据分发到所有相关的 BE 节点。
- 并行写入:各个 BE 节点并行处理数据写入操作。
- 写入确认:每个 BE 节点在完成数据写入后,会向 FE 发送确认信息。
- 多数派判断:FE 统计成功写入的副本数,当达到多数派时,认为导入成功。
- 事务提交:FE 提交导入事务,使数据对外可见。
- 异步复制:对于未成功写入的副本,系统会在后台异步进行数据复制,以确保最终所有副本的数据一致性。
多数派写入策略是 Doris 在数据可靠性和系统可用性之间的一个平衡。对于有特殊需求的场景,Doris 提供了最小写入副本数等其他选项来进一步提高系统的灵活性。
最小写入副本数
多数派写入策略在保证数据可靠性的同时,也可能在某些场景下影响系统的可用性。例如,在两副本的情况下,必须两个副本都写入成功才能完成导入,这意味着在导入过程中不允许任何一个副本不可用。
为了解决上述问题并提高导入的可用性,Doris 提供了最小写入副本数(Min Load Replica Num)选项。
功能说明
最小写入副本数允许用户指定导入数据时需要成功写入的最少副本数。当成功写入的副本数大于或等于这个值时,导入即视为成功。
典型使用场景
- 在部分节点不可用时,仍需要保证数据能够成功导入。
- 对数据导入速度有较高要求,愿意在一定程度上牺牲一致性来换取更高的可用性。
配置方法
最小写入副本数支持单表配置和全局配置两种方式。
1. 单表配置
方式 A:建表时设置
在建表 PROPERTIES 中指定 min_load_replica_num:
CREATE TABLE example_table
(
id INT,
name STRING
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES
(
'replication_num' = '3',
'min_load_replica_num' = '2'
);
方式 B:修改现有表
通过 ALTER TABLE 动态调整:
ALTER TABLE example_table
SET ( 'min_load_replica_num' = '2' );
2. 全局配置
通过 FE 配置项 min_load_replica_num 设置:
| 项目 | 取值 |
|---|---|
| 配置项 | min_load_replica_num |
| 有效值 | 大于 0 |
| 默认值 | -1(表示不开启全局最小写入副本数) |
关于 FE 配置项的查看和修改,请参考 FE 配置项文档。
配置优先级
当表属性、全局配置同时存在时,遵循以下优先级:
表属性 > 全局配置 > 默认多数派规则
如果表属性未设置或无效,且全局配置有效,则该表的最小写入副本数为:
min(FE 配置的 min_load_replica_num, 表的副本数 / 2 + 1)
其他高可用性机制
除了最小写入副本数选项,Doris 还采用了以下机制来提高导入的可用性:
| 机制 | 作用 |
|---|---|
| 导入重试 | 自动重试因临时故障导致的失败导入任务 |
| 负载均衡 | 将导入任务分散到不同的 BE 节点,避免单点压力过大 |
| 事务机制 | 确保数据的一致性,失败时自动回滚 |
常见问题
Q1:min_load_replica_num 可以大于 replication_num 吗?
不可以。最小写入副本数的语义是“导入时至少需要成功写入的副本数”,应小于或等于副本总数;当通过全局配置生效时,系统会自动取 min(FE 配置的 min_load_replica_num, 表的副本数 / 2 + 1)。
Q2:开启 min_load_replica_num 后,未写入成功的副本会丢数据吗?
不会。导入提交后,未成功写入的副本会通过后台异步复制最终补齐数据,保证副本之间的一致性。
Q3:什么时候应该使用 min_load_replica_num?
当出现部分 BE 节点临时不可用、副本调度未完成、或对导入可用性要求高于强一致性的场景时,可启用该选项以确保导入不被少量副本异常阻塞。
Q4:表属性和全局配置同时设置时以哪个为准?
以表属性为准。仅当表属性未设置或无效时,才会使用全局配置;若两者均未设置,则回退到默认的多数派规则。