KingbaseES读写分离高可用集群扩容、备库重建与故障切换实战
文章目录一、安装包下载及环境部署二、KingbaseES V9R3C18 读写分离集群环境信息2.1 环境规划2.2 系统环境2.3 安装介质三、读写分离集群扩容3.1 新节点准备3.2 新节点配置3.2.1 配置主机名3.2.2 配置 sysctl 参数3.2.3 配置 SSH 服务参数3.2.4 生成 SSH key3.2.5 配置 known_hosts3.2.6 配置三节点 SSH 互信3.3 新节点扩容前准备3.3.1 检查主节点位置3.3.2 准备 node3 临时扩容目录3.3.3 准备扩容节点临时扩容目录3.3.4 扩容前检查3.4 开始扩容四、重建备库的克隆同步速率控制4.1 重建前状态确认4.1.1 集群查看状态4.1.2 在主节点写入测试数据4.1.3 配置环境变量4.2 停止待重建备库4.3 清理旧备库环境4.3.1 检查复制槽4.3.2 移动旧数据目录4.4 开始重建4.4.1 执行限速 clone32mb/s4.4.2 启动备库4.5 验证备库小结五、主库故障下并行检测5.1 环境准备5.1.1 确认当前集群状态5.1.2 打开HA日志观察窗口5.2 故障模拟5.3 故障恢复5.3.1 恢复启动ha组件5.3.2 最终验证小结六、选举与升主流程优化6.1 选举策略优化目标6.2 检查状态6.3 策略配置6.3.1 在 node1 上降低候选优先级6.3.2 重新注册 node1 的优先级6.3.3 在 node3 上提高候选优先级6.3.4 重新注册 node3 的优先级6.3.5 在node2验证优先级是否生效6.4 模拟故障测试6.4.1 在 node3 打开日志观察窗口6.4.2 模拟 node2 主库故障6.4.3 观察选举与升主日志6.4.4 验证 node3 是否成为新主库小结总结一、安装包下载及环境部署https://www.kingbase.com.cn/download.html下载测试安装包并且进行部署详细部署流程见https://blog.csdn.net/qq_46302361/article/details/162045963二、KingbaseES V9R3C18 读写分离集群环境信息2.1 环境规划角色主机名IP 地址网卡说明主库node1192.168.40.112ens192当前 primary持有 VIP备库node2192.168.40.113ens192standby从 node1 流复制VIP-192.168.40.115/24ens192对外访问入口网关/仲裁检测地址-192.168.40.2ens192trusted_servers2.2 系统环境项目node1node2操作系统UOS Server 20UOS Server 20内核版本4.19.90-2305.1.0.0199.56.uel20.x86_644.19.90-2305.1.0.0199.56.uel20.x86_64CPUAMD Ryzen 7 5825U with Radeon GraphicsAMD Ryzen 7 5825U with Radeon GraphicsCPU 核数22内存3.3Gi3.3GiSwap15Gi15Gi时区Asia/ShanghaiAsia/ShanghaiSELinuxDisabledDisabledfirewalldinactiveinactivesecurecmddactiveactive磁盘空间节点根分区/home分区node170G总用 15G可用 56G50G总用 1.7G可用 49Gnode270G总用 14G可用 57G50G总用 1.6G可用 49G关键系统参数参数值open files65536max user processes65536memlock50000000 KBkernel.sem5010 64128000 50100 1280net.ipv4.ip_local_reserved_ports8890,543212.3 安装介质文件节点路径大小SHA256KingbaseES_V009R003C018B0003_Lin64_install.iso/install/KingbaseES_V009R003C018B0003_Lin64_install.iso1.3Ge4c04cbb1c4a1277fc5e0fdecca8e3d57d6d10e2ad247fde4fac53c670f6bcd2license.dat/install/license.dat4.9K3cf5a2109695e59a847f012cf11849b616b631d212c192aefb76194ab2a594fe三、读写分离集群扩容3.1 新节点准备项目值主机名node3IP192.168.40.114/24网卡ens192网关192.168.40.2root 密码kingbase.123kingbase 用户已存在数据库端口 54321未监听securecmdd 端口 8890未监听firewalldinactiveSELinuxDisablednode3 当前网络ens192 UP192.168.40.114/24 default via192.168.40.2 dev ens1923.2 新节点配置3.2.1 配置主机名hostnamectl set-hostname node3配置hosts文件node1与node2同时配置192.168.40.112 node1192.168.40.113 node2192.168.40.114 node3关闭 firewalldsystemctl stop firewalld systemctl disable firewalld关闭 SELinuxsed-is/^SELINUX.*/SELINUXdisabled//etc/selinux/config准备扩容目录mkdir-p/home/kingbase/cluster/installchown-Rkingbase:kingbase /home/kingbase/clusterchmod-R755/home/kingbase/cluster配置 limits 参数写入资源限制cat/etc/security/limits.d/99-kingbase.confEOF kingbase soft nofile 65536 kingbase hard nofile 65536 kingbase soft nproc 65536 kingbase hard nproc 65536 kingbase soft core unlimited kingbase hard core unlimited kingbase soft memlock 50000000 kingbase hard memlock 50000000 EOF3.2.2 配置 sysctl 参数写入 /etc/sysctl.d/99-kingbase-ha.confcat/etc/sysctl.d/99-kingbase-ha.confEOF kernel.sem 5010 64128000 50100 1280 net.ipv4.ip_local_reserved_ports 8890,54321 EOF同时写入 /etc/sysctl.conf避免被原配置覆盖sed-i/^kernel.sem/d/etc/sysctl.confsed-i/^net.ipv4.ip_local_reserved_ports/d/etc/sysctl.confcat/etc/sysctl.confEOF kernel.sem 5010 64128000 50100 1280 net.ipv4.ip_local_reserved_ports 8890,54321 EOF立即生效sysctl-wkernel.sem5010 64128000 50100 1280sysctl-wnet.ipv4.ip_local_reserved_ports8890,543213.2.3 配置 SSH 服务参数优化 SSH 连接关闭 DNS 反查和 GSSAPIsed-is/^#\?UseDNS.*/UseDNS no//etc/ssh/sshd_configsed-is/^#\?GSSAPIAuthentication.*/GSSAPIAuthentication no//etc/ssh/sshd_config systemctl reload sshd3.2.4 生成 SSH keyroot 用户mkdir-p/root/.sshchmod700/root/.ssh ssh-keygen-q-trsa-b3072-N-f/root/.ssh/id_rsachmod600/root/.ssh/id_rsachmod644/root/.ssh/id_rsa.pubkingbase 用户su- kingbase-cmkdir -p ~/.ssh chmod 700 ~/.sshsu- kingbase-cssh-keygen -q -t rsa -b 3072 -N -f ~/.ssh/id_rsachmod600/home/kingbase/.ssh/id_rsachmod644/home/kingbase/.ssh/id_rsa.pubchown-Rkingbase:kingbase /home/kingbase/.ssh3.2.5 配置 known_hosts写入三台节点的 SSH 指纹foruinroot kingbase;dohome$([$uroot]echo/root||echo/home/kingbase)touch$home/.ssh/known_hostsfortargetin192.168.40.112192.168.40.113192.168.40.114 node1 node2 node3;dossh-keygen-R$target-f$home/.ssh/known_hosts/dev/null21||truedonessh-keyscan-H192.168.40.112192.168.40.113192.168.40.114 node1 node2 node3$home/.ssh/known_hosts2/dev/null||truechown-R$u:$u$home/.sshchmod644$home/.ssh/known_hostsdone3.2.6 配置三节点 SSH 互信将 node1、node2、node3 上 root 和 kingbase 用户的公钥统一追加到各节点/root/.ssh/authorized_keys /home/kingbase/.ssh/authorized_keysnode3 上最终授权文件权限chmod700/root/.ssh /home/kingbase/.sshchmod600/root/.ssh/authorized_keys /home/kingbase/.ssh/authorized_keyschown-Rroot:root /root/.sshchown-Rkingbase:kingbase /home/kingbase/.ssh验证 node3 到 node1sshrootnode1hostnamesu- kingbase-cssh rootnode1 hostnamesu- kingbase-cssh kingbasenode1 hostname3.3 新节点扩容前准备3.3.1 检查主节点位置我这里主节点是node2su- kingbase-c/home/kingbase/cluster/install/kingbase/bin/repmgr -f /home/kingbase/cluster/install/kingbase/etc/repmgr.conf cluster show3.3.2 准备 node3 临时扩容目录先在node2主节点scp-r/home/kingbase/cluster/install/kingbase/bin\/home/kingbase/cluster/install/kingbase/lib\/home/kingbase/cluster/install/kingbase/share\root192.168.40.114:/home/kingbase/kes_expand_stage/kingbase3.3.3 准备扩容节点临时扩容目录我的扩容节点是node3exportKB_STAGE/home/kingbase/kes_expand_stage/kingbaseexportKB_BIN$KB_STAGE/binexportCONF$KB_BIN/install.confexportPRIMARY_IP192.168.40.113exportEXPAND_IP192.168.40.114exportEXPAND_NODE_ID3exportEXPAND_INSTALL_DIR/home/kingbase/cluster/installexportMAX_RATE64M##重建备库clone同步速率控制(MB/s)不限制的话设为0集群配置awk-vprimary_ip$PRIMARY_IP\-vexpand_ip$EXPAND_IP\-vnode_id$EXPAND_NODE_ID\-vinstall_dir$EXPAND_INSTALL_DIR\-vmax_rate$MAX_RATE BEGIN { in_expand0 } { if ($0 [expand]) { print [expand] print expand_type\0\ print primary_ip\ primary_ip \ print expand_ip\ expand_ip \ print node_id\ node_id \ print sync_type\\ print install_dir\ install_dir \ print zip_package\\ print net_device(ens192) print net_device_ip( expand_ip ) print license_file(license.dat) print db_password\12345678ab\ print deploy_by_sshd\1\ print ssh_port\22\ print scmd_port\8890\ print max_rate\ max_rate \ in_expand1 next } if (in_expand 1 $0 ~ /^\[/) { in_expand0 print next } if (in_expand 0) { print } } $CONF$CONF.tmpmv-f$CONF.tmp$CONFchownkingbase:kingbase$CONFsed-n/^\[expand\]/,/^\[/p$CONF3.3.4 扩容前检查hostnametest!-e/home/kingbase/cluster/install/kingbaseechonode3 正式安装目录干净ss-lntp|egrep54321|8890||echonode3 未监听 54321 和 88903.4 开始扩容cd/tmp/kes_expand_stage/kingbase/bin ./cluster_install.shexpand|tee/tmp/kes_expand_node3_$(date%Y%m%d%H%M%S).log集群节点扩容完毕四、重建备库的克隆同步速率控制4.1 重建前状态确认4.1.1 集群查看状态su- kingbase-c/home/kingbase/cluster/install/kingbase/bin/repmgr -f /home/kingbase/cluster/install/kingbase/etc/repmgr.conf cluster show4.1.2 在主节点写入测试数据先在node3设置个密码变量exportKINGBASE_PASSWORD12345678ab连接node2主库/home/kingbase/cluster/install/kingbase/bin/ksql-h192.168.40.113-p54321-Usystem-dtemplate1创建测试数据create tableifnot exists ha_rebuild_rate_demo(idint primary key, note text, created_at timestamp default now());insert into ha_rebuild_rate_demo(id,note)values(1,before rebuild node3 with clone rate limit);select* from ha_rebuild_rate_demo;4.1.3 配置环境变量设置变量使用32M限速重新cloneexportKB_HOME/home/kingbase/cluster/install/kingbaseexportKB_BIN$KB_HOME/binexportREPMGR_CONF$KB_HOME/etc/repmgr.confexportDATA_DIR$KB_HOME/dataexportPRIMARY_IP192.168.40.113exportCLONE_RATE32M4.2 停止待重建备库停止node3本地HA和数据库停止node3本地服务##停止securecmd/home/kingbase/cluster/install/kingbase/bin/sys_HAscmdd.sh stopsu- kingbase##停止本地HA/home/kingbase/cluster/install/kingbase/bin/sys_monitor.sh stoplocal##停止数据库/home/kingbase/cluster/install/kingbase/bin/sys_ctl-D/home/kingbase/cluster/install/kingbase/data-mfast-wstop确认54321已经停止ss-lntp|grep54321||echonode3 数据库已停止4.3 清理旧备库环境4.3.1 检查复制槽在node2上先配置一下变量exportKINGBASE_PASSWORD12345678ab连接主库/home/kingbase/cluster/install/kingbase/bin/ksql-h192.168.40.113-p54321-Usystem-dtemplate1删除复制槽selectslot_name, active from pg_replication_slots whereslot_namerepmgr_slot_3;selectpg_drop_replication_slot(repmgr_slot_3);4.3.2 移动旧数据目录在node3中移动旧数据目录cd/home/kingbase/cluster/install/kingbasemvdata data.bak.rebuild.$(date%Y%m%d%H%M%S)ls-lddata*4.4 开始重建设置环境变量exportKB_HOME/home/kingbase/cluster/install/kingbaseexportKB_BIN$KB_HOME/binexportREPMGR_CONF$KB_HOME/etc/repmgr.confexportDATA_DIR$KB_HOME/dataexportPRIMARY_IP192.168.40.113exportCLONE_RATE32M4.4.1 执行限速 clone32mb/s$KB_BIN/repmgr-f$REPMGR_CONF-h$PRIMARY_IP-Uesrep-desrep-p54321--fast-checkpoint-D$DATA_DIRstandby clone-r$CLONE_RATE4.4.2 启动备库启动node3数据库$KB_BIN/sys_ctl-w-t60-D$DATA_DIR-l$KB_HOME/logfile start重新注册 node3 备库$KB_BIN/repmgr-f$REPMGR_CONFstandby register-F--upstream-node-id2启动 repmgrd 守护进程$KB_BIN/repmgrd-f$REPMGR_CONF--daemonize启动本地 HA$KB_BIN/sys_monitor.sh startlocal ha查看集群状态$KB_BIN/repmgr-f$REPMGR_CONFcluster show4.5 验证备库进库验证selectsys_is_in_recovery();小结本次重建 node3 备库时通过 repmgr standby clone -r 32M 对 clone 同步速率进行了限制。实际执行日志中可以看到底层调用sys_basebackup … -S repmgr_slot_3 -r 32M其中 -r 32M 表示基础备份/克隆过程中最大传输速率限制为 32MB/s。重建完成后重新启动 node3 数据库并执行 repmgr standby register -F --upstream-node-id2 注册备库最终 repmgr cluster show 显示 node3 恢复为 standby跟随 node2LSN_Lag 为 0 bytes。五、主库故障下并行检测5.1 环境准备5.1.1 确认当前集群状态su- kingbase-c/home/kingbase/cluster/install/kingbase/bin/repmgr -f /home/kingbase/cluster/install/kingbase/etc/repmgr.conf cluster show5.1.2 打开HA日志观察窗口node2 打开 HA 日志观察窗口tail-n0-f$KB_HOME/log/hamgr.log$KB_HOME/log/kbha.lognode3 打开 HA 日志观察窗口tail-n0-f$KB_HOME/log/hamgr.log$KB_HOME/log/kbha.log5.2 故障模拟node1 模拟主库故障先停止 node1 本地 HA$KB_BIN/sys_monitor.sh stoplocal ha然后停止 node1 主库数据库$KB_BIN/sys_ctl-D$DATA_DIR-mimmediate stop观察node2与node3的日志窗口node2node35.3 故障恢复5.3.1 恢复启动ha组件$KB_BIN/sys_monitor.sh startlocal ha进程验证ps-ef|egreprepmgrd|kbha|kingbase -D|grep-vgrep5.3.2 最终验证$KB_BIN/repmgr-f$REPMGR_CONFcluster showipaddr show ens192|grep192.168.40.115小结演练前集群状态为 node1 主库node2、node3 为备库并且两个备库均正常跟随 node1。随后在 node2 和 node3 分别打开 hamgr.log、kbha.log 日志窗口用于观察主库故障后的检测过程。在 node1 上停止本地 HA 组件并关闭数据库后node2 和 node3 都检测到了原主库 node1 的数据库端口不可连接日志中出现了 connection to database failed、unable to connect to node “node1” 等信息。同时两个备库都对可信服务器192.168.40.2进行连通性检测确认故障不是由自身网络异常引起的。随后集群进入故障确认和升主流程。最终 node2 被提升为新的主库虚拟 IP 192.168.40.115从 node1 漂移到 node2。node1 自动恢复为 node2 的备库node3 也重新跟随 node2。本次验证说明在主库故障场景下多个备库节点会并行检测主库状态并结合可信服务器、复制状态和 HA 日志判断故障范围。确认主库不可用后集群能够自动完成候选节点升主、VIP 漂移和其他节点重新跟随保证读写分离集群具备较好的高可用切换能力。整个切换流程的时长大概在45秒左右六、选举与升主流程优化6.1 选举策略优化目标当前 node2 是主库本节目标是当 node2 故障时让 node3 优先升主node1 作为次选候选节点。也就是把优先级调整为node3priority200优先升主 node1priority50次选 node2priority100当前主库保持默认6.2 检查状态$KB_BIN/repmgr-f$REPMGR_CONFcluster show6.3 策略配置6.3.1 在 node1 上降低候选优先级把 node1 的升主优先级改成 50exportKB_HOME/home/kingbase/cluster/install/kingbaseexportREPMGR_CONF$KB_HOME/etc/repmgr.confifgrep-q^priority$REPMGR_CONF;thensed-is/^priority.*/priority50/$REPMGR_CONFelsesed-i/^conninfo/a priority50$REPMGR_CONFfichownkingbase:kingbase$REPMGR_CONFgrep-n^priority$REPMGR_CONF6.3.2 重新注册 node1 的优先级把 node1 配置文件里的新优先级同步到 repmgr 集群元数据中$KB_BIN/repmgr-f$REPMGR_CONFstandby register-F--upstream-node-id26.3.3 在 node3 上提高候选优先级把 node3 的升主优先级改成 200这样当主库 node2 故障时node3 会比 node1 更优先成为升主候选节点。exportKB_HOME/home/kingbase/cluster/install/kingbaseexportREPMGR_CONF$KB_HOME/etc/repmgr.confifgrep-q^priority$REPMGR_CONF;thensed-is/^priority.*/priority200/$REPMGR_CONFelsesed-i/^conninfo/a priority200$REPMGR_CONFfichownkingbase:kingbase$REPMGR_CONFgrep-n^priority$REPMGR_CONF6.3.4 重新注册 node3 的优先级把 node3 的 priority200 写入集群元数据$KB_BIN/repmgr-f$REPMGR_CONFstandby register-F--upstream-node-id26.3.5 在node2验证优先级是否生效$KB_BIN/repmgr-f$REPMGR_CONFcluster show6.4 模拟故障测试6.4.1 在 node3 打开日志观察窗口tail-n0-f$KB_HOME/log/hamgr.log$KB_HOME/log/kbha.log6.4.2 模拟 node2 主库故障先停止 node2 本地 HA 组件$KB_BIN/sys_monitor.sh stoplocal ha然后停止 node2 主库数据库$KB_BIN/sys_ctl-D$DATA_DIR-mimmediate stop6.4.3 观察选举与升主日志6.4.4 验证 node3 是否成为新主库$KB_BIN/repmgr-f$REPMGR_CONFcluster show再确认 VIP 是否漂移到 node3ipaddr show ens192|grep192.168.40.115优化成功小结在优化前node1、node2、node3 的 Priority 均为 100多个备库在主库故障时都具备升主条件升主结果不够直观。为了让选举结果更符合预期本次将 node1 的优先级调整为 50将 node3 的优先级调整为 200使 node3 成为更优先的升主候选节点。随后模拟当前主库 node2 故障node1 和 node3 同时检测到 node2 的数据库连接失败并通过可信服务器确认自身网络正常。故障确认后集群根据调整后的优先级完成候选节点选择最终 node3 被提升为新的主库并成功接管虚拟 IP 192.168.40.115。最终集群状态显示node3 为 primarynode1 和 node2 均作为备库跟随 node3且 LSN_Lag 为 0 bytes。这说明通过调整 priority 参数可以影响自动故障切换时的升主候选顺序使选举和升主流程更加可控。总结这次模拟了 KingbaseES 读写分离高可用集群的运维场景完成了从集群扩容、备库重建到主库故障切换的完整实践验证。花了一周时间做测试每天下班写一点终于肝完了~整体来看KingbaseES 读写分离高可用集群提供了比较完整的运维能力。从扩容到重建从故障检测到自动切换再到升主策略优化都可以通过工具和参数进行管理。通过这次实践也加深了对数据库高可用架构的理解高可用的目标不是完全避免故障而是在故障发生时尽快发现、准确判断、自动切换并在切换后保持集群状态清晰可控。