技术流 | 运维平台大型“生产事故”录播和实战重现

news2024/11/16 7:32:54

【本文作者:擎创科技 资深专家禹鼎侯】

本文写于2021年,最近重读觉得特别有现场感。这也是运维人面对生产环境时遇到的各种惊心动魄的事件之一。惊险,但又顺利解决。是最好的结果。


事情是酱紫的。
那天上午,轻轻松松完成了一个新功能的开发,原本计划着混到中午吃个饭,美美的午个觉,下午跑跑测试,摸摸鱼,划划水,愉快的一天就过去了。
正当我在为我的完美计划自豪不已的时候,微信群闪过一条消息,有人艾特我。
特么的!!!
这个时候!居然有人艾特我!!!
当时我就不乐意了。指名道姓的艾特我,指定没好事。

图片

划开手机一看,果然,生产出事故了。而且看起来事情还比较紧急严重。

图片


我给大家简单描述一下事情的经过。
我们(咳咳,请把"们"字去掉,说的就是你,别想甩锅)开发了一个可以采集宿主机硬件指标的这么一个功能。其中有一项是获取IPV6的地址,然后这个IPV6地址获取的时候出问题了,本来不应该获取fe80开头的地址(fe80开头的地址类似于IPV4的192.168,是局域网的地址,这个是应该pass掉的),却获取成了一串乱七八糟的数字。

图片

当时的情况是这样的。客户提交了升级单,他们也怕出问题,就先升级了两千台设备,并打算当天晚上升级剩余的两万多台。
然后到了快中午的时候,发现这两千台中,有那么一百台的样子,获取的地址不对。
如果嫌我说的啰嗦的话,请我师爷来翻译翻译。

图片


简单来说,就是客户中午的时候发现了程序有问题,但是由于晚上要升级所有生产环境,所以下午必须给他们搞定。不能耽误他们晚上的升级。此诚危急存亡之秋也。
什么情况啊?
劳资特么一脸懵逼啊!
没办法啊,谁让咱是吃这碗饭的呢?于是乎,简单收拾一下,连午觉都不顾上了,背上我的蓝色小书包,坐上公交车,直接奔赴客户现场。


当时我心里是一点底都没有,这问题咱也没碰到过啊,于是脑中快速过了一遍当时的代码逻辑,看看能不能找到可以甩锅的地方。嗯,测试!一定是测试没测好!带着问题就上线了!
于是乎:

图片


人家很明确的告诉我,测试没有发现问题。
这就尴尬了。公司环境没有发现问题,pit环境也没有发现问题(备注:该pit环境是客户提供的一套无限接近生产环境的机器)。也就是说,这个问题似乎是生产环境独有的。
这特么就扯了。。。
这都什么鬼啊?
没办法了,去现场看吧。

图片


经过了冗长而复杂的客户园区入场手续后,终于来到了生产机房。客户找出两台有问题的机器,说,你调试吧!然后也不管我,忙他自己的工作去了。
生产的机器,如果玩过的大家都应该了解,客户不让做的事情千万别做,千万别想着删库跑路,然后坐船去新加坡,越南,柬埔寨。
特别是我当时拿到的是root权限。客户更是慎之又慎,就连重启程序都得经过他们同意。危险的命令想都不要想。
那还调试个鸡儿啊。

图片


但这个时候我可不能怂啊,老夫一世英名能否保住,就看在此一举了。
首先我给客户强调,这个问题百年难得一遇,肯定不是那么好解决的,今天下午就算能找到根因,回去还要修改代码,测试,晚上升级估计有点来不及。
打了这个预防针,客户也知道问题棘手,就有心里准备了。说,你先查原因吧,实在难解决的话今晚就暂缓升级,周五之前能搞定就行。
这样我就放心大胆的搞了。

图片


先说一下我们这个程序获取IPV6的逻辑。
我们这个程序是用C语言开发的,为了支持跨平台,我们引入了一个叫sigar的第三方库。这个sigar库是专门用来获取机器硬件指标的,而且对不同的平台操作系统都有实现。
Linux下,获取IPV6的逻辑是读取/proc/net/if_net6的配置文件。这个文件的第一项就是IPV6的地址。
简单来说,获取ipv6的地址,就是读取文件中指定字符串的内容的实现。听起来剁么简单的事情。就这破逻辑,还能出啥问题?
sigar库里这段逻辑在 src/os/linux/linux_sigar.c 中的sigar_net_interface_ipv6_config_get函数中。当然我们做了一些调整,最终的样子是这样的:

while (fscanf(fp, "%32s %02x %02x %02x %02x %16s\n",
                  addr, &idx, &prefix, &scope, &flags, ifname) != EOF)
    {
        if (strEQ(name, ifname) && addr != strstr(addr, "fe80")) {
            status = SIGAR_OK;
            break;
        }
    }

