暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《金融业DBA守则与案例》—下篇

OCM之家 2021-08-19
780

作者介绍:

李志勇:OCM之家核心成员。某外资银行核心数据库负责人。IT行业从业十余年,九年的职业DBA生涯,其中有六年时间负责商业银行的核心数据库管理,对商业银行最高安全级别的可持续运行架构,对oracle故障的诊断与处理,积累了丰富的经验,形成了银行dba特有的管理风格。

DBA守则第二条

DBA守则第二条:有效的备份重于一切。这点是来自老的DBA守则,强调了“有效”两个字,备份一定要有效,可以用于恢复!关键时刻,如果没有有效的备份恢复数据库,就可以对职业生涯判死刑!这条就不多说了,重要性大家都懂。


DBA守则第三条

DBA守则第三条:任何变更可以回退。能做到这点,你就可以立于不败之地!比如操作系统的rm –rf 命令,和这个类似危险的命令还有好几个,比如:

  • chmod –R 777 *

  • chown –R xxx:yyy *

  • mv * *

  • rmdev

执行不当,都有可能导致系统宕机和灾难,极难恢复。那我们采取怎样的策略防止出现问题呢?看下面的案例:


案例三:项目经理说,项目上线已经成功了,请把xxx路径的冷备删除。


也许很多人就直接把它删除了,反正项目经理让删除的!可是,难免有时候删错了,然后各有理由相互指责!我们希望培养和招聘这样的人:做事自己对自己负责,能坚持“可回退”原则,项目经理让删除的文件,自己先不真的删除这些文件:1)检查当前运行数据库所有文件不要在删除文件路径下;2)确认完第一步,把要删除的文件路径打包压缩,放在一个合适的空间里,保存几天,没人找你,再删除。


我们坚决拒绝纯净主义者,推崇小心谨慎,最怕那种有洁癖的DBA,登陆系统发现很多历史的备份或者貌似没用的文件,总觉得碍眼,哪天忍无可忍的清理掉,如果失误会是致命的!生产的东西能不动就不动!


下面来说说数据库的变更:各种数据库的变更中,有一种因为触发BUG而要打PATCH的问题,这也是一种变更,一种很有争议的变更。通常是DB出故障了,请第三方或者原厂的专家来分析,经常反馈你的库触发了BUG,所以请升级DB版本或者打PATCH!


1)往往这些BUG还不好在测试环境再现;所以你的系统是不是真的触发那个BUG不能100%保证的,第三方或原厂专家总是说的似是而非,有很大猜测的成分,总想打上试试,生产不是用来试错的呀!

2)PATCH打到生产上能不能真的解决你的故障,第三方或原厂专家也不会给你保证;

3)全局性的PATCH打到DB上,会不会引起更大的其他问题,比如执行计划混乱,数据一致性出现问题,引发更大的BUG,第三方或原厂专家不保证不负责;


如果你全权负责管理一个7*24小时的在线系统,库的资产交易规模超过4000亿,上述三点都是必须要考虑的,多数技术专家只是告诉你要打PATCH解决某个似是而非的BUG,以期待能解决你的故障,而他却不做保证!我们尊敬技术专家的知识,但我们对生产也心存敬畏!


我们希望看到的是,一个故障发生了,即使触发了BUG,但是给的解决方案是一个有保证的方案,也是一个可以安全回退的方案。而不是专家的习惯建议升级到某某版本或者打某某PATCH,升级版本就不触发新的BUG了吗?显然不可能,新的版本永远有新的BUG,新的PATCH也带来新的BUG!


我管理的不重要的库,我也打过PATCH解决BUG,也用过隐含参数!但是在这六年对核心的管理中,任何的故障和BUG处理方案都没有打过PATCH,都坚持寻找最安全的方案,专家建议打的PATCH,我们都坚持拒绝!下面就是这样的一个案例,我们坚决不采用专家的意见,不打PATCH,开动脑筋想办法寻找方案。


案例四:银行核心RAC日结账宕机案例


