云计算保障系统SLA之线上打桩

达芬奇密码2018-08-23 11:38

时间是我们最大的敌人 --奇异博士

云计算一个难点在于保障系统的高可用,当在发生故障的时候,能够尽快的恢复(参考最近的gitlab和亚马逊s3故障教训)。如同奇异博士所说,工程师是在和时间在战斗。监控和报警是工作的重中之重。一般来说,我们肯定会做好宿主机层面和服务层面的监控报警,否则系统形如裸奔。

然而,某些场景中,宿主机和服务运行正常,但是上面的虚拟机被异常关机或者重启,抑或网络连通性出现问题(包括私有网,外网,以及不带外网的情况下通过L3访问外网等),上述情况下现有的监控方案覆盖不到,不能及时发现问题;另外,每次线上更新主机和网络等服务,需要观察升级对已有云主机的影响。基于上述考虑,从用户态出发,有了这个线上打桩监控的方案,切实提升系统可用性,保障网易云服务的SLA。


实现思路概述

在当前线上所有节点部署一台虚拟机,虚拟机内部部署测试工具进行线上业务的网络监控,主要实现的功能包括:

  1. 同租户私有网网络连通性验证,所有节点之间同租户云主机互ping,虚拟机的私有网采用固定ip的形式;
  2. 不同租户之间机房网网络连通性验证,选取部分节点间进行,包括同租户和跨租户等情形(跨租户主要进行acl的功能检查)
  3. 私有网访问外网连通性/dns解析功能,部分节点中的部分虚拟机(dns-server功能验证、L3功能检查)
  4. 外网访问外网连通性/dns解析功能,部分节点中的部分虚拟机(外网检查、dns-server功能验证)
  5. 公共服务访问/优先路由验证(虚拟机路由推送功能验证)

其中,网络连通性方面通过ping进行检查,时间间隔为0.2s,结果方式采用如下的形式进行记录:

[date] [src_ip] [dst_ip] [state]

例如:

INFO     [root]  2017-03-01 14:21:35 ping from 10.166.224.65 to 10.166.224.17 is ok!

无异常出现的情况不做任何推送操作,仅打印日志记录;在网络出现异常后,打印日志,同时通过IM或邮件的形式进行实施告警推送。

由于实现中,需要在每个节点进行虚拟机的预埋,所以会占用部分线上的资源,使用中会选取最小的规格(1v1e,512M内存)来进行验证,尽量少的占用系统资源。


实现

经过调研对比(ansible, salt,puppet等),选取了较为轻量的python fabric模块,进行打桩机脚本与配置文件的下发和服务的部署。

另外完整的方案部署还需要考虑日志回滚,进程守护等问题。因此在脚本下发过程中,也会注入好事先准备的logrotate,supervisor等配置文件。


运行

在fabric主程序中封装了部分常用命令,展示如下:

执行一次,在命令行下各节点看连通性结果。

fab -f network_check.py dry_run

拉起所有节点云主机测试连通性服务。

fab -f network_check.py start

停止所有节点测试连通性服务。

fab -f network_check.py stop

抓回所有节点的日志。

fab -f network_check.py get_log

并行执行,可以加上 -P 参数。

fab -f network_check.py start -P


实现效果展示

报警消息

登录到哨兵监控节点看一下日志,果然在10:40左右10.173.32.77网络连通性异常。

通过私有网ip反查对应宿主机所在节点。

查看宿主机对应的监控,果然在该段时间内有异常产生。


结论

通过此线上打桩方案,我们能够以用户态监控各个节点的网络连通性,有无异常宕机、重启等发生,从而能够更早的发现某些异常场景,为问题排查与服务恢复争取更多时间。


网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者黄哲骁授权发布。