外观
KingBaseES 物理备库配置
物理备库是 KingBaseES 最常用的高可用解决方案之一,通过字节级复制确保备库与主库的数据完全一致。本文将详细介绍 KingBaseES 物理备库的配置方法、验证步骤和最佳实践。
物理备库概述
工作原理
物理备库通过以下方式保持与主库的数据一致性:
- 主库生成 WAL(Write-Ahead Log)日志
- WAL 日志通过流复制或归档复制发送到备库
- 备库将 WAL 日志写入磁盘
- 备库应用 WAL 日志到数据库缓冲区
- 备库将修改刷新到磁盘,完成数据同步
复制模式
- 流复制:主库实时将 WAL 日志发送到备库,延迟较低
- 归档复制:主库先将 WAL 日志归档到本地,备库定期从主库获取归档日志,延迟较高
- 同步复制:主库等待备库确认收到 WAL 日志后才提交事务,确保数据零丢失
- 异步复制:主库不等待备库确认,直接提交事务,性能较好但可能存在数据丢失风险
配置前准备
环境要求
| 组件 | 要求 |
|---|---|
| KingBaseES 版本 | 主备库版本必须一致 |
| 操作系统 | 建议使用相同的操作系统版本 |
| 硬件配置 | 备库硬件配置建议不低于主库 |
| 网络 | 主备库之间网络带宽充足,延迟低 |
| 存储 | 备库存储空间不小于主库 |
软件准备
- KingBaseES 安装包
- 主库的基础备份
- 主库的归档日志(如果使用归档复制)
详细配置步骤
1. 主库配置
1.1 修改 kingbase.conf 文件
ini
# ---------------------\n# WAL 配置\n# ---------------------\n# 启用归档模式
archive_mode = on
# 配置归档命令
archive_command = 'cp %p /path/to/archive/%f'
# 配置归档重试命令
archive_retry_command = 'cp %p /path/to/archive/%f'
# 配置归档超时时间(秒)
archive_timeout = 60
# ---------------------\n# 复制配置\n# ---------------------\n# 配置 WAL 级别
wal_level = replica
# 配置最大 WAL 发送进程数
max_wal_senders = 10
# 配置 WAL 保持段数
wal_keep_segments = 64
# 配置复制槽
max_replication_slots = 10
# ---------------------\n# 同步复制配置\n# ---------------------\n# 配置同步备库名称(可选)
synchronous_standby_names = 'standby1'
# 配置同步复制方法(可选)
synchronous_commit = on1.2 修改 pg_hba.conf 文件
添加备库的连接权限:
# 允许备库连接进行复制
host replication standby_user 192.168.1.100/32 md5
# 允许本地连接进行复制
local replication standby_user md51.3 创建复制用户
sql
-- 创建复制用户
CREATE USER standby_user REPLICATION LOGIN ENCRYPTED PASSWORD 'standby_password';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO standby_user;1.4 重启主库使配置生效
bash
sys_ctl restart -D /path/to/kingbase/data2. 备库配置
2.1 准备备库目录
bash
# 创建备库数据目录
mkdir -p /path/to/kingbase/standby_data
# 设置目录权限
chown -R kingbase:kingbase /path/to/kingbase/standby_data2.2 初始化备库
使用 pg_basebackup 命令从主库获取基础备份:
bash
pg_basebackup -h 192.168.1.100 -p 54321 -U standby_user -D /path/to/kingbase/standby_data -Fp -Xs -P -R参数说明:
-h:主库主机地址-p:主库端口号-U:复制用户名-D:备库数据目录-Fp:使用普通文件格式-Xs:使用流复制获取 WAL 日志-P:显示进度-R:自动生成备库的 recovery.conf 文件
2.3 配置备库参数
编辑备库的 kingbase.conf 文件,调整以下参数:
ini
# ---------------------\n# 备库配置\n# ---------------------\n# 配置备库是否允许只读访问
hot_standby = on
# 配置备库最大连接数
max_connections = 100
# 配置备库共享缓冲区
shared_buffers = 2GB
# 配置备库 WAL 缓冲区
wal_buffers = 16MB
# ---------------------\n# 恢复配置\n# ---------------------\n# 配置最大恢复延迟
max_standby_streaming_delay = 30s
# 配置备库恢复冲突处理
hot_standby_feedback = on2.4 创建 standby.signal 文件
bash
touch /path/to/kingbase/standby_data/standby.signal2.5 配置 recovery.conf 文件(V8 R6)
注意:在 V8 R7 版本中,recovery.conf 文件已被废弃,相关配置移至 kingbase.conf
ini
# 主库连接信息
primary_conninfo = 'host=192.168.1.100 port=54321 user=standby_user password=standby_password application_name=standby1'
# 恢复目标
recovery_target_timeline = 'latest'
# 恢复命令(如果使用归档复制)
restore_command = 'cp /path/to/archive/%f %p'
# 恢复重试命令
restore_command_retry_interval = 5
# 最大重试次数
restore_command_max_retries = 32.6 启动备库
bash
sys_ctl start -D /path/to/kingbase/standby_data验证物理备库
1. 主库验证
sql
-- 查看复制状态
SELECT * FROM pg_stat_replication;
-- 查看复制槽状态
SELECT * FROM pg_replication_slots;
-- 查看 WAL 发送状态
SELECT pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn());2. 备库验证
sql
-- 查看备库状态
SELECT pg_is_in_recovery();
-- 查看 WAL 接收状态
SELECT pg_last_wal_receive_lsn(), pg_walfile_name(pg_last_wal_receive_lsn());
-- 查看 WAL 应用状态
SELECT pg_last_wal_replay_lsn(), pg_walfile_name(pg_last_wal_replay_lsn());
-- 查看复制延迟
SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag;
-- 查看备库信息
SELECT * FROM pg_stat_wal_receiver;3. 数据一致性验证
bash
# 在主库创建测试表并插入数据
psql -h 192.168.1.100 -p 54321 -U test_user -d test_db -c "CREATE TABLE test_table (id serial primary key, name varchar(50)); INSERT INTO test_table (name) VALUES ('test');"
# 在备库查询数据,验证同步
psql -h 192.168.1.200 -p 54321 -U test_user -d test_db -c "SELECT * FROM test_table;"监控与维护
1. 监控复制状态
使用 SQL 监控
sql
-- 主库监控
SELECT
application_name,
state,
sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS send_lag,
pg_wal_lsn_diff(sent_lsn, write_lsn) AS write_lag,
pg_wal_lsn_diff(write_lsn, flush_lsn) AS flush_lag,
pg_wal_lsn_diff(flush_lsn, replay_lsn) AS replay_lag,
backend_start,
backend_xmin
FROM pg_stat_replication;
-- 备库监控
SELECT
pg_is_in_recovery() AS is_standby,
pg_last_wal_receive_lsn() AS last_receive_lsn,
pg_last_wal_replay_lsn() AS last_replay_lsn,
pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag,
pg_last_xact_replay_timestamp() AS last_replay_time
FROM pg_stat_wal_receiver;使用监控工具
- KingBaseES Manager (KEM):提供图形化的复制监控界面
- Prometheus + Grafana:通过 exporter 收集复制指标,可视化监控
- Zabbix:配置监控模板,监控复制状态和延迟
2. 日常维护
- 定期检查复制延迟,确保在合理范围内
- 定期备份备库,避免主备库同时故障
- 监控主库的 WAL 日志生成速率,调整归档策略
- 监控备库的磁盘空间,及时清理旧的 WAL 日志
- 定期进行主备切换演练,验证故障恢复能力
故障排除
1. 复制中断
症状:备库无法接收或应用主库的 WAL 日志
排查步骤:
检查主备库之间的网络连接
bashping 192.168.1.100 telnet 192.168.1.100 54321检查复制用户权限
sqlSELECT * FROM pg_roles WHERE rolname = 'standby_user';检查主库的 WAL 发送进程
sqlSELECT * FROM pg_stat_replication;检查备库的 WAL 接收进程
sqlSELECT * FROM pg_stat_wal_receiver;检查备库的 recovery.conf 或 kingbase.conf 配置
检查主库的 pg_hba.conf 配置
解决方案:
- 修复网络连接问题
- 重新配置复制用户权限
- 重启主备库的复制进程
- 重新初始化备库
2. 复制延迟过高
症状:备库与主库的 WAL 日志差距较大
排查步骤:
检查网络带宽和延迟
bashiperf -c 192.168.1.100检查主库的 WAL 生成速率
sqlSELECT (pg_current_wal_lsn() - pg_wal_lsn_offset(pg_current_wal_lsn(), 60 * 60)) AS one_hour_ago_lsn, pg_wal_lsn_diff(pg_current_wal_lsn(), pg_wal_lsn_offset(pg_current_wal_lsn(), 60 * 60)) AS wal_generated FROM pg_stat_wal;检查备库的系统资源使用情况
bashtop iostat -x vmstat检查备库的恢复进程数
sqlSELECT count(*) FROM pg_stat_activity WHERE backend_type = 'startup';
解决方案:
- 增加网络带宽
- 调整主库的 WAL 级别和归档参数
- 增加备库的硬件资源
- 调整备库的恢复参数,如
max_worker_processes - 考虑使用级联复制,减轻主库负担
3. 备库无法启动
症状:备库启动失败,报错信息在日志中
排查步骤:
检查备库的日志文件
bashtail -n 100 /path/to/kingbase/standby_data/log/kingbase.log检查备库的数据目录权限
bashls -la /path/to/kingbase/standby_data检查备库的配置文件
bashkingbase --validate-config -D /path/to/kingbase/standby_data
解决方案:
- 修复配置文件中的错误
- 调整数据目录权限
- 重新初始化备库
- 检查硬件故障
版本差异
| 特性 | V8 R6 | V8 R7 |
|---|---|---|
| 恢复配置文件 | 使用 recovery.conf 文件 | 恢复配置移至 kingbase.conf,使用 standby.signal 文件 |
| 并行恢复 | 支持有限的并行恢复 | 增强了并行恢复能力,支持更多的恢复进程 |
| 级联复制 | 不支持 | 支持级联复制,允许备库作为其他备库的主库 |
| 复制槽 | 支持基本的复制槽功能 | 增强了复制槽的稳定性和可靠性 |
| 同步复制 | 支持同步复制 | 支持多备库同步,提供更灵活的同步策略 |
| 备库性能 | 备库查询性能一般 | 优化了备库的查询性能,支持更多的并发查询 |
最佳实践
1. 配置建议
- 复制模式选择:优先使用流复制,延迟较低
- 同步策略:根据业务需求选择同步或异步复制
- WAL 级别:设置为 replica 或 higher
- 归档策略:配置合理的归档路径和保留时间
- 复制槽:使用复制槽避免 WAL 日志丢失
2. 硬件配置
- 备库硬件配置建议不低于主库
- 使用 SSD 存储提高备库的恢复性能
- 配置充足的内存,提高备库的查询性能
3. 网络配置
- 使用专用的网络链路进行复制
- 配置合理的网络超时参数
- 考虑使用压缩传输,减少网络带宽消耗
4. 安全配置
- 限制复制用户的连接权限
- 使用加密传输,保护复制数据
- 定期更换复制用户密码
5. 灾难恢复
- 定期进行备库恢复演练
- 配置多个备库,分布在不同的物理位置
- 考虑使用跨地域复制,提高灾难恢复能力
常见问题(FAQ)
1. 物理备库可以同时作为主库的备份源吗?
是的,可以在备库上执行备份操作,减轻主库的负担。使用 pg_basebackup 或 sys_dump 等工具在备库上进行备份。
2. 如何将物理备库转换为主库?
使用以下命令将备库提升为主库:
bash
# 在备库上执行
pg_ctl promote -D /path/to/kingbase/standby_data或者在 SQL 中执行:
sql
SELECT pg_promote();3. 物理备库支持只读查询吗?
是的,物理备库支持只读查询,通过设置 hot_standby = on 启用。
4. 如何配置多个物理备库?
配置多个物理备库的步骤与配置单个备库相同,只需要在主库的 pg_hba.conf 中添加多个备库的连接权限,并为每个备库创建独立的复制用户。
5. 物理备库与逻辑备库有什么区别?
| 特性 | 物理备库 | 逻辑备库 |
|---|---|---|
| 复制级别 | 物理级别,字节级复制 | 逻辑级别,基于SQL或行级变更 |
| 数据一致性 | 与主库完全一致 | 逻辑一致,可能存在延迟 |
| 故障恢复 | 恢复速度快 | 恢复速度慢 |
| 只读访问 | 支持 | 支持 |
| 灵活性 | 较低 | 较高,支持选择性复制 |
| 性能影响 | 对主库影响小 | 对主库影响大 |
总结
物理备库是 KingBaseES 实现高可用性的重要手段,通过正确配置和维护物理备库,可以确保业务系统的连续性和数据安全性。在配置物理备库时,需要根据业务需求选择合适的复制模式,定期监控复制状态,及时排查和解决问题,确保备库的可靠性。
V8 R7 版本对物理备库进行了多项优化,包括增强并行恢复能力、支持级联复制、优化备库查询性能等,建议在新部署或升级时优先考虑使用 V8 R7 版本。
