加入新公司后不久开始怀念xflush,大部分情况下只需在页面上配置, 就可以实现业务指标的可视化及异常报警。
尝试利用现有的开源系统搭建,经过调研分析,最终确定的方案为statsd+influxdb+grafana。目前已上线,运行稳定。
具体过程不再细说,其中重要的取舍和配置介绍如下。
设计取舍
graphite:
老牌的企业级的监控工具。
环境搭建繁琐: 参考官方文档和网上各种文档,踩各种坑,加上工作上有其它事情在忙,搭建花了2-3天之久。
性能: graphite的存储组件whisper 是零散小文件存储,这样写指标文件会造成随机io。性能不敢恭维。
界面: 比较传统的树形结构,略显土气。进一步调研时发现了grafana。
引入StatsD:
对数据时间范围内汇总,大大减少了db的压力。并能进行min, max, avg多维度统计。
存储选型InfluxDB:
使用 Go 语言编写,无需外部依赖。反之OpenTSDB 是一种基于 HBase 的时间序列数据库。
最新版本的存储引擎底层是B+树, 也支持批量写入和缓存。
InfluxDB内部集成支持 graphite数据格式。 每次统计指标的min, max, avg对应到数据库中是一条记录的多个列, 相比graphite降低了不必要的io开销。
可视化Grafana:
界面相当漂亮,功能齐全的度量仪表盘和图形编辑器和查询编辑器。
监控报警:
当时使用了kapacitor。 目前grafana4.0 已经release, 直接支持alerting。
业务指标采集:
业务指标的主要内容: qps/qpm, 延迟。
对java-statsd-client进行了封装,使用注解和aop xml配置进行业务指标汇报,业务代码无侵入。
java-statsd-client 内部使用udp发送指标统计到StatsD,没有复杂的状态管理。对业务影响很小。另外一种方案就是记录到日志,flume收集后再发送到StatsD,彻底隔离对业务的影响。
性能扩展:
StatsD为无状态节点,可通过负载均衡器部署多台保证可靠性和可伸缩性。
InfluxDB存储到达瓶颈后,可以做分库的方案,增加一个代理层。StatsD和Grafana通过代理层访问InfluxDB。