Skip to content

GaussDB 存储架构

GaussDB 存储架构设计了高效的数据存储和管理机制,支持多种存储引擎和数据模型,能够满足不同业务场景的需求。

存储架构分层

1. 存储接口层

存储接口层提供了统一的数据存储接口,屏蔽了底层存储引擎的差异,使上层应用能够透明地使用不同的存储引擎。

主要组件

存储引擎抽象接口
  • 定义统一的存储操作接口
  • 支持多种存储引擎的插拔
  • 实现存储引擎的动态切换
  • 提供事务一致性保证
数据访问 API
  • 提供结构化的数据访问接口
  • 支持 CRUD 操作
  • 实现数据的批量处理
  • 支持异步数据访问

2. 存储引擎层

存储引擎层是 GaussDB 存储架构的核心,负责数据的物理存储和管理,支持多种存储引擎。

行存储引擎

行存储引擎以行为单位存储数据,适合 OLTP 场景,支持高效的插入、更新和删除操作。

核心特性

  • 行级存储组织
  • 支持行级锁和 MVCC
  • 高效的事务处理
  • 适合随机读写
  • 支持快速点查询

适用场景

  • 在线交易系统
  • 客户关系管理系统
  • 订单管理系统
  • 任何需要频繁更新的场景

列存储引擎

列存储引擎以列为单位存储数据,适合 OLAP 场景,支持高效的分析查询和数据压缩。

核心特性

  • 列级存储组织
  • 支持高效的列压缩
  • 适合批量数据扫描
  • 支持向量执行
  • 优化的聚合查询

适用场景

  • 数据仓库
  • 商业智能系统
  • 数据分析平台
  • 任何需要复杂查询和分析的场景

行列混合存储引擎

行列混合存储引擎结合了行存储和列存储的优势,能够根据数据类型和查询模式自动选择最优的存储方式。

核心特性

  • 支持行列混合存储
  • 自动选择存储格式
  • 热点数据识别和调整
  • 平衡 OLTP 和 OLAP 性能
  • 支持动态存储转换

适用场景

  • 混合负载场景
  • 同时需要 OLTP 和 OLAP 的应用
  • 数据仓库和交易系统的融合场景

3. 存储管理层

存储管理层负责管理物理存储资源,包括数据文件、日志文件、索引文件等。

主要组件

数据文件管理
  • 管理数据库数据文件的创建、扩展和删除
  • 实现数据文件的分片和分布
  • 支持数据文件的加密和压缩
  • 管理数据文件的备份和恢复
日志文件管理
  • 管理事务日志的写入和归档
  • 实现日志的多副本同步
  • 支持日志的回放和恢复
  • 管理日志文件的大小和保留策略
索引文件管理
  • 管理索引文件的创建和维护
  • 支持多种索引类型
  • 实现索引的优化和重建
  • 管理索引的统计信息
存储资源管理
  • 管理存储设备的挂载和卸载
  • 实现存储资源的监控和告警
  • 支持存储资源的动态扩展
  • 管理存储资源的使用配额

4. 分布式存储层

分布式存储层负责分布式环境下的数据存储和管理,包括数据分片、复制和一致性维护。

主要组件

数据分片管理器
  • 管理数据的分片策略
  • 实现数据的自动重分布
  • 支持多种分片算法
  • 管理分片的元数据
数据复制管理器
  • 实现数据的多副本同步
  • 支持多种复制模式
  • 管理副本的分布和状态
  • 处理副本故障和恢复
一致性管理器
  • 实现分布式一致性协议
  • 管理数据的一致性级别
  • 处理分布式事务
  • 实现冲突检测和解决
分布式存储接口
  • 提供分布式数据访问接口
  • 支持跨节点的数据查询
  • 实现分布式数据的事务处理
  • 支持分布式数据的备份和恢复

数据存储组织

1. 表空间

表空间是 GaussDB 中的逻辑存储容器,对应一个或多个物理目录。

核心特性

  • 逻辑存储容器
  • 对应物理目录
  • 支持数据文件的组织和管理
  • 可以跨磁盘和服务器
  • 支持表空间级别的备份和恢复

表空间类型

  • 系统表空间:存储系统元数据
  • 用户表空间:存储用户数据
  • 临时表空间:存储临时数据
  • 索引表空间:专门存储索引数据

2. 数据文件

数据文件是 GaussDB 中存储数据的物理文件,以页为单位存储数据。

核心特性

  • 物理存储文件
  • 以页为存储单位
  • 页大小可配置(默认 8KB)
  • 支持数据压缩
  • 支持数据加密