刚接管核心的几年,我们竭尽所能对银行的核心做优化,每个人都像嗷嗷叫的小狼,都在寻找战机、寻找舞台进行表演,比如清理无用的历史数据,索引设计,优化SQL的执行计划,启用并行计算。事情已经做的很好了,还会不断思考怎样做的更好。比如银行日结账,其中一个过程需要对主帐户表中所有的客户的余额做一个重新计算,上千万客户,每个客户的余额都需要关联好几个表计算,曾把并行计算增加到30个进程,有明显的优化效果,开发负责人尝到了甜头,又上版本增加到40个并行,以便有更好的表现。


故障描述:核心在日结跑批时,RAC单节点宕机重启,日志可以看到,一个节点被RAC内部进程踢出!重启之后进程接续跑,日结跑批可以顺利完成。


首先oracle support在线求助,上传所有RAC日志,印度的RAC专家建议安装osw并再现这个故障,才能真正定位根本原因!我们拒绝生产环境安装osw,原本日结账压力就很大,这种监控只会增加服务器负担,容易引发其他的故障!


我们有一个内部分析问题的方法,出现故障后,追溯上一个版本是否和故障时段程序有关!正好在20多天前,新版本日结算并行度由30增加到40个!这个版本成了怀疑重点,我们决定不做改变继续观察。


之后每过20多天,RAC又出现单节点宕机重启!


两次请oracle原厂专家来看,不同的两个专家都认为是BUG造成了这个故障!建议打PATCH修复。因为专家们都说话留有余地,不保证一定解决故障,不保证不触发新的BUG。在会议室,我们和oracle原厂专家带了脾气的激烈争吵,我们无法采纳,无法接受专家的建议!


我认为几乎所有BUG都是业务SQL触发的,没有业务SQL就不会有宕机。可以打PATCH解决BUG问题,也可以改进业务SQL,让业务不触发BUG。就如大禹治水,可以疏导洪水,也可以堵住漏洞。这个问题明显是程序过度优化,并行度过高导致CPU消耗达到极限的极限,从而触发oracle程序漏洞,触发单节点重启。我一度提议回退这个优化版本,降低并行度。这个方案虽然很没有技术含量,但是修改最小,是有保障的的解决方案。但是开发主管不同意回退版本,这是他们今年的一个重要工作业绩,无论如何让我们再想想办法解决这个问题。回退并行版本是最后方案。


我们坚持寻找完美的方案,坚持寻找变更可以回退的方案,多方僵持不下,问题持续了半年,每20天都会重启一次,每次单节点重启后,都要争论。我们搭建了测试RAC环境反复测试无法再现这个BUG,也就不能验证PATCH是否能解决这个问题,那这个问题的完美方案是什么呢?


我们达成的共识:资源耗尽引发单节点重启。那能不能加点儿资源呢?向这个方向走走试试,最终加了1个cpu和16G内存,从此RAC单节点宕机重启问题完美解决,我想这个方案会是个完美的可以回退的方案^_^&^_^&^_^&!


最佳方案是如此的简单,这来自于对完美的不断追求,讨论中理念的不断碰撞。我觉得,就是坚持遵守“任何变更可以回退”这个守则,才有这样的解决方案。


这里,问题解决的技术原理,不再累述!


DBA守则四:选择合适时间窗

仅仅精通oracle技术,绝对不会是个好的DBA,也不会管理好数据库!我们要了解数据库每个时间预计在跑哪些业务,什么时候压力大,比如:

  • 银行业务,压力大的时间段

  • 每天零点日结;

  • 每月最后一天月结账;

  • 每月十号扣账户管理费;

  • 每季度的最后一个月二十日结息日;

  • 半年结;

  • 年结;


这些时段都会是各家银行DB服务器压力最大的时候,不要再给服务器额外的压力,比如:DB层的操作、OS层的操作、新版本、主备切换和灾备演练,都要避开这些时间去做。可以名曰,做事需要选良辰择吉日,貌似有点儿迷信的,但会是很好的趋利避害的DB管理方式。


