一、 概要
在金仓 KingbaseES (KES) V9 高可用集群环境中,节点物理 IP 和服务虚拟 IP (VIP) 是核心配置。当业务需求变更(如网络规划调整、服务器迁移)需要修改这些 IP 地址时,需谨慎操作以确保集群持续可用。本文基于测试环境,详细演示 KES V9 集群 IP 地址调整的全流程步骤,为实际运维提供参考。
二、 调整说明
IP 调整涉及两个层面:
-
主机层面:
- 修改操作系统的永久物理 IP 地址配置。
- 更新
/etc/hosts文件中的主机名与 IP 映射关系。 - 重启网络服务使新配置生效。
- 注意: 若使用网卡绑定 (bond),需同步调整 bond 相关配置。
-
集群层面:
- 修改所有节点上的
repmgr.conf配置文件,更新其中的:- 物理 IP (
conninfo,net_device_ip) - 虚拟 VIP (
virtual_ip) - 网络设备名 (
net_device) - 信任网关 (
trusted_servers)
- 物理 IP (
- 重启数据库并重新将节点注册到集群。
- 修改所有节点上的
三、 实践方案
1. 变更规划
| 项目 | 变更前 | 变更后 |
|---|---|---|
| 主节点IP | 192.168.126.15/24 | 192.168.80.15/24 |
| 从节点IP | 192.168.126.16/24 | 192.168.80.16/24 |
| 虚拟VIP | 192.168.126.18/24 | 192.168.80.18/24 |
| 信任网关 | 192.168.126.1 | 192.168.80.1 |
| 网卡名称 | ens33 | ens34 |
重要提示: 如果服务器配置了网卡绑定 (bond),请务必在主机层面相应调整 bond 的配置。
2. 当前集群环境信息收集 (变更前)
- 主机映射 (
/etc/hosts):192.168.126.15 node01 192.168.126.16 node02 192.168.126.18 kes_vip - 主节点 IP (
ip add):inet 192.168.126.15/24 brd 192.168.126.255 scope global noprefixroute ens33 - 从节点 IP (
ip add):inet 192.168.126.16/24 brd 192.168.126.255 scope global noprefixroute ens33 - 集群状态 (
repmgr cluster show):ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string ---+-------+---------+---------+----------+----------+----------+----------+------------------- 1 | node1 | primary | running | | default | 100 | 1 | host=192.168.126.15 user=esrep ... 2 | node2 | standby | running | node1 | default | 100 | 1 | host=192.168.126.16 user=esrep ... - 主节点
repmgr.conf关键参数 (repmgr config showall/grep):node_id=1 node_name='node1' conninfo='host=192.168.126.15 user=esrep ...' # 主库连接串 virtual_ip='192.168.126.18/24' # 虚拟VIP net_device='ens33' # 网卡名 net_device_ip='192.168.126.15' # 本机物理IP trusted_servers='192.168.126.1' # 信任网关 ... (其他配置如 promote_command, vip_*_cmd, arping_cmd 等保持不变) - 从节点
repmgr.conf关键参数 (repmgr config showall/grep):node_id=2 node_name='node2' conninfo='host=192.168.126.16 user=esrep ...' # 备库连接串 virtual_ip='192.168.126.18/24' # 虚拟VIP (同主库) net_device='ens33' # 网卡名 net_device_ip='192.168.126.16' # 本机物理IP trusted_servers='192.168.126.1' # 信任网关 (同主库) ... (其他配置如 promote_command, vip_*_cmd, arping_cmd 等保持不变) - 主节点
kingbase.auto.conf(cat data/kingbase.auto.conf):synchronous_standby_names = 'ANY 1(node2)' # 指定备库node2为同步备 - 从节点
kingbase.auto.conf(cat data/kingbase.auto.conf):primary_conninfo = 'host=192.168.126.15 user=esrep ...' # 指向旧主库IP primary_slot_name = 'repmgr_slot_2' # 复制槽
3. 修改配置文件
在进行以下操作前,请务必关闭整个 KES 数据库集群 (sys_monitor.sh stop 或在各节点 sys_ctl stop -D $KINGBASE_DATA)。
-
主机名 IP 映射配置 (
/etc/hosts):# 在所有节点上执行,覆盖旧的映射或追加新的映射 cat <<EOF >> /etc/hosts 192.168.80.15 node01 192.168.80.16 node02 192.168.80.18 kes_vip EOF # 建议:也可直接编辑 /etc/hosts 文件,将旧IP行注释或删除,添加新行。 -
集群
repmgr.conf配置修改:- 备份配置文件 (所有节点):
cp $KINGBASE_HOME/etc/repmgr.conf ~/repmgr.conf.bak.$(date +%Y%m%d) # 强烈建议备份! - 修改主节点 (
node01, 192.168.80.15)repmgr.conf:# 1. 修改 conninfo 中的 host IP (指向本机新IP) sed -i "s/\(conninfo='host=\)192\.168\.126\.15/\1192.168.80.15/" $KINGBASE_HOME/etc/repmgr.conf # 2. 修改 net_device 值 (新网卡名) sed -i "s/\(net_device=\)'ens33'/\1'ens34'/" $KINGBASE_HOME/etc/repmgr.conf # 3. 修改 net_device_ip 值 (本机新物理IP) sed -i "s/\(net_device_ip=\)'192\.168\.126\.15'/\1'192.168.80.15'/" $KINGBASE_HOME/etc/repmgr.conf # 4. 修改 virtual_ip 值 (新VIP) sed -i "s/\(virtual_ip=\)'192\.168\.126\.18\/24'/\1'192.168.80.18\/24'/" $KINGBASE_HOME/etc/repmgr.conf # 5. 修改 trusted_servers 值 (新信任网关) sed -i "s/\(trusted_servers=\)'192\.168\.126\.1'/\1'192.168.80.1'/" $KINGBASE_HOME/etc/repmgr.conf- 验证主节点修改 (
grep):conninfo='host=192.168.80.15 user=esrep ...' virtual_ip='192.168.80.18/24' net_device='ens34' net_device_ip='192.168.80.15' trusted_servers='192.168.80.1'
- 验证主节点修改 (
- 修改从节点 (
node02, 192.168.80.16)repmgr.conf:# 1. 修改 conninfo 中的 host IP (指向本机新IP) sed -i "s/\(conninfo='host=\)192\.168\.126\.16/\1192.168.80.16/" $KINGBASE_HOME/etc/repmgr.conf # 2. 修改 net_device 值 (新网卡名) sed -i "s/\(net_device=\)'ens33'/\1'ens34'/" $KINGBASE_HOME/etc/repmgr.conf # 3. 修改 net_device_ip 值 (本机新物理IP) sed -i "s/\(net_device_ip=\)'192\.168\.126\.16'/\1'192.168.80.16'/" $KINGBASE_HOME/etc/repmgr.conf # 4. 修改 virtual_ip 值 (新VIP,通常与主库相同) sed -i "s/\(virtual_ip=\)'192\.168\.126\.18\/24'/\1'192.168.80.18\/24'/" $KINGBASE_HOME/etc/repmgr.conf # 5. 修改 trusted_servers 值 (新信任网关,通常与主库相同) sed -i "s/\(trusted_servers=\)'192\.168\.126\.1'/\1'192.168.80.1'/" $KINGBASE_HOME/etc/repmgr.conf- 验证从节点修改 (
grep):conninfo='host=192.168.80.16 user=esrep ...' virtual_ip='192.168.80.18/24' net_device='ens34' net_device_ip='192.168.80.16' trusted_servers='192.168.80.1'
- 验证从节点修改 (
- 备份配置文件 (所有节点):
-
数据库
kingbase.auto.conf配置 (备库):- 从节点 (
node02): 主要修改primary_conninfo指向新的主库物理 IP。synchronous_standby_names在主库的配置会在重新注册后自动更新,无需手动修改。
注意:
repmgr node rejoin命令在后续步骤中会处理备库的重新连接,修改此处primary_conninfo是冗余的,因为 rejoin 过程会重建复制连接。但为了确保在 rejoin 之前 如果手动启动备库也能正确连接主库,进行此修改是推荐的最佳实践。如果不修改,在 rejoin 成功前手动启动备库可能会失败。 - 从节点 (
4. 启动数据库并重新注册集群
-
启动主库 (
node01):sys_ctl start -D $KINGBASE_DATA- 检查主库状态 (
repmgr cluster show):
此时应只看到主库ID | Name | Role | Status | Upstream | ... | Connection string ---+-------+---------+---------+----------+-----+------------------- 1 | node1 | primary | running | | ... | host=192.168.80.15 ... # 注意IP已更新node1在运行,状态为primary,连接字符串中的 IP 已是新 IP。备库node2尚未注册。
- 检查主库状态 (
-
在主库注册主节点 (
node01):repmgr primary register -F预期输出示例:
INFO: connecting to primary database... INFO: primary registration complete NOTICE: primary node (ID: 1) successfully registered -
在备库重新加入节点 (
node02):-
启动备库 (可选但推荐): 如果之前没有启动,先启动备库。如果第 3.3 步修改了
primary_conninfo,此时备库应能连接到新 IP 的主库开始追赶日志。如果没修改,启动可能会失败或等待连接。sys_ctl start -D $KINGBASE_DATA -
执行
repmgr node rejoin: 此命令告知 repmgr 该节点(node02)希望以备用节点身份重新加入集群。它会连接到当前主库 (-h指定新主库IP) 获取信息并配置自身。repmgr node rejoin -h 192.168.80.15 -U esrep -d esrep预期输出示例:
INFO: connecting to rejoin target node INFO: retrieving configuration from rejoin target node INFO: rejoin target node is primary (ID: 1) INFO: local node is standby (ID: 2) INFO: updating node 2 configuration INFO: updating node 2 in repmgr primary INFO: reloading configuration on rejoin target node INFO: starting standby using existing data directory INFO: setting node 2's upstream to node 1 INFO: local node 2 rejoined the cluster INFO: STANDBY REJOIN successful NOTICE: node 2 rejoined the cluster as standby此命令成功后,备库
node02已重新加入集群,其repmgr.conf中关于主库的信息(如上游节点)会被更新。 -
注册备库 (
repmgr standby register): 此步骤将当前运行的备库实例正式注册到 repmgr 的元数据中。repmgr standby register -h 192.168.80.15 -U esrep -d esrep -F预期输出示例:
INFO: connecting to primary database... INFO: standby registration complete NOTICE: standby node "node2" (ID: 2) successfully registered
-
-
检查集群状态 (
repmgr cluster show):
在主库或任一节点执行:ID | Name | Role | Status | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string ---+-------+---------+---------+----------+----------+----------+----------+---------+------------------- 1 | node1 | primary | running | | default | 100 | 1 | | host=192.168.80.15 ... 2 | node2 | standby | running | node1 | default | 100 | 1 | 0 bytes | host=192.168.80.16 ...关键确认点:
- 两个节点
Status均为running。 - 角色 (
Role) 正确:primary和standby。 - 备库的
Upstream指向主库 (node1)。 LSN_Lag显示为0 bytes或很小的值,表示复制正常无延迟。Connection string中的 IP 地址均已更新为新 IP。
- 两个节点
-
重启 KES 集群服务并测试切换:
- 重启集群 (可选,验证服务脚本):
预期输出: 显示主备节点依次正常停止和启动。sys_monitor.sh restart # 使用集群管理脚本重启 - 测试主备切换 (
repmgr standby switchover):预期输出示例 (摘要):# 在**当前主库 (node01)** 执行切换命令 repmgr standby switchoverINFO: connecting to local node "node1" (ID: 1) INFO: connecting to candidate standby node "node2" (ID: 2) INFO: candidate standby node "node2" (ID: 2) is up to date INFO: replication lag on candidate standby: 0 seconds INFO: checking cluster configuration INFO: checking switchover on node "node1" (ID: 1) in progress INFO: performing switchover INFO: switching current node "node1" to standby INFO: promoting candidate standby node "node2" to primary INFO: waiting for promotion to complete INFO: node "node2" (ID: 2) promoted to primary INFO: switching current node "node1" to standby INFO: STANDBY SWITCHOVER successful NOTICE: node 2 is now primary - 再次检查集群状态 (
repmgr cluster show):
确认点: 角色成功互换 (ID | Name | Role | Status | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string ---+-------+---------+---------+----------+----------+----------+----------+---------+------------------- 2 | node2 | primary | running | | default | 100 | 2 | | host=192.168.80.16 ... 1 | node1 | standby | running | node2 | default | 100 | 2 | 0 bytes | host=192.168.80.15 ...node2变primary,node1变standby),状态正常,复制无延迟,IP 正确。Timeline通常会增加。
- 重启集群 (可选,验证服务脚本):
四、 总结
- 操作核心: KES V9 集群 IP 调整需同步修改操作系统网络配置 (
/etc/sysconfig/network-scripts,/etc/hosts) 和集群关键配置文件 (repmgr.conf, 备库的kingbase.auto.conf),并在修改后重启网络服务、数据库,并重新注册集群节点。 - 关键步骤:
- 详细规划新旧 IP、VIP、网关、网卡映射。
- 操作前务必停止整个集群。
- 备份所有关键配置文件 (
repmgr.conf,kingbase.auto.conf,/etc/hosts, 网络配置文件)。 - 修改
/etc/hosts和操作系统网络配置 (IP, 网关等),重启网络。 - 修改所有节点的
repmgr.conf(更新conninfo,net_device,net_device_ip,virtual_ip,trusted_servers)。 - 修改备库的
kingbase.auto.conf(更新primary_conninfo指向新主库 IP - 最佳实践)。 - 启动主库,在主库执行
repmgr primary register -F。 - 在备库执行
repmgr node rejoin -h <新主库IP> ...重新加入集群。 - 在备库执行
repmgr standby register -h <新主库IP> ... -F注册备节点。 - 使用
repmgr cluster show仔细验证集群状态和 IP 信息。 - 执行集群重启和主备切换测试,验证高可用功能正常。
- 风险提示:
- 操作涉及数据库停机和网络变更,务必在业务低峰期进行,并通知相关方。
- 修改配置文件时务必仔细核对参数名和 IP 地址,避免拼写错误。利用
sed命令需注意转义。 - 强烈建议在测试环境充分验证操作流程后再在生产环境执行。
- 如果配置了网卡绑定 (bond),主机层面的网络配置变更需要额外小心处理 bond 相关设置。
- 遗漏: 本文档步骤基于一主一从 KES V9 集群编写,时间仓促更多节点集群场景待以后弥补。




