MetaService 架构
概述
MetaService(也称为调度中心)是 RobustMQ 的元数据管理和集群协调中心。它作为整个系统的大脑,负责管理集群元数据、节点协调、故障检测和恢复。基于 Raft 共识算法构建,MetaService 确保集群元数据的高可用性和强一致性。
设计原则
MetaService 基于以下核心原则设计:
- 高可用性:基于 Raft 的共识确保即使节点故障也能保持集群可用性
- 强一致性:所有元数据操作在集群中保持强一致性
- 容错性:自动检测和恢复节点故障
- 可扩展性:支持动态集群成员变更
- 性能:针对低延迟元数据操作优化
架构概述
MetaService 采用分层架构,职责分离清晰:
1. 服务层
- gRPC 服务:集群操作的外部 API 接口
- 内部服务:协议特定的服务实现
- 服务发现:节点注册和发现机制
2. 核心层
- 缓存管理:高性能内存元数据缓存
- 集群控制器:中央协调和控制逻辑
- 心跳管理:节点健康监控和故障检测
- 指标收集:性能和操作指标
3. Raft 层
- 共识引擎:Raft 算法实现分布式共识
- 状态机:元数据状态管理和转换
- 日志存储:Raft 操作的持久化日志存储
- 网络层:节点间通信和消息传递
4. 存储层
- RocksDB 引擎:元数据和日志的持久化存储
- 数据路由:请求路由到适当的存储处理器
- 模式管理:数据模式和管理
核心组件
服务层 (src/server/
)
服务层提供外部 API 和内部服务实现。
gRPC 服务
- MetaServiceService:集群操作的主要 gRPC 服务
- MQTT 服务:MQTT 特定的元数据操作
- Journal 服务:存储相关的元数据操作
- KV 服务:键值元数据操作
服务实现
rust
pub struct GrpcPlacementService {
raft_machine_apply: Arc<StorageDriver>,
cluster_cache: Arc<CacheManager>,
rocksdb_engine_handler: Arc<RocksDBEngine>,
client_pool: Arc<ClientPool>,
journal_call_manager: Arc<JournalInnerCallManager>,
mqtt_call_manager: Arc<MQTTInnerCallManager>,
}
主要职责:
- 处理外部 gRPC 请求
- 将请求路由到适当的内部服务
- 管理客户端连接和身份验证
- 提供服务发现和健康检查
核心层 (src/core/
)
核心层包含基本的业务逻辑和协调机制。
缓存管理器 (cache.rs
)
- 内存缓存:高性能元数据缓存
- 缓存失效:自动缓存一致性管理
- 缓存预热:主动缓存填充以提高性能
- 内存管理:高效内存使用和垃圾回收
集群控制器 (controller.rs
)
rust
pub struct ClusterController {
cluster_cache: Arc<CacheManager>,
meta_service_storage: Arc<StorageDriver>,
stop_send: broadcast::Sender<bool>,
client_pool: Arc<ClientPool>,
journal_call_manager: Arc<JournalInnerCallManager>,
mqtt_call_manager: Arc<MQTTInnerCallManager>,
}
主要职责:
- 集群协调和管理
- 节点生命周期管理
- 故障检测和恢复
- 负载均衡和路由决策
心跳管理 (heartbeat.rs
)
- 节点健康监控:集群节点的持续健康检查
- 故障检测:自动检测故障节点
- 恢复协调:协调恢复程序
- 健康指标:收集和报告节点健康统计
Raft 层 (src/raft/
)
Raft 层实现分布式共识以确保元数据一致性。
Raft 节点 (raft_node.rs
)
rust
pub struct Node {
pub node_id: u64,
pub rpc_addr: String,
}
pub type NodeId = u64;
主要特性:
- 领导者选举:自动领导者选举和故障转移
- 日志复制:节点间一致的日志复制
- 成员变更:动态集群成员管理
- 快照管理:高效的快照创建和恢复
状态机 (store/state_machine_store.rs
)
- 状态转换:管理元数据状态变更
- 日志应用:将已提交的日志条目应用到状态
- 快照创建:创建一致的状态快照
- 恢复:从快照和日志恢复状态
网络层 (network/
)
- 节点间通信:Raft 节点间的高效通信
- 消息序列化:优化的消息序列化/反序列化
- 连接管理:可靠的连接处理
- 负载均衡:在节点间分布网络负载
存储层 (src/storage/
)
存储层为元数据和日志提供持久化存储。
RocksDB 引擎 (rocksdb.rs
)
- 持久化存储:元数据和日志的持久化存储
- 高性能:针对元数据访问模式优化
- 压缩:自动数据压缩和优化
- 备份/恢复:数据备份和恢复功能
数据路由 (raft/route/
)
- 请求路由:将请求路由到适当的处理器
- 协议支持:支持不同的数据类型和协议
- 批处理:高效的批处理操作
- 错误处理:全面的错误处理和恢复
数据流架构
元数据操作流程
- 客户端请求:客户端发送元数据操作请求
- 服务层:gRPC 服务接收并验证请求
- 缓存检查:在内存缓存中检查数据
- Raft 共识:如果缓存未命中,向 Raft 集群提议操作
- 日志复制:在集群节点间复制操作
- 状态应用:将操作应用到状态机
- 缓存更新:用新数据更新内存缓存
- 响应:向客户端返回结果
节点管理流程
- 节点注册:新节点向集群注册
- 健康监控:持续心跳监控
- 故障检测:通过错过的心跳检测节点故障
- 恢复协调:协调恢复程序
- 负载重平衡:节点变更后重新平衡负载
- 成员更新:更新集群成员
共识流程
- 领导者选举:通过 Raft 共识选举领导者
- 日志提议:领导者向跟随者提议操作
- 投票收集:从多数节点收集投票
- 提交:多数同意后提交操作
- 状态更新:用已提交的操作更新状态机
- 响应:向客户端返回结果
协议特定控制器
MQTT 控制器 (controller/mqtt/
)
- 会话管理:管理 MQTT 客户端会话
- 主题路由:将消息路由到适当的主题
- 订阅管理:处理主题订阅
- QoS 协调:在 broker 间协调 QoS 级别
Journal 控制器 (controller/journal/
)
- 存储协调:与存储节点协调
- 数据复制:管理存储节点间的数据复制
- 垃圾回收:协调垃圾回收操作
- 存储健康:监控存储节点健康
结论
MetaService 是确保 RobustMQ 集群可靠性、一致性和性能的关键组件。其基于 Raft 的共识架构提供强一致性保证,同时保持高可用性和容错性。分层设计和清晰的职责分离使其易于维护和扩展。
内存缓存、高效共识算法和健壮存储机制的结合使 MetaService 能够处理高吞吐量元数据操作,同时保持亚秒级响应时间。这使其适用于需要高可用性和强一致性的苛刻生产环境。
本文档提供了 MetaService 架构的全面概述。有关特定组件的更详细信息,请参考各个组件的文档。