监控
简单来说,分布式系统需要实现一个基本的监控工具。最简单的办法是在每个节点上部署一个agent,定时上报该机器的信息。这一块鱼龙混杂。开源的实施起来就比较复杂了。这一块主要分四层:
- 收集,具体怎么收集数据(比如sar命令、JMX等)
- 传输,收集到的数据如何传到存储(比如用syslog,fluentd,statsd)
- 存储+分析,如何存储收集到的数据,并提供查询(比如用mysql,postgres等一般数据库,RRD Tools工具,或者InfluxDB这样的专用时序数据库)
- 界面展示和报警,数据怎么变成好看的图表,并提供不同维度的查询;如果可以,一些参数超过一定的阈值,就要自动报警(发邮件、发短信、发微信等)。(比如grafana, icinga等)
也有很多All-in-one的收费方案,比如New Relic,听云等。
不同监控的侧重点不同,有的主打通用,于是可以对接一堆其他工具。有的则主打特定领域,比如Java自带的JMC可以监控JVM的GC,线程等情况;Percona Monitoring Plugins可以监控MySql的内部情况等。可以根据需要具体选择。有些云服务提供商也会提供一些最基本的监控,比如阿里云的相关工具。
监控什么呢
当搭建一个集群,要监测三大类数据
- 机器数据:最主要包括
- CPU idle,io,load值等
- 内存的使用和swap
- 磁盘io KB/s,iops (如果是数据库的的机器特别重要)
- 网络,总带宽占用,io KB/s, packet/s (如果是服务的机器就特别重要)
- 框架/服务级别的监控
- 例如,如果是JVM,Java的堆内存情况;GC,尤其是FullGC的频率和暂停时间;线程数量和状态;如果可以的话,方法执行的耗时排名;
- 如果是DB,为内存占用,磁盘io,慢查询,链接数的监控
- 业务级别监控
- 比如单位时间下单数、Cache命中率等等、Log中500错误数等等。随着业务的变化,这些监控会不断的变化
这是一个浩大的工程。不可能一蹴而就,也不可能一套工具就全搞定。必须结合Infra和业务开发工程师的共同努力才能构建出来。如果预算不是那么紧,建议采购一两套收费的方案来减少这方面的开发资源消耗。毕竟做公司的主要精力是业务本身,而不是开发完备的基础设施。当公司体量大到一定程度,自然就会建立专门的团队来做这些。
构建监控体系时注意 报警不能淹没使用者的接收。铺天盖地的报警只会让人把报警直接关了。所以设计时要考虑报警的频率,级别,ACK等机制。而且可能会反复调整。尽量把“关键问题的报警”提供出来。
实际的压力问题怎么发生的
压力问题主要发生在两个时刻
- 上线的时候。比如曾经有一个同学做了一个实现,勿用了正则表达式,造成了一上线CPU飙高直接打到100%。这时通过监控工具和报警可以马上识别所有上线的包都有问题,立刻实施紧急回滚。类似的问题还有,比如写代码的SQL没有用好索引造成全表扫描。异步代码写成了同步的,卡死了接收端等等。
- 用户流量压力突然增加。比如我们的长赢指数投资计划非常受欢迎。一发车就流量(带宽)升高10倍。这个第一次发生时没有应对的策略。事后我们使用K8S,提前准备热备机器来顶住流量。此外,很多压力会集中到DB,因此需要花跟多精力开发Cache(Cache其实是个很难的问题,回头单独讲)
我用的工具
工具太多了,我们粗选了几个就用了,不一定是最好的,但至少目前还是可以解决问题的
- 收集端就用服务自带的命令即可,比如操作系统的top、sar,redis的info命令等
- 传输和存储使用influxdb
- 分析工具使用grafana和icinga