title: ELK系列之一:安装和基本使用
categories: Linux
tags:
- ELK
timezone: Asia/Shanghai
date: 2019-02-02
ELK介绍
需求背景:
业务发展越来越庞大,服务器越来越多
各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
开发人员排查问题,需要到服务器上查日志,不方便
运营人员需要一些数据,需要我们运维到服务器上分析日志
为什么要用到ELK:
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。
但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,
面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。
需要集中化的日志管理,所有服务器上的日志收集汇总。
常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,
大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,
构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制
ELK简介:
ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。
不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent)
Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,
目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。
为什么被采集端使用 Filebeat ,而不用原来的 Logstash 呢?
原因很简单,资源消耗比较大。
由于 Logstash 是跑在 JVM 上面,资源消耗比较大
后来作者用 GO 写了一个功能较少但是资源消耗也小的轻量级的 Agent 叫 Logstash-forwarder。
后来作者加入 elastic.co 公司, Logstash-forwarder 的开发工作给公司内部 GO 团队来搞,最后命名为 Filebeat。
Filebeat 需要部署在每台应用服务器上,可以通过 Salt 来推送并安装配置。
整体架构
Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。
Kibana :可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。
Logstash :数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。
Filebeat:轻量级数据收集引擎。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。
环境
[root@centos181002 httpd]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@centos181001 home]# java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
Elastic Stack 6.6.0
第一步:系统初始化设置
1.关闭系统默认防火墙(支持REHL\CentOS6和7)
setenforce 0
sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
which systemctl && systemctl stop firewalld
which systemctl && systemctl disable firewalld
which systemctl && systemctl stop iptables || service iptables stop
which systemctl && systemctl disable iptables || chkconfig iptables off
2.安装JDK环境
Elasticsearch requires Java 8 or later. Use the official Oracle distribution or an open-source distribution such as OpenJDK.
官方建议使用Oracle JDK1.8.0.131或更高,这里我们使用的是1.8.0.192
# 解压并重命名
tar vxf jdk-8u192-linux-x64.tar.gz
mv jdk1.8.0_192 jdk
# 修改环境变量并提前备份原始文件
/bin/grep 666666 /etc/profile && /bin/cp /etc/profile.666666 /etc/profile || /bin/cp /etc/profile /etc/profile.666666
cat <<EOF >>/etc/profile
export JAVA_HOME=/home/jdk
export CLASSPATH=.:\${JAVA_HOME}/jre/lib/rt.jar:\${JAVA_HOME}/lib/dt.jar:\${JAVA_HOME}/lib/tools.jar
export PATH=\$PATH:\${JAVA_HOME}/bin
EOF
source /etc/profile
第二步:安装Elasticsearch
配置文件:/etc/elasticsearch/
启动日志:/var/log/messages
默认日志:/var/log/elasticsearch
官方安装说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
1.下载并安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
rpm -ivh elasticsearch-6.6.0.rpm
2.修改配置文件
# 1.修改监听IP和监听端口
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml
network.host: 11.11.11.61
http.port: 9200
# 2.为elasticsearch设置jdk路径,否则启动时候会报错
cp /etc/sysconfig/elasticsearch /etc/sysconfig/elasticsearch.bak
vim /etc/sysconfig/elasticsearch
JAVA_HOME=/home/jdk
3.启动服务
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service
4.检查程序是否正常运行。
# 1.查看服务状态是否正常
systemctl status elasticsearch.service
# 2.查看监听端口是否正常(elasticsearch会监听9200和9300两个端口)
# 虽然我们这里是单机模式,不过9300一样会正常监听
# 9200则是数据传输时用的
# 9300端口是集群通信用的
netstat -lntp |grep java
# 3.查看进程是否正常
ps aux | grep elasticsearch
# 4.检查9200端口返回状态
# 也可以通过浏览器此地址测试:http://11.11.11.61:9200/
curl -X GET "11.11.11.61:9200/"
[root@centos181001 elasticsearch]# curl -X GET "11.11.11.61:9200/"
{
"name" : "iI1f5lo",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "1QFZh0mDQHWmW5uJJnXixw",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
使用浏览器显示出来的也是一堆字符串,我们希望这些信息能以图形化的方式显示出来,那就需要安装kibana来为我们展示这些数据了。
第三步:安装Kibana
配置文件:/etc/kibana/
官方安装说明:https://www.elastic.co/guide/en/kibana/6.6/index.html
1.下载并安装
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.0-x86_64.rpm
rpm -ivh kibana-6.6.0-x86_64.rpm
2.修改配置文件
# 1.修改Kibana服务监听IP、监听端口、配置elasticsearch地址
# elasticsearch为es服务器的ip,如果是集群则配置该集群中主节点的ip
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "11.11.11.61"
elasticsearch.hosts: ["http://11.11.11.61:9200"]
3.启动并设置开机自动启动
systemctl enable kibana
systemctl stop kibana
systemctl start kibana
systemctl status kibana
4.检查程序是否正常
# 1.检查默认监听端口
# 由于kibana是使用node.js开发的,所以进程名称为node
netstat -lntp |grep 5601
# 2.查看进程
ps aux | grep kibana
5.打开浏览器访问管理页面
打开浏览器里进行访问,由于我们并没有安装x-pack,所以此时是没有用户名和密码的,可以直接访问的。
到此我们的kibana就安装完成了,很简单,接下来就是安装logstash,不然kibana是没法用的。
http://11.11.11.61:5601
到此我们的kibana就安装完成了,很简单,接下来就是安装logstash,不然kibana是没法用的。
第四步:安装Logstash
程序如果启动错误或者端口没有正常监听,可以到/var/log/message查看日志
1.下载安装
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.rpm
rpm -ivh logstash-6.6.0.rpm
2.安装以后先不要启动服务,先配置Logstash收集syslog日志并测试
1.创建文件并编辑
cat <<EOF >/etc/logstash/conf.d/syslog.conf
input { # 定义日志源
syslog {
type => "system-syslog" # 定义类型
port => 10514 # 定义监听端口
}
}
output { # 定义日志输出
stdout {
codec => rubydebug # 将日志输出到当前的终端上显示
}
}
EOF
cat /etc/logstash/conf.d/syslog.conf
2.检查配置文件是否有错误
/usr/share/logstash/bin/logstash \
--path.settings /etc/logstash/ \
-f /etc/logstash/conf.d/syslog.conf \
--config.test_and_exit
--path.settings 用于指定logstash的配置文件所在的目录
-f 指定需要被检测的配置文件的路径
--config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
# 显示Configuration OK代表配置没问题
[root@centos181001 conf.d]# /usr/share/logstash/bin/logstash \
> --path.settings /etc/logstash/ \
> -f /etc/logstash/conf.d/syslog.conf \
> --config.test_and_exit
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2019-02-02T03:06:08,558][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}
[2019-02-02T03:06:08,582][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}
[2019-02-02T03:06:09,714][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
Configuration OK
[2019-02-02T03:06:21,137][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
3.配置kibana服务器的ip以及配置的监听端口:
# 1.编辑并在#### RULES ####位置增加以下行(IP地址为本机监听IP地址和端口)
vim /etc/rsyslog.conf
*.* @@11.11.11.61:10514
# 2.重启rsyslog,让配置生效
systemctl restart rsyslog
4.指定配置文件,启动logstash测试
/usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
# 等待出现以下信息
[root@centos181001 conf.d]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2019-02-02T03:16:57,098][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2019-02-02T03:16:57,192][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.6.0"}
[2019-02-02T03:16:57,259][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"b98c03ce-ca73-4b08-a392-653913d80883", :path=>"/var/lib/logstash/uuid"}
[2019-02-02T03:17:11,739][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2019-02-02T03:17:12,794][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x1b532bc9 run>"}
[2019-02-02T03:17:12,892][INFO ][logstash.inputs.syslog ] Starting syslog udp listener {:address=>"0.0.0.0:10514"}
[2019-02-02T03:17:12,913][INFO ][logstash.inputs.syslog ] Starting syslog tcp listener {:address=>"0.0.0.0:10514"}
[2019-02-02T03:17:13,011][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-02-02T03:17:13,751][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
5.检查10514端口是否已被监听
netstat -antp | grep 10514
6.用另外机器ssh登录到这台服务器,看看是否有日志输出
应该可以看到很多以JSON的格式打印的收集到的日志
3.配置Logstash
以上只是测试的配置,这一步我们需要重新改一下配置文件,让收集的日志信息输出到es服务器中,而不是当前终端
1.编辑配置文件
cat <<EOF >/etc/logstash/conf.d/syslog.conf
input {
syslog {
type => "system-syslog"
port => 10514
}
}
output {
elasticsearch {
hosts => ["11.11.11.61:9200"] # 定义es服务器的ip
index => "system-syslog-11.11.11.61-%{+YYYY.MM}" # 定义索引
}
}
EOF
cat /etc/logstash/conf.d/syslog.conf
2.为Logstash手动指定JAVA_HOME,否则启动程序会报错
cp /usr/share/logstash/bin/logstash.lib.sh /usr/share/logstash/bin/logstash.lib.sh.bak
vim /usr/share/logstash/bin/logstash.lib.sh
JAVA_HOME=/home/jdk
3.检测配置文件是否有错误
/usr/share/logstash/bin/logstash \
--path.settings /etc/logstash/ \
-f /etc/logstash/conf.d/syslog.conf \
--config.test_and_exit
4.将以下两个文件夹所有者改为logstash,否则启动的时候会因为没有权限报错
chown -R logstash:logstash /var/log/logstash/
chown -R logstash:logstash /var/lib/logstash/
5.修改Logstash默认监听IP
cp /etc/logstash/logstash.yml /etc/logstash/logstash.yml.bak
vim /etc/logstash/logstash.yml
http.host: "11.11.11.61"
4.测试OK后启动并设置开机自动启动
systemctl enable logstash
systemctl stop logstash
systemctl start logstash
systemctl status logstash
5.检查是否是否正常启动
# 1.检查进程
ps aux |grep logstash
# 2.查看服务状态
systemctl status logstash
# 3.查看监听端口
netstat -antp | grep -E '9600|10514'
6.可以使用以下命令查看索引
curl '11.11.11.61:9200/_cat/indices?v'
# 这里可以看到上边我们配置的:
# index => "system-syslog-11.11.11.61-%{+YYYY.MM}" # 定义索引
第五步:登录Kibana查看
到这里我们已经可以实现了将本地的message日志归档并可使用Kibana查看
1.登录Kibana
http://11.11.11.61:5601
2.需要设置索引才能够查看。
- Management
- Create index pattern
- 选择刚才添加索引名称,可以使用通配符,比如:system-syslog*,然后点击【Next step】
- 选择【@timestamp】后点击【Create index pattern】
3.查看日志
- Discover
在这里可以跟在搜索框里搜索任意想要查找的日志内容。
第六步:使用Filebeat采集日志
之前也介绍过beats是ELK体系中新增的一个工具,它属于一个轻量的日志采集器,以上我们使用的日志采集工具是logstash,但是logstash占用的资源比较大,没有beats轻量,所以官方也推荐使用beats来作为日志采集工具。而且beats可扩展,支持自定义构建。
这里我们新增一台测试服务器11.11.11.62来安装Filebeat并将日志发送到ES服务器
1.关闭系统默认防火墙(支持REHL\CentOS6和7)
setenforce 0
sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
which systemctl && systemctl stop firewalld
which systemctl && systemctl disable firewalld
which systemctl && systemctl stop iptables || service iptables stop
which systemctl && systemctl disable iptables || chkconfig iptables off
2.下载安装
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-x86_64.rpm
rpm -ivh filebeat-6.6.0-x86_64.rpm
3.测试配置
1.先将配置文件备份
cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak
2.过滤掉#开头的备注内容和空行,方便修改查看
cat /etc/filebeat/filebeat.yml.bak | grep -v '^#' | grep -v '^ #' | grep -v '^$' > /etc/filebeat/filebeat.yml
3.修改配置文件
[root@centos181002 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
# 本行注释掉
# enabled: false
# 这里是日志路径可以有多条
paths:
# - /var/log/*.log
- /var/log/messages
#- c:\programdata\elasticsearch\logs\*
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
# 这里先注释掉,设定输出到控制台先测试
#output.elasticsearch:
# hosts: ["localhost:9200"]
# 新增这里,让日志输出到控制台,以测试
output.console: # 指定在终端上输出日志信息
enable: true
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
4.修改完以上配置后执行以下命令,查看是否有日志输出,终端内有打印日志说明配置正常
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml
4.修改为正式配置文件并启动程序
1.修给配置文件为以下内容
[root@centos181002 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
# 本行注释掉
# enabled: false
# 这里是日志路径可以有多条
paths:
# - /var/log/*.log
- /var/log/messages
#- c:\programdata\elasticsearch\logs\*
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
# 这里设定ES服务器地址
output.elasticsearch:
hosts: ["11.11.11.61:9200"]
# 新增这里,让日志输出到控制台,以测试,测试部分注释掉
#output.console: # 指定在终端上输出日志信息
# enable: true
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
2.启动Filebeat服务并设置开机自动启动
systemctl enable filebeat
systemctl stop filebeat
systemctl start filebeat
systemctl status filebeat
3.查看服务是否正常
# 1.查看服务状态
systemctl status filebeat
# 2.查看进程
ps aux | grep filebeat
# 3.查看ES服务器上是否新增了一个以filebeat-6.0.0开头的索引
# 这就代表filesbeat和es能够正常通信了
curl '11.11.11.61:9200/_cat/indices?v'
4.登录ES管理页面,配置索引,并查看日志。
- 登录页面:http://11.11.11.61:5601
- Management
- Index Patterns
- Create index pattern
- 填写Index pattern(索引模式,支持通配符,比如:filebeat-6.6.0*)后【Next step】
- Time Filter field name选择【@timestamp】后点击【Create index pattern】
- 到Discover可以查看系统收集到的日志。
5.在以上基础上增加httpd日志搜集
因为filebeat日志路径是支持多条的,所以这里只需要将需要采集的日志路径填入配置文件即可。
1.安装httpd
yum install -y httpd
2.修改filebeat配置文件以搜集httpd日志
httpd默认日志路径:/var/log/httpd/
vim /etc/filebeat/filebeat.yml
在paths:处增加以下内容:
- /var/log/httpd/
3.重启Filebeat服务并启动httpd服务
systemctl stop filebeat
systemctl start filebeat
systemctl start httpd
systemctl status filebeat httpd
4.打开浏览器访问httpd服务,并到ES服务器查看是否有httpd日志被采集。
第六步:汉化
作者主页:https://github.com/anbai-inc
结语:到这里ELK的架设和简单使用基本OK,更深入的使用和其他内容将抽时间继续整理。
附录:
所用到离线包下载:https://pan.baidu.com/s/16uVQL-d5HdgjajzCpY2e3g
官方安装:https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
中文官网:https://www.elastic.co/cn/products
ELKstack中文指南:https://elkguide.elasticsearch.cn/logstash/examples/nginx-access.html
不错的文章(亿级 ELK 日志平台构建实践):http://blog.51cto.com/13527416/2117141
搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群:http://blog.51cto.com/zero01/2079879
搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器:http://blog.51cto.com/zero01/2082794