Skip to content

KingBaseES 逻辑备库配置

逻辑备库是 KingBaseES 提供的一种高级高可用解决方案,通过逻辑级别的复制实现数据同步。与物理备库不同,逻辑备库允许选择性复制特定的数据库、表或甚至行,提供了更大的灵活性。

逻辑备库概述

工作原理

逻辑备库通过以下方式实现数据同步:

  1. 主库生成逻辑变更日志(基于逻辑复制槽)
  2. 发布者(Publisher)将逻辑变更发送到订阅者(Subscriber)
  3. 订阅者接收并解析逻辑变更
  4. 订阅者将变更应用到本地数据库
  5. 完成数据同步,保持逻辑一致性

核心组件

  • 发布(Publication):主库上定义的一组要复制的对象(数据库、表等)
  • 订阅(Subscription):备库上定义的与发布的连接,用于接收和应用变更
  • 复制槽(Replication Slot):确保主库保留订阅者需要的 WAL 日志,防止日志被提前删除
  • 逻辑解码(Logical Decoding):将 WAL 日志转换为逻辑变更的过程

适用场景

  • 选择性复制:只复制特定的数据库或表
  • 跨版本复制:支持不同版本之间的复制
  • 数据集成:将数据复制到其他系统进行分析或报告
  • 读写分离:备库用于查询,主库用于写操作
  • 数据库迁移:用于版本升级或架构迁移

配置前准备

环境要求

组件要求
KingBaseES 版本主库版本需支持逻辑复制,建议使用 V8 R6 及以上版本
操作系统支持 Linux 和 Windows 操作系统
硬件配置备库硬件配置根据实际负载调整
网络主备库之间网络连接稳定
存储备库存储空间根据复制的数据量调整

软件准备

  • KingBaseES 安装包
  • 主库的基础备份(可选,用于初始化备库)
  • 主库的逻辑解码插件(如 test_decoding 或 wal2json)

详细配置步骤

1. 主库配置

1.1 修改 kingbase.conf 文件

ini
# ---------------------\n# WAL 配置\n# ---------------------\n# 启用逻辑复制模式
wal_level = logical

# ---------------------\n# 复制配置\n# ---------------------\n# 配置最大 WAL 发送进程数
max_wal_senders = 10

# 配置最大逻辑复制槽数
max_replication_slots = 10

# 配置最大并行备份进程数
max_worker_processes = 10

# 配置逻辑复制工作进程数
max_parallel_workers_per_gather = 4

# ---------------------\n# 其他配置\n# ---------------------\n# 启用自动清理
autovacuum = on

1.2 修改 pg_hba.conf 文件

添加逻辑复制的连接权限:

# 允许逻辑复制连接
host    replication     logical_user     192.168.1.100/32    md5

host    testdb          logical_user     192.168.1.100/32    md5

1.3 重启主库使配置生效

bash
sys_ctl restart -D /path/to/kingbase/data

1.4 创建逻辑复制用户

sql
-- 创建逻辑复制用户
CREATE USER logical_user WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'logical_password';

-- 授予必要的权限
GRANT CONNECT ON DATABASE testdb TO logical_user;
GRANT USAGE ON SCHEMA public TO logical_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO logical_user;

1.5 创建发布(Publication)

sql
-- 连接到要复制的数据库
\c testdb

-- 创建发布,复制所有表
CREATE PUBLICATION my_publication FOR ALL TABLES;

-- 或选择性复制特定表
CREATE PUBLICATION my_publication FOR TABLE table1, table2;

-- 或复制特定表的特定列
-- 注意:KingBaseES V8 R7 支持列级复制,V8 R6 不支持
CREATE PUBLICATION my_publication FOR TABLE table1 (id, name), table2;

-- 查看已创建的发布
\dP+

2. 备库配置

2.1 初始化备库

如果备库尚未初始化,可以使用以下方法之一初始化:

方法一:使用 pg_basebackup 初始化
bash
pg_basebackup -h 192.168.1.100 -p 54321 -U logical_user -D /path/to/kingbase/logical_standby_data -Fp -Xs -P
方法二:使用 sys_dump/sys_restore 初始化
bash
# 在主库上备份
sys_dump -h 192.168.1.100 -p 54321 -U logical_user -d testdb -f testdb_dump.sql

# 在备库上恢复
createdb -h 192.168.1.200 -p 54321 -U logical_user testdb
sys_restore -h 192.168.1.200 -p 54321 -U logical_user -d testdb testdb_dump.sql

2.2 配置备库参数