下面讲一个很经典的故障案例,爱八卦的同学,不要扒是哪家银行,咱们就当故事听听,重点体悟DBA守则。这么多年过去了,也应该是解封的时候了,各行都已经升级成两地三中心架构,应该不会再出现雷同故障,而唯一不变的是故障给我们的启示,一个隐瞒真正历史的团队是个没有总结的团队,没有进步的团队。先上图:


案例五:核心生产机房市电切换引发故障。


由于发现市内电压不稳定,银行计划做市电的切换,核心生产机房从A路市电切换到B路市电,操作前经历了领导的层层审批,执行时间竟然是季度的最后一个月的20日凌晨,正好是结息日,结息日,结息日!好吧,重要的事情说三遍,首先,时间选择上他们的领导层应该对此担责。


晚上零点所有银行都在繁忙的跑结息计算,对照我们行,凌晨跑批计算经历过千锤百炼的优化,平时跑1小时,那么结息日的跑批执行用时2.5小时,可见运算量之大!

他们的机房电管依据计划,凌晨2:00切换A路市电到B路市电,切换后没多久,他就惊讶的发现机房的柴油发电机组启动供电了,这哥儿们觉得应该是柴油发电机组坏了吧,乱启动发电,就关闭了柴油发电机组(无上报,擅自决定)。结果没多久柴油发电机组又运转起来供电了,好吧,大晚上的闹鬼辣吗?跟我过不去?接着关掉你。没多久,轰,偌大的机房无数服务器、存储、照明突然一下全黑了,我想如此壮观的景象会是这个电管兄弟一辈子最深刻最难忘的“独家”记忆吧!其实,那个B路市电是坏的,根本没电,UPS自动监测发现没有外部电力,通知启动柴油发电机供电。


金融行业的IT架构,可以叫超级IT架构,有非常强大的自纠错能力,一点儿都不怕任何单一的故障!所以在这种架构下的IT运维人员易生倦怠之心,所谓生于忧患之间,死于安乐之中!灾难并不可怕,怕的是做出错误的判断,引发另一场灾难,再一场灾难也不可怕,最可怕的是推倒多米诺骨牌引发一系列灾难。


这家银行,当年核心项目上线,在安装高端存储的时候,发现缓存层的电池安装后,无法充电使用。高端存储的数据直接写入cache缓存池不直接写入磁盘,这样才有高效的IO能力,之后缓慢的异步同步到磁盘里。如果突然断电,那么缓存池两个互备电池会保障cache层的数据足够的电力写入到磁盘,保障数据不丢失!而这两个电池无法充电进行保护,乙方建议升级电池微码也许能解决这个问题,但不保证一定能解决!甲方和乙方为此发生了争吵,乙方甚至群发邮件给甲方所有相关人,说明电池问题,但是迟迟未能达成一致解决这个问题。所以甲方从上到下所有的人都知道,这个高端存储的电池就如“花瓶”般搁在存储上的,不可使用,只能观赏!

机房大停电,高端存储cache缓存数据全部丢失!

领导同意在结息日作切换,切换前未检查B路市电是否有电,柴油发电机组被人为关闭,核心存储cache层互备电池是“花瓶”,在结息日最大的批量运算都写入cache的时候,断电了!多个数据库的数据全部丢失(核心,支付,网银,ATM等重要系统),数据恢复后需要重新结息日批量计算!据说oracle原厂很多专家都参加了救援,所有人一起奋战三天三夜解决这个重大事件。这是我这六年来知道的银行业最严重的灾难事故,没有之一。


造成的影响

XX银行由于系统故障,中断营业9个小时。

柜台无法办理业务,导致营业厅排队骚乱。

支付、网银、ATM等重要业务无法使用,造成极大的不良影响与客户抱怨、投诉。对公信贷彻底无法恢复,账目丢失,面临大量索赔!

媒体大量刻薄的符合事实和不合事实的报道,声誉形象严重受损。


