前段时间大学同学聚会,一个在读的博士同学谈到他们实验室做实验时,物理服务器需要向老师申请且组内同学都共用那些机器。由于运行一些大数据和人工智能的项目比较耗费资源,且对资源环境的隔离要求比较高,因而很多时候用机器还得排队(毕竟学校经费和底层基础设施没有公司充裕),不是很方便。于是我就对他说到,为什么不尝试在公有云上面购买 VM 呢?便宜又好用,实验室每个月经费买虚拟机是绰绰有余的,同时因为公有云可以按需使用,磁盘高可用且支持动态扩容,还能在某个时刻打快照,非常适合搭项目环境使用。
朋友目前的一个实验任务是从海量分布式系统中收集操作系统、数据库、消息中间件及应用程序的日志,并利用大数据算法挖掘隐藏在数据中有潜在价值的信息。
想到可能还有更多的同学会遇到类似的问题、甚至可能是类似的任务,于是便写了本篇博客以帮助有此需要的同学,使之能够在短时间内搭建一套行之有效的数据采集系统,方便快速上手使用。
快速了解 ELK 系统
ELK-Stack 是一套开源日志采集套件,使用起来非常方便。先快速了解下每个服务是干什么的。
- Filebeat: 利用 Go 语言编写的日志文件爬取工具,所占系统的内存和 CPU 非常小。它能够实时监控指定日志目录或文件,不断追踪读取这些文件的变化,最后通过 TCP/IP 协议将日志数据发送到其它系统中进行处理。
- Logstash: 一个基于服务端的数据处理管道,由 JRuby 编写且运行在 JVM 上,主要用于日志解析、数据净化和格式化(转换成 JSON 格式)。
- Elasticsearch: 一个基于半结构化存储的全文搜索引擎,主要用于对海量日志数据进行查询、聚合统计等。数据查询利用了带有限状态转化机的倒排索引,能够在秒级查找到对应的目标。
- Kibana: 一个 Web UI 界面,能够对采集到的日志数据进行可视化展示,通过丰富的图表化展现和动态可交互的搜索功能,让海量的数据更容易被理解。
在虚拟机上搭建日志采集组件
巧妇难为无米之炊。首先,需要在滴滴云上购买一台 VM。操作系统任意选,这里我选择的是 Ubuntu 14.04。由于 ElasticSearch 需要存储采集到的日志数据,因而对存储空间要求相对较高,我选择了 100G 的磁盘;同时,因为 Logstash 会不停的解析和处理数据,所以 CPU 和内存需要适当大一点,这里我选择了 2 核 4G 内存的配置。现在让我们开始 ELK 日志系统搭建之旅。
首先安装 JDK8
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
安装完之后,执行如下命令:
update-alternatives --config java
可以看到 Java 的 HOME 目录为 /usr/lib/jvm/java-8-oracle。接着,配置 Java 环境变量,执行如下命令:
vim ~/.bashrc
在文件末尾粘贴上以下几行:
export JAVA_HOME=/usr/lib/jvm/java-8-oracl
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
为了使配置生效,还需要 source 一下:
source ~/.bashrc
最后,通过 java -version 查看 JDK 版本信息。若出现类似以下显示,则表明安装成功:
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
安装 ELK 套件
首先,通过 wget 下载 deb 包,以下命令分别下载最新版(6.5.1)的 Filebeat、Logstash、Elasticsearch 和 Kibana:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.1-amd64.deb
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.1.deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.1.deb
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.1.deb
下载完成后,会存在以下四个 deb 包:
- elasticsearch-6.5.1.deb
- filebeat-6.5.1-amd64.deb
- kibana-6.5.1-amd64.deb
- logstash-6.5.1.deb
之后,就可以通过 dpkg -i xxx.deb 命令进行安装了:
sudo dpkg -i filebeat-6.5.1-amd64.deb
sudo dpkg -i logstash-6.5.1.deb
sudo dpkg -i elasticsearch-6.5.1.deb
sudo dpkg -i kibana-6.5.1-amd64.deb
修改配置文件,让数据流打通
- 进入 /etc/filebeat 目录,修改 filebeat.yml 文件,设置要采集的日志文件路径,和要发送到的 Logstash IP 地址。由于是在同一台 VM 上混部,所以 IP 可以设置为 127.0.0.1。若 Logstash 部署在另外一台 VM 上,则需要配置那台 VM 的 IP 地址。
- type: log
enabled: false
paths:
- /home/dc2-user/userAPP/logs/*.log
exclude_lines: ['^DBG']
include_lines: ['^ERR', '^WARN']
output.logstash:
hosts: ["127.0.0.1:5044"]
Filebeat 包中已经安装了默认的索引模板(index template)。 如果你采用 filebeat.yml 文件的默认配置,即 Filebeat 直连 ElasticSearch 时,会自动上传索引模板(filebeat.template.json),该索引模板定义了索引名及如何对 Filebeat 上传的数据建立索引。但是如何需要将日志发送到 Logstash 中,则不会自动上传索引模板,必须手动上传,因此需要执行如下命令:
curl -XPUT -H 'Content-Type: application/json' http://localhost:9200/_template/filebeat-6.5.1 [email protected]
- 在 /etc/logstash/conf.d 目录下面创建 pipeline.yml,并输入如下内容:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{NUMBER:pid} %{NOTSPACE:logtype} %{NOTSPACE:logcomponent} %{GREEDYDATA:logmsg}" }
}
}
output {
elasticsearch {
hosts => [localhost:9200]
}
}
而且,需要进入到 /usr/share/logstash/bin 目录,执行如下命令安装 logstash-input-beats
插件:
./logstash-plugin install logstash-input-beats
- 进入到 /etc/elasticsearch 目录中,修改 elasticsearch.yml 文件:
# ------------------- Network ------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:#
http.port: 9200
#
# For more information, consult the network module documentation.
- 进入到 /etc/kibana 目录,修改 kibana.yml 文件。此处的 server.host 一定要配置成
0.0.0.0
:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
kibana.index: ".kibana"
最后,启动所有的服务,在 /usr/share/(elk)/bin 目录中执行启动文件,启动时注意用户权限的问题。同时记住要先启 Elasticserch,再启 Kibana,否则会报错。待准备环境都就绪之后,就可以运行 Filebeat 爬取日志数据了。此时登录到浏览器,可以通过 Kibana UI 界面检索(可视化)海量日志内容,如果需要定制化界面或者将日志数据拉出来用于其它用途,则可以调用 Elasticsearch 的 RESTful API 与之进行交互。
总结
随着分布式系统的普及,如何在众多物理服务器上采集海量日志并进行统一处理,然后利用大数据算法挖掘日志中有潜在价值的信息,变得越来越重要。
本文只是在单台 VM 上搭建了一套日志采集环境,进行演示。如果需要在分布式系统中使用,也很简单,只需将 Filebeat 独立安装在各个宿主机上就可以了。