【实战经验系列】记一次打系统补丁引发的“血案”

日前在客户生产环境,突然接到告警,系统宕机,查看所有微服务的日志都在报错“no route to host XXX”,根据经验判断,是网络不通相关问题,但是生产环境运行好好的,怎么会突然网络不通呢?

  • 首先排查网络连通性,发现服务器间网络是通的;

  • 排查微服务所运行的环境里的网关gateway服务,报错无法连接数据库(mysql),错误信息依然是“connect timeout”和无法获取JDBC连接错误;

  • 排查mysql数据库运行情况,正常,通过telnet 3306端口开放情况,正常;

  • 尝试重启网关gateway服务,依然无法启动,还是报连接mysql数据库错误;

  • 尝试重启mysql数据库,然后重启网关gateway,错误依然;

    由于此次发生故障涉及的面很广,20余个运行在k8s平台的docker容器微服务,和SpringCloud相关治理组件(nacos、gateway)等都在报错,起初以为是某个公共服务突然故障导致整个高可用架构的系统平台挂掉,但是思考良久没有找到哪个服务有如此大的“影响力”,如果有,那这微服务系统群的高可用涉及也太脆弱了......
    正当机房所有人都一筹莫展时,客户系统科的一条消息让事情发生转机,系统科下午18:20左右给生产环境服务器打了系统升级补丁!我第一时间反应,就它了!首先故障发生时间能对上,故障涉及面广和打补丁的系统级环境变动的影响范围吻合!同时我们已经把问题定向到net.ipv4.ip_forward整个参数,发现生产环境服务器整个参数全部都是0,而系统能运行的条件是net.ipv4.ip_forward=1。net.ipv4.ip_forward直接影响docker容器的ip转发,经验证当net.ipv4.ip_forward=0时,登录docker容器内部,ping外部其他的服务器ip是不通的,而net.ipv4.ip_forward=1时,是可以ping通的,这就解释了为什么之前一直报错连接不到数据库。

最终解决方案:系统级参数调整(永久生效方式),将net.ipv4.ip_forward设置为1。
系统全部恢复正常。

上一篇:安装docker报错


下一篇:十六、内联style.html