我依据和运维交流、媒体报道、同等数据规模来估算以下数据:

2:30大停电,IT相关人全部抵达现场并查明情况,精锐力量优先恢复核心DB(其他库先不要恢复),预计4:00开始执行恢复,6:00完成核心数据库恢复并开始结息日跑批,8:30刚好完成结息日跑批,可以开门对外营业,同时出结息日报表(预计3小时)。日间交易和结息日报表同时执行,压力很大,银行上午开门营业了,只有极少的核心业务可以办理,其他库都未恢复!而且业务办理非常缓慢,营业厅排队骚乱!直到领导下大决心,通知停业。下午下班时间,支付、网银、ATM等重要系统才陆续恢复使用!

下面是核心库的恢复时间图:

市电仅仅是电压不稳定,推迟一天切换又不会死!如果遵守DBA守则“选择合适的时间窗”原则,推迟一天切换市电!那么日结批量已经在1:00完成,2:30故障发生时,日结报表还有30分钟出完,一般报表存放于报表服务器,日结批量计算结果早已经同步到磁盘!那么恢复时间模型会是:4:00开始执行恢复,6:00完成核心数据库恢复并接续出日结报表,7:30前出完所有报表。无需进行2.5小时的结息日跑批计算,也无需完整的计算出3个小时报表,不影响日间交易!还能腾出时间和资源用于恢复其他库!也许就不用停业了,不会发生骚乱!


DBA守则第五条:生产无小事儿


DBA守则第五条:生产无小事儿我们团队对此次事故的总结,特别强调这点,乙方曾发邮件给甲方所有运维人员,如果运维的存储工程师或运维DBA能够充分重视数据存放的高端存储电池问题,在日常排查中就处理掉这个问题,就不会有这个数据丢失大灾难!


据oracle原厂专家说这家银行的DBA团队技术能力是很强的,至少有三个高级DBA一点儿不输oracle原厂技术专家,有的就是从oracle挖来的专家!所以只有技术能力还是不够的,DBA是数据库管理者,要有管理的思维,要有对风吹草动的敏感性,不要一味的迷信技术,而丧失了警觉!技术相当于手里的战争武器,技术专家会是美德装备,有精良装备而没有过硬的战争意志,没有好的战术素养,也是不能打胜仗的!而DBA守则五“生产无小事儿”就是一个优秀DBA的战术素养!

我们银行的高端存储也有这个电池问题,一个可用、一个不可用,存储厂商也建议我们升级微码,我们也几经交涉拍桌子踢板凳的不同意升级微码,“貌似是需要额外花钱升级,并不保证升级一定可以解决这个问题”。这个灾难后,我们克服所有困难坚决解决这个问题,哈哈^_^&,这也给我们上了一课!


生产无小事儿,哪怕是一个运维的电工,都需要培训到位,沟通到位!有兴趣的朋友可以求一下这位电工的心理阴影面积!


故障发展的一般规律:风吹草动期—小故障隐现期—大故障爆发期。风吹草动就是我们的战机,抓住每一个生产的小异常现象,仔细分析清楚现象背后隐藏的深层次问题,坚决推动解决,这就是生产无小事儿。比如错误的市电切换时间、错误的电工、错误的存储电池,任何一个问题抓住都会是英雄。

下面我再讲述一个身边发生的坚持“生产无小事儿”原则,发现小问题,积极推进问题的解决,避免了一次灾难!

案例六: 监控出现超时交易,AWR一个小的发现。

凌晨3点,接到公司电话说监控报警,发现几个超时交易,请DBA介入分析,我迅速抵达现场,检查数据库很正常的运行!打开AWR报告对比分析,发现每个SQL都比昨天同期慢一点点,好像也没啥影响,找不到根本原因!我就习惯性的打算把AWR报告每个数字都看一遍,思考每个数字指标的合理性,发现如下一个异常:


虽然log file sync并不是第一第二第三位的等待事件,但是同期时间比较,正常时平均等待是0.002秒,现在是0.231秒,是人体无感觉的慢了100倍。

