
文章目录每日一句正能量摘要1. 背景与问题1.1 业务背景1.2 最容易被低估的四个问题2. 环境与数据2.1 脱敏拓扑2.2 部署前基线数据3. 复现过程从部署缺陷到故障放大3.1 主机与网络不一致3.2 多路径只配置了一条有效链路3.3 资源依赖顺序错误3.4 仅停止数据库进程的演练4. 方案实施4.1 部署清单网络与仲裁存储与文件系统数据库与集群资源4.2 安全接管状态机4.3 业务级探针4.4 故障注入矩阵4.5 RTO与RPO实测5. 结果对比6. 风险与复盘6.1 共享存储故障域过大6.2 FENCE失败时的处理6.3 旧主回归不能直接启动6.4 检查清单上线前演练中演练后7. 总结每日一句正能量“真正的强大正是这样温柔而坚定地重新爱上这个真实且完整的自己。”强大不是无坚不摧不是完美无瑕而是“温柔”不苛责与“坚定”不放弃并存的自我接纳。从“我要成为更好的自己”转向“我以此刻的自己为起点”。说明金仓官方公开资料通常将共享存储高可用形态称为KingbaseES Clusterware共享存储集群“KFS”在其他官方资料中也常用于 Kingbase FlySync。本文沿用项目选题中的“KFS共享存储集群”称呼但技术讨论对象是共享存储型高可用集群。实施时应以采购版本、交付手册和厂商确认的组件名称为准。摘要共享存储集群看起来比主备复制简单多个节点连接同一套存储故障后由其他节点接管数据库服务不需要等待大量数据重放。然而真正决定系统能否安全接管的不是“两个节点都能看到同一块盘”而是资源所有权是否唯一、故障节点能否被可靠隔离、文件系统和数据库实例能否按依赖顺序启动、访问入口能否及时切换以及共享存储本身是否具备冗余能力。本文以核心交易系统的双节点共享存储高可用环境为例给出一套可执行的部署与演练方法从网络、时间、主机名、磁盘多路径、设备权限和目录规划入手建立“存储—文件系统—数据库—虚拟地址—业务探针”的资源依赖链再通过进程终止、节点断网、存储路径故障、文件系统异常和旧主残留等故障注入验证隔离、接管、RTO、RPO与回退流程。文中给出的命令、参数和时间均为脱敏示例不能替代对应版本的官方安装手册。1. 背景与问题1.1 业务背景某核心业务系统承担订单受理、账户记账和状态流转日均写入约数千万行。原单机数据库具备存储冗余但数据库进程、操作系统和主机仍是单点。建设共享存储集群后希望在单节点故障时由另一节点快速接管并满足指标目标节点故障RTO120秒以内数据库进程故障RTO60秒以内RPO0双主概率必须通过隔离机制降到可控演练频率每季度至少一次回退能力30分钟内恢复原拓扑或完成故障节点重建共享存储架构的优势是数据文件只有一份。官方高可用资料将 Clusterware 共享存储集群概括为全局资源统一管理、共享存储高可用以及多节点承载不同实例其RPO可做到零丢失RTO通常为秒到分钟级。但它也明确依赖共享存储设备的高可用能力且集群节点通常要求位于同一子网。[^1]1.2 最容易被低估的四个问题第一共享可见不等于并发可写。如果两个节点同时挂载并启动同一个数据库实例可能破坏数据文件或控制文件。必须由集群资源管理器保证同一资源组在任意时刻只有一个所有者。第二心跳失败不等于节点死亡。节点可能只是业务网断开数据库和存储仍在运行。此时直接提升另一节点会形成双主。正确顺序应是“仲裁确认—隔离旧节点—释放或强制回收存储资源—新节点接管”。第三共享存储不是天然无单点。双节点数据库共用一套存储如果控制器、交换机、链路或磁盘组没有冗余主机高可用仍会被存储单点抵消。第四RTO不能只记录数据库启动时间。真正的RTO应从业务首次失败开始到应用连接恢复、关键交易成功和数据校验通过为止。2. 环境与数据2.1 脱敏拓扑项目节点A节点B主机名db-ha-01db-ha-02管理网10.10.1.1110.10.1.12业务网10.10.2.1110.10.2.12存储网110.10.3.1110.10.3.12存储网210.10.4.1110.10.4.12虚拟地址colspan10.10.2.100共享LUN/dev/mapper/kes_data数据目录/data/kingbase日志目录本地/var/log/kingbase集群方式双节点主动/被动共享存储这里特意将数据库日志放在本地独立目录并集中采集到日志平台。故障时即使共享盘无法挂载仍能查看集群代理、操作系统和数据库启动日志。2.2 部署前基线数据演练使用独立业务流水表每秒持续写入一条带批次号的记录CREATETABLEha_drill_txn(txn_idBIGINTPRIMARYKEY,drill_batchVARCHAR(64)NOTNULL,node_nameVARCHAR(64)NOTNULL,payloadVARCHAR(200),created_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP);CREATESEQUENCE ha_drill_txn_seqSTARTWITH1CACHE100;持续写入脚本在应用侧记录客户端发送时间、数据库返回时间和错误类型。这样可以把“数据库服务恢复”与“业务真正恢复”区分开来。3. 复现过程从部署缺陷到故障放大3.1 主机与网络不一致部署前先验证两节点的主机名解析、时区、时间同步、内核参数和用户ID一致性hostnamectl timedatectl chronyc tracking getent hosts db-ha-01 db-ha-02idkingbaseulimit-a在一次预演中节点B的kingbase用户UID与节点A不同。共享目录虽然显示同样的用户名但实际文件UID不匹配导致接管后数据库报“权限不足”。这个问题在平时无法暴露因为节点B没有真正启动数据库。修正原则是集群用户、组、UID、GID、软件目录、环境变量和关键系统参数必须由自动化脚本统一下发而不是人工逐台配置。3.2 多路径只配置了一条有效链路检查多路径multipath-lllsblk-oNAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS表面上每台服务器都能看到LUN但节点B仅有一条活动路径。故障注入时关闭一台存储交换机节点A正常节点B在接管阶段出现I/O超时。根因不是数据库而是备节点的存储冗余没有被真正验证。最低检查项包括每个LUN的WWID在两节点一致路径数量、状态和优先级符合设计禁止使用不稳定的/dev/sdX设备名路径故障和恢复不会改变上层设备标识文件系统挂载参数和属主一致存储超时参数经过厂商联合确认。3.3 资源依赖顺序错误错误资源顺序启动数据库 → 挂载共享文件系统 → 绑定VIP正确顺序应是确认旧主已隔离 → 激活多路径/卷组 → 文件系统检查与挂载 → 校验数据目录所有权 → 启动数据库 → 执行业务探针 → 绑定VIP或开放代理路由停止顺序则相反摘除VIP/业务路由 → 停止数据库并确认进程退出 → 卸载文件系统 → 释放卷组或共享设备如果VIP先切换而数据库尚未完成恢复应用会建立连接但马上报错造成连接池持续重试如果文件系统在数据库进程未退出时被强制卸载可能扩大故障影响。3.4 仅停止数据库进程的演练在节点A执行受控故障# 仅作实验示意生产演练应由变更单和集群管理命令执行kill-9database_pid预期行为资源代理检测数据库进程异常先在本节点尝试有限次数的本地重启本地重启失败或达到阈值后启动节点级接管若节点仍健康可不迁移存储资源业务探针成功后恢复访问入口。若任何数据库进程退出都立即迁移节点会增加无必要的资源漂移如果无限本地重启又可能拖延RTO。应根据故障类型设置分层恢复策略。4. 方案实施4.1 部署清单网络与仲裁管理、业务和存储网络分离心跳至少双链路避免单网卡导致误判仲裁或信任目标与业务节点故障域分离防火墙规则在两节点完全一致VIP冲突检测和ARP刷新策略完成验证旧主隔离必须有明确执行和确认结果。存储与文件系统存储控制器、交换机、HBA和链路均有冗余两节点LUN、WWID、容量和扇区信息一致多路径策略经存储厂商确认共享文件系统只由当前资源所有者挂载禁止在/etc/fstab中配置会被操作系统自动挂载的共享数据盘数据盘空间、inode、I/O延迟和错误计数纳入监控备份仓库与共享生产盘分离避免“一套存储损坏同时失去生产和备份”。数据库与集群资源软件版本、补丁、扩展和参数文件一致数据库启动、停止和状态探针均使用标准脚本资源依赖顺序显式定义数据库实例在同一时间只能由一个节点启动VIP或代理切换必须晚于数据库业务探针成功集群日志、数据库日志和操作系统日志统一时间戳故障节点重新加入时默认禁止直接启动数据库。4.2 安全接管状态机安全切换不是简单的“检测不到主节点就启动备节点”而是一个有门槛的状态机健康 ↓ 心跳/业务探针连续失败 疑似故障 ↓ 多链路和仲裁复核 确认故障 ↓ 执行FENCE/断电/禁网/停库并获得成功证据 旧主已隔离 ↓ 新节点获取共享资源 存储已接管 ↓ 启动数据库并执行读写探针 数据库可用 ↓ 切换VIP/代理 业务恢复任何一步不能确认都应停在安全状态并告警而不是“带病提升”。自动化的目标不是无条件快而是在安全前提下缩短人工判断时间。4.3 业务级探针进程存在不等于服务可用。建议至少设置三层探针-- 1. 连接探针SELECT1;-- 2. 读探针SELECTMAX(created_at)FROMha_drill_txn;-- 3. 受控写探针INSERTINTOha_drill_txn(txn_id,drill_batch,node_name,payload)VALUES(nextval(ha_drill_txn_seq),PROBE,db-ha-02,failover probe);写探针必须使用独立小表和独立批次避免污染真实业务。探针失败时VIP不应对外开放。4.4 故障注入矩阵场景注入方式预期保护主要指标数据库进程故障停进程本地重启或迁移进程恢复时间操作系统故障受控关机节点隔离后接管RTO、VIP漂移业务网中断关闭业务网卡不误判存储状态仲裁结果心跳网中断断单条心跳双链路保持稳定是否误切换存储单路径故障关闭一条SAN路径多路径无感切换I/O延迟峰值存储全路径故障隔离节点存储禁止双挂载FENCE结果数据盘满受控填充测试盘告警、停止扩散恢复步骤旧主恢复恢复电源/网络不自动抢占资源重入群安全性故障注入应从低风险到高风险逐级开展并使用测试环境、演练窗口和明确的终止条件。不能把拔线当作唯一演练方法更不能在没有隔离和回退方案时直接模拟存储全断。4.5 RTO与RPO实测RTO按业务视角记录RTO 首次业务失败时刻 到 首次连续N次关键交易成功时刻建议拆分阶段时间点T0业务首次失败T1监控确认故障T2旧主隔离成功T3新节点挂载共享盘T4数据库启动成功T5VIP/代理切换完成T6关键交易连续成功总RTO为T6-T0。同时记录每一段耗时才能知道优化应落在故障检测、隔离、挂载、数据库恢复还是应用连接池。共享存储模式的数据文件只有一份正常设计下节点切换不依赖日志复制因此目标RPO通常为0。官方资料也将共享存储Clusterware的RPO描述为零丢失。[^1] 但业务级验证仍不可省略因为客户端可能在故障边界收到超时无法确定事务究竟提交还是回滚。应用必须通过幂等键或交易状态查询处理“结果未知”事务。校验SQLSELECTdrill_batch,COUNT(*)ASrow_count,MIN(txn_id)ASmin_id,MAX(txn_id)ASmax_id,MIN(created_at)ASfirst_time,MAX(created_at)ASlast_timeFROMha_drill_txnWHEREdrill_batch:batchGROUPBYdrill_batch;-- 检查编号缺口编号存在空洞不一定等于数据丢失需结合提交日志判断SELECTa.txn_id1ASgap_start,MIN(b.txn_id)-1ASgap_endFROMha_drill_txn aJOINha_drill_txn bONb.txn_ida.txn_idWHEREa.drill_batch:batchANDb.drill_batch:batchGROUPBYa.txn_idHAVINGMIN(b.txn_id)a.txn_id1ORDERBYgap_start;5. 结果对比一次脱敏演练记录如下指标优化前优化后故障确认42秒12秒旧主隔离55秒18秒共享盘接管38秒21秒数据库恢复64秒39秒VIP与连接池恢复47秒24秒业务验证35秒16秒总RTO281秒130秒业务级RPO00未知事务7笔2笔优化措施并不是盲目缩短所有超时而是修复备节点多路径缺失将数据库、文件系统和VIP的依赖顺序固化增加旧主隔离成功回执将业务探针纳入集群恢复判定缩短应用连接池的失效连接检测时间对“提交结果未知”的订单增加幂等查询与补偿将演练时间线自动写入记录表。性能验证还应关注接管后的“次生抖动”。共享盘在新节点首次访问时操作系统缓存为空数据库缓存也需要预热。即使服务恢复前几分钟P95仍可能高于正常值。因此验收不能只看第一笔交易成功还要观察缓存命中、I/O延迟、锁等待和连接数是否回到稳定区间。6. 风险与复盘6.1 共享存储故障域过大共享存储集群可以处理主机或实例故障但如果共享存储整体不可用两个数据库节点都会失去数据文件。官方对比资料也指出Clusterware对存储与数据损坏的处理依赖存储设备自身的高可用架构。[^1] 因此核心系统仍需要独立备份、异地副本或其他容灾层不能把共享存储集群等同于完整灾备。6.2 FENCE失败时的处理隔离失败是最危险的分支。此时不能为了追求RTO继续自动接管。正确动作是阻断应用写入口将集群转入人工确认通过带外管理、交换机端口、存储访问控制或断电等方式确认旧主失去写能力确认后再允许新节点挂载并启动记录隔离失败原因修复后重新演练。6.3 旧主回归不能直接启动旧节点恢复后操作系统自启动项、fstab、数据库服务和集群服务的顺序必须受控。恢复节点应先以非资源所有者身份加入完成集群状态确认共享设备只读或不挂载检查软件、配置和日志校验确认当前活动节点由集群管理器重新纳管。6.4 检查清单上线前节点、网络、存储和仲裁故障域已评审两节点UID/GID、软件、补丁和参数一致多路径数量与故障切换实测通过共享盘不会被操作系统自动挂载资源启动与停止顺序已固化旧主隔离机制至少有一种可自动执行、一种可人工执行业务探针、VIP冲突检查和连接池恢复完成验证备份与恢复不依赖同一套共享存储RTO/RPO目标已由业务、运维和数据库团队共同确认演练中全程记录T0T6时间点先确认隔离再执行接管监控共享盘挂载所有者检查是否出现双节点数据库进程执行连接、读、写三级探针记录未知事务并通过幂等键核验观察恢复后1030分钟性能抖动达到终止条件时立即回退演练后对账行数、金额、状态和关键流水输出分阶段RTO与业务级RPO故障节点按受控流程重新入群清理演练数据和临时网络/存储策略更新应急预案、联系人和自动化脚本对未达标项建立负责人和关闭时间7. 总结共享存储高可用的核心不是“共享一块盘”而是对共享资源建立唯一、可验证、可回收的所有权。部署时必须把网络、仲裁、隔离、多路径、文件系统、数据库、访问入口和应用探针视为一条完整链路演练时也必须以业务恢复和数据结果为准而不是以数据库进程启动为准。一套值得投入生产的共享存储集群至少应证明三件事任意单节点故障后旧节点能够被可靠隔离新节点才能接管接管过程不会出现双挂载、双启动或未知资源所有者RTO与RPO来自可重复的故障演练而不是架构图上的承诺。把部署清单固化为自动检查把故障时间线固化为演练记录把业务探针固化为接管门槛才能让共享存储集群从“能启动”走向“可运营、可审计、可恢复”。转载自https://blog.csdn.net/u014727709/article/details/163271270欢迎 点赞✍评论⭐收藏欢迎指正