---
title: 创业公司的数据收集以及监控系统方案
date: 2013-06-02
draft: false
summary: 围绕创业团队的数据收集和监控需求，整理一套低成本可落地的系统与业务监控方案。
slug: monitor-and-data-collect
tags:
- startup
- 运维
- monitor
topics:
- infra
type: post
---
精益的 Build-Measure-Learn 环中的一个要点是 Measure。只有足够的数据，才能进行测量评估，增加认知。所以数据监控和收集对创业公司来说非常重要。
需要监控和收集的数据主要有**系统数据**和**业务数据**。

## 系统数据

系统数据主要指应用和服务的性能、可用性、频次等数据。

看了一些开源方案，业界比较常见的组合大致是：

`nagios + collectd/ganglia/munin/cacti`

* nagios 用于设置阀值和报警。
* 再整合数据收集与展示系统（collectd/ganglia/munin/cacti）。

    1. collectd：<https://collectd.org/>。只负责收集，不负责展示；如果要展示，需要整合一个展示系统，比较优秀的是 Graphite。
    2. ganglia：<http://ganglia.info/>。是一个完整的监控方案。
    3. munin：<http://munin-monitoring.org/>。优势是比较简单，直接定时生成静态图片。
    4. cacti：<http://www.cacti.net/>。相当于 munin 的升级版，支持动态绘制。
    5. graphite：用于绘图，一般和以上工具整合。优点是实时绘制，便于多个监控指标进行比较。

以上监控系统的数据大多是 RRD 格式。RRD 格式的好处是随着时间推移自动降低精度，缺点是不会保存完整数据。

以上工具主要用于收集服务器状况：

1. cpu,硬盘,网络,load 等
2. 通用的服务器状况 mc,mysql,nginx,jvm 等各种指标变化

以上开源的服务都有现成的插件可用，使用的是拉模式。

当前选择的方案是 `collectd + graphite`。

应用层的性能,监控指标(如 接口响应时间 实事调用频次等）需要自行设计方案

1. 依然是拉模式，应用层先收集数据缓存，然后通过接口方式输出。监控系统定时拉取。简单的可以直接暴露http接口。如果是java应用也可以通过java的MBean模式，通过JMX输出。
2. 推模式，应用层将数据推送到一个中间层，由中间层汇总然后输出到监控系统。如: [statsd][1]。

当前选择的方案是 `statsd`。

接口层的可用性监控当前没找到非常合适的开源工具，有第三方服务可供选择，但一般都只支持简单的接口调用，无法做回环功能监控。想到的办法是通过自动化测试工具来定时监控可用性。

## 业务数据

和业务相关的数据，一般无法通过程序直接记录。需要通过日志等方式汇总并通过一定的计算公式得出。

一般的解决方案是 收集日志（scribe等），写入 hadoop集群，然后通过日志分析工具每天出报表。

但对创业公司来说，hadoop的成本较高，小成本的解决方案是写日志到mongodb中，通过mongodb的MapReduce和集合方法来汇总统计。
收集日志最终没有选择 scribe,而选择了[fluentd][2]. 

fluentd 优点是和mongodb整合容易，并且支持多种方式收集日志。

1. 应用层通过本地端口直接写入。
2. 应用层写入本地文件，fluentd 进行读取该文件并且转换格式记录日志

[1]:    https://github.com/etsy/statsd/
[2]:    http://fluentd.org/
