容灾方案写在文档里的不算数,拔了网线还能站着的才算数。故障演练主动制造故障:拔数据库的线、杀游戏进程、断网关节点,验证预案的真实成色——演练发现的每一个问题,都是未来真实事故里省下的损失。
---演练场景:数据库主库失联
function Drill.dbDown()
Ops.log("演练开始:切断主库连接")
Firewall.block(DbCluster.masterIp(), 3306)
-- 观察切换:从库应在 60 秒内接替
local t0 = os.time()
while os.time() - t0 < 120 do
if DbCluster.currentMaster() ~= DbCluster.masterIp() then
Ops.log(("切换耗时 %d 秒"):format(os.time() - t0))
return true
end
os.execute("sleep 5")
end
return false, "主从切换超时"
end
演练场景按故障的典型形态编排:主库失联验证主从切换的自动性与耗时,进程被杀验证守护拉起与状态恢复,网关断电验证玩家的重连体验。防火墙的定向阻断模拟故障,真实的影响面只落在演练环境——演练的第一原则是不伤生产,生产上的演练用灰度的单节点在低峰做。切换耗时是核心指标:主从切换 60 秒内为达标,超时的每次演练都是预案修订的输入。
---演练断言:数据零丢失与会话恢复
function Drill.assert(case)
local ok = true
-- 断言一:切换后的数据一致性
if not Drill.dataConsistent() then
Ops.log("断言失败:数据不一致")
ok = false
end
-- 断言二:玩家会话的恢复
local reconnected = Drill.reconnectRate(case)
if reconnected < 0.95 then
Ops.log(("断言失败:重连率 %.0f%%"):format(reconnected * 100))
ok = false
end
Drill.report(case, ok)
return ok
end
演练的断言量化成败:数据一致性校验切换前后的账目与背包流水,玩家会话的 95% 重连率验证网关的接管能力,断言不过的演练等于失败的事故,处置与复盘按事故流程走。演练的节奏季度一次:场景的库随架构演进更新,上季度加的读写分离这季度就要演练从库失联。演练报告的三段式:发现了什么、根因是什么、预案改了什么,演练的价值在预案的迭代里兑现。
演练环境的与生产配置的差异清单,差异超过阈值演练结论不可外推;演练发现问题的整改跟踪,修复后的复验演练排进下季度。
演练曾经在生产高峰拔了备用网线,冗余缺失让半个机房掉线,演练的窗口与对象评估后定在低峰单点。切换的断言曾经只看端口通了,数据没追平就开始写,一致性断言的加入让假切换现形。演练的报告曾经没人看,发现的问题没有跟进的着落,问题清单进迭代的强制项。
演练的日历提前公示,参与的值班团队全员知情。场景库与架构演进同步维护,新组件上线一个季度内必须进演练场景。演练的成本与收益在复盘认账:一次演练的投入换一次真实事故的避免,这笔账管理层要看到。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…
实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…
实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…
实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…
实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…
实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…