团队几个人都在现场,我就很肯定的说出我的发现,我认为是高端存储IO速度比平时突然慢了100倍导致的,存储故障!当时也叫了EMC厂商,存储工程师说检查所有硬盘灯正常,存储也没有报错,不可能存储故障,EMC是有保障的很成熟的产品,全球这么多人用EMC,没听说突然慢100倍的现象。

既然你们都找不到故障原因,那么这个指标就是生产最大的发现,我就咬死了对每个陆续赶来支援的兄弟和领导说,存储肯定故障了,这给了他们很大压力!

直到一个领导到达现场,听了我的报告,马上决策,先打断存储的异地同步看看,反正也不影响生产的运行,让存储IO简单化!核心生产是同城异地存储级复制,一个事物需要同时写主机房和备机房的存储,两边存储都反馈写完成,事物才算写成功!

架构图:


好吧,打断同步后,问题就这样解决了!

马上可以分析出,问题原因是同城机房间光纤链路抖动造成的。事后大家讨论,光纤交换机上是有异常日志的,只是以前没发生过,没有重视!EMC存储的日志记录里也有异常标记,可惜故障时,他们不理解这个异常标记的含义,当作正常日志给忽略了!因为不是报错日志,是异常记录,需要真正理解它的含义才能判断。

我们有个兄弟银行,架构和我们一样,也悲催的在凌晨三点监控报警,有超时交易,运维人员全部抵达现场,还叫了网络的、oracle、ibm、emc厂商的第三方专家,好不热闹,直到8:30银行开门交易时间,都没有定位到问题原因,在无奈下决定开门交易!日间交易冲进来,CPU达到100%,大家又一通分析原因,没有结果,大量交易出现积压。最终在中午把服务器压垮,无奈全行通知下午歇业,排查故障,终于在晚上发现了同城光纤链路抖动问题。


他们的团队和我们交流过运维管理!如果在故障时和我们团队电话交流一下,也许下一秒问题就解决了!在他们的案例中,我从来不认为oracle原厂专家无法发现log file sync的异常,我也不认为网络和存储的专家们无法发现异常信息,他们缺乏的是“生产无小事儿”的态度,缺乏的是紧紧抓住这个“小事儿”深入研究原因,大胆推测并大声的说出来。


我后来见到了这家银行的事故现场的高管,通过我的描述,他说我这个成功是来自DBA的灵感,成功不能建立在某个人的灵感上;我说这就是战术素养,别人缺乏的是对故障的不断反复思考和总结。有没有反思,为什么故障的时候,CPU达到100%了,业务大量积压,那么多人在现场没有任何作为,如果杀掉积压进程,提供有损服务,扛过日间交易,为找到故障原因争取时间,坚持DBA守则一“保证生产的可持续运行”也能挽救这次故障。多种解决思路的打开,相谈甚欢。


兄弟银行的这次故障,才让我们团队意识到,我们坚持DBA的守则,避免了自己银行发生宕机灾难。真正做到了趋利避害。


DBA守则六:不拿生产做实验。

这点前面也有案例提及,很多高手都是死在艺高人胆大,处理问题不经测试,直接上生产。当然也有人说,我们没条件。你要和领导强调,反复强调,没有测试环境的生产就是不重要的生产,不要想达到99.99%甚至更高的在线要求。想尽办法,创造条件,但有条件!

DBA守则七:制定规范。

这点就不讲了,大家都耳熟能详了!


我的分享讲完了,希望这些案例对你有启发,有帮助,希望能助力你的职业发展。如果你想和我讨论这些案例,或者您经历的案例想和我分享,欢迎ora-lazy交流或邮箱82186960@qq.com私信给我。 

目最后,回顾一下DBA守则

保证生产的可持续运行。

有效的备份重于一切。

任何变更可回退。

选择正确的时间窗。

生产无小事儿。

不拿生产做实验。

制定规范。



中国OCM之家

专注数据    共现梦想

QQ群:554334183


文章转载自OCM之家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论