Skip to content

KingBaseES 物理备库配置

物理备库是 KingBaseES 最常用的高可用解决方案之一,通过字节级复制确保备库与主库的数据完全一致。本文将详细介绍 KingBaseES 物理备库的配置方法、验证步骤和最佳实践。

物理备库概述

工作原理

物理备库通过以下方式保持与主库的数据一致性:

  1. 主库生成 WAL(Write-Ahead Log)日志
  2. WAL 日志通过流复制或归档复制发送到备库
  3. 备库将 WAL 日志写入磁盘
  4. 备库应用 WAL 日志到数据库缓冲区
  5. 备库将修改刷新到磁盘,完成数据同步

复制模式

  • 流复制:主库实时将 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 = on

1.2 修改 pg_hba.conf 文件

添加备库的连接权限:

# 允许备库连接进行复制
host    replication     standby_user     192.168.1.100/32    md5

# 允许本地连接进行复制
local   replication     standby_user                     md5

1.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/data

2. 备库配置

2.1 准备备库目录

bash
# 创建备库数据目录
mkdir -p /path/to/kingbase/standby_data

# 设置目录权限
chown -R kingbase:kingbase /path/to/kingbase/standby_data

2.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 = on

2.4 创建 standby.signal 文件

bash
touch /path/to/kingbase/standby_data/standby.signal

2.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 = 3

2.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 日志

排查步骤

  1. 检查主备库之间的网络连接

    bash
    ping 192.168.1.100
    telnet 192.168.1.100 54321
  2. 检查复制用户权限

    sql
    SELECT * FROM pg_roles WHERE rolname = 'standby_user';
  3. 检查主库的 WAL 发送进程

    sql
    SELECT * FROM pg_stat_replication;
  4. 检查备库的 WAL 接收进程

    sql
    SELECT * FROM pg_stat_wal_receiver;
  5. 检查备库的 recovery.conf 或 kingbase.conf 配置

  6. 检查主库的 pg_hba.conf 配置

解决方案

  • 修复网络连接问题
  • 重新配置复制用户权限
  • 重启主备库的复制进程
  • 重新初始化备库

2. 复制延迟过高

症状:备库与主库的 WAL 日志差距较大

排查步骤

  1. 检查网络带宽和延迟

    bash
    iperf -c 192.168.1.100
  2. 检查主库的 WAL 生成速率

    sql
    SELECT 
        (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;
  3. 检查备库的系统资源使用情况

    bash
    top
    iostat -x
    vmstat
  4. 检查备库的恢复进程数

    sql
    SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'startup';

解决方案

  • 增加网络带宽
  • 调整主库的 WAL 级别和归档参数
  • 增加备库的硬件资源
  • 调整备库的恢复参数,如 max_worker_processes
  • 考虑使用级联复制,减轻主库负担

3. 备库无法启动

症状:备库启动失败,报错信息在日志中

排查步骤

  1. 检查备库的日志文件

    bash
    tail -n 100 /path/to/kingbase/standby_data/log/kingbase.log
  2. 检查备库的数据目录权限

    bash
    ls -la /path/to/kingbase/standby_data
  3. 检查备库的配置文件

    bash
    kingbase --validate-config -D /path/to/kingbase/standby_data

解决方案

  • 修复配置文件中的错误
  • 调整数据目录权限
  • 重新初始化备库
  • 检查硬件故障

版本差异

特性V8 R6V8 R7
恢复配置文件使用 recovery.conf 文件恢复配置移至 kingbase.conf,使用 standby.signal 文件
并行恢复支持有限的并行恢复增强了并行恢复能力,支持更多的恢复进程
级联复制不支持支持级联复制,允许备库作为其他备库的主库
复制槽支持基本的复制槽功能增强了复制槽的稳定性和可靠性
同步复制支持同步复制支持多备库同步,提供更灵活的同步策略
备库性能备库查询性能一般优化了备库的查询性能,支持更多的并发查询

最佳实践

1. 配置建议

  • 复制模式选择:优先使用流复制,延迟较低
  • 同步策略:根据业务需求选择同步或异步复制
  • WAL 级别:设置为 replica 或 higher
  • 归档策略:配置合理的归档路径和保留时间
  • 复制槽:使用复制槽避免 WAL 日志丢失

2. 硬件配置

  • 备库硬件配置建议不低于主库
  • 使用 SSD 存储提高备库的恢复性能
  • 配置充足的内存,提高备库的查询性能

3. 网络配置

  • 使用专用的网络链路进行复制
  • 配置合理的网络超时参数
  • 考虑使用压缩传输,减少网络带宽消耗

4. 安全配置

  • 限制复制用户的连接权限
  • 使用加密传输,保护复制数据
  • 定期更换复制用户密码

5. 灾难恢复

  • 定期进行备库恢复演练
  • 配置多个备库,分布在不同的物理位置
  • 考虑使用跨地域复制,提高灾难恢复能力

常见问题(FAQ)

1. 物理备库可以同时作为主库的备份源吗?

是的,可以在备库上执行备份操作,减轻主库的负担。使用 pg_basebackupsys_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 版本。