外观
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/base | SAS SSD | 系统表和目录 |
USER_DATA | /kingbase/tbs/user_data | SAS SSD | 用户业务数据 |
USER_INDEX | /kingbase/tbs/user_index | SAS SSD | 用户索引 |
HOT_DATA | /kingbase/tbs/hot_data | NVMe SSD | 热点数据表 |
HOT_INDEX | /kingbase/tbs/hot_index | NVMe SSD | 热点数据索引 |
LOB_DATA | /kingbase/tbs/lob_data | HDD | 大对象数据 |
BACKUP | /kingbase/backup | HDD | 备份数据 |
TEMP | /kingbase/temp | SAS 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=16kB2. 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/scheduler3. 大文件处理
对于大表和大对象,建议:
- 使用分区表分散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压缩功能,建议在新部署时优先考虑。
