zoukankan      html  css  js  c++  java
  • 普元云计算-微服务来了,监控怎么办?

    转载本文需注明出处:EAII企业架构创新研究院,违者必究。如需加入微信群参与微课堂、架构设计与讨论直播请直接回复公众号:“EAII企业架构创新研究院”。(微信号:eaworld)

    设想今天是个愉快的周末,天气很好,你带着孩子在公园闲逛,这时候,一条短信来了:

    瞬间整个人都不好了,到底怎么回事,上面的业务有没有预警,赶紧把相关人召集一下,最好赶紧去下公司吧!也许这时候你会想:能不能有些智能监控手段,给我看到我最想要的信息,这种模棱两可的信息,只会让人心情变差。

    回到主题,现在只要说微服务,必须先说单块应用了,那单块应用架构下,监控都怎么做呢?这是一个非0即1的问题,如果宿主服务器指标一切正常,那就是单块应用出问题了。对于宿主服务器的监控技术也算蛮成熟,比如Nagios、Zabbix;而对于应用的监控,主要通过应用服务器的管理平台,或者直接上去拿应用日志就可以了。


    随着微服务越来越多的被采用,以前是单个服务器+单个服务,现在转变成是多个服务器+多个服务的模式了,出现一个异常,如何快速找出问题根源,显然对监控能力的要求更高了:

    · 分散在各处的日志怎么办?

    · 是某个宿主服务器的问题?还是某个服务的问题?

    · 无论是服务还是服务器问题,影响链有哪些?

    · ……

    当然,前面一直在拿故障定位举例,但监控可不是只为了故障定位,一般监控目标无非下面几种:

    · 事故预警:比如基于阀值对比的实时的事件告警等

    · 故障定位:比如静态点的异常日志收集等

    · 优化决策:比如用户行为数据分析,发现瓶颈等

    无论是上述的哪个目标,又或是微服务带来的诸多难点,有一样东西是一直没有变的,那就是来源,要么是落地日志、要么是硬件设备或系统信息、要么就是一堆自定义的程序埋点(当然也可以把日志作为埋点的一种实现方式)。只是在微服务架构下,信息收集后你需要的处理动作(关联、合并、过滤、去重等等)更多更复杂了,我们可以想想一些实际的应用场景:

    1. 微服务的日志收集场景,假设现在我是一个平台的运维人员,我肯定不希望登到每台宿主服务器上去看各种日志,最好是把日志都收集到一起展现,然后做后续的分析挖掘,基本流程如下图所示:

    从左至右,先是从宿主服务器上去收日志,紧接着是一个管道,负责数据传输,接着数据被分流,部分进了存储系统,比如ElasticSearch、Hadoop,部分进了实时系统,比如storm、esper,再往右就很明了了。这个架构已经被很多的互联网公司应用,我所知道的淘宝、当当、美团等都是这个基础架构。但这个架构设计中有几个点值得大家关注:

    · 管道除了传输,还有很多能力,最常用的是简单预处理和数据缓冲(比如很多架构里用到了kafka)

    · 传输可以是多级,一般来说规模大到一定程度,数据往一个点的海量汇聚很容易出问题,分级处理是个很好的方式

    · 日志收集方式尽量统一,很多设计里对于业务日志、容器日志(如docker)、宿主机日志等采用不同agent,这是一个不好的设计方式,agent也要管理,引入太多agent只会给自己增加不必要的麻烦

    2. 行为数据分析场景,很多创业公司都在关注这块,一个常用的方式就是基于埋点,一般埋点可分为前端(终端)和服务端两种,两者各有利弊:比如前端的好处在于可获取更丰富的界面操作信息,从而指导界面UI(如布局)的演进,而其最大的问题在于采集数据的传输对网络要求较高(一般采用批量方式)。微服务架构下,基于埋点的被统计进程变得越来越多,比如服务健康检查这类,既要有点,又要有链。埋点的设计里有几点经验供大家参考:

    · 都可以做到的前提下,后端采集是首选

     

    · 前端采集尽量采用框架进行埋点,不要到处插入自定义代码(框架的做法其实不复杂,比如web端,用过类似selenium这些框架自然就清楚原理了)

    · 埋点很难做到语言无关性,尤其后端埋点,微服务架构下,尽量结合各微服务语言特征来实现

    3. 系统性能跟踪场景,这个其实倒和传统架构下的方案类似,比如通过协议采集系统的CPU、内存、磁盘IO等,进而分主题入指标库。不过像我们采用容器来承载微服务的做法,比起传统架构来说,需要采的系统信息更多了,比如容器的性能信息,同时在创建性能相关的主题时,数据的关联性也显然更复杂了。

    同样有些经验大家可参考:

    · 指标库的选型一般会采用一些内存计算框架,对于主题的设计和优化要充分考虑内存容量。

    · 无论容器、虚机、物理机,性能数据采集都面临着窗口的问题,一般是两个窗口(多长时间采集一次和采集的数据是多长时间的数据平均值),需结合业务设置合理值。

    · 还有一点,包括上述的两个场景也都要注意,就是采集器本身对宿主机的性能影响,需尽量降到最低。

    前面从技术或业务架构上谈监控,除此之外,微服务架构下,在做监控设计时,还有一项重要因素:(PS:我不是要说康威定律),前面有一句话,不知道大家有没有在意,“给我看到我最想要的信息”,“我”很重要,我可以是很多角色,即使是同一个微服务,不同的角色对于想看到的信息都可能是不一样的,结合角色考虑,往往在微服务架构中可以给我们的设计留有很大优化空间,举个例子:

    我们曾经在一个项目中采集性能信息,后端的指标库用了influxDB,存储虚拟机的各性能数据,每次采集信息作为某时间点的一条完整记录(默认是1分钟采集一次),中间架了缓冲(kafka),然后由处理器订阅,并对一批数据向InfluxDB做批量插入,示意图如下:

    我们一开始认为这就可以了,后面基于类sql语句和内置函数完全就可以得到想要的信息了。比如每天的性能曲线,可以将一天的数据通过mean计算出24个点,而每个月的时间曲线,可以将一个月的数据计算出30个点。我们就这么傻呵呵的把数据持续积累着(要求半年),直到一段时间后,发现撑不住了,怎么办呢?我们回过头来,看看实际上不同的角色要什么信息?他们是怎么消费数据的?

    · 决策者:最关注的是这周或这个月比前段周期负载增加或降低了多少,给他的只需是个数字对比结果,明细数据根本不重要,最多他希望能对比到半年前即可

    · 运维人员:运维人员其实对数据实时性要求很高,他们根本不在乎几个月前的数据,只要能看到最近时间的数据有没有问题即可

    这么一考虑,那优化方式其实就很多,详细数据虽然需要存档,但完全可不放在时序库中,针对决策者,数据按每周或每月汇总再存入线性指标库即可(influxdb continuous queries);而针对运维人员,数据驻留内存周期可大幅缩短。

    总的来说,在微服务架构下,监控确实变得越来越复杂,但无论怎么复杂,我们都时刻需要结合业务需要和角色识别,来进行监控方案的设计与优化。

    最后给大家分享下我们目前平台中使用的一些技术栈:

    ·日志收集的需求,因为我们是基于容器技术的,使用的CoreOS系统,最终我们采用了Journald+Fluentd+ElasticSearch的技术(业务日志亦是如此),简单场景下,ELK、Flume等其实就足够了,我们在一些小项目中实践过。而实时分析系统部分,大家可选择akka、或者esper、或者storm作为实现框架,akka通过actor模型实现信息流转,esper我们是用来做CEP产品的,storm就不用多说了。

    ·对于埋点的一些需求,大家可参考java的Metrics项目,或者Netflix的Suro项目,都是java实现,前者简单,后者则考虑更周全。

    ·对于性能指标的一些需求,influxdb可作为后端存储(不过influxdb的版本间兼容性做的很一般),大家尽可能使用最新版本,还有opentsdb,有朋友推荐过,不过毕竟是基于HBase的,比较重,大家有兴趣可尝试。

    关于作者:

    顾伟

    EAII-企业架构创新研究院 专家委员

    现任普元软件产品部主任架构师,先后参与华为,中信银行,工商银行,中航信,阿里云,兴业银行等客户定制项目。擅长OSGI,eclipse插件,web前端,云计算,CI/CD等领域技术,对新技术有着浓厚的兴趣。

     

    关于EAII

    EAII(Enterprise Architecture Innovation Institute)企业架构创新研究院,致力于软件架构创新与实践,加速企业数字化转型。

    eaworld项目(微信号:eaworld,长按二维码关注)

    eaworld是EAII的官方微信账号。

  • 相关阅读:
    裴蜀定理
    上下界网络流
    寻找符合子序列要求的区间个数
    小猪分配 , 最大流
    floyd + 最大流 (奶牛分配问题)
    抛硬币问题
    消消乐
    Entity Framework(1)
    冒泡排序
    二分法查找数据
  • 原文地址:https://www.cnblogs.com/insideout/p/6112593.html
Copyright © 2011-2022 走看看