文件结构

  • 文件头:存储文件元数据
  • 页:存储实际数据
  • 空闲空间管理:管理文件中的空闲空间
  • 检查点信息:用于恢复

3. 页结构

页是 GaussDB 中数据存储的基本单位,包含数据行、索引条目等。

核心结构

  • 页头:存储页元数据
  • 数据区:存储实际数据
  • 空闲空间:页中未使用的空间
  • 行指针:指向数据行的指针
  • 页目录:加速数据行的访问

页类型

  • 数据页:存储表数据
  • 索引页:存储索引数据
  • 系统页:存储系统元数据
  • 空闲页:未使用的页

4. 行格式

行格式定义了数据行在页中的存储方式。

核心格式

  • 固定长度行格式:适合固定长度的数据类型
  • 可变长度行格式:适合可变长度的数据类型
  • 压缩行格式:适合需要压缩的数据
  • 列式行格式:用于列存储引擎

行结构

  • 行头:存储行元数据
  • 数据字段:存储实际数据
  • 空值位图:标记字段是否为空
  • 事务信息:用于 MVCC

索引存储管理

1. 索引类型

GaussDB 支持多种索引类型,以满足不同的查询需求。

B-tree 索引

  • 最常用的索引类型
  • 适合等值查询和范围查询
  • 支持排序和分组操作
  • 支持前缀索引
  • 适合高基数列

Hash 索引

  • 基于哈希表实现
  • 适合等值查询
  • 不支持范围查询
  • 适合精确匹配场景
  • 支持快速点查询

GIN 索引

  • 通用倒排索引
  • 适合全文搜索
  • 支持数组查询
  • 适合多值属性
  • 支持复杂数据类型

GiST 索引

  • 通用搜索树索引
  • 适合空间数据
  • 支持自定义数据类型
  • 适合非平衡数据结构
  • 支持 nearest neighbor 查询

SP-GiST 索引

  • 空间分区 GiST 索引
  • 适合非平衡数据结构
  • 支持快速搜索
  • 适合点数据和线段数据
  • 支持多种距离度量

BRIN 索引

  • 块范围索引
  • 适合大型表
  • 存储块级统计信息
  • 适合顺序数据
  • 占用空间小

2. 索引组织

GaussDB 索引采用 B-tree 结构组织,确保高效的查询性能。

索引结构

  • 根节点:索引的入口点
  • 中间节点:存储索引键和指针
  • 叶子节点:存储索引键和行指针
  • 分支因子:决定树的高度

索引维护

  • 插入操作:维护索引的平衡
  • 删除操作:标记删除和垃圾回收
  • 更新操作:可能导致索引分裂
  • 真空操作:清理无效索引条目

日志存储管理

1. 日志类型

GaussDB 支持多种日志类型,用于不同的目的。

事务日志(WAL)

  • 预写式日志
  • 记录所有数据修改操作
  • 用于事务恢复
  • 支持数据复制
  • 确保事务持久性

错误日志

  • 记录数据库错误和警告
  • 用于故障诊断
  • 支持日志级别控制
  • 支持日志轮转

审计日志

  • 记录数据库访问和操作
  • 用于安全审计
  • 支持细粒度审计
  • 支持审计策略配置

慢查询日志

  • 记录执行时间超过阈值的查询
  • 用于性能优化
  • 支持查询计划记录
  • 支持日志格式配置

2. 日志存储

日志存储采用高效的写入机制,确保日志的可靠性和性能。

日志写入机制

  • 顺序写入:提高写入性能
  • 批量写入:减少 I/O 次数
  • 异步写入:平衡性能和可靠性
  • 双写缓冲:防止部分写入

日志归档

  • 自动日志归档
  • 支持归档到不同位置
  • 支持归档压缩
  • 支持归档验证

日志清理

  • 自动日志清理
  • 基于保留策略
  • 支持手动清理
  • 确保日志不占用过多空间

存储优化技术

1. 数据压缩

GaussDB 支持多种数据压缩技术,能够显著减少存储空间和 I/O 开销。

压缩级别

  • 轻量级压缩:快速压缩和解压缩,适合 OLTP 场景
  • 高压缩比:较高的压缩率,适合 OLAP 场景
  • 自适应压缩:根据数据类型自动选择压缩算法

压缩算法

  • 字典压缩:适合重复数据
  • 前缀压缩:适合有序数据
  • 位图压缩:适合稀疏数据
  • 行程长度编码:适合连续重复数据
  • 熵编码:适合随机数据

2. 存储分层

GaussDB 支持存储分层,将不同访问频率的数据存储在不同性能的存储设备上。

