外观
KingBaseES 逻辑备库配置
逻辑备库是 KingBaseES 提供的一种高级高可用解决方案,通过逻辑级别的复制实现数据同步。与物理备库不同,逻辑备库允许选择性复制特定的数据库、表或甚至行,提供了更大的灵活性。
逻辑备库概述
工作原理
逻辑备库通过以下方式实现数据同步:
- 主库生成逻辑变更日志(基于逻辑复制槽)
- 发布者(Publisher)将逻辑变更发送到订阅者(Subscriber)
- 订阅者接收并解析逻辑变更
- 订阅者将变更应用到本地数据库
- 完成数据同步,保持逻辑一致性
核心组件
- 发布(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 = on1.2 修改 pg_hba.conf 文件
添加逻辑复制的连接权限:
# 允许逻辑复制连接
host replication logical_user 192.168.1.100/32 md5
host testdb logical_user 192.168.1.100/32 md51.3 重启主库使配置生效
bash
sys_ctl restart -D /path/to/kingbase/data1.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.sql2.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 = 22.3 重启备库使配置生效
bash
sys_ctl restart -D /path/to/kingbase/logical_standby_data2.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. 订阅创建失败
症状:创建订阅时报错,无法连接到主库或找不到发布
排查步骤:
检查主备库之间的网络连接
bashping 192.168.1.100 telnet 192.168.1.100 54321检查主库的发布是否存在
sqlSELECT * FROM pg_publication WHERE pubname = 'my_publication';检查复制用户权限
sqlSELECT * FROM pg_roles WHERE rolname = 'logical_user';检查主库的 pg_hba.conf 配置
解决方案:
- 修复网络连接问题
- 确保发布已正确创建
- 重新配置复制用户权限
- 检查并修正 pg_hba.conf 配置
2. 复制延迟过高
症状:备库与主库的数据差异较大,延迟时间长
排查步骤:
检查主库的 WAL 生成速率
sqlSELECT (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;检查备库的系统资源使用情况
bashtop iostat -x vmstat检查备库的订阅工作进程
sqlSELECT * FROM pg_stat_subscription;
解决方案:
- 增加备库的硬件资源
- 调整备库的逻辑复制工作进程数
- 优化主库的查询性能,减少 WAL 生成速率
- 考虑使用多个订阅,分散复制负载
3. 复制中断
症状:备库停止接收或应用主库的逻辑变更
排查步骤:
检查主备库之间的网络连接
检查主库的复制槽状态
sqlSELECT * FROM pg_replication_slots WHERE slot_name LIKE 'sub%';检查备库的订阅状态
sqlSELECT * FROM pg_stat_subscription;检查备库的日志文件
bashtail -n 100 /path/to/kingbase/logical_standby_data/log/kingbase.log
解决方案:
- 修复网络连接问题
- 重启备库的订阅
- 重新创建订阅(如果必要)
- 排查并修复导致复制中断的错误
版本差异
| 特性 | V8 R6 | V8 R7 |
|---|---|---|
| 列级复制 | 不支持 | 支持 |
| 行级过滤 | 不支持 | 支持 |
| 并行应用 | 有限支持 | 增强支持 |
| 复制槽管理 | 基本功能 | 增强功能,支持自动清理 |
| 发布订阅语法 | 基础语法 | 扩展语法,支持更多选项 |
| 监控指标 | 基本指标 | 更丰富的监控指标 |
| 错误处理 | 基本错误处理 | 增强的错误处理和恢复机制 |
最佳实践
1. 配置建议
- 发布设计:根据业务需求设计合理的发布,避免复制不必要的数据
- 订阅管理:定期清理不再使用的订阅和复制槽
- 复制槽配置:为每个订阅配置独立的复制槽,确保数据不丢失
- 冲突处理:配置合理的冲突解决策略,避免数据不一致
2. 性能优化
- 批量应用:启用批量应用功能,提高复制性能
- 并行应用:根据备库的 CPU 核心数调整并行工作进程数
- 网络优化:使用专用网络链路进行复制,减少网络延迟
- WAL 优化:优化主库的 WAL 生成,减少复制负载
3. 安全配置
- 最小权限原则:复制用户只授予必要的权限
- 加密传输:使用 SSL/TLS 加密复制数据
- 定期密码更换:定期更换复制用户密码
- 访问控制:限制复制用户的连接来源
4. 灾难恢复
- 定期备份备库数据,确保数据安全
- 配置多个逻辑备库,提高可用性
- 定期进行故障恢复演练,验证恢复能力
- 考虑使用跨地域复制,提高灾难恢复能力
常见问题(FAQ)
1. 逻辑备库和物理备库可以同时使用吗?
是的,可以同时配置物理备库和逻辑备库,以满足不同的业务需求。物理备库用于高可用性,逻辑备库用于选择性复制或数据分析。
2. 逻辑备库支持跨版本复制吗?
是的,逻辑备库支持跨版本复制,但需要注意版本兼容性。建议使用较低版本的主库和较高版本的备库,或者确保两个版本之间的逻辑复制兼容。
3. 如何处理逻辑复制中的冲突?
逻辑复制中的冲突可以通过以下方式处理:
- 配置冲突解决策略(如忽略、覆盖或保留)
- 使用
ALTER SUBSCRIPTION ... REFRESH PUBLICATION重新同步数据 - 手动修复冲突数据,然后重启订阅
4. 逻辑备库可以写入数据吗?
是的,逻辑备库可以写入数据,但需要注意:
- 写入的数据不会被复制回主库
- 写入的数据可能与主库复制过来的数据发生冲突
- 建议只在备库上写入与主库复制无关的数据
5. 如何删除逻辑备库?
删除逻辑备库的步骤:
删除备库上的订阅
sqlDROP SUBSCRIPTION my_subscription;删除主库上的复制槽
sqlSELECT pg_drop_replication_slot('subscription_slot_name');删除主库上的发布(如果不再需要)
sqlDROP PUBLICATION my_publication;停止并删除备库实例
bashsys_ctl stop -D /path/to/kingbase/logical_standby_data rm -rf /path/to/kingbase/logical_standby_data
总结
逻辑备库是 KingBaseES 提供的一种灵活的数据同步解决方案,适用于多种场景,如选择性复制、跨版本复制和数据集成。通过正确配置和维护逻辑备库,可以提高数据的可用性和灵活性。
在配置逻辑备库时,需要注意以下几点:
- 选择合适的复制模式和配置参数
- 定期监控复制状态和延迟
- 及时处理复制中的问题和冲突
- 定期进行备份和恢复演练
V8 R7 版本对逻辑备库进行了多项增强,包括列级复制、行级过滤、增强的并行应用等,建议在新部署或升级时优先考虑使用 V8 R7 版本。
