目录
-
[第一章 集群架构概述](#第一章 集群架构概述)
-
[第二章 系统环境与配置要求](#第二章 系统环境与配置要求)
-
[第三章 核心配置文件详解](#第三章 核心配置文件详解)
-
[第四章 日常巡检标准](#第四章 日常巡检标准)
-
[第五章 集群启停管理](#第五章 集群启停管理)
-
[第六章 主备切换操作](#第六章 主备切换操作)
-
[第七章 故障自动恢复机制](#第七章 故障自动恢复机制)
-
[第八章 手动故障恢复操作](#第八章 手动故障恢复操作)
-
[第九章 故障场景与处理方案](#第九章 故障场景与处理方案)
-
[第十章 VIP管理](#第十章 VIP管理)
-
[第十一章 在线扩缩容](#第十一章 在线扩缩容)
-
[第十二章 参数调整与配置变更](#第十二章 参数调整与配置变更)
-
[第十三章 常见故障FAQ](#第十三章 常见故障FAQ)
-
[第十四章 运维禁令与注意事项](#第十四章 运维禁令与注意事项)
-
[第十五章 运维工具箱](#第十五章 运维工具箱)
-
[附录A V8R3与V8R6+架构差异对照](#附录A V8R3与V8R6+架构差异对照)
-
[附录B 故障判断与恢复命令速查表](#附录B 故障判断与恢复命令速查表)
-
[附录C 参数配置速查表](#附录C 参数配置速查表)
第一章 集群架构概述
1.1 核心架构组件
KingbaseES V8R3 读写分离集群采用基于 Pgpool-II(kingbasecluster) 的技术架构,与 V8R6+ 使用 repmgrd/kbha 的架构有本质区别。
| 组件 | 功能说明 | 监听端口 |
|---|---|---|
| kingbasecluster(基于 Pgpool-II) | 中间件层,负责读写请求分发、连接池、负载均衡、健康检测 | 9999 |
| watchdog | Pgpool 子进程,负责高可用监控、节点间 heartbeat 通讯、VIP 管理、主备选举投票 | 9000(heartbeat) |
| es_ha_model / HAmodule.conf | 集群 HA 自动化脚本和配置,控制 failover 切换和 auto-recovery 行为 | - |
| kingbaseES 数据库服务 | 主库提供读写服务,备库提供只读服务,通过流复制(Streaming Replication)同步数据 | 54321 |
| pcp 命令集 | Pgpool 集群管理命令,用于节点注册/脱离/切换等操作 | 9898(pcp 端口) |
1.2 集群端口通讯
| 端口 | 服务 | 说明 |
|---|---|---|
| 9999 | kingbasecluster | 应用连接中间件端口,读写请求入口 |
| 9898 | pcp | 集群管理命令端口(pcp_attach_node 等) |
| 9000 | watchdog heartbeat | watchdog 进程间互监控通讯端口 |
| 54321 | kingbaseES 数据库 | 数据库物理端口,流复制端口 |
1.3 集群典型拓扑
┌─────────────┐
│ 应用客户端 │
└──────┬──────┘
│ 连接 Cluster VIP:192.192.103.185:9999
┌──────┴──────┐
│ kingbasecluster │ ← 读写请求分发 + 连接池
│ (Pgpool-II) │
└──────┬──────┘
│ 读写分离路由
┌────────────┼────────────┐
│ │
┌────────┴────────┐ ┌───────┴───────┐
│ 主库 primary │ │ 备库 standby │
│ 54321端口 │ WAL │ 54321端口 │
│ DB VIP所在节点 │ 流复制 │ 只读服务 │
│ 192.192.103.183 │←──────│ │
└─────────────────┘ └───────────────┘
│ │
└── watchdog heartbeat ───┘
(9000端口互监控)
1.4 读写分离实现原理
V8R3 的读写分离由 kingbasecluster 中间件自动实现:
-
SELECT 等只读请求:按负载均衡权重分发到备库(lb_weight 配置)
-
INSERT/UPDATE/DELETE 等写请求:自动路由到主库
-
读写混合事务:第一个写操作之前的读操作按读事务处理,遇到写操作后所有请求路由到主库
应用只需连接 kingbasecluster 的 9999 端口(或 Cluster VIP),无需自行判断读写路由。
1.5 同步模式
| 模式 | 说明 | 性能与数据安全 |
|---|---|---|
| sync(同步) | 主库事务需等待备库 WAL 落盘确认才返回 | 数据不丢,但影响性能 |
| async(异步) | 主库不等待备库确认,性能最高 | 可能丢数据 |
| 半同步 | 介于同步和异步之间,WAL 落盘即返回 | 推荐一般生产环境 |
生产环境推荐同步模式确保数据不丢;高并发场景酌情选用半同步或异步。
1.6 核心概念
| 概念 | 说明 |
|---|---|
| primary(主库) | 提供读写服务,生成 WAL 日志 |
| standby(备库) | 提供只读服务,接收重放 WAL 日志 |
| recovery.conf | V8R3 备库标识和恢复配置文件(V8R6+改用 standby.signal) |
| recovery.done | 主库标识文件(备库升主后 recovery.conf 改名生成) |
| watchdog MASTER | 当前活跃的 kingbasecluster 节点,持有 Cluster VIP |
| watchdog STANDBY | 备用的 kingbasecluster 节点 |
| DB VIP | 数据库服务 VIP,始终跟随主库漂移 |
| Cluster VIP | 集群管理 VIP(delegate_IP),始终跟随 watchdog MASTER 漂移 |
| pcp | Pgpool Cluster Protocol,集群管理命令接口 |
| 脑裂 | 集群同时出现多个 primary 节点,导致数据分歧 |
第二章 系统环境与配置要求
2.1 硬件要求
-
2路网络区分内外网,本地服务器置于同一千兆交换机
-
外挂磁盘阵列与各主机置于同网段
2.2 操作系统强制性配置
资源限制(/etc/security/limits.conf)
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
⚠️
nofile的 hard limit 不能超过/proc/sys/fs/nr_open
内核参数(/etc/sysctl.conf)
kernel.sem= 5010 641280 5010 256
fs.file-max=7672460
fs.aio-max-nr=1048576
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=4194304
net.ipv4.ip_local_port_range=9000 65500
net.ipv4.tcp_wmem=8192 65536 16777216
net.ipv4.tcp_rmem=8192 87380 16777216
vm.min_free_kbytes=512000
vm.vfs_cache_pressure=200
vm.swappiness=20
net.ipv4.tcp_max_syn_backlog=4096
net.core.somaxconn=4096
Remove IPC 配置
# /etc/systemd/logind.conf
RemoveIPC=no # 必须设为 no,否则共享内存可能被回收
时钟同步
- 集群所有节点必须做时钟同步 ,系统时间误差需在 2秒以内
防火墙配置
建议关闭防火墙,若无法关闭需开放:
| 端口 | 用途 |
|---|---|
| 54321 | 数据库端口 |
| 9999 | kingbasecluster 中间件端口 |
| 9898 | pcp 管理端口 |
| 9000 | watchdog heartbeat 端口 |
| 8890 | sys_securecmdd 端口(如使用) |
关闭数据库自动启动服务
systemctl stop kingbased
systemctl disable kingbased
2.3 VIP 相关前置配置
# ip 命令需赋予普通用户 setuid 权限
chown root.root /sbin/ip
chmod 4755 /sbin/ip
# arping 命令同理
chown root.root ${cluster_path}/kingbasecluster/bin/arping
chmod 4755 ${cluster_path}/kingbasecluster/bin/arping
⚠️ watchdog 启动需 root 权限,因为它需要控制 VIP 接口。kingbasecluster 启动时需以管理员权限运行。
2.4 libnsl 适配(银河麒麟V10等新系统)
find /usr/lib64 /usr/lib -name "libnsl.so*"
ln -s /usr/lib64/libnsl.so.2 /usr/lib64/libnsl.so.1
第三章 核心配置文件详解
3.1 kingbasecluster.conf(中间件核心配置)
kingbasecluster.conf 是基于 Pgpool-II 的配置文件,位于 ${cluster_path}/kingbasecluster/etc/ 目录。
Backend(后端数据库节点)配置
# 从0开始编号
backend_hostname0 = '192.192.103.181' # 主库IP
backend_port0 = 54321 # 数据库端口
backend_weight0 = 1 # 负载均衡权重
backend_data_directory0 = '/home/kingbase/cluster/ks_cluster/db/data'
backend_flag0 = 'DISALLOW_TO_FAILOVER' # 主库禁止自动failover
backend_hostname1 = '192.192.103.182' # 备库IP
backend_port1 = 54321
backend_weight1 = 1
backend_data_directory1 = '/home/kingbase/cluster/ks_cluster/db/data'
backend_flag1 = 'ALLOW_TO_FAILOVER' # 备库允许自动failover
backend_flag 详解:
| Flag | 说明 |
|---|---|
ALLOW_TO_FAILOVER |
允许 failover 或 detach,默认值 |
DISALLOW_TO_FAILOVER |
禁止 failover,用于被 HA 保护的节点 |
ALWAYS_PRIMARY |
始终视为 primary |
Health Check(健康检查)配置
health_check_period = 10 # 健康检查间隔(秒),0=禁用
health_check_timeout = 20 # 健康检查超时(秒)
health_check_user = 'SYSTEM' # 健康检查用户
health_check_password = '' # 健康检查密码
health_check_database = 'TEST' # 健康检查数据库
health_check_max_retries = 10 # 最大重试次数
health_check_retry_delay = 20 # 重试间隔(秒)
⚠️ health_check 需要每个后端额外 1 个连接,需相应调整 max_connections
Failover(故障切换)配置
failover_mode = 'automatic' # 故障切换模式
failover_command = '' # 切换时执行的命令
recovery_1st_stage_command = '' # 恢复第一阶段命令
recovery_2nd_stage_command = '' # 恢复第二阶段命令
连接池和负载均衡配置
listen_addresses = '*' # 监听地址
port = 9999 # 中间件服务端口
num_init_children = 16 # 连接池进程数
max_pool = 4 # 每进程最大连接池数
child_life_time = 300 # 子进程生存时间(秒)
connection_life_time = 0 # 连接生存时间
child_max_connections = 0 # 子进程最大连接数
Watchdog(看门狗)配置
# ---- WATCHDOG ----
use_watchdog = on # 激活看门狗(必须on)
trusted_servers = '192.192.103.128' # 信任网关列表,逗号分隔
ping_path = '/bin' # ping命令路径
wd_interval = 10 # pgpool生命检查间隔(秒)
wd_life_point = 3 # 生命检测失败重试次数
wd_lifecheck_method = 'heartbeat' # 生命检测方式
# Cluster VIP 配置
delegate_IP = '192.192.103.185' # 集群VIP地址
ifconfig_path = '/sbin' # ifconfig命令路径
if_up_cmd = 'ifconfig eth0:0 inet $IP$ netmask 255.255.255.0'
if_down_cmd = 'ifconfig eth0:0 down'
arping_path = '/usr/sbin' # arping命令路径
arping_cmd = 'arping -U $IP$ -w 1' # ARP请求命令
# Watchdog 互监控配置
wd_hostname = '192.192.103.181' # 本节点IP
wd_port = 9000 # watchdog通讯端口
# 其他节点 watchdog 配置
other_pgpool_hostname0 = '192.192.103.182'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
watchdog 关键功能:
-
pgpool 服务的生命检测 --- 通过发送查询到 kingbaseES 检查响应
-
watchdog 进程相互监控 --- 通过 heartbeat(9000端口)交换状态信息
-
自动 VIP 地址分配 --- 主备切换时自动迁移 Cluster VIP
-
恢复时自动注册备用服务器
3.2 HAmodule.conf(集群HA配置)
HAmodule.conf 是 V8R3 特有的 HA 配置文件(不同于 V8R6+ 的 repmgr.conf),位于 ${cluster_path}/db/etc/ 和 ${cluster_path}/kingbasecluster/etc/ 目录下(两处都需要配置且保持一致)。
# ---- AUTO PRIMARY RECOVERY ----
# failover切换后原主库是否自动恢复为备库
# 0=关闭(默认),1=开启
AUTO_PRIMARY_RECOVERY=0
# ---- DB VIP ----
# 数据库VIP地址,用于数据库服务连接,跟随主库漂移
db_vip="192.192.103.183"
# ---- Cluster VIP ----
# 集群VIP地址,对应kingbasecluster.conf中的delegate_IP
cluster_vip="192.192.103.185"
# ---- 信任网关 ----
# 用于检测网络连通性,防止脑裂(建议配置网关IP,不要配置节点IP或127.0.0.1)
trust_ip="192.192.103.128"
# ---- 网卡设备 ----
# VIP绑定的网卡名称
DEV="eth0"
# ---- 数据库端口 ----
db_port="54321"
# ---- 网络配置路径 ----
ifconfig_path="/sbin"
arping_path="/usr/sbin"
ping_path="/bin"
AUTO_PRIMARY_RECOVERY 详解:
| 值 | 说明 | 推荐场景 |
|---|---|---|
0 |
failover 后原主库不自动恢复,需人工介入 | 默认值,安全优先 |
1 |
failover 后原主库自动被 recovery 为备库加入集群 | 无人值守生产环境 |
3.3 信任网关防脑裂原理
| 场景 | 主库行为 | 备库行为 |
|---|---|---|
| 主库网络故障 | 发现同步中断 + ping 网关失败 → 关闭主库 | 发现同步中断 + ping 网关正常 → 执行 failover 升主 |
| 备库网络故障 | 发现同步中断 + ping 网关正常 → 踢出备库 | 发现同步中断 + ping 网关失败 → 降级,不执行 failover |
⚠️ trusted_servers 不建议配置为数据库节点 IP 或 127.0.0.1
3.4 数据库配置文件
V8R3 集群数据库的配置文件为 kingbase.conf(与单机相同),关键参数参考 附录C。
3.5 pcp.conf(PCP认证配置)
pcp.conf 位于 ${cluster_path}/kingbasecluster/etc/,存储 pcp 命令的用户名和 MD5 密码:
kingbase:$md5hash
3.6 recovery.conf(备库恢复配置)
V8R3 特有的备库标识文件(V8R6+ 改用 standby.signal + kingbase.auto.conf):
standby_mode='on'
primary_conninfo='port=54321 host=主库IP user=SYSTEM password=12345678ab application_name=node1'
recovery_target_timeline='latest'
primary_slot_name='slot_node1'
第四章 日常巡检标准
4.1 逻辑状态检查(核心)
通过 kingbasecluster 中间件端口查看节点状态:
/home/kingbase/cluster/ks_cluster/db/bin/ksql \
-USYSTEM -dTEST -W12345678ab -p9999 \
-c "show pool_nodes"
正常标准:
-
✅ 所有节点 status 必须为 up
-
✅ 必须有且仅有 一个 primary
-
✅ replication_delay 长期维持在 0
4.2 物理进程检查
# kingbasecluster 及 watchdog 进程
ps -ef | grep kingbasecluster
# 正常:包含 kingbasecluster: watchdog, kingbasecluster: heartbeat等子进程
# 数据库进程
ps -ef | grep kingbase
# 正常:包含 logger, checkpointer, writer, wal writer, walsender/walreceiver 等
# crond 定时任务
cat /etc/cron.d/KINGBASECRON
# 正常:包含 network_rewind.sh 和 restartcluster.sh 定时任务
4.3 watchdog 状态检查
/home/kingbase/cluster/ks_cluster/kingbasecluster/bin/pcp_watchdog_info \
-h 127.0.0.1 -p 9898 -U kingbase
正常标准:
-
✅ Quorum state = QUORUM EXIST
-
✅ Master Node 指向当前主节点
-
✅ 所有节点 Status 正常(MASTER=4, STANDBY=7)
4.4 VIP 检查
ip a
正常标准:
-
✅ DB VIP 应在当前 primary 节点上
-
✅ Cluster VIP 应在 watchdog MASTER 节点上
4.5 流复制状态检查
SELECT usename, application_name, client_addr, sync_state, state
FROM sys_stat_replication;
正常标准:
-
✅ state 为
streaming -
✅ sync_state 与配置的同步模式一致
4.6 复制延迟检查
在备库执行:
SELECT CASE
WHEN sys_last_wal_receive_lsn() = sys_last_wal_replay_lsn() THEN 0
ELSE EXTRACT(EPOCH FROM now() - sys_last_xact_replay_timestamp())
END AS replication_lag;
正常标准:延迟值 0 或 < 10
4.7 磁盘空间检查
df -h
预警标准 :/home/kingbase/ 使用率 < 80%
4.8 归档日志检查
# 检查 sys_xlog/sys_wal 是否堆积
ls -la $data_path/sys_wal/ | wc -l
⚠️ 归档目录写满会导致主库停止服务
4.9 recovery.conf 检查(V8R3特有)
# 备库 data 目录应存在 recovery.conf
ls $data_path/recovery.conf
# 主库 data 目录应存在 recovery.done(而非 recovery.conf)
ls $data_path/recovery.done
4.10 License 检查
SELECT get_license_validdays() AS valid_days;
预警标准:valid_days < 7 需更换
第五章 集群启停管理
5.1 一键启停
cd /home/kingbase/cluster/ks_cluster/bin
# 启动集群
sh kingbase_monitor.sh start
# 停止集群
sh kingbase_monitor.sh stop
# 重启集群
sh kingbase_monitor.sh restart
5.2 启动流程详解
kingbase_monitor.sh start 执行顺序:
-
检查关闭状态:检查各节点 data 目录是否存在 recovery.conf/recovery.done,判断主备角色,避免双主
-
启动数据库服务:依次启动所有节点的数据库(sys_ctl start)
-
启动 kingbasecluster:需要 root 权限(watchdog 需控制 VIP)
-
watchdog 自动选举:
-
状态演变:DEAD → LOADING → JOINING → INITIALIZING → MASTER/STANDBY
-
首先被 active 的节点选举为 MASTER 角色
-
其他节点收到 heartbeat 后加入 cluster,配置为 STANDBY
-
-
加载 VIP:DB VIP 加载到 primary 节点,Cluster VIP 加载到 watchdog MASTER 节点
5.3 停止流程详解
kingbase_monitor.sh stop 执行顺序:
-
停止 kingbasecluster 中间件服务
-
删除 Cluster VIP
-
停止 crond 定时任务(KINGBASECRON)
-
停止所有节点数据库服务(sys_ctl stop)
-
删除 DB VIP
5.4 验证启动成功
/home/kingbase/cluster/ks_cluster/db/bin/all_monitor.sh
确认所有组件状态为 active。
第六章 主备切换操作
6.1 手动 Switchover(计划内切换)
适用场景:计划内维护、补丁升级等
操作步骤:
-
确认集群状态正常(show pool_nodes 所有节点 up)
-
在当前主库停止数据库服务:
sys_ctl stop -D /home/kingbase/cluster/ks_cluster/db/data
-
等待 watchdog 检测到主库故障,自动执行 failover(约1-2分钟)
-
原主库恢复为备库:
-
若
AUTO_PRIMARY_RECOVERY=1:自动恢复(crond 定时任务 network_rewind.sh 自动执行) -
若
AUTO_PRIMARY_RECOVERY=0:需手动配置 recovery.conf 并启动备库
-
-
验证切换结果:
show pool_nodes确认新主备状态
6.2 自动 Failover(故障自动切换)
由 watchdog 自动触发:
-
检测阶段 :kingbasecluster 的 health_check 检测到主库不可用,重试
health_check_max_retries次 -
确认阶段:watchdog 通过 heartbeat 通讯确认其他节点状态,投票确认 failover
-
执行阶段:
-
停止原主库的数据库服务(尝试通过 es_ha_model 脚本远程关闭)
-
备库执行
sys_ctl promote升为主库 -
DB VIP 漂移到新主库节点
-
Cluster VIP 漂移到新 watchdog MASTER
-
-
恢复阶段:原主库根据 AUTO_PRIMARY_RECOVERY 配置自动或手动恢复为备库
6.3 sys_ctl promote 手工切换备库为主库
当自动 failover 失败时,可手动操作:
# 在备库执行
sys_ctl promote -D /home/kingbase/cluster/ks_cluster/db/data
升主后需更新 kingbasecluster 的节点角色:
/home/kingbase/cluster/ks_cluster/kingbasecluster/bin/pcp_promote_node \
-U kingbase -h 127.0.0.1 -p 9898 -n [备库节点ID]
第七章 故障自动恢复机制
7.1 AUTO_PRIMARY_RECOVERY 配置
| 值 | 说明 | 行为 |
|---|---|---|
0(默认) |
不自动恢复原主库 | failover 后原主库需人工介入恢复为备库 |
1 |
自动恢复原主库 | failover 后 crond 定时任务自动执行 network_rewind.sh 将原主库恢复为备库 |
7.2 自动恢复流程(AUTO_PRIMARY_RECOVERY=1)
-
failover 切换完成,备库升为新主库
-
原主库的 crond 定时任务检测到本节点数据库已停止且无 recovery.conf
-
执行 network_rewind.sh:
-
检查本节点 data 目录状态
-
使用 sys_rewind 同步数据与新主库一致
-
配置 recovery.conf(指向新主库)
-
删除 recovery.done(如存在)
-
启动数据库为备库
-
通过 pcp_attach_node 在 kingbasecluster 中注册节点
-
7.3 crond 定时任务
V8R3 集群通过 crond 定时任务实现自动守护:
cat /etc/cron.d/KINGBASECRON
# 内容示例:
*/1 * * * * kingbase /home/kingbase/cluster/ks_cluster/db/bin/network_rewind.sh
*/1 * * * * kingbase /home/kingbase/cluster/ks_cluster/db/bin/restartcluster.sh
| 定时任务 | 功能 |
|---|---|
| network_rewind.sh | 检测故障节点并自动恢复(sys_rewind + recovery.conf + pcp_attach_node) |
| restartcluster.sh | 检测 kingbasecluster 服务状态并自动重启 |
7.4 watchdog 守护机制
| 功能 | 实现方式 |
|---|---|
| pgpool 生命检测 | 发送查询到 kingbaseES 检查响应 |
| watchdog 互监控 | heartbeat(9000端口)交换状态信息 |
| VIP 自动管理 | watchdog MASTER 持有 Cluster VIP,切换时自动漂移 |
| 备用服务器自动注册 | 恢复的节点自动注册为 STANDBY |
第八章 手动故障恢复操作
8.1 故障节点重新加入集群(pcp_attach_node)
当节点流复制正常但 show pool_nodes 显示 status 为 down 时:
/home/kingbase/cluster/ks_cluster/kingbasecluster/bin/pcp_attach_node \
-U kingbase -h 127.0.0.1 -p 9898 -n [节点ID]
前置条件:
-
该节点数据库服务正常在线(
sys_ctl status -D $data_path返回 running) -
流复制连接正常
操作步骤:
-
确认节点数据库在线:
sys_ctl status -D $data_path -
执行 pcp_attach_node 重新注册节点
-
验证:
show pool_nodes确认 status 变为 up
8.2 原主库手动恢复为备库
当 AUTO_PRIMARY_RECOVERY=0 或自动恢复失败时:
步骤 1:停止原主库数据库
sys_ctl stop -D $data_path
步骤 2:配置 recovery.conf(在 data 目录下创建)
standby_mode='on'
primary_conninfo='port=54321 host=新主库IP user=SYSTEM password=12345678ab application_name=node1'
recovery_target_timeline='latest'
primary_slot_name='slot_node1' # 填写新主库上未使用的复制槽名称
步骤 3:删除 recovery.done(如存在)
rm -f $data_path/recovery.done
步骤 4:使用 sys_rewind 同步数据(如原主库曾启动过且与新主库数据分歧)
sys_rewind -D $data_path \
--source-server="host=新主库IP port=54321 user=SYSTEM dbname=TEST"
步骤 5:启动备库
sys_ctl start -D $data_path
步骤 6:注册到 kingbasecluster
pcp_attach_node -U kingbase -h 127.0.0.1 -p 9898 -n [原主库节点ID]
步骤 7:验证
# 查看集群状态
ksql -USYSTEM -dTEST -p9999 -c "show pool_nodes"
# 查看流复制
ksql -USYSTEM -dTEST -p54321 -c "select * from sys_stat_replication;"
8.3 备库完全重建(rejoin/rewind 失败时)
如果 sys_rewind 无法完成同步,需从主库重新克隆备库:
# 停止备库
sys_ctl stop -D $data_path
# 清理备库 data 目录(先备份!)
cp -r $data_path $data_path_bak
rm -rf $data_path/*
# 从主库克隆数据(使用 sys_basebackup 或 pg_basebackup)
sys_basebackup -h 新主库IP -U SYSTEM -D $data_path -X stream -P -R
# 或使用 recovery.conf 手动配置后启动
8.4 脑裂处理
识别 :show pool_nodes 出现两个或多个 primary 节点
处理步骤:
-
判断哪个节点数据最新:
-
运行中查 LSN:
select sys_current_wal_lsn(); -
运行中查时间线:
select timeline_id from sys_control_checkpoint(); -
停机状态:
sys_controldata -D $data_path查看Latest checkpoint's TimeLineID
-
-
以数据最新节点为真正主库
-
停止其他"假主库":
sys_ctl stop -D $data_path
-
将"假主库"恢复为备库(参照 [8.2 原主库手动恢复](#8.2 原主库手动恢复))
-
通过 pcp_attach_node 重新注册
-
验证集群仅有一个 primary
8.5 全节点故障恢复
# 一键启动集群
sh kingbase_monitor.sh start
验证:
ksql -USYSTEM -dTEST -p9999 -c "show pool_nodes"
若出现双主:参照脑裂处理流程。
第九章 故障场景与处理方案
9.1 主库故障
| 故障类型 | 集群应对行为 | 业务影响 | 恢复方案 |
|---|---|---|---|
| 主库停库 | health_check 检测主库不可用,watchdog 触发 failover,备库升主,VIP 漂移 | 切换期间业务中断 | AUTO_PRIMARY_RECOVERY=1:自动恢复;=0:手动参照 8.2 |
| 主库掉电/系统崩溃 | 同主库停库 | 同主库停库 | 服务器恢复后启动集群 |
| 主库进程被杀 | kingbasecluster health_check 检测到不可用,触发 failover | 切换期间业务中断 | crond 定时任务自动拉起或手动恢复 |
| 主库 hang 住 | 所有进程 hang:health_check 超时后触发 failover;仅主进程 hang:新建连接异常 | 新建连接异常或业务中断 | 重启主库或执行 switchover |
9.2 备库故障
| 故障类型 | 集群应对行为 | 业务影响 | 恢复方案 |
|---|---|---|---|
| 备库停库/掉电 | kingbasecluster 将备库从 pool 中 detach,读请求路由到主库 | 读性能下降 | 备库恢复后 pcp_attach_node 注册 |
| 备库网络中断 | 同备库停库 | 读性能下降 | 网络恢复后自动或手动恢复 |
| 同步备库故障 | 主库同步转异步继续运行 | 数据同步延迟 | 备库恢复后流复制自动重建 |
9.3 网络类故障
| 故障类型 | 集群应对行为 | 业务影响 |
|---|---|---|
| 主节点网络中断 | ping 信任网关失败→关闭主库;备库 ping 网关正常→failover 升主 | 切换期间中断 |
| 网络丢包 10% | 基本无影响 | 无 |
| 网络丢包 30% | 可能触发 failover | 集群可能无法服务 |
| 网络分区 | 可能出现脑裂 | 多主 |
| 网关失联 | 所有节点 ping 网关失败→watchdog 不执行 failover | 集群失去自动切换能力 |
9.4 资源耗尽类故障
| 故障类型 | 集群应对行为 | 业务影响 |
|---|---|---|
| 数据盘满 | 内核可能 core,需人工介入 | 可能无法恢复 |
| 连接满 | kingbasecluster 新连接失败 | 新建连接报错 |
| 磁盘 IO 高 | 响应低 | 响应低 |
| CPU/内存高 | 响应低 | 响应低 |
第十章 VIP管理
10.1 双 VIP 机制
V8R3 集群管理两种 VIP:
| VIP 类型 | 说明 | 跟随对象 | 配置位置 |
|---|---|---|---|
| DB VIP | 数据库服务 VIP,应用连接数据库使用 | 跟随 primary 节点漂移 | HAmodule.conf db_vip |
| Cluster VIP | 集群管理 VIP,应用连接中间件使用 | 跟随 watchdog MASTER 漂移 | HAmodule.conf cluster_vip / kingbasecluster.conf delegate_IP |
10.2 VIP 自动管理
-
DB VIP:由 es_ha_model 脚本管理,failover 时自动从原主卸载并加载到新主
-
Cluster VIP:由 watchdog 管理,watchdog MASTER 持有,切换时自动漂移
10.3 VIP 手动管理
# 加载 VIP
ip addr add ${VIP}/${MASK} dev ${DEV} label ${DEV}:3
# 卸载 VIP
ip addr del ${VIP}/${MASK} dev ${DEV}
# 发送 arping 通知
arping -U ${VIP} -w 2 -c 2 -i ${DEV}
10.4 VIP 加载故障排查
原因 1:ip/arping 权限不足
# 解决方案
chown root.root /sbin/ip && chmod 4755 /sbin/ip
chown root.root ${cluster_path}/kingbasecluster/bin/arping && chmod 4755 ${cluster_path}/kingbasecluster/bin/arping
原因 2:arping_path 配置错误
# 错误:参数名应为 arping_path 而非 arping
# kingbasecluster.conf 或 HAmodule.conf 中
arping='/home/kingbase/.../bin' # ❌ 错误
arping_path='/home/kingbase/.../bin' # ✅ 正确
原因 3:HAmodule.conf 中 DEV 变量为空
# 检查并修改 HAmodule.conf
DEV="eth0" # 必须指定网卡名称
原因 4:中文 locale 问题(OpenEuler/kylin)
# ping 返回中文"已接收"而非"received",脚本 grep 英文关键词匹配失败
# 解决方案:在脚本开头添加
export LANG=C
第十一章 在线扩缩容
11.1 添加备库节点
操作步骤:
-
修改 kingbasecluster.conf:添加新的 backend 配置段(如 backend_hostname2 等)
-
修改 HAmodule.conf(db/etc/ 和 kingbasecluster/etc/ 两处):
-
更新节点数量配置
-
添加新节点信息
-
-
备库配置 crond 定时任务:
# /etc/cron.d/KINGBASECRON
*/1 * * * * kingbase /home/kingbase/cluster/ks_cluster/db/bin/network_rewind.sh
*/1 * * * * kingbase /home/kingbase/cluster/ks_cluster/db/bin/restartcluster.sh
-
重启 kingbasecluster 服务使配置生效
-
验证 :
show pool_nodes确认新节点已加入
11.2 删除备库节点
-
修改 kingbasecluster.conf 移除对应 backend 配置段
-
修改 HAmodule.conf 移除对应节点信息
-
重启 kingbasecluster 服务
-
主库清理残留复制槽:
SELECT sys_drop_replication_slot('slot_name');
⚠️ 不能直接删除主库节点,需先 switchover 切换为主备后再删除
第十二章 参数调整与配置变更
12.1 kingbasecluster.conf 修改
修改后需重启 kingbasecluster 服务:
# 停止
/home/kingbase/cluster/ks_cluster/kingbasecluster/bin/kingbasecluster stop
# 启动(需 root 权限)
/home/kingbase/cluster/ks_cluster/kingbasecluster/bin/kingbasecluster start
12.2 HAmodule.conf 修改
修改后需同步修改 db/etc/HAmodule.conf 和 kingbasecluster/etc/HAmodule.conf 两处,保持一致。
12.3 数据库配置修改
-
需重启生效的参数:修改 kingbase.conf 后重启数据库或集群
-
不需要重启的参数 :
sys_ctl -D $data_path reload
12.4 同步模式调整
修改 kingbase.conf 中的 synchronous_standby_names 参数:
# 同步模式
synchronous_standby_names = '1 (node2)'
# 优选同步模式(推荐)
synchronous_standby_names = 'ANY 1(node2,node3)'
# 异步模式
synchronous_standby_names = ''
修改后需 reload 或重启数据库。
第十三章 常见故障FAQ
13.1 kingbase_monitor.sh 启动失败 --- pam_nologin 错误
现象 :启动集群时提示 pam_nologin(8) 错误
原因:/etc/nologin 文件存在,PAM 模块阻止非 root 用户登录
解决:
rm /etc/nologin
13.2 OpenEuler/kylin 系统 kingbasecluster 无法启动
现象:kingbasecluster 启动失败,日志显示 ping 网关失败,但手工 ping 正常
原因:系统返回中文提示"已接收"而非"received",脚本 grep 英文关键词匹配失败
解决 :在脚本开头添加 export LANG=C
13.3 VIP 加载失败 --- ip/arping 权限不足
现象 :[ERROR] No execute permission for "/usr/sbin/ip" 或 arping
解决:
chown root.root /sbin/ip && chmod 4755 /sbin/ip
chown root.root ${cluster_path}/kingbasecluster/bin/arping && chmod 4755 ${cluster_path}/kingbasecluster/bin/arping
13.4 VIP 加载失败 --- arping_path 配置错误
现象 :failover 切换 VIP 加载超时,日志提示 arping unknown paramName
原因 :kingbasecluster.conf 或 HAmodule.conf 中参数名写为 arping 而非 arping_path
解决 :修正为 arping_path
13.5 VIP 加载失败 --- DEV 变量为空
现象 :手工执行 sh -x change_vip.sh 发现 DEV 变量为空
原因:HAmodule.conf 中 DEV 未赋值
解决 :在所有 HAmodule.conf 文件中给 DEV 指定网卡名称:DEV="eth0"
13.6 failover 切换后节点均处于 standby
现象:show pool_nodes 显示两个节点均为 standby,无流复制
处理:
-
先解决流复制:配置 recovery.conf → 启动原主库为备库 → 确认流复制正常
-
更新集群状态:在主备节点分别执行 pcp_attach_node
-
验证 show pool_nodes
13.7 esHAmodel.sh 脚本错误
现象:V8R3 集群启动 esHAmodel.sh 失败
排查:检查脚本执行权限、环境变量、路径配置、LANG 设置
13.8 集群名称不能使用 "cluster"
现象:部署时集群名称设为 "cluster" 导致异常
解决:使用其他名称如 ks_cluster
13.9 防火墙导致 show pool_nodes 信息错误
解决:关闭防火墙或开放所有集群相关端口(54321/9999/9898/9000)
13.10 pcp_node_refresh 误触发 failover
⚠️ pcp_node_refresh 会将指定节点踢出并重新加入集群。对主库执行此命令会导致主备切换!
13.11 DATA_SIZE_DIFF 告警
现象:集群启动时报 DATA_SIZE_DIFF 超过阈值
排查:检查 sys_stat_replication 中的 lsn_lag,确认主备数据差异
13.12 libssl 问题
现象:kingbasecluster 启动报 libssl 相关错误
排查:检查 OpenSSL 库版本兼容性
13.13 crond 定时任务 PID 文件问题
现象:restartcluster.sh 无法正常启动 kingbasecluster
原因:某次启动异常创建了有问题的 pid 文件,后续定时任务读取 pid 文件时出错
解决:清理残留 pid 文件后重新启动
13.14 旧主库未自动拉起(V8R3特有)
现象:failover 后旧主库未自动加入集群
解决:
-
在旧主库 data 目录创建 recovery.conf(参考 8.2节)
-
删除 recovery.done(如存在)
-
等待约1分钟,旧主库自动拉起为备库
第十四章 运维禁令与注意事项
🚫 禁令一:禁止直接在备库写数据
必须通过 9999 端口(kingbasecluster 中间件)或连接主库 54321 端口写入。备库为只读,直接写会导致数据不一致。
🚫 禁令二:禁止单节点修改配置
修改 kingbasecluster.conf 或 HAmodule.conf 后,必须在所有节点同步修改,避免角色切换后配置不一致。
⚠️ HAmodule.conf 需同步修改 db/etc/ 和 kingbasecluster/etc/ 两处
🚫 禁令三:禁止心跳网络不稳定
确保节点间 heartbeat 网络(9000端口)稳定,否则会引发脑裂导致 VIP 冲突。
🚫 禁令四:禁止对主库执行 pcp_node_refresh
对主库执行 pcp_node_refresh 会导致 failover 切换!
🚫 禁令五:禁止集群中缩小 max_connections
集群中 max_connections 只能调大不能调小。
⚠️ 注意一:归档目录不能写满
归档目录写满会导致主库停止服务。
⚠️ 注意二:kingbasecluster 启动需 root 权限
watchdog 进程需要控制 VIP 接口,kingbasecluster 启动必须拥有管理员权限。
⚠️ 注意三:trusted_servers 不要配置节点 IP
信任网关应配置网关 IP(如交换机 IP),不要配置数据库节点 IP 或 127.0.0.1。
⚠️ 注意四:recovery.conf 是 V8R3 备库标识
V8R3 使用 recovery.conf(而非 standby.signal)标识备库。备库 data 目录必须存在此文件,主库 data 目录应有 recovery.done。
第十五章 运维工具箱
| 任务 | 常用工具/命令 |
|---|---|
| 查看集群节点状态 | ksql -USYSTEM -dTEST -p9999 -c "show pool_nodes" |
| 查看 watchdog 状态 | pcp_watchdog_info -h 127.0.0.1 -p 9898 -U kingbase |
| 查看节点详细信息 | pcp_node_info -h 127.0.0.1 -p 9898 -U kingbase -n [节点ID] |
| 挂载被隔离节点 | pcp_attach_node -U kingbase -h 127.0.0.1 -p 9898 -n [节点ID] |
| 脱离节点 | pcp_detach_node -U kingbase -h 127.0.0.1 -p 9898 -n [节点ID] |
| 强制升主节点 | pcp_promote_node -U kingbase -h 127.0.0.1 -p 9898 -n [节点ID] |
| 手工升主备库 | sys_ctl promote -D $data_path |
| 查看当前连接数 | select count(*) from sys_stat_activity; |
| 查看长事务 | select pid, state, query_start from sys_stat_activity where state<>'idle'; |
| 查看流复制状态 | select * from sys_stat_replication; |
| 查看复制槽 | select * from sys_replication_slots; |
| 查看复制延迟 | select case when sys_last_wal_receive_lsn()=sys_last_wal_replay_lsn() then 0 else EXTRACT(EPOCH FROM now()-sys_last_xact_replay_timestamp()) end; |
| 杀长事务 | select sys_terminate_backend(pid); |
| 查看数据库进程 | `ps -ef |
| 查看 kingbasecluster 进程 | `ps -ef |
| 查看 watchdog 进程 | `ps -ef |
| 一键启停集群 | kingbase_monitor.sh start / stop / restart |
| 手工启停中间件 | kingbasecluster start / stop |
| 全节点状态检查 | all_monitor.sh |
| sys_rewind 同步 | sys_rewind -D $data_path --source-server="host=新主IP port=54321 user=SYSTEM dbname=TEST" |
| 检查 crond 定时任务 | cat /etc/cron.d/KINGBASECRON |
附录A V8R3与V8R6+架构差异对照
| 项目 | V8R3 | V8R6+ |
|---|---|---|
| 中间件 | kingbasecluster(Pgpool-II) | 无中间件(直连数据库) |
| HA组件 | watchdog + es_ha_model/HAmodule.conf | repmgrd + kbha |
| 核心配置文件 | kingbasecluster.conf + HAmodule.conf | repmgr.conf |
| 备库标识文件 | recovery.conf | standby.signal |
| 服务端口 | 9999(中间件)+ 54321(DB) | 54321(DB直连) |
| 节点管理命令 | pcp 命令集 + show pool_nodes | repmgr 命令集 |
| 自动恢复配置 | AUTO_PRIMARY_RECOVERY(HAmodule.conf) | recovery 参数(repmgr.conf) |
| 备库恢复方式 | crond 定时任务 + network_rewind.sh | repmgrd 进程监控 + kbha 进程 |
| 集群启停脚本 | kingbase_monitor.sh | sys_monitor.sh |
| VIP管理 | watchdog(if_up_cmd/if_down_cmd)+ es_ha_model | kbha 进程 |
| 读写分发方式 | kingbasecluster 中间件自动路由 | JDBC 驱动级路由 |
| 双VIP机制 | DB VIP + Cluster VIP | 单 VIP |
| watchdog选举 | heartbeat 通讯 + MASTER/STANDBY | repmgrd 竞选 |
附录B 故障判断与恢复命令速查表
故障判断命令
| 编号 | 命令 | 用途 |
|---|---|---|
| FC-1 | ksql -USYSTEM -dTEST -p9999 -c "show pool_nodes" |
看集群节点状态 |
| FC-2 | pcp_watchdog_info -h 127.0.0.1 -p 9898 -U kingbase |
看 watchdog 状态 |
| FC-3 | `ps -ef | grep kingbasecluster` |
| FC-4 | `ps -ef | grep kingbase` |
| FC-5 | `ps -ef | grep watchdog` |
| FC-6 | ls $data_path/recovery.conf / ls $data_path/recovery.done |
判断主备角色 |
| FC-7 | ksql -h 主库IP -U SYSTEM -d TEST -c "select * from sys_stat_replication;" |
看流复制状态 |
| FC-8 | sys_ctl status -D $data_path |
看数据库运行状态 |
故障恢复命令
| 编号 | 命令 | 用途 |
|---|---|---|
| FR-1 | select sys_current_wal_lsn(); / select timeline_id from sys_control_checkpoint(); |
多主判断真正主库 |
| FR-2 | kingbase_monitor.sh start |
全节点故障一键启动 |
| FR-3 | pcp_attach_node -U kingbase -h 127.0.0.1 -p 9898 -n [ID] |
被隔离节点重新注册 |
| FR-4 | 配置 recovery.conf + sys_rewind + sys_ctl start + pcp_attach_node | 原主库手动恢复为备库 |
| FR-5 | show pool_nodes + sys_stat_replication |
恢复后验证 |
附录C 参数配置速查表
kingbasecluster.conf 关键参数
| 类别 | 参数 | 建议值 | 说明 |
|---|---|---|---|
| Backend | backend_hostname0/1 |
主/备库IP | 后端节点IP |
| Backend | backend_port0/1 |
54321 | 数据库端口 |
| Backend | backend_weight0/1 |
1 | 负载均衡权重 |
| Backend | backend_flag0 |
DISALLOW_TO_FAILOVER | 主库禁止自动failover |
| Backend | backend_flag1 |
ALLOW_TO_FAILOVER | 备库允许failover |
| Health | health_check_period |
10 | 健康检查间隔(秒) |
| Health | health_check_timeout |
20 | 健康检查超时(秒) |
| Health | health_check_max_retries |
10 | 最大重试次数 |
| Health | health_check_retry_delay |
20 | 重试间隔(秒) |
| Health | health_check_user |
SYSTEM | 健康检查用户 |
| Watchdog | use_watchdog |
on | 激活看门狗 |
| Watchdog | trusted_servers |
网关IP | 信任网关列表 |
| Watchdog | wd_interval |
10 | 生命检查间隔 |
| Watchdog | wd_life_point |
3 | 失败重试次数 |
| Watchdog | delegate_IP |
Cluster VIP | 集群VIP |
| Watchdog | wd_port |
9000 | heartbeat端口 |
| Failover | failover_mode |
automatic | 自动故障切换 |
| 连接池 | num_init_children |
16 | 连接池进程数 |
| 连接池 | max_pool |
4 | 每进程最大连接池 |
HAmodule.conf 关键参数
| 参数 | 建议值 | 说明 |
|---|---|---|
AUTO_PRIMARY_RECOVERY |
1(生产推荐) | failover后自动恢复原主库 |
db_vip |
如 192.192.103.183 | 数据库VIP |
cluster_vip |
如 192.192.103.185 | 集群VIP(=delegate_IP) |
trust_ip |
网关IP | 信任网关 |
DEV |
eth0 | VIP绑定网卡 |
db_port |
54321 | 数据库端口 |
ifconfig_path |
/sbin | ifconfig路径 |
arping_path |
/usr/sbin 或集群bin | arping路径 |
ping_path |
/bin | ping路径 |
数据库 kingbase.conf 关键参数
| 参数 | 建议值 | 说明 |
|---|---|---|
wal_level |
replica | 主备最低要求 |
full_page_writes |
on | 防坏块 |
wal_log_hints |
on | sys_rewind前提 |
hot_standby |
on | 备库可读 |
synchronous_commit |
remote_apply | 数据强一致 |
max_wal_senders |
32 | WAL发送进程数 |
wal_keep_segments |
512 | WAL保留数 |
max_connections |
使用数×120% | 只能调大不能调小 |
archive_mode |
on | 开启归档 |
shared_buffers |
内存1/3 | 共享缓冲 |
tcp_keepalives_idle |
2 | TCP心跳间隔 |
wal_sender_timeout |
30000 | 主库检测超时(ms) |
wal_receiver_timeout |
30000 | 备库检测超时(ms) |