金仓这套产品,搞过的人都知道,单机部署跑起来容易,真正麻烦的是后面那句“要保证业务连续性”。KingbaseES单机转集群这件事,标题看着就是个高可用改造,但真正从接到需求到切换完成,你会发现问题全埋在细节里——证书挂载、归档参数、基础备份、备库拉起、HA接管,每一步都有讲究。这篇我把整个命令行操作过程完整捋一遍,包括我踩过的坑,适合正在做金仓单机迁移、或者打算把测试环境升级成主备架构的DBA参考。
先说下这次项目的背景:手上有一套KingbaseES V8R6单机库,跑了两年的业务系统,数据量在800GB左右,每天交易量中等,但老板最近被机房运维事故吓到了,要求做高可用改造。改造目标很明确:单机变主备集群,自动故障切换,应用侧只需要把连接串改成VIP。整个操作过程中,业务允许在切换窗口内停机30分钟,但窗口内必须完成数据迁移和集群初始化,不能拖到第二天。
1. 项目背景与方案选型:单机转集群不是简单“多装一台”
1.1 单机部署的真正痛点在哪里
单机版KingbaseES用起来确实舒服,一台机器搞定所有事情,不用考虑网络延迟,不用纠结复制延迟,备份恢复就一个sys_backup脚本跑到底。但这种架构的风险是系统性的:数据库所在服务器宕机,业务就直接断;磁盘阵列坏了,数据直接没了;就算是机房断电,恢复速度也完全取决于你备份策略够不够细。
我做这次改造之前先算了一笔账:当前单机库RTO如果只靠冷备和归档,最坏情况要4小时以上。而主备集群配合HA自动切换,RTO能压到1分钟以内,基本上应用无感知。这个投入产出比非常划算,也是这次项目能快速立项的根本原因。
另外还有一个容易被忽视的痛点——版本和补丁管理。单机升级有一定风险,往往要评估很久。有了备库之后,可以先把备库升级测试版本,验证稳定后再主备切换,业务影响降到最低。这个好处是后续才体会到的,但提前值得纳入选型考量。
1.2 集群方案选型的底层逻辑
金仓的集群方案我筛选后剩下两类:一类是存储层面的共享存储集群(类似Oracle RAC架构),另一类是日志复制型主备集群。共享存储方案成本高,需要SAN存储和集群文件系统,对小团队来说不太现实。日志复制架构则简单得多——主库把WAL日志传输给备库,备库持续replay,保持与主库数据一致,配合第三方的VIP漂移实现故障切换。
日志复制方案里还有细分:同步复制和异步复制。同步复制能保证主备数据零丢失,但会拖慢主库事务提交速度;异步复制则相反,主库性能无损,但极端情况下可能丢少量日志。实际生产里我采用的是“同步+降级”策略:主备网络正常时走同步复制,一旦备库出现长时间不可达,自动降级为异步,避免备库故障拖垮主库。这个模式很多国产数据库都支持,金仓也不例外,需要在参数层面把synchronous_standby_names配好。
具体架构拓扑如下:
- 两台数据库服务器:一主一备,硬件配置尽量一致
- 一个虚拟IP(VIP):漂移在主备之间,应用只连VIP
- 一个HA组件:负责监控主备健康状态、触发切换、转移VIP
- 独立备份目录:归档和基础备份放在第三块磁盘或独立存储上
整个链路里,数据库复制是核心,HA组件是辅助。很多人容易本末倒置,把HA配得很复杂,结果复制本身有问题,切换过去备库不可写,那就是灾难了。所以我的部署顺序很明确:先把主备复制跑通跑稳,再做HA和VIP。
2. 前期准备:证书挂载、环境检查与数据盘点
2.1 证书挂载流程与常见坑
金仓数据库不像开源PostgreSQL那样装完就能用,它需要挂载授权证书(License),否则数据库服务无法正常启动。这个环节在生产环境踩坑概率极高,而且报错信息不够直白,第一次遇到的人容易被绕晕。
证书挂载的常规流程如下:
- 从金仓官方获取授权证书文件,一般是一个
.dat或.key结尾的文件 - 将证书文件上传到服务器,放到安装目录的指定位置,比如
$KINGBASE_HOME/license.dat,不同版本路径会有差异,我这边V8R6是放在$KINGBASE_HOME目录下 - 重启数据库服务,或者执行证书校验工具确认证书有效
- 用
ksql登录数据库,检查版本信息中是否显示授权类型和使用期限
这里有几个核心坑:
- 证书与机器绑定。金仓的证书通常会绑定CPU序列号、MAC地址或主机名。如果先做好了单机,后来换了服务器,证书可能直接失效。所以在做单机转集群之前,最好先确认主备两台新机都能正常挂载证书,别等到数据同步到一半才发现备库起不来。
- 主备节点都要独立挂载证书。很多新手以为复制一个证书文件到主备两台机器就行,实际上每一台机器都需要自己的授权。如果证书是按节点授权的,备库需要单独申请;如果证书是按CPU授权的,两台机器都得校验硬件信息一致才有效。
- 证书过期不是重启就能解决。证书过期后会有一段时间的宽限期,这段时间数据库会持续打印告警日志,但不会立刻拒绝服务。等到宽限期过了,数据库会进入只读或者直接拒绝新连接。排查问题的时候,先看日志里有没有License相关告警,能省很多时间。
证书校验命令我通常这样用:
# 进入金仓安装目录 cd $KINGBASE_HOME # 查看证书信息 license_tool -info # 如果命令不存在,就用数据库自带的方式校验 sys_ctl -D /data/kingbase/data status # 启动时报证书错误,检查日志 tail -100 /data/kingbase/data/sys_log/startup.log注意,不同版本的工具名可能不一样,我在V8R6下用过license_tool,也见过直接通过ksql查询sys_license视图的方式。拿到环境先看帮助文档,别死记命令。
2.2 硬件与系统环境规划
金仓单机转集群,最理想的是申请两台新服务器,旧单机继续跑到切换当天。如果只能复用现有单机作为主库,那就额外准备一台备库机器,确保备库硬件规格不低于主库,磁盘容量建议是主库的1.5倍以上,给WAL归档和未来数据增长留出余量。
我把环境检查项整理成了一张清单,照着做基本不会漏:
| 检查项 | 要求 | 推荐值/操作 |
|---|---|---|
| 操作系统 | 主备一致,内核参数兼容 | CentOS 7.9 / 麒麟 / 统信均可 |
| CPU/内存 | 主备尽量一致 | 主库16C/64G,备库同步配置 |
| 数据盘 | 数据目录独立挂载 | 使用ext4或xfs,不用系统盘 |
| 主机名 | 主备主机名不同,且能互相解析 | 编辑/etc/hosts,写死IP映射 |
| 时间同步 | 主备时钟误差小于1秒 | 配置chrony或ntpd,并设为开机自启 |
| 防火墙/端口 | 放行数据库和HA端口 | 主库54321,HA组件心跳端口等 |
| 用户 | 统一使用kingbase系统用户 | 主备uid/gid保持一致,避免权限问题 |
这里面最容易忽略的是/etc/hosts。很多高可用切换异常,根因就是主备主机名解析有问题。数据库实例名、HA配置文件里的节点标识,往往绑定的是主机名而不是IP,你如果只用IP做了连通性测试,忽略主机名解析,配置完成后HA根本不会正常启动。
时间同步同样关键,逻辑复制场景下主备时间差异大,日志时间戳会对不上,排障会非常痛苦。我见过备库因为时钟快了10分钟,导致监控脚本误判复制延迟的案例。
2.3 单机端数据量评估与迁移窗口
改造前先摸清单机库的家底:总数据量、最大表大小、WAL日增长量、业务高峰时段、能否接受短时停机。这些数据直接决定你用什么样的迁移方案。
对于本次项目,800GB的数据量、日均WAL约20GB,我给出的迁移方案是“基础备份+增量日志同步”。具体来说:
- 在切换窗口前,先做一次全量基础备份,把数据文件拷贝到备库并完成恢复
- 主库继续运行,不断产生的WAL日志传到备库回放,备库始终追平主库数据
- 切换窗口内,停掉业务写入,主备做最后一次日志追平,然后启动HA切换
这种方案的好处是主库几乎不需要停机,窗口内业务中断时间只要几分钟。前提是你要在窗口外提前完成备份和备库初始化,而不是把800GB数据整个拷完再切换。
迁移窗口我选择的是周末凌晨2点到3点,业务写入量最低。窗口确定后,提前一周通知应用方,确认数据库账号权限、连接串改动事项,避免切换当天扯皮。
3. 单机端调整:为集群铺路的三个关键动作
3.1 开启归档与复制相关参数
单机环境默认的wal_level并不是为复制准备的,归档可能也是关闭状态。要在不重启数据库的情况下尽量做完所有能动态调整的参数,最后只需要一次重启来激活部分静态参数。
在KingbaseES的配置文件kingbase.conf中,以下参数需要重点确认:
# 复制与归档相关 wal_level = replica archive_mode = on archive_command = 'cp %p /kingbase/archive/%f && chmod 644 /kingbase/archive/%f' max_wal_senders = 10 max_standby_streaming_delay = 30s hot_standby = on wal_keep_size = 1024解释一下每个参数为什么这样配:
wal_level:如果只是主备复制,replica足够了,不需要logical,除非后续要做逻辑复制。archive_command:这里面的%p是源WAL文件路径,%f是目标文件名。生产环境我一般不用cp直接拷,而是用rsync或者调用可靠脚本,并且目标目录要确保磁盘空间充足。文件权限建议显式chmod 644,否则备库可能因权限不足读取失败。max_wal_senders:这个值决定了最多允许多少个备库连接。默认10就可以,如果有多个备库或者监控工具也要拉取WAL,可以适当调大。wal_keep_size:表示主库保留多少WAL日志供备库拉取。我设置1GB,是为了防止备库短暂断连后还能从主库补齐日志,不至于必须重做基础备份。hot_standby:备库开启后允许只读查询,这个很有用,可以分流部分报表查询。
参数修改完成后,需要重启数据库生效。这里有个小技巧:先用ALTER SYSTEM修改视图参数,最后统一重启,减少业务中断次数。
# 使用金仓自带的v$参数查询 ksql -U system -d test SELECT name, setting, context FROM pg_settings WHERE name IN ('wal_level', 'archive_mode', 'archive_command', 'hot_standby');我在实际项目里遇到过一种情况:改了archive_mode但忘了创建归档目录,主库一产生日志就报错,数据库直接进入只读状态。所以设置完参数,一定要先手动创建目录并测试归档写入权限:
mkdir -p /kingbase/archive chown -R kingbase:kingbase /kingbase/archive # 手动执行一次归档命令,验证目录可写3.2 基础备份:保证数据一致性
单机转集群,基础备份的质量决定了备库能用多久。备份过程中主库还在持续写入,如果备份不完整或者不一致,备库恢复完根本起不来。
金仓提供了类似PostgreSQL的sys_basebackup工具,命令行操作可以直接用它:
# 在备库机器上执行,从主库拉取基础备份 sys_basebackup -h 192.168.1.10 -p 54321 -U rep_user -D /data/kingbase/data -P -R -X stream # 如果无法使用sys_basebackup,也可以用sys_backup.sh走物理备份 sys_backup.sh -b full -d /data/kingbase/data关键参数解读:
-U rep_user:必须使用具有复制权限的账号,不能用普通业务账号。需要在主库提前创建复制账号并授权。-D:基础备份的输出目录,也就是备库的数据目录。-P:显示进度,对于800GB的库,你能直观看到备份进度,方便估算时间。-R:自动生成备库恢复配置文件(standby.signal或recovery.conf),省得手动写。-X stream:表示在备份过程中通过流复制同步WAL日志,保证备份数据一致性。
创建复制账号的命令如下:
ksql -U system -d test CREATE USER rep_user REPLICATION LOGIN PASSWORD 'your_password';注意,生产金仓环境可能不允许明文密码,需要考虑加密方式或使用专用认证配置。备份过程中主库的负载会上升,我建议选择业务低谷时段执行,还要监控主库的磁盘IO和网络带宽。
备份完成后,立刻在备库检查数据目录是否完整,确认数据文件、归档文件、配置文件的属主都是kingbase用户,否则备库启动会报权限错误。
3.3 业务收敛与切换窗口
集群切换最怕的就是正在切换时,还有大量应用连接悬在旧连接上,或者有临时表、未提交事务卡住主库。所以切换窗口内的操作顺序必须先“收敛”再“切换”。
我的习惯做法是:
- 切换前30分钟,通知应用方进入只读维护期
- 在主库执行
SELECT pg_terminate_backend(pid)清理空闲连接,或者通过pg_hba.conf临时拒绝新连接 - 确认当前没有活动事务,用
pg_stat_activity检查 - 记录主库当前WAL日志位置(
pg_current_wal_lsn()),作为备库追平的基准点 - 确认备库已经追平到该位置,然后再执行切换
如果你在做HA自动切换,业务收敛这一步不是必须的,但手动切换时必须做。我这次改造用的方案是:先手动停掉应用写入,把主备日志完全追平,再启动HA组件,让HA接管后续的自动切换能力。这样做能保证集群上线时数据零丢失,后续再测自动切换功能。
4. 集群端部署:从基础备份恢复到HA组件配置
4.1 备库节点安装与备份恢复
备库机器需要先安装好KingbaseES软件,但不需要执行初始化数据库的步骤,因为我们会用主库的基础备份来覆盖数据目录。
安装完成后,执行以下操作:
# 1. 停止备库默认生成的数据目录(如果有的话) sys_ctl -D /data/kingbase/data stop # 2. 清空默认数据目录 rm -rf /data/kingbase/data/* rm -rf /data/kingbase/data/.pgpass # 3. 用基础备份恢复数据目录 # 如果之前用 sys_basebackup 直接在备库执行,则目录是现成的 chown -R kingbase:kingbase /data/kingbase/data # 4. 确认恢复配置文件存在 ls -la /data/kingbase/data/standby.signal ls -la /data/kingbase/data/recovery.conf在V8R6版本中,如果使用-R参数,会自动生成备库标识文件。老版本(V8R3)则是生成recovery.conf,配置内容类似:
standby_mode = 'on' primary_conninfo = 'host=192.168.1.10 port=54321 user=rep_user password=your_password application_name=standby1' restore_command = 'cp /kingbase/archive/%f %p'特别注意primary_conninfo里的application_name,这个名称后面在HA配置和主库的pg_stat_replication视图中会用到,最好起一个有意义的名字,比如standby1。
备库配置完成后,先不要启动,先确保主备时间同步和网络连通性正常,再启动备库:
sys_ctl -D /data/kingbase/data start启动后立刻查看日志:
tail -100 /data/kingbase/data/sys_log/startup.log # 正常会看到进入hot standby模式或数据库系统正在启动的日志4.2 主备复制关系验证
备库启动后,主备复制应该自动建立。验证方法有两个:
在主库上查看:
ksql -U system -d test SELECT client_addr, state, sync_state, sent_lsn, replay_lsn, write_lag FROM pg_stat_replication;正常情况下,state应为streaming,sync_state应为sync或async,replay_lsn应接近sent_lsn。如果出现catchup状态,说明备库还在追赶,需要等一会儿再查。
在备库上查看恢复状态:
ksql -U system -d test SELECT pg_is_in_recovery(); # 返回 t 表示处于恢复模式,正常如果备库一直追不上,或者复制中断,排查顺序是:
- 主库防火墙是否放行54321端口
pg_hba.conf是否允许复制用户从备库IP连接primary_conninfo里的密码、端口是否正确- 主库WAL目录是否有断档,是否开启了归档
- 备库的
restore_command是否能正常从归档目录读取WAL
这些问题我在第5节会展开讲几个典型的。
4.3 HA组件配置与虚拟IP
金仓的高可用方案不只有一种,V8R6自带了一套HA工具,底层通常是基于etcd和patch逻辑实现的;也有客户喜欢在数据库之上单独部署keepalived,自己做VIP漂移。我这边采用的是金仓自带的集群管理组件,理由是和数据库版本配套,故障探测和恢复逻辑更贴合,遇到问题可以找原厂协助。
不过无论用哪种HA,核心配置都绕不开这三件事:
- 集群节点定义:明确哪台是主、哪台是备,以及各节点的IP和主机名
- VIP配置:指定虚拟IP,正常时绑定在主库上,主库故障后漂移到备库上
- 切换策略:定义故障判定条件(例如心跳超时次数、数据库进程状态检查)、是否自动切换、是否启用防脑裂机制
以keepalived为例,主备节点的配置差异点主要在于priority和state,其余keepalived.conf配置几乎一致。需要额外做一个金仓数据库存活检测脚本,只有数据库进程正常时才允许VIP存在于本节点。脚本逻辑大致如下:
#!/bin/bash # 检查金仓数据库是否存活 if sys_ctl -D /data/kingbase/data status > /dev/null 2>&1; then # 检查流复制是否正常(备库不允许持有VIP) exit 0 else exit 1 fi这个脚本必须放到keepalived的vrrp_script里,避免出现“数据库已经挂了但VIP还在旧节点上飘不走”的情况。
如果你使用金仓自带的HA部署工具,这些配置通常通过命令行交互式完成,或者通过一个xml/json配置文件批量生成。我建议无论如何都先手动验证一遍复制,再让HA工具接管,否则HA部署脚本即使报“成功”,切换后也可能因为复制异常起不来备库。
4.4 集群启动与自动切换验证
集群部署完成后的第一步不是直接交给业务,而是做至少三轮故障切换演练:
第一轮:手动切换演练
在主库执行HA工具的切换命令,将主库切换为备库,原备库提升为新主库。验证业务连接串切换到VIP后是否正常。然后反向再切回来。
第二轮:一次"杀主库"演练
直接在主库执行kill -9数据库进程,或者shutdown abort模拟宕机。观察HA组件是否在预期时间内完成VIP漂移,备库是否自动提升为主库,应用重连后业务是否恢复。
第三轮:网络层面演练
有条件的话,用防火墙断掉主备之间的心跳网络,观察HA是否触发切换,以及是否产生脑裂(两个节点同时认为自己是主)。如果出现脑裂,必须检查防脑裂机制是否生效。
每轮演练后都要收集日志,重点看以下内容:
- 主库故障时间点
- 备库提升为主库的时间点
- VIP漂移完成的时间点
- 数据库恢复可写的时间点
- 期间是否有报错
把时间线拉出来,就能计算出真实的RTO。我这次三台演练下来,RTO基本稳定在30秒以内,满足业务要求。
5. 常见问题与排障实录
5.1 证书挂载失败的典型场景
做集群改造时,证书相关的坑排在第一位。我遇到的具体报错是备库启动时报“License verification failed”,排查过程如下:
- 先确认证书文件是否在正确位置,对比主备两台的路径和文件名
- 确认证书的授权类型,是否按主机名绑定,备库主机名和主库不同导致证书不匹配
- 查看数据库启动日志,看是否有更详细的错误码
- 联系厂商重新申请备库节点证书
另外一个坑是证书挂载到路径后,数据库进程因权限问题读不到证书。金仓一般使用kingbase用户运行数据库,证书文件属主也必须是kingbase,否则报错信息可能五花八门。出现“permission denied”直接chown kingbase:kingbase license.dat就能解决。
5.2 备库追不上主库,复制延迟持续增长
这种情况在基础备份刚完成、备库刚开始追日志时特别常见。查了几种情况:
- 主库wal_keep_size设置太小:备库断连时间一长,主库需要的WAL已经被覆盖,备库只能重新做基础备份。解决办法是调大
wal_keep_size或确保归档目录持续可用。 - 归档目录磁盘写满:
archive_command执行失败后,主库WAL发送会被阻塞,导致整个复制链路卡死。我在排障时发现归档目录所在的磁盘满了,清理日志后复制自动恢复。 - 备库磁盘IO太差:备库回放WAL的速度跟不上主库产生WAL的速度,延迟会一直涨。这种情况需要升级备库硬件,或者检查备库是否有其他任务抢占IO。
5.3 切换后应用连接异常
主备切换完成后,应用连的是VIP,按理说VIP已经漂移到新主库,应用重连就行。但如果应用连接池没有配置“断开重连”机制,旧的连接可能一直挂在旧主库上,即使旧主库已经变成备库,应用发请求也会报“read-only”错误。
这个问题的标准解法是在应用连接池里配置连接探活和失效回收,例如Druid的testWhileIdle、testOnBorrow,HikariCP的connectionTestQuery。同时在数据库端,可以主动断开旧连接:
-- 在新主库上清理来自旧主库的残留连接 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'your_db' AND application_name NOT IN ('standby1', 'HA监控账号');5.4 切换期间HA组件误判主库故障
有一次演练发现,主库负载非常高(跑大查询),HA组件因为心跳超时误判主库宕机,触发了自动切换。虽然最终数据没有丢失,但产生了一次不必要的切换。
这个问题的根因是HA的心跳检测只通过网络连通性判断,没有结合数据库本身的负载和响应时间。解决办法是调整HA的故障判定参数,把“心跳超时”和“数据库进程检查”组合起来,只有当两者同时异常时才触发切换。
另外,如果业务有大查询、超长事务,切换时这些事务会回滚,应用侧大概率报错。建议在切换窗口内,应用侧尽量完成长事务提交,数据库侧设置statement_timeout来限制单条SQL的最长执行时间,减少长事务阻塞切换的概率。
5.5 快速排障命令速查表
最后把我常用的一批排障命令整理成表,供参考:
| 场景 | 命令/操作 | 期望输出 |
|---|---|---|
| 检查数据库进程状态 | sys_ctl -D /data/kingbase/data status | 显示进程PID、数据目录、启动时间 |
| 检查主备复制状态 | SELECT * FROM pg_stat_replication; | state=streaming,sync_state=sync/async |
| 检查备库恢复状态 | SELECT pg_is_in_recovery(); | t |
| 查询WAL日志位置 | SELECT pg_current_wal_lsn(); | 类似 0/170000E8 |
| 查询归档状态 | SELECT * FROM pg_stat_archiver; | archived_count持续增长 |
| 检查证书授权 | license_tool -info或查询自定义视图 | 显示到期时间、授权节点 |
| 查看数据库日志 | tail -100 /data/kingbase/data/sys_log/*.log | 按时间倒序看报错 |
| 检查HA组件状态 | HA工具自带状态命令 | 显示节点角色、VIP归属 |
| 测试备库连接主库 | telnet 主库IP 54321 | 端口可达 |
| 检查防火墙 | iptables -L -n或firewall-cmd --list-all | 确认54321端口放行 |
这套速查表在改造后的初期排障里非常实用,环境稳定后依旧可以保留,平时巡检也要用。
最后再分享一点个人体会:金仓单机转集群这套操作,本质上和很多基于PostgreSQL内核的数据库迁移高可用的思路是一致的——万变不离其宗,先把日志复制搞清楚,再谈HA和VIP。我见过不少人一上来就摆弄HA工具,结果复制都没通,最后切换演练翻车。命令行操作的路径没有图形界面那么友好,但你每一步都看得见配置、看得见日志、看得见进程状态,反而更容易把原理想透。把这次改造过程中的每一步做好检查、留存日志,后续无论是升级版本还是扩容节点,这套经验都能复用上。