热点数据识别

  • 基于访问频率的热点识别
  • 支持动态数据迁移
  • 实现数据的自动分层
  • 支持手动分层配置

存储设备分级

  • 高速存储:SSD、NVMe 等
  • 中速存储:SATA SSD 等
  • 低速存储:HDD、磁带等

3. 预取和缓存

GaussDB 实现了多级缓存机制,能够显著提高数据访问性能。

缓存层次

  • 数据库缓冲区:内存中的数据缓存
  • 操作系统缓存:操作系统级别的文件缓存
  • 存储设备缓存:存储设备自带的缓存

预取策略

  • 顺序预取:适合顺序访问
  • 随机预取:适合随机访问
  • 自适应预取:根据访问模式自动调整
  • 基于机器学习的预取:智能预取热点数据

存储架构优化建议

1. 存储引擎选择

  • 根据业务场景选择合适的存储引擎
  • OLTP 场景:行存储引擎
  • OLAP 场景:列存储引擎
  • 混合场景:行列混合存储引擎

2. 表空间设计

  • 合理规划表空间
  • 将不同类型的数据存储在不同表空间
  • 考虑存储设备的性能和容量
  • 支持表空间级别的备份和恢复

3. 索引优化

  • 合理创建索引
  • 避免过度索引
  • 选择合适的索引类型
  • 定期重建和优化索引
  • 监控索引使用情况

4. 数据压缩

  • 根据数据类型选择合适的压缩级别
  • 考虑压缩和解压缩的性能开销
  • 测试压缩对查询性能的影响
  • 定期评估压缩效果

5. 存储设备选择

  • 根据性能需求选择存储设备
  • 考虑存储设备的可靠性
  • 实现存储设备的冗余
  • 监控存储设备的健康状况

6. 日志优化

  • 合理配置日志参数
  • 考虑日志写入性能
  • 配置适当的日志保留策略
  • 实现日志的远程归档

常见问题(FAQ)

Q1: GaussDB 支持哪些存储引擎?

A1: GaussDB 支持多种存储引擎:

  • 行存储引擎:适合 OLTP 场景
  • 列存储引擎:适合 OLAP 场景
  • 行列混合存储引擎:适合混合负载场景

Q2: 行存储和列存储的区别是什么?

A2: 行存储和列存储的主要区别:

  • 行存储:以行为单位存储,适合随机读写和频繁更新
  • 列存储:以列为单位存储,适合批量扫描和分析查询

Q3: GaussDB 支持哪些索引类型?

A3: GaussDB 支持多种索引类型:

  • B-tree 索引:适合等值查询和范围查询
  • Hash 索引:适合等值查询
  • GIN 索引:适合全文搜索和数组查询
  • GiST 索引:适合空间数据
  • SP-GiST 索引:适合非平衡数据结构
  • BRIN 索引:适合大型表

Q4: 什么是表空间?

A4: 表空间是 GaussDB 中的逻辑存储容器,对应一个或多个物理目录,用于组织和管理数据文件。

Q5: 如何优化 GaussDB 的存储性能?

A5: 优化 GaussDB 存储性能的建议:

  • 选择合适的存储引擎
  • 合理设计表空间
  • 优化索引
  • 使用数据压缩
  • 选择高性能存储设备
  • 优化日志配置

Q6: GaussDB 如何实现数据的高可靠性?

A6: GaussDB 实现数据高可靠性的方式:

  • 多副本存储
  • 事务日志
  • 自动故障检测和恢复
  • 支持备份和恢复
  • 实现数据校验和

Q7: 什么是 MVCC?

A7: MVCC(Multi-Version Concurrency Control)是一种并发控制机制,通过保存数据的多个版本,实现读写操作的并发执行,提高系统的并发性能。

Q8: GaussDB 支持哪些数据压缩技术?

A8: GaussDB 支持多种数据压缩技术:

  • 字典压缩
  • 前缀压缩
  • 位图压缩
  • 行程长度编码
  • 熵编码

Q9: 如何选择合适的索引类型?

A9: 选择索引类型的建议:

  • 等值查询:B-tree 或 Hash 索引
  • 范围查询:B-tree 索引
  • 全文搜索:GIN 索引
  • 空间数据:GiST 索引
  • 大型表:BRIN 索引

Q10: 如何监控 GaussDB 的存储使用情况?

A10: 监控 GaussDB 存储使用情况的方法:

  • 使用系统视图查询存储使用情况
  • 配置存储告警
  • 监控表空间大小
  • 监控数据文件增长
  • 定期进行存储审计