编辑备库的 kingbase.conf 文件:

ini
# ---------------------\n# 备库配置\n# ---------------------\n# 配置最大连接数
max_connections = 100

# 配置共享缓冲区
shared_buffers = 2GB

# 配置 WAL 缓冲区
wal_buffers = 16MB

# ---------------------\n# 逻辑复制配置\n# ---------------------\n# 配置最大逻辑复制工作进程数
max_logical_replication_workers = 4

# 配置每个订阅的工作进程数
max_workers_per_subscription = 2

2.3 重启备库使配置生效

bash
sys_ctl restart -D /path/to/kingbase/logical_standby_data

2.4 创建订阅(Subscription)

sql
-- 连接到备库
psql -h 192.168.1.200 -p 54321 -U logical_user testdb

-- 创建订阅
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=192.168.1.100 port=54321 user=logical_user password=logical_password dbname=testdb'
PUBLICATION my_publication;

-- 查看已创建的订阅
\ds+

验证逻辑备库

1. 主库验证

sql
-- 查看发布状态
SELECT * FROM pg_publication;

-- 查看发布中的表
SELECT * FROM pg_publication_tables;

-- 查看复制槽状态
SELECT * FROM pg_replication_slots;

-- 查看 WAL 发送状态
SELECT * FROM pg_stat_replication;

2. 备库验证

sql
-- 查看订阅状态
SELECT * FROM pg_subscription;

-- 查看订阅工作进程状态
SELECT * FROM pg_stat_subscription;

-- 查看订阅进度
SELECT subname, subenabled, subconninfo
FROM pg_subscription;

3. 数据一致性验证

bash
# 在主库创建测试表并插入数据
psql -h 192.168.1.100 -p 54321 -U logical_user testdb -c "CREATE TABLE test_logical (id serial primary key, name varchar(50)); INSERT INTO test_logical (name) VALUES ('test');"

# 在备库查询数据,验证同步
psql -h 192.168.1.200 -p 54321 -U logical_user testdb -c "SELECT * FROM test_logical;"

监控与维护

1. 监控复制状态

使用 SQL 监控

sql
-- 主库监控
SELECT 
    application_name,
    state,
    sync_state,
    pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS send_lag
FROM pg_stat_replication
WHERE application_name LIKE 'subscription%';

-- 备库监控
SELECT 
    subname,
    subenabled,
    last_msg_send_time,
    last_msg_receipt_time,
    last_sync_time,
    sync_priority,
    sync_state
FROM pg_stat_subscription;

使用监控工具

  • KingBaseES Manager (KEM):提供图形化的逻辑复制监控
  • Prometheus + Grafana:通过 exporter 收集逻辑复制指标
  • 自定义脚本:定期检查复制状态并发送告警

2. 日常维护

  • 定期监控复制延迟,确保在合理范围内
  • 监控主库的复制槽,避免 WAL 日志堆积
  • 监控备库的磁盘空间,及时清理旧数据
  • 定期验证数据一致性,确保复制正常
  • 定期进行主备切换演练,验证故障恢复能力

故障排除

1. 订阅创建失败

症状:创建订阅时报错,无法连接到主库或找不到发布

排查步骤

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

    bash
    ping 192.168.1.100
    telnet 192.168.1.100 54321
  2. 检查主库的发布是否存在

    sql
    SELECT * FROM pg_publication WHERE pubname = 'my_publication';
  3. 检查复制用户权限

    sql
    SELECT * FROM pg_roles WHERE rolname = 'logical_user';
  4. 检查主库的 pg_hba.conf 配置

解决方案

  • 修复网络连接问题
  • 确保发布已正确创建
  • 重新配置复制用户权限
  • 检查并修正 pg_hba.conf 配置

2. 复制延迟过高

症状:备库与主库的数据差异较大,延迟时间长

排查步骤

  1. 检查主库的 WAL 生成速率

    sql
    SELECT 
        (pg_current_wal_lsn() - pg_wal_lsn_offset(pg_current_wal_lsn(), 60)) AS one_minute_ago_lsn,
        pg_wal_lsn_diff(pg_current_wal_lsn(), pg_wal_lsn_offset(pg_current_wal_lsn(), 60)) AS wal_generated
    FROM pg_stat_wal;
  2. 检查备库的系统资源使用情况

    bash
    top
    iostat -x
    vmstat
  3. 检查备库的订阅工作进程

    sql
    SELECT * FROM pg_stat_subscription;

