Skip to content

KingBaseES 存储配置

存储配置是KingBaseES数据库设计和性能调优的关键环节,合理的存储架构和配置可以显著提升数据库的IO性能、可靠性和可扩展性。本文将详细介绍KingBaseES的存储配置方案。

存储架构设计

1. 逻辑存储架构

KingBaseES的逻辑存储层次结构:

  • 数据库集群:包含一个或多个数据库
  • 数据库:包含多个表空间
  • 表空间:映射到物理存储位置
  • :表或索引的数据存储单元
  • :由多个连续的数据块组成
  • 数据块:数据库的最小存储单元(默认8KB)

2. 物理存储布局

推荐的KingBaseES物理存储布局:

/kingbase/             # 数据库根目录
├── data/              # 数据文件目录(主目录)
│   ├── sys_config/    # 配置文件
│   ├── base/          # 系统表和默认表空间
│   ├── pg_xlog/       # WAL日志(V8 R6)
│   ├── pg_wal/        # WAL日志(V8 R7)
│   ├── pg_clog/       # 事务提交日志(V8 R6)
│   ├── pg_xact/       # 事务提交日志(V8 R7)
│   └── pg_tblspc/     # 表空间链接
├── archive/           # WAL归档目录
├── backup/            # 备份文件目录
├── logs/              # 日志文件目录
└── temp/              # 临时文件目录

存储设备选择

1. 存储类型对比

存储类型特点适用场景
HDD大容量、低成本、低IOPS历史数据存储、备份存储
SAS SSD中容量、中成本、中高IOPS一般业务数据库
NVMe SSD小容量、高成本、极高IOPS高性能业务、关键数据库
FusionIO小容量、极高成本、极高IOPS超高性能要求的核心业务

2. RAID级别选择

根据不同的业务需求选择合适的RAID级别:

RAID级别特点适用场景
RAID 0无冗余、高性能临时表空间、测试环境
RAID 1镜像冗余、读性能高日志文件、关键配置文件
RAID 5奇偶校验、空间利用率高一般数据存储
RAID 6双奇偶校验、更高冗余重要数据存储
RAID 10镜像+条带、高性能高冗余核心业务数据库、WAL日志

文件系统配置

1. 文件系统选择

推荐使用的文件系统:

  • Linux:EXT4、XFS(推荐)
  • Windows:NTFS

2. XFS文件系统优化

XFS是KingBaseES在Linux环境下的推荐文件系统,具有良好的扩展性和性能:

bash
# 格式化命令
mkfs.xfs -f -i size=512 -l size=128m,version=2 -d su=64k,sw=8 /dev/sdb1

# 挂载选项(/etc/fstab)
/dev/sdb1 /kingbase xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0

主要优化项说明:

  • -i size=512:inode大小,适合大文件存储
  • -l size=128m:日志区大小,提高写入性能
  • noatime/nodiratime:禁用访问时间记录
  • logbufs=8:日志缓冲区数量
  • logbsize=256k:日志缓冲区大小

3. EXT4文件系统优化

bash
# 格式化命令
mkfs.ext4 -F -b 4096 -E stride=16,stripe-width=128 /dev/sdb1

# 挂载选项(/etc/fstab)
/dev/sdb1 /kingbase ext4 defaults,noatime,nodiratime,barrier=0,data=writeback,commit=60 0 0

表空间配置

1. 表空间设计原则

  • 分离原则:将不同类型的数据分离到不同表空间
  • 性能原则:高性能存储用于热点数据
  • 管理原则:便于备份和恢复
  • 扩展原则:考虑未来存储扩展需求

2. 推荐的表空间规划

表空间名称存储位置存储类型用途
SYSTEM/kingbase/data/baseSAS SSD系统表和目录
USER_DATA/kingbase/tbs/user_dataSAS SSD用户业务数据
USER_INDEX/kingbase/tbs/user_indexSAS SSD用户索引
HOT_DATA/kingbase/tbs/hot_dataNVMe SSD热点数据表
HOT_INDEX/kingbase/tbs/hot_indexNVMe SSD热点数据索引
LOB_DATA/kingbase/tbs/lob_dataHDD大对象数据
BACKUP/kingbase/backupHDD备份数据
TEMP/kingbase/tempSAS SSD临时表空间

3. 表空间创建示例

sql
-- 创建表空间
CREATE TABLESPACE user_data LOCATION '/kingbase/tbs/user_data';
CREATE TABLESPACE user_index LOCATION '/kingbase/tbs/user_index';
CREATE TABLESPACE hot_data LOCATION '/kingbase/tbs/hot_data';
CREATE TABLESPACE hot_index LOCATION '/kingbase/tbs/hot_index';
CREATE TABLESPACE lob_data LOCATION '/kingbase/tbs/lob_data';
CREATE TABLESPACE temp_tbs LOCATION '/kingbase/temp';

-- 修改默认表空间
ALTER DATABASE mydb SET default_tablespace = user_data;

-- 创建表时指定表空间
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
) TABLESPACE user_data;

-- 创建索引时指定表空间
CREATE INDEX idx_users_email ON users(email) TABLESPACE user_index;

4. 临时表空间配置

优化临时表空间配置,提高排序和连接操作性能:

sql
-- 创建多个临时表空间
tCREATE TABLESPACE temp_tbs1 LOCATION '/kingbase/temp1';
CREATE TABLESPACE temp_tbs2 LOCATION '/kingbase/temp2';

