一、 关键词
FE、BE、bdbje
- FE
Frontend,即 Doris 的前端节点。主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作。 - BE
Backend,即 Doris 的后端节点。主要负责数据存储与管理、查询计划执行等工作。 - bdbje
全称Oracle Berkeley DB Java Edition,在Doris 中,使用 bdbje 存放Doris元数据,保证元数据持久性和一致性、FE 高可用等功能。
Berkeley DB是一款分布式、支持事务、嵌入式、KV数据库。
二、 整体架构
Doris 的整体架构分为两层。多个 FE 组成第一层,提供 FE 的横向扩展和高可用。多个 BE 组成第二层,负责数据存储与管理。元数据的设计与实现方式,主要与第一层的设计架构相关。
- FE 节点分为 follower 和 observer 两类。各个 FE 之间,通过 bdbje(BerkeleyDB Java Edition (opens new window))进行 leader 选举,数据同步等工作。
- follower 节点通过选举,其中一个 follower 成为 leader 节点,负责元数据的写入操作。当 leader 节点宕机后,其他 follower 节点会重新选举出一个 leader,保证服务的高可用。
- observer 节点仅从 leader 节点进行元数据同步,不参与选举。可以横向扩展以提供元数据的读服务的扩展性。
三、 元数据内容
Doris 的元数据是全内存的。每个 FE 内存中,都维护一个完整的元数据镜像。
元数据在内存中整体采用树状的层级结构存储,并且通过添加辅助结构,能够快速访问各个层级的元数据信息。
下图是 Doris 元信息所存储的内容。
如上图,Doris 的元数据主要存储4类数据:
- 用户数据信息。包括数据库、表的 Schema、分片信息等。
- 各类作业信息。如导入作业,Clone 作业、SchemaChange 作业等。
- 用户及权限信息。
- 集群及节点信息。
四、 高可用元数据
元数据的数据流周期具体过程如下:
- 只有 leader FE 可以对元数据进行写操作。 写操作在修改 leader 的内存后,会序列化为一条log,按照 key-value 的形式写入 bdbje。其中 key 为连续的整型数字,全局唯一、递增,作为 log id;value 即为序列化后的操作日志,由2部分组成。OperationType为操作类型,如建库操作、建表操作等。Writable Entity为序列化后的操作具体内容,通过反序列化该值,可以从镜像上回放元数据操作。
- 集群节点同步元数据
主节点按照元数据操作顺序,将元数据日志log