APMCon 2017|58集团龚诚:构建立体化的体系—58集团实践
当前位置 :主页 > 菜谱 >
APMCon 2017|58集团龚诚:构建立体化的体系—58集团实践
* 来源 :http://www.antibiotics-cheap.com * 作者 : * 发表时间 : 2017-10-23 04:12

  中国应用性能管理行业盛宴2017中国应用性能管理大会(简称APMCon 2017)于8月10日至11日在新云南皇冠假日酒店隆重召开。本届APMCon是由听云、极客邦和InfoQ联合主办,作为国内APM领域最具影响力的技术大会,本次大会以“驱动应用架构优化与创新”为主题,致力于推动APM在国内的成长与发展。

  58集团技术工程平台群高级技术经理龚诚于APMCon 2017智能运维专场发表了题为《构建立体化的体系-58集团实践》的,现场解读了如何将运维数据进行量化和可视化,以及58集团在方面如何快速的构建起立体化的体系。

  龚诚:首先欢迎大家,我今天的题目是“构建立体化的体系-58集团实践”,主要讲一下我们58集团是如何在最近一年多时间内,从做的不是很好的状态,发展成为相对来说比较完善的状态的。

  我们的工作其实可以划分为四个阶段:第一阶段,如何快速获得收益,最开始的时候的情况不是很好,所以要快速的实现基本的功能;第二阶段,构建立体化的体系,各个端、各个层面的都要比较完整和完善;第三阶段,提升系统用户体验,基本的功能都有了,怎么能让大家用的更爽呢,就是要提升用户体验;第四阶段,智能化和发送告警。

  l 系统数量非常多。由于各种历史原因导致每个机房的网络运维、系统运维、应用运维、各个研发部门都有各自的系统。

  l 告警数量非常多。每天运维人员可能要接收几百条的短信告警,这么大的告警数量对运维人员造成很多干扰。

  l 针对集群进行。早期的很多开源系统是服务器级别的,我们负责运维58集团下属的很多网站,包括58同城、赶集网、中华英才网、安居客、转转等网站,我们的服务器数量常多的,为了管理方便,一定要以集群维度进行的管理。

  l 支持模板和模板的继承。这么多服务器的调整起来是很麻烦的,所以我们要求的模型一定要针对集群进行管理。策略绑定在集群层面上,不需要绑定到某一个机器,调整机器的时候可以不需要调整模板,极大的简化了信息的。

  l 模板中包含多条策略。对于肯定有很多共同的需求,可以把这些需求都写在通用的模板里,然后用集群自己个性化的模板继承共用的父模板,这样既实现了大家共同的需求,每个人也不需要重复配置,也可以添加自己服务特殊的策略,这样很好的兼顾了通用性和个性化。

  l 支持告警组。在一个公司里总会有人员的变更,为了方便告警管理,可以将告警发送给告警组,告警组里可以配置用户,用户可以随时进行调整,有效减少了的代价。

  l 高稳定性和分布式系统。系统是用来保障网站稳定性的,所以它自身的稳定性就必须要高,且具有很强的容错能力。

  l 性能强大,支持横向可扩展,无性能瓶颈。当我们的服务器数量和业务规模增加的时候,可以简单通过横向扩展各模块的方式实现容量的提升,不需要对系统进行大规模的升级。

  l 单个模块逻辑简单,方便二次开发。为了更好的支持我们的业务,任何一个系统都需要根据我们自己的业务需求做一些定制化的开发,那么它的二次开发是否方便就非常重要了。

  基于前面提到的这几点,为了减少整个系统的开发周期,我们以现在业界比较流行的open-falcon为基础进行二次开发。

  在第一阶段的工作中,首先我们将切换到open-falcon,它解决了以下三个主要问题:

  l 解决部分服务器无的问题,把很多套整合为一套,把所有系统层的、应用层的、网络层的完全整合起来,了服务器级别的覆盖率。

  l 解决告警发送数量过多的问题,主要从两个方面:open-falcon本身就有比较好的告警数量控制的机制,可以支持定义告警最多发送次数,对异常做告警分级,对不同的告警以不同的方式来发送;也会针对不同重要性的异常进行判断,初期只针对最核心的集群发告警。

  l 解决了告警接收人的问题。在老的系统里,很多告警接收人由于业务的变化,人员的变化已经不是很准确了,这一块我们也重新进行了梳理和配置。

  其次,我们开发了“快速添加”的功能。在满足基本需求后,技术人员对于每个集群会有更多更个性化的需求。大家用过open-falcon可能有些体会,功能非常强大,但是添加的流程还是很复杂的。首先要创建一个集群,然后在集群里绑定一些服务器,再创建一个模板,然后在模板里创建很多策略,再创建一个告警组,告警组里加告警接收人,再把模板跟告警组关联起来,最后把集群和模板关联起来。基本上要通过十几个操作才能把一个集群的添加好,这个过程是比较复杂的,也是容易出错的。所以我们开发了快速添加的功能,很好的解决了上述问题:

  l 在一个页面添加集群名、机器列表、策略、告警接收人即完成告警添加。

  接下来,我们实现了对集群自动添加。如果依靠大量的技术人员依靠人工来添加功能的话,必然带来很多工作量,而且的覆盖度也无法,所以接下来做了自动的添加系统。具体做法如下:

  l 所有集群的模板继承公共的系统模板。我们会根据共同的需求整理一个公共的模板,基础的策略都配置在这个公共模板中,每个集群的模板都继承该公共模板。

  l 可自定义指标。在本集群的模板中可以添加很多自定义的指标,比如服务QPS、订单量、用户量等只要能采集到的指标都可以进行。

  另外我们在加强功能、提升易用性方面也做了很多工作,对于来说最关键的无非是以下几点:

  l 异常查看:方便查看当前有哪些异常,以及我接收告警的异常有哪些,这个功能方便大家快速的知道我负责的系统是否有问题。

  这些工作做好了之后,在方面已经基本上能够满足大家的需求,为了让系统起到更大的作用,也更新了帮助文档协助大家更好的使用我们的系统,另外也会在公司的技术日,以及去各个部门宣讲我们的系统。

  通过上图我们可以看到网站的通用架构。首先在机房外部有域名解析,它会让动态请求直接到机房进行访问,静态请求到CDN访问,机房内部有网络出口以及四层和七层的负载均衡设备,再到nginx和业务集群上。刚才做的工作主要在集群或者服务器维度,对于整个用户端、机房出口端及四层、七层负载均衡设备上做的相对比较少,我们这个阶段就是主要完成这些工作。

  上图右侧是集群和服务器维度的,自底向上是网络层、服务器层、系统层、应用层和业务层。对于网络层我们最关心的是网络设备有没有宕机、资源使用率和流量是否正常,以及内网和专线的服务质量等;在服务器层关心机器是否宕机、是否无法登陆或者是否有硬件故障;系统层主要关注资源使用率,例如CPU、内存、磁盘、网络等指标;应用层与应用程序更加相关了,比如端口、进程、接口状态、服务QPS等所有与应用层程序相关的指标都可以在这里进行;业务层是与具体的某项业务更加相关了,比如说我是电商类型的网站,那么对于订单量、交易量就会非常关注。

  再来看横向的,前面我们提到了比较粗略的通用网站架构图,我们把这些信息略微细化一些,从左到右,首先是在机房外部对域名的解析。由于用户处于一个比较复杂的公网当中,所以用户访问过程中会遇到很多如DNS劫持、链劫持等问题,导致无法访问正常。对于CDN节点来说,也会出现一些跨运营商或者跨区域调度造成的访问速度较慢问题。对于我们机房的网络出口,VIP是否正常也是需要我们的。在四层负载均衡设备上我们比较关心流量的变化,在七层负载均衡服务上比较关心域名、集群维度的错误率(状态码)、响应时间等指标的变化。再往右看,业务集群的跟纵向更加相关了,关注集群和服务器的维度。

  基于上述的分析,我们在用户端对于一些重点页面的关键指标进行了,包括页面的首屏时间、全部加载时间、可用性等。这些指标能够帮助我们比较好的描述网站的用户体验是怎么样的。对于DNS劫持、链劫持、页面访问较慢、访问错误等都进行了。

  在机房网络出口端,首先会对VIP是否存活做,也会在业务层上针对关键页面或者关键接口从机房出口VIP上进行探测,这样可以比较清楚的知道整个集群服务所提供的服务状态是如何的。因为是直接从机房网络出口进行探测的,所以它不会受到公网服务质量的影响,能够比较全面的评价从流量接入端到后端业务集群的服务质量。另外也会对集群中的每台服务器做页面和接口的,便于发现部分服务器的异常。

  在流量接入端的网络设备上可以流量变化,以及是否受到。另外在Nginx上可以针对域名维度、集群维度进行,评价域名和集群的可用性和响应时间。

  在业务端集群,的维度是针对于单机和集群的。单机的更像刚才提到的纵向,从网络层、服务器层、系统层一直往上,还有针对服务器的页面和接口。针对集群,一方面有通过机房的网络出口做的页面和接口,另一方面也会通过Nginx上的一些流量的变化看后端业务集群的运行状态,看它整体的可用性和响应时间。

  所以简单的总结一下,构建立体化的体系是从纵向和横向两个维度来实现的。

  立体化体系构建完之后还要在的核心功能上下功夫,比如的添加、数据的查看、数据视图、告警查看、提供更好的功能以方便我们快速发现故障、排查故障、解决故障。另外,我们也做了很多运营质量评估方面的工作,我们认为要做的一项比较重要的工作是使整个网站的运行信息透明化,原来没有的时候整个网站像一个黑盒子,哪个地方运行的好或不好、哪个地方是瓶颈我们都不清楚,通过系统可以把它由黑盒子变为白盒子,每部分的运行情况都清清楚楚,这样就知道哪部分出现的异常更多,哪部分是性能瓶颈,需要及时进行优化。我们运营质量评估分成了三个层次:

  l 机房网络出口端:看流量经过TGW,Nginx和业务集群的整个过程的服务质量。

  的基本功能都可用后,完善的用户体验就成了我们的重要目标。刚才也提到了open-falcon本身添加是比较复杂的,我们发现用户在使用的时候也会觉得比较困惑,添加、管理总会出现一些错误的情况,怎么办呢?

  之前提到过,open-falcon的模型是相对比较复杂的,如下图所示:

  所以我们就对的业务模型进行了简化,所有的配置项都是与服务树的节点也就是集群进行关联,集群是我们从CMDB里同步过来的,集群会关联服务器列表,集群也会关联唯一的模板,这个模板会继承公共的模板,就是说一些通用的项都已经在里面设置好了。另外我们把之前关联在模板上的告警接收人直接关联到集群上,这样的话对于一个集群的只需要关注这三点:服务器的列表、的模板和告警接收人。只要这三部分信息都设置正确了,那么这个的添加肯定是没有问题的,这样既满足了我们的需求又极大降低了复杂性。简化后的业务模型如下:

  我们在系统Web界面的展示上提供了基于服务树的展示模型。所谓服务树模型是将公司整个集团下属的事业群、业务线、集群按照一个树型的结构进行组织。当你想操作某一个业务线或者某个集群的时候,选择服务树里这个节点就可以对它进行操作了。

  另外我们的系统除了包含开源的open-falcon之外还有很多自研的系统,这么多系统怎么样更好的进行整合呢?如何统一整体的用户体验、页面的风格以及交互方式呢?如果上述方面统一的话,在用户看来学习的代价就会很小、易用性就会很好。所以,我们使用了一个统一的web框架,用户操作的时候,首先通过服务树节点选择一个操作范围,然后通过菜单选择使用的功能,页面中就可以展示相关的业务信息了。这样就可以把用户使用系统的交互方式统一了。我们也对自研的相关系统做了整合,包括Nginx业务流量的、网络的、用户端、IDC出口以及运营质量数据等。

  这个页面展示的是统一的web框架和服务树模型:左侧是树型的结构,根节点是58集团,下面是各个事业群,再下一级节点是业务线,再下一级节点是集群;页面是一排菜单,每一项是一个一级菜单,当把鼠标放上去的时候会看到二、菜单。在左侧的服务树上选择服务树节点相当于选择了一个业务的范围,也就是要操作的是这块业务;在的菜单中选择某个菜单就是选择某个功能,两者都选中后,右侧就会显示出相关的业务页面,用户就可以完成相关的数据查看和管理操作了。

  l 告警接收人:这里可以看到配置了哪些告警组,包括出现异常时发送告警的告警组,以及告警升级后的告警组。

  l 模板和策略:通过这里可以看到,集群对应的模板是继承了一个公共的父模板,在父模板里定义了一些像剩余磁盘空间、系统的负载、是否宕机等这些最基础、最重要的。另外,在这个集群的模板中可以根据它的需要去添加一些个性化的策略。

  l 服务器的列表:在服务树里面搜索某一个集群,服务树上自然会把包含关健词的集群显示出来,选中这个集群直接可以看到这个集群的服务器列表。当集群中的服务器列表发生变化的时候,可以在这里增加机器或者删除机器,并且可以看到某台机器是不是被其他集群共用。

  上述的信息对每个集群来说都自动添加了,只要好了每个集群的上述信息,就能够正常的告警了,通过这种方式极大的降低了的代价。

  我们在原来open-falcon的基础之上做的一点改进。我们对告警进行了分级,并且提供了多种方式发送告警,包括:邮件、微信、短信、语音,不同重要程度的告警采用不同的方式进行通知。

  open-falcon在异常告警的发送次数控制上做的还是比较好的,它可以控制发送告警的最多次数,比如设置告警发送次数最多为3次,当告警发了3次之后就不会再发了,直到从异常中恢复了才发一条恢复正常的告警。我们来看一个场景,如果前3条告警由于运营商问题没有收到或者负责人当时正在忙什么事把这个告警忘记了,这个异常要持续几天甚至几十天,那么对网站稳定性有很大的,所以我们增加了告警升级和告警提供功能。

  比如说我们设置的连续3次异常的时候再告警,两次告警时间间隔5分钟,最多告警3次。我们结合上图看一下,蓝色的线是时间轴,底下的数字代表时间,绿色代表数据正常的点,红色代表数据异常的点,在前3分钟连续3次出现了异常,所以它发出了第一条的告警,5分钟之后发送了第二条,又过了5分钟又发送了第告警。按照之前的策略,这个告警如果不去处理的话,可能未来几天甚至几十天都不会发任何告警,我们这里增加了一个策略,在最后一条告警发送完之后30分钟后如果异常还存在则会把告警升级,且使用更明显的方式提醒用户。另外如果说这个故障持续时间超过一天了,之后的每一天我们也会给再发告警提醒一次。

  当前异常信息的查看也是系统中非常重要的一项功能,下图就是该功能的页面,这里可以通过服务树选择一个业务范围,选择查看整个公司的异常或者只查看某个业务线或者集群的异常。右侧还有“我的告警”选项,选中这个选项会看到所有与“我”相关的告警和异常,页面还可以根据设置自动刷新,这个功能对于运维值班和做系统巡检常有用的。

  这个页面是展示的当前处于异常状态的告警,当它从异常状态恢复到正常之后这个信息就自动消失了。另外在这里也可以很方便的进行搜索,比如根据告警条件、异常类型甚至告警接收人进行搜索。

  这个页面把每个告警事件作为一个圆圈展示出来,圆圈越大说明告警级别越高,颜色越深代表告警次数越多,而且把鼠标放到某个圆圈上的时候能够看到某一个告警的详情。因为服务有可能依赖于一些存储服务或依赖于别人的接口,所以当出现异常的时候,可以上来看一看是不是跟你相关的服务在这个时间附近也出现了异常,有可能因为它的异常引起我们服务的异常。

  数据的查看也常重要的一个功能,故障时对异常原因进行排查、做完系统优化后对比效果、规划系统容量等操作都会用到这个功能。

  用户在使用该功能的时候,首先在左侧服务树里选择事业群、业务线或者集群,在右侧会显示出来它对应节点下的机器列表,而且在可以对IP模式进行一定的搜索,通过右侧的常用指标选项可以快速选择我们平时常用的指标,比如概况、CPU、磁盘、IO等,这样就能够很方便的通过几次点击的方式看到一些常见的视图。当然高级搜索可以满足更加个性化的需求。点击看图按纽就能够看到相关的数据。

  当然这些数据可能不只是今天看一下,有可能平时工作当中会常常查看的一些视图,可以在这里面点击生成视图按纽,生成视图并且收藏起来。那么下次直接在“我收藏的视图”中就可以快速查看视图了,我生成的视图也可以被其他用户收藏和查看。

  我们把核心数据放到墙中展示,可以很方便的看到网站运行中最重要的一些数据。

  通过系统采集的服务器的数据和业务相关的数据,也可以针对不同的容量、负载模型进行计算,得出每个集群、每个业务线相关的负载指数,通过雷达图可以展示各个分项指标,可以很好的规划容量,也可以在分配服务器的时候有效的控务器成本。

  在运营质量评估方面,我们可以针对业务集群维度、机房IDC出口维度、用户端维度进行评估。这个页面展示了集群的关键指标,可以看到某事业群下面的多个集群的响应时间。

  对于大家平时常用的功能,都可以在这个菜单内找到,比如我收藏的视图、我负责的异常、我订阅的告警、我的集群和我的模板等。如下是访问系统首页后默认展示的“我收藏的视图”页面:

  l 同服务器告警合并。我们可以对同一个服务器的告警进行合并,因为如果一个服务器宕机的话这个机器上肯定有其他的告警,只需要告诉用户这个服务器宕机就可以了。

  l 同集群告警合并。由于用户流量特别大或者程序出现某个bug,这个集群当中每一台服务器都会出现告警,如果同时发几十条告警也是一种干扰,所以我们对同一个集群的告警进行了合并,直接发送一条告警。

  l 同网段的宕机合并告警。由于某个交换机出现了异常,肯定有同网络上的机器出现了大量的丢包告警消息,其实这些告警合并起来就可以推断出某个交换机网络设备出现了问题。

  l 同根因的告警合并。当的覆盖度比较高的时候,对每一个层级都会有,如果一个集群出现问题就会在很多层级的监警体现出来,这些问题都是可以进行合并的。

  l 告警信息丰富化:在微信告警中,可以展示更丰富的信息。除文字外增加了很多指标相关的图片,能够直观看出异据的变化趋势。另外也增加很多链接,可以快速的通过点击这些链接修改相关配置信息。

  l 异常的根因分析:需要我们逐渐构建起运维的知识库推断出来异常的根源原因。

  l 服务器宕机自动处理:如果服务器宕机,自动重启服务器;如果服务器出现硬件故障可以通过服务器的机型、对网络的需求等信息自动分配备机。

  l 磁盘空间不足自动处理:通过一些告警事件触发自动删除一些预定义目录的文件。

  l 负载升高自动扩容:当集群负载升高,达到警戒值后自动调用部署管理系统和云平台,自动对系统做扩容。

  l 流量自动调度:当某个机房或网段出现问题时,操作TGW和Nginx进行流量调度。

  龚诚:使用ELK将Nginx日志实时传输和计算,再把数据实时灌到open-falcon里,通过open-falcon做数据展示和告警。现在正在从ELK迁移到storm。

  问题:对于关键业务的关键接口,这些接口是在Nginx日志里分析还是请求接口做的?

  龚诚:两方面都有,我们会实时分析nginx日志,也会实时对接口发送请求进行监测。

  龚诚:通过听云在全国各区域各运营商的探针采集数据,然后将原始数据拉回来自己做分析,再进行数据展示和告警。

  问题:我想问怎么做压缩告警,因为我们的日志有可能发生大量的error,假如1分钟内有100个A错误、1个B错误,又有100个C错误,理想的状态是收到告警。现在我们是通过一个case来判断次数的,但是这个次数没有做智能压缩的,只能是一分钟收到多少条就压缩为一条,但是不能把不同的错误分级别发出来,您这一块是怎么做的?

  龚诚:这个是具体实现层面上的事情,告警可以按照不同业务需求进行实现,需要具体问题具体分析。刚才你说的情况是根据错误的类型对告警数量进行合并,你可以每分钟对这些错误的数据按照错误类型进行合并,得到A错误100次、B错误1次、C错误100次,然后将这3个信息使用不同的指标推给系统,对不同的指标设置不同的告警策略和级别,就能够实现对不同错误类型做告警分级。

  问题:是我们自己研发还是用第三方比较好,因为开源工具包括小米的还是其它都实现不了。

  龚诚:要把自己的需求和开源系统较好的结合起来,开源系统实现的都是通用的模型和功能,自己的业务要选择一个好的方式和开源系统结合起来。跟自己业务和需求相关的部分,要自己控制这部分逻辑,把数据处理成标准格式后,再推给系统,使用开源的系统来解决。