大型互联网系统的监控流水线
大型互联网的系统一般会架构散布于多个数据中心和一些私有/公有云,由真实物理机以及虚拟机组成。架构中部署的关键工具包括实现报警的Zabbix,以及一个采集、聚合和存储度量的六阶段流水线。流水线主要由开源工具构建,其中使用了OpenTSDB、Kafka、Elasticsearch和Grafana,还有一些企业自研的工具。
监控的一些关键度量,包括CPU平均负载、内存、线程、网络连接、磁盘空间和性能等。对于电子商务网站而言,网络监控至关重要。网络监控实现为多个层级,包括使用ping监控跨数据中心的连通性,使用Observium监控网络设备带宽,使用Uptime Robot监控外部可访问性和系统运行时间及负载情况(uptime)。监控的实现原理通常分为两大类,即拉取模式(Pull)和推送模式(Push)。在拉取模式下,存在一个集中式系统,轮询各个被监控系统并从中拉取数据。Nagios等多种传统的监控系统主要遵循该模式,但是其中部分系统也提供推送模块。在推送模式下,每个被监控系统中需要运行一个代理程序。该代理程序采集监控数据,并将数据推送到一个中央系统。Prometheus等工具使用了推送模式,它们提供推送功能选项。团队选择使用推送模式,并在每台服务器上运行了Zabbix代理。Grafana做为可视化工具。
监控流水线分六个阶段,实现从日志中抽取度量并推送到时序数据库OpenTSDB。
第一个阶段负责收集日志。流水线通过运行在每个服务器上的syslog-ng代理,以UDP方式汇集到一个中央Logstash服务器。syslog-ng可在类UNIX系统上实现syslog协议。 第二阶段进而使用grok分析器分析收集的日志,并推送到两个不同的Elasticsearch(ELS)集群。每天分析的日志总量可达700GB。 第三阶段使用称为“Data Monster”的企业自研工具(Django-Python),周期性轮询Elasticsearch集群,从中抽取度量。 第四阶段使用调度系统计算各个度量。该调度系统基于Celery Beat、RabbitMQ和MySQL实现,使用Data Monster从ELS拉取数据,并推送到Kafka集群。 第五阶段生成实际写入到OpenTSDB的
PUT
语句。Apache Kafka通常用于构建持久化流数据队列。在流水线中,Kafka消费者处理消息,并推送到OpenTSDB中持久存储。 第六阶段使用Grafana查询数据库中的消息,生成可视化的仪表盘展示。
架构使用了Zabbix生成报警。此外为保证高可靠性,OpenTSDB是安装在多个节点上的。
在云环境中,机器的生命周期是短暂的,这对于需要掌握被监控机器的监视工具而言是一个挑战。通过使用Zabbix的自动注册功能解决了这一问题。Zabbix支持使用模板注册一个新机器。团队使用了一种基本的Linux模板,用于CPU使用率、平均负载、Java线程等通用系统度量。还使用了一种特定于应用的模板,用于健康检查和应用性能管理。
关键关注点还包括,如何确定实时监控下的度量粒度问题,以及如何对HTTP响应代码和请求趋势等度量进行近距离观察。前者可支持团队快速地响应并定位问题,后者可作为一种早期预警系统,对客户或服务器端错误和应用性能突发问题做出预警。对请求数量变化趋势的深入研究,也有助于团队进一步规划容量。
- Effective Deep Memory Networks for Relation Extraction
- ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
- AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
- WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]
- AngularJS in Action读书笔记6(实战篇)——bug hunting
- FreeMarker模板开发指南知识点梳理
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- H5手游大事件:腾讯上线“微信小游戏”!支持群分享与内购
- 我所理解的Remoting(2):远程对象生命周期的管理[上篇]
- 谈谈分布式事务(Distributed Transaction)[共5篇]
- SQLXML初体验:用XML代替T-SQL来操作数据库
- 自己动手写可视化软件(代码已开源)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于 JavaScript 中 null 的一切
- 总结 | DataFrame、Series、array、tensor的创建及相互转化
- 这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
- Go by Example 中文版: 写文件
- PWN:House Of Force
- Windwos10下使用VS2017搭建cocos2d-x 4.0开发环境
- JavaScript 中的函数式编程:函数,组合和柯里化
- 如何设置一个生产级别的高可用etcd集群
- NVIDIA Jetson nano可以处理4K相机吗?来验证编码性能吧(中)
- House Of Lore原理学习
- 使用 rush 进行命令并行处理
- 老生常谈 Spring Aop 日志收集与处理做的工具包,贼好用?
- Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
- Go by Example 中文版: 行过滤器
- Elasticsearch重要知识点 | 选举流程详解