一晃新的一年就过去了 1/24,程序君发现自己竟然还没有写上哪怕只言片语,未免让「程序人生」的读者感到失望。如果说之前说自己忙都是瞎忙,如今我是体会到了什么叫忙得连去上厕所的路上都要以 6km/h 的速度前进。不过忙归忙,公众号还是要更新的,今天先来一篇短文,答谢大家的苦苦等待。
系统监控和日志处理这块,有很多现成的工具。除了商业上比较成功的 new relic 和 datadog 外,开源的解决方案也不少,如 elk stack (elasticsearch, logstash, kibana),reimann 等。elk 大家用的比较多,各种成功的解决方案也都能找到,尤其在 amazon 提供了 elasticsearch services 之后,大家需要操心的就只有安装和配置 logstash 而已,运维的门槛大大降低。
然而,单单配置 logstash 也不是件容易的活儿,你得掌握其一堆 input / output / filter plugins,弄懂配置文件的语法,学会成功撰写 grok pattern 等等。有时候你只是想消费你硬盘中的日志文件而已,有没有办法不用配置 logstash,让 log agent 能够直接 plug & play?
当然!程序世界的挠痒痒定律(当你为一个问题感觉到奇痒难耐的时候,这个世界一定有相当数量的人和你一样奇痒难耐,于是有人会解决这个问题)保证了这一点。一个创业公司为了他们的系统在 elk 的基础上搞了套 beats 系统,能够处理大部分日志格式,于是,他们就和做 elasticsearch SAAS 的公司 found 一样,被 elastic (elk 的母公司) 收编了。不过,收不收编不重要,重要的是 beats 依旧在 apache 2.0 协议下开源。下面我们简单讲讲这个体系。
beats 是用 golang(感觉 golang 要渐渐统治运维软件的市场了)写的一组 collector,它可以从操作系统,文件和网络中抓取信息,发送到 logstash,或者直接发送到 elasticsearch,从而让这些信息得到可视化。目前 beats 项目包含这些子项目:
他们之间的关系是这样的:
我们主要看看 filebeat 和 packetbeat。
filebeat 的目的主要是取代 logstash forwarder,你可以从系统的日志文件中抓取信息,发送到 elasticsearch 上。安装很简单(redhat):
$ curl -L -O https://download.elastic.co/beats/filebeat/filebeat-1.0.1-x86_64.rpm
$ sudo rpm -vi filebeat-1.0.1-x86_64.rpm
如果你的 elasticsearch cluster 不是 localhost,需要修改 /etc/filebeat/filebeat.yml
中对应的配置。之后就可以:
$ sudo /etc/init.d/filebeat start
之后你就可以使用 kibana 查询到你当前的日志信息了。
filebeat 比较直观,不多说。
packetbeat 是个值得拥有的神器。logging 应该有层级的概念:network layer,web server layer,application layer,etc. 越往上的层级,收集 log 的手段越丰富,然而,对于 network layer,至少我之前一直忽视。packetbeat 使用 libpcap 直接从网卡上抓包,进行协议分析后将其存入 elasticsearch,相当于一个加强版的 wireshark。目前 packetbeat 支持 DNS,HTTP,MySQL,Postgres,MongoDB,Redis/Memcached,Thrift RPC 等协议,对于一般的 web 应用,足矣(也许还应该支持 AMQP),通过 packetbeat 你可以做一些应用层需要特殊处理才能完成的事情,比如实时发现系统中的 slow query(不管是 sql 还是 mongoDB),或者是实时网络拓扑的发现(很多复杂的服务器应用,应用的开发者都不知道某种 traffic 会经历哪些 server,做哪些事情)。
说句题外话,做网络设备的厂商,应该为自己,或者为客户开发这样的系统。为自己开发,可以用于debug,把 tcpdump 下来的数据用 ELK 可视化以发现其中的关联;为客户开发可以帮客户更好的定位潜在的风险,各个应用的瓶颈,以及更好的调试手段。
扯远了。
packetbeat 安装稍微麻烦,需要先装 libpcap:
sudo yum install libpcap
curl -L -O https://download.elastic.co/beats/packetbeat/packetbeat-1.0.1-x86_64.rpm
sudo rpm -vi packetbeat-1.0.1-x86_64.rpm
然后在 /etc/packetbeat/packetbeat.yml
中修改 elasticsearch 的地址, 然后运行即可:
$ sudo /etc/init.d/packetbeat start