Dawn's Blogs

分享技术 记录成长

0%

GaiaDB 架构简介

GaiaDB 是百度自研的云原生数据库,GaiaDB 采用计算与存储分离的架构,不仅在性能、扩展性和高可用方面有大幅提升,而且架构的解耦使得计算层和存储层都获得了很大的优化空间。

架构

GaiaDB 在运行形态上是一个多节点集群,集群中有一个主节点和多个从节点日志服务(LogService)用于持久化主节点生成的日志,所有节点共享底层的分布式存储(PageServer),各模块分布到不同的K8S容器内。

架构上采用合-分-合的架构,在扩展性和使用便捷性之间保持了平衡,使得对于上层应用程序来说,就像使用一个单点的MySQL数据库一样简单。

  • 【合】最上层是接入代理,作为统一的入口。
  • 【分】中间数据库引擎作为计算层,扩展为一个主节点合多个从节点,提高扩展性。
  • 【合】底层采用一套分布式存储,节省成本。

img

GaiaDB 代理层

GaiaDB 通过内部的代理层(Proxy)对外提供服务,也就是说所有的应用程序都先经过这层代理,然后才访问到具体的数据库节点。这样的好处:

  • Proxy 提供安全认证和保护。
  • Proxy 解析 SQL,把写操作(比如事务、Update、Insert、Delete、DDL 等)发送到主节点,把读操作(比如 Select)均衡地分发到多个读节点,这个也叫读写分离
  • 通过 Proxy 把不同的业务用不同的连接地址,使用不同的数据节点。这样就可以避免相互影响,不会影响在线业务。

img

GaiaDB 计算层

计算层由一个主节点合最多十五个从节点组成。计算层百分百支持 MySQL 语法,相对于 MySQL 的主从节点来说,GaiaDB 的计算节点是无状态的。

  • 主节点:处理读写请求,处理事务。相比于 MySQL 的主节点,GaiaDB 的主节点仅需要将日志(RedoLog)发送至日志服务(LogService)持久化,不需要写数据。数据是由数据存储节点(PageServer)从 LogService 拉取日志并回放。
  • 从节点:处理只读负载。从 PageServer 拉取最新的数据。

这样的设计具有以下优势

  • 计算节点无状态,弹性快速扩容。计算层节点无持久化数据,本地文件不复存在,包括日志文件,所以支持快速扩容,大概在 30 秒内就能快速创建从节点并提供服务。
  • 只有单机事务,没有分布式事务问题。集群所有的事务都请求到主节点,主节点自身保障事务的 ACID 特性
  • 单机故障不影响集群一致性,底层存储层利用 Raft 一致性算法保障数据的一致性。事务产生的 Redo 日志均实时写入 LogService,从节点利用 PageServer 上的数据文件和 LogService 中的 Redo 日志,在内存中恢复最新的数据对外提供服务。每一次主备故障切换,从节点均可以获取最新的事务 Redo 日志,因此不会出现数据丢失。

GaiaDB 存储层

存储层是由多组数据存储节点(PageServer)和一组日志服务节点(LogService)组成。包括两个组件,LogService 和 Page Server。

  • LogService 用于持久化数据库日志(RedoLog),采用 Raft 一致性协议保障日志的高可用和一致性。缓存近期产生的日志,供从节点和 PageServer 快速拉取。

  • PageServer 用于缓存和持久化数据页,每组包含三个 PageServer 节点,一组 PageServer 管理 32GB 的数据(这 32GB 的数据称为一个 Segment)。

img

这样的设计有以下优势

  • 数据的一致性和数据存储分离,LogService 专注一致性保障,PageServer 专注持久化数据。
  • PageServer 和 LogService 都采用多副本的方式保障高可用。
  • PageServer 之间逻辑独立。独立从 LogService 拉取数据,LogService 保障数据的一致性。
  • 存储节点的扩容只需要增加 PageServer 的个数,扩容操作对用户无感