解决方案

  • 增加备库的硬件资源
  • 调整备库的逻辑复制工作进程数
  • 优化主库的查询性能,减少 WAL 生成速率
  • 考虑使用多个订阅,分散复制负载

3. 复制中断

症状:备库停止接收或应用主库的逻辑变更

排查步骤

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

  2. 检查主库的复制槽状态

    sql
    SELECT * FROM pg_replication_slots WHERE slot_name LIKE 'sub%';
  3. 检查备库的订阅状态

    sql
    SELECT * FROM pg_stat_subscription;
  4. 检查备库的日志文件

    bash
    tail -n 100 /path/to/kingbase/logical_standby_data/log/kingbase.log

解决方案

  • 修复网络连接问题
  • 重启备库的订阅
  • 重新创建订阅(如果必要)
  • 排查并修复导致复制中断的错误

版本差异

特性V8 R6V8 R7
列级复制不支持支持
行级过滤不支持支持
并行应用有限支持增强支持
复制槽管理基本功能增强功能,支持自动清理
发布订阅语法基础语法扩展语法,支持更多选项
监控指标基本指标更丰富的监控指标
错误处理基本错误处理增强的错误处理和恢复机制

最佳实践

1. 配置建议

  • 发布设计:根据业务需求设计合理的发布,避免复制不必要的数据
  • 订阅管理:定期清理不再使用的订阅和复制槽
  • 复制槽配置:为每个订阅配置独立的复制槽,确保数据不丢失
  • 冲突处理:配置合理的冲突解决策略,避免数据不一致

2. 性能优化

  • 批量应用:启用批量应用功能,提高复制性能
  • 并行应用:根据备库的 CPU 核心数调整并行工作进程数
  • 网络优化:使用专用网络链路进行复制,减少网络延迟
  • WAL 优化:优化主库的 WAL 生成,减少复制负载

3. 安全配置

  • 最小权限原则:复制用户只授予必要的权限
  • 加密传输:使用 SSL/TLS 加密复制数据
  • 定期密码更换:定期更换复制用户密码
  • 访问控制:限制复制用户的连接来源

4. 灾难恢复

  • 定期备份备库数据,确保数据安全
  • 配置多个逻辑备库,提高可用性
  • 定期进行故障恢复演练,验证恢复能力
  • 考虑使用跨地域复制,提高灾难恢复能力

常见问题(FAQ)

1. 逻辑备库和物理备库可以同时使用吗?

是的,可以同时配置物理备库和逻辑备库,以满足不同的业务需求。物理备库用于高可用性,逻辑备库用于选择性复制或数据分析。

2. 逻辑备库支持跨版本复制吗?

是的,逻辑备库支持跨版本复制,但需要注意版本兼容性。建议使用较低版本的主库和较高版本的备库,或者确保两个版本之间的逻辑复制兼容。

3. 如何处理逻辑复制中的冲突?

逻辑复制中的冲突可以通过以下方式处理:

  • 配置冲突解决策略(如忽略、覆盖或保留)
  • 使用 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 重新同步数据
  • 手动修复冲突数据,然后重启订阅

4. 逻辑备库可以写入数据吗?

是的,逻辑备库可以写入数据,但需要注意:

  • 写入的数据不会被复制回主库
  • 写入的数据可能与主库复制过来的数据发生冲突
  • 建议只在备库上写入与主库复制无关的数据

5. 如何删除逻辑备库?

删除逻辑备库的步骤:

  1. 删除备库上的订阅

    sql
    DROP SUBSCRIPTION my_subscription;
  2. 删除主库上的复制槽

    sql
    SELECT pg_drop_replication_slot('subscription_slot_name');
  3. 删除主库上的发布(如果不再需要)

    sql
    DROP PUBLICATION my_publication;
  4. 停止并删除备库实例

    bash
    sys_ctl stop -D /path/to/kingbase/logical_standby_data
    rm -rf /path/to/kingbase/logical_standby_data

总结

逻辑备库是 KingBaseES 提供的一种灵活的数据同步解决方案,适用于多种场景,如选择性复制、跨版本复制和数据集成。通过正确配置和维护逻辑备库,可以提高数据的可用性和灵活性。

在配置逻辑备库时,需要注意以下几点:

  • 选择合适的复制模式和配置参数
  • 定期监控复制状态和延迟
  • 及时处理复制中的问题和冲突
  • 定期进行备份和恢复演练

V8 R7 版本对逻辑备库进行了多项增强,包括列级复制、行级过滤、增强的并行应用等,建议在新部署或升级时优先考虑使用 V8 R7 版本。