-- 修改postgresql.conf配置
work_mem = 64MB           # 每个会话的工作内存
maintenance_work_mem = 512MB  # 维护操作的工作内存
temp_tablespaces = 'temp_tbs1, temp_tbs2'  # 临时表空间列表

存储参数优化

1. 数据块大小

KingBaseES默认数据块大小为8KB,可根据业务需求调整:

  • 对于OLTP系统:8KB(默认)
  • 对于数据仓库:16KB或32KB

注意:数据块大小在初始化数据库时指定,后续无法修改。

bash
# 初始化数据库时指定数据块大小
initdb -D /kingbase/data --data-block-size=16kB

2. WAL相关参数

sql
-- postgresql.conf配置
wal_buffers = 16MB        # WAL缓冲区大小
checkpoint_timeout = 30min # 检查点间隔
max_wal_size = 4GB         # 最大WAL文件大小
min_wal_size = 1GB         # 最小WAL文件大小
wal_compression = on       # WAL压缩(V8 R7)

3. IO相关参数

sql
-- postgresql.conf配置
shared_buffers = 25%       # 共享缓冲区大小(推荐系统内存的25%)
effective_cache_size = 50% # 有效缓存大小(推荐系统内存的50%)
maintenance_work_mem = 2GB # 维护操作内存
random_page_cost = 1.1     # 随机IO成本(SSD设置为1.1,HDD设置为4)
seq_page_cost = 1.0        # 顺序IO成本

存储优化最佳实践

1. 数据文件布局优化

  • 将数据文件、WAL日志、备份文件分离到不同的存储设备
  • 使用独立的存储设备存储临时文件
  • 对于大表,考虑使用分区表并分布到不同表空间

2. IO调度算法选择

bash
# 查看当前IO调度算法
cat /sys/block/sda/queue/scheduler

# 设置IO调度算法(SSD推荐使用none或mq-deadline)
echo none > /sys/block/sda/queue/scheduler

# 永久设置(/etc/rc.d/rc.local)
echo none > /sys/block/sda/queue/scheduler
echo none > /sys/block/sdb/queue/scheduler

3. 大文件处理

对于大表和大对象,建议:

  • 使用分区表分散IO负载
  • 将大对象存储在独立的表空间
  • 考虑使用外部表或分区表归档历史数据

4. 存储监控

定期监控存储性能:

bash
# Linux系统
iosat -x 1 10         # 磁盘IO监控
df -h                 # 磁盘空间使用情况
du -sh /kingbase/*    # 目录大小
smartctl -a /dev/sda  # 磁盘健康状态

# KingBaseES内置视图
SELECT * FROM pg_stat_database;
SELECT * FROM pg_stat_bgwriter;
SELECT * FROM pg_statio_user_tables;

版本差异(V8 R6 vs V8 R7)

V8 R6 存储特性

  • WAL日志目录为pg_xlog
  • 事务提交日志目录为pg_clog
  • 有限的SSD优化支持
  • 表空间管理功能相对简单
  • 不支持WAL压缩

V8 R7 存储特性

  • WAL日志目录改为pg_wal
  • 事务提交日志目录改为pg_xact
  • 增强了对NVMe SSD的优化支持
  • 新增了表空间组管理功能
  • 支持WAL压缩
  • 改进了大对象存储管理
  • 新增了增量检查点功能

常见问题(FAQ)

Q1:如何选择合适的数据块大小?

A1:根据业务类型和查询模式选择:

  • OLTP系统:8KB(默认),适合随机读写
  • 数据仓库:16KB或32KB,适合顺序扫描
  • 大对象存储:16KB或32KB

Q2:表空间数量越多越好吗?

A2:不是。过多的表空间会增加管理复杂度,建议根据以下原则创建:

  • 按数据类型分离(数据、索引、大对象)
  • 按访问频率分离(热点数据、冷数据)
  • 按备份策略分离(不同备份周期)

Q3:WAL日志和数据文件必须分离吗?

A3:是的。将WAL日志与数据文件分离到不同存储设备有以下好处:

  • 提高写入性能,避免IO竞争
  • 提高数据安全性,WAL日志损坏不影响数据文件
  • 便于单独管理和备份

Q4:如何优化大表的查询性能?

A4:

  • 使用分区表分散数据和IO负载
  • 创建合适的索引
  • 考虑使用物化视图
  • 定期进行VACUUM和ANALYZE
  • 将大表存储在高性能存储设备

Q5:如何处理存储容量不足问题?

A5:

  • 清理无用数据和日志文件
  • 归档历史数据到低成本存储
  • 扩展现有存储容量
  • 添加新的表空间
  • 考虑使用分布式存储架构

Q6:SSD和HDD混合使用的最佳实践是什么?

A6:

  • 将热点数据和索引存储在SSD
  • 将冷数据和备份存储在HDD
  • 将WAL日志存储在SSD以提高写入性能
  • 将临时表空间存储在SSD以提高排序性能

总结

合理的存储配置是KingBaseES数据库性能和可靠性的基础。在设计存储架构时,应根据业务需求、数据量和性能要求选择合适的存储设备、文件系统和表空间布局。同时,定期监控存储性能,根据实际运行情况进行优化调整。V8 R7版本在存储管理方面有了显著改进,特别是对NVMe SSD的支持和WAL压缩功能,建议在新部署时优先考虑。