Dkron 是一个分布式、容错的任务调度系统,基于 Raft 共识算法,专注于高可用和扩展性。它被广泛用于调度和管理周期性任务,例如在分布式系统中运行批处理任务。以下是 Dkron 的主要架构和组件:
1. 核心组件
a. Server 节点
- 角色:Dkron 集群的核心,负责任务的存储、调度和执行。
- 功能:
- 通过 Raft 协议实现共识,保证任务调度和状态的一致性。
- 提供任务管理 API(如任务创建、删除和查询)。
- 管理任务的分配和执行状态。
b. Agent 节点
- 角色:轻量级的任务执行代理。
- 功能:
- 接收来自 Server 节点的任务指令并执行。
- 将任务结果反馈给 Server 节点。
- 可以单独运行或与 Server 节点部署在一起。
2. 任务调度
- Dkron 支持多种类型的任务,包括定时任务和单次执行任务。
- 调度方式基于 CRON 表达式,支持精细化的调度规则。
- Server 节点维护任务队列并协调执行,确保任务的高可靠性和分布式特性。
3. 数据存储与一致性
- Raft 协议:
- Dkron 使用 Raft 来保证 Server 节点间的状态一致性。
- Leader 节点负责写入任务信息,其它节点作为 Follower,接收同步。
- 任务持久化:
- 任务和状态通常存储在嵌入式数据库(如 BoltDB)中。
- 支持集群重新选举,避免单点故障。
4. 通信机制
- gRPC:Server 和 Agent 节点之间使用 gRPC 通信,确保高效、可靠的数据传输。
- Serf:Dkron 使用 Serf 用于服务发现和集群成员管理。
5. 任务执行流程
- 任务定义:
- 用户通过 REST API 或 Web 界面定义任务。
- 任务调度:
- 任务被存储在集群的 Leader 节点,按照调度规则触发。
- 任务分发:
- Leader 将任务分发给合适的 Agent 节点执行。
- 任务执行:
- Agent 节点运行任务,并将结果反馈到 Server 节点。
- 结果处理:
- Server 节点记录任务状态(成功、失败)并提供给用户查询。
6. 可扩展性和高可用性
- 集群扩展:
- Server 节点可动态加入或退出集群。
- Agent 节点可以独立扩展,适应任务负载的变化。
- 故障恢复:
- 通过 Raft 选举新 Leader 来接管任务调度。
- 任务执行失败时支持重试策略。
7. 插件机制
Dkron 提供插件支持,用于扩展功能,包括:
- 执行器插件:定义任务执行的具体行为。
- 存储插件:扩展任务状态的存储后端。
- 观察者插件:用来监听和处理任务执行事件(例如日志记录、通知等)。
典型架构图
+----------------+ +----------------+ +----------------+
| Server Node | <----> | Server Node | <----> | Server Node |
| (Leader/Follower)| | (Follower) | | (Follower) |
+----------------+ +----------------+ +----------------+
| | |
v v v
+----------------+ +----------------+ +----------------+
| Agent Node | | Agent Node | | Agent Node |
+----------------+ +----------------+ +----------------+
应用场景
- 分布式系统中的定时任务管理。
- 数据处理管道的调度和执行。
- 高可用和可扩展的批处理任务系统。