说一下/proc/net/if_net6这个文件,这个文件里存放的是接口和单播地址。其内部格式如下:
|addr(32位)|

addr(32位)if_index(一般2位十六进制数字)prefix(一般2位十六进制数字)scope(一般2位十六进制数字)flags(一般2位十六进制数字)ifname(16位)
ipv6地址接口ID前缀长度地址适用范围标志位网卡名称

这样一看,上面的代码解析,似乎没有什么问题嘛。
但,等等,这都是什么鬼?

图片


我嗅到了一丝犯罪的气息,虽然说不上哪里不对,但我感觉这里会有问题。第二位,也就是if_index,为啥出现了这么多三位的?
一个三位的字符串,却用%02x,这是会出问题的呀。
可是,为什么会出现3位的呢?

图片


咱也不知道啊。没办法,祭出百度吧!
然鹅,一上百度,是这个样子的:

图片


众所周知,大天朝的技术文章,百分之八十被号称吃屎都(D)难(N)的某网站给劫持了,只要一搜索,千篇一律的出来的都是该网站的链接,而且内容重复率之高,含金量之低,令人咋舌。
既然度娘不助我,我就只能寻求谷嫂的帮助了。
可是!

图片


完犊子了,这可咋办?
我忽然想到我一个高中同学发小是做海外竞价的,自己创业当了老板,咱要不去试试白嫖一波?

图片


嗯。。。弄起来还是挺麻烦的,但好歹是弄到了。
谷歌一游,大多数也只是告诉你if_net6文件是啥含义的,没有告诉我这个if_index到底应该有几位。
然后我在if.h头文件里发现了这个if_index的定义:

struct if_nameindex
  {
    unsigned int if_index;  /* 1, 2, ... */
    char *if_name;      /* null terminated name: "eth0", ... */
  };

int类型,理论上可以有8位啊,汗~
得,不管了。为了验证我这一猜想是对的,确实是if_index有三位导致的,我让测试的同事在pit环境找if_net6文件中有三位的测试,很快:

图片

然后就是愉快的修改代码的过程了。咱也不管有的没的,搞什么位数啊,代码一旦hard code了,下次有变动还是得出问题,不如一把搞定:

while (fscanf(fp, "%s %s %s %s %s %s\n",
                  addr, idx, prefix, scope, flags, ifname) != EOF)
    {
        if (strEQ(name, ifname) && addr != strstr(addr, "fe80")) {
            status = SIGAR_OK;
            break;
        }
    }

事实上,fscanf函数处理这种带固定宽度的解析时,如果字符串有三位,但只解析了两位,并不会把第三位丢弃,而是把第三位挤到了下一个域。
举个例子。

图片


上图中第二条记录,if_index321,按照上述代码逻辑处理时,会将32当做if_index,剩下的1当做prefix40当做scope20flags80ifname, veth1ffa1a8本来是网卡名,它会将其认为是第二条的ipv6地址,导致后面的全部错位。
嗯。。。接下来就是把代码改好,重新发布补丁,让客户更新测试。
虽然过程是曲折的,但结果是好的。

图片


至此,故事划一段落,可惜了了我的午觉啊。嘤嘤嘤~

———— THE END ————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自媒体内容创作者必备:ChatGPT助你提升文章质量

随着自媒体的迅猛发展,越来越多的人加入到内容创作的行列。然而,要在这个竞争激烈的领域脱颖而出,不仅需要创意和独特的观点,更需要高质量的文章内容。在这方面,ChatGPT作为一个智能写作助手,能够帮助自媒体…

第三届仿真模拟、电子信息科学与技术国际学术会议(SMEI 2024,8月02-04)

随着仿真模拟技术的成熟和进步,仿真模拟技术越来越广泛地应用于工业工程、管理科学、社会经济、交通运输、生态环境、军事装备等各个科学领域,并深刻影响着信息技术和信息产业的发展。围绕仿真模拟、电子信息科学与技术等方面内容,为更好地促…

昇思25天学习打卡营第4天|MindSpore快速入门-FCN图像语义分割

FCN图像语义分割 全卷积网络(Fully Convolutional Networks,FCN)是UC Berkeley的Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation[1]一文中提出的用于图像语义分割的一种框架。 FCN是首个端到端&#…

SAP 自动登录

文章目录 前言一、程序介绍/笔者需求二、程序原理介绍 a.基本原理 b.为什么不设置界面? c.为什么用户信息不走配置文件? d.注意事项 三、如何使用 a.下载程序 b.配置并执行登录 …

大模型笔记1: Longformer环境配置

论文: https://arxiv.org/abs/2004.05150 首先保证电脑上配置了git. git环境配置: https://blog.csdn.net/Andone_hsx/article/details/87937329 3.1、找到git安装路径中bin的位置,如:D:\Program Files\Git\bin 找到git安装路径中git-core的…

收银系统源码-开源收银系统-私有化独立部署

千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 千呼新零售2.0-支持OEM私有化独立部署和全开源源码 如需了解请私信交流

Java知识点整理 14 — MyBatisX代码生成器

在后端开发过程中大多数的工作都是在重复编写各种CRUD(增删改查)代码,费时费力。 所以要灵活运用各类现成的代码生成器,协助我们自动生成常用的增删改查代码,而无需自己重复编写,从而大幅提升开发效率。 …

【系统架构设计师】六、信息系统基础知识(电子政务|企业信息化|电子商务|信息化战略体系)

目录 一、电子政务EG 1.1 电子政务的内容 1.2 电子政务的主要特征 二、企业信息化EI 2.1 企业信息化实现 2.2 企业信息化方法 三、电子商务EC 四、信息化战略体系 五、客户关系CRM 5.1 CRM的功能 5.2 CRM解决方案具备的要素 5.3 CRM的实现过程 六、供应链管理SCM 七…

TEMU半托管模式引领跨境电商新风尚

TEMU半托管模式作为2024年的热门话题,正吸引着越来越多卖家的目光。继全托管模式取得巨大成功之后,半托管模式的推出无疑为跨境电商行业注入了新的活力。 在选品方向上,TEMU半托管模式强调商品的聚焦与精选。卖家在选择上架商品时&#xff0c…

404 Not Found(nginx)

#vue-router history 配置location / {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers *;add_header Cross-Origin-Embedder-Policy require-corp;add_header Cross-Origin-Opener-Policy same-origin;try_files $uri $uri/ router;index …

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一

一、鸿蒙开发环境搭建 DevEco Studio安装 下载 访问官网:https://developer.huawei.com/consumer/cn/deveco-studio/选择操作系统版本后并注册登录华为账号既可下载安装包 安装 建议:软件和依赖安装目录不要使用中文字符软件安装包下载完成后&#xff0…

Java网络编程(JavaWeb的基础)

Java网络编程(JavaWeb的基础) 文章目录 Java网络编程(JavaWeb的基础)前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

收银系统开源源码-千呼新零售2.0【打折促销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

操作系统——考研笔记(一)操作系统概述

目录 操作系统引言一、 操作系统概述1.1 操作系统的功能和目标1.2 操作系统的特征1.2.1 并发1.2.2 共享1.2.3 并发和共享的关系1.2.4 虚拟1.2.5 异步1.2.6 知识回顾与重要考点 1.3 操作系统的发展与分类1.3.1 手工操作阶段1.3.2 批处理阶段——单道批处理系统1.3.3 批处理阶段—…

2024年最佳软件测试工具40强清单(非常详细)零基础入门到精通,收藏这一篇就够了

什么是测试工具 软件测试工具是指那些支持从计划、需求收集、构建创建、测试执行、缺陷记录到测试分析等各种测试活动的产品。这些工具主要用于检测软件的稳定性、彻底性以及其他性能参数。 市场上有大量的软件测试工具,众多选择使得难以确定最适合你项目的测试工…

项目开发 TCP-Socket连接功能实现(Android端)

前段时间在公司做项目的时候遇到了一个功能需要使用TCP-Socket连接硬件设备进行通信,查了很多资料也只是关于HTTP-Socket相关的,没法满足项目的要求,后来查到一个相关的插件,现在有时间和大家分享一下。 项目简单介绍&#xff1a…

python AI全栈工程师

python AI全栈工程师 前端:Streamlit Streamlit是一个开源的Python库,专为数据科学家和机器学习工程师设计,用于快速构建交互式用户界面。Streamlit功能强大、易于使用,特别适合数据科学家和机器学习工程师快速构建和部署交互式数…

状态机模型——AcWing 1057. 股票买卖 IV

状态机模型 定义 动态规划中的算法状态机模型是一种用于描述算法执行过程中状态变化的模型。它由状态、事件、动作和转移组成。状态表示算法在某个时刻所处的情况,事件是导致状态发生变化的原因,动作是在状态变化时执行的操作,转移则定义了…

1.2 离散LTI系统的时域分析

目录 离散系统的定义 离散LTI系统的时域描述h[k] 离散系统的分类 线性与非线性系统 时变与非时变系统 因果与非因果系统 稳定与不稳定系统 例题 LTI——Linear and Time-invariant System 线性时不变系统 离散系统的定义 离散LTI系统的时域描述h[k] 离散系统的…

关于“刘亦菲为什么无人敢娶”的问题❗❗❗

关于“刘亦菲为什么无人敢娶”的问题, 实际上涉及到多个方面的因素, 以下是对这些因素的详细分析:1.事业心重:刘亦菲作为华语影视圈的知名女星,她的演艺事业非常成功, 这也意味着她将大量的时间和精力投…