26.1 ELK入门
在日常运维工作中,对于系统和业务日志的处理尤为重要。作为运维工程师,假如管理的服务器数量并不是很多,那么不需要借助任何工具也能管理过来。但如果服务器数量非常多,而因为业务的关系,运维和开发人员常常需要通过查看日志来定位问题,很明显不借助任何工具来帮助我们管理日志是不现实的,不仅让人感觉繁琐,效率也会低下。
ELK介绍
需求背景:
1. 业务发展越来越庞大,服务器越来越多;
2. 各种访问日志、应用日志及错误日志的量也越来越多;
3. 开发人员排查问题,需要到服务器上查看日志分析解决问题,不方便;
4. 运营人员需要一些数据,需要我们运维到服务器上分析日志,不方便。
概念:
ELK 是 elastic 公司旗下三款产品ElasticSearch、Logstash、Kibana的首字母组合,也即Elastic Stack包含ElasticSearch、Logstash、Kibana、Beats
ElasticSearch是一个搜索引擎,用来搜索、分析、存储日志。它是分布式的,可以横向扩容,可以自动发现,索引自动分片
Logstash用来采集日志,把日志解析为json格式交给ElasticSearch
Kibana是一个数据可视化组件,把处理后的结果通过web界面展示
Beats是一个轻量型日志采集器
X-Pack对Elastic Stack提供了安全、警报、监控、报表、图表于一身的扩展包,是收费的
为什么要使用ELK:
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,
此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志
收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制
而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。
ELK架构:
上面是 ELK 技术栈的一个架构图,从图中可以清楚的看到数据流向:
Beats是单一用途的数据传输平台,它可以将多台机器的数据发送到 Logstash 或 ElasticSearch。但 Beats 并不是不可或缺的一环,所以本文中暂不介绍
Logstash是一个动态数据收集管道,支持以 TCP/UDP/HTTP 多种方式收集数据(也可以接受 Beats 传输来的数据),并对数据做进一步丰富或提取字段处理
ElasticSearch是一个基于 JSON 的分布式的搜索和分析引擎,作为 ELK 的核心,它集中存储数据
Kibana是 ELK 的用户界面,它将收集的数据进行可视化展示(各种报表、图形化数据),并提供配置、管理 ELK 的界面。
ELK安装准备
官网:https://www.elastic.co/cn/ ,中文文档:https://elkguide.elasticsearch.cn/
环境准备:
3台机器:lzx:192.168.100.150 ,lzx1:192.168.100.160 ,lzx2:192.168.100.170
角色划分:
3台机器都安装elasticSearch(简称es),1个主节点为lzx,2个数据节点分别是lzx1和lzx2
es主节点lzx上安装kibana,其中1台es数据节点lzx1上安装logstash,另外一台lzx2上安装beats
3台机器都要安装jdk8(openjdk也可以),关闭3防火墙和selinux
- 三台机器都编辑hosts:
# vim /etc/hosts
192.168.100.150 lzx
192.168.100.160 lzx1
192.168.100.170 lzx2
- 三台机器都安装openjdk:
# yum install -y java-1.8.0-openjdk
# which java
/usr/bin/java
es安装
- 三台机器都安装es:
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch #--import,导入密钥
# vim /etc/yum.repos.d/elastic.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install -y elasticsearch
也可以使用下载rpm包安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
rpm -ivh elasticsearch-6.0.0.rpm
es配置
elasticsearch有两个配置文件:/etc/elasticsearch
和/etc/sysconfig/elasticsearch
,配置集群我们需要配置/etc/elasticsearch
这个配置文件。
- 三台机器都要配置:
lzx
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: lzxlinux #Cluster里面添加该行,定义集群名
node.name: lzx #指定节点主机名,在Node中添加该行
node.master: true #表示是否为主节点,在Node中添加该行
node.data: false #表示是否是数据节点,在Node中添加该行
network.host: 192.168.100.150 #在Network中添加该行,监听ip
discovery.zen.ping.unicast.hosts: ["192.168.100.150","192.168.100.160","192.168.100.170"]
# 在Discovery中添加该行,定义集群中那些角色,可以写ip地址,也可以写主机名
lzx1
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: lzxlinux
node.name: lzx1
node.master: false #表示不是主节点
node.data: true #表示是数据节点
network.host: 192.168.100.160
discovery.zen.ping.unicast.hosts: ["192.168.100.150","192.168.100.160","192.168.100.170"]
lzx2
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: lzxlinux
node.name: lzx2
node.master: false #表示不是主节点
node.data: true #表示是数据节点
network.host: 192.168.100.170
discovery.zen.ping.unicast.hosts: ["192.168.100.150","192.168.100.160","192.168.100.170"]
- 全部启动es:
# systemctl start elasticsearch
# netstat -lntp |grep java
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 192.168.100.150:9200 :::* LISTEN 1305/java
tcp6 0 0 192.168.100.150:9300 :::* LISTEN 1305/java
# ls /var/log/elasticsearch/ #已经生成日志
gc.log.0.current lzxlinux_deprecation.log lzxlinux_index_search_slowlog.log
lzxlinux_access.log lzxlinux_index_indexing_slowlog.log lzxlinux.log
已经在监听9200和9300端口。
- curl查看es:
lzx上执行
# curl '192.168.100.150:9200/_cluster/health?pretty' #集群健康检查
{
"cluster_name" : "lzxlinux",
"status" : "green", #status是green就说明集群没问题,如果是yellow或red都说明有问题
"timed_out" : false,
"number_of_nodes" : 3, #3个节点
"number_of_data_nodes" : 2, #2个数据节点
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
还可以查看集群详细信息:
# curl '192.168.100.150:9200/_cluster/state?pretty' #查看集群详细信息
安装kibana
前面讲到过,kibana是一个数据可视化组件,把处理后的结果通过web界面展示,我们需要在主节点机器上安装它。
- lzx上下载安装:
# yum install -y kibana
- 修改配置文件:
# vim /etc/kibana/kibana.yml
server.port: 5601
server.host: 192.168.100.150
elasticsearch.url: "http://192.168.100.150:9200"
logging.dest: /var/log/kibana.log #指定kibana日志路径
- 启动服务:
# touch /var/log/kibana.log; chmod 777 /var/log/kibana.log
# systemctl start kibana
# ps aux |grep kibana
kibana 1062 18.9 18.2 1198292 182080 ? Dsl 21:37 0:08 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
# netstat -lntp |grep node
tcp 0 0 192.168.100.150:5601 0.0.0.0:* LISTEN 1062/node
已经在监听5601端口。
- 访问web界面:
在浏览器输入192.168.150:5601,访问web界面,因为没有安装x-pack,所以没有用户验证。
安装logstash
除了kibana之外,我们还需要安装logstash,按照之前的角色划分,这次在lzx1上操作。
- lzx1上下载安装:
# yum install -y logstash
- 编辑配置文件:
# vim /etc/logstash/conf.d/syslog.conf #写入下面内容
input {
syslog {
type => "system-syslog" #定义日志类型
port => 10514 #定义监听端口
}
} #input部分定义日志源
output {
stdout {
codec => rubydebug #表示将输出在当前屏幕显示出来
}
} #output部分定义输出位置
- 检查配置文件是否有错:
# cd /usr/share/logstash/bin/
# ls
benchmark.sh logstash logstash.lib.sh pqrepair
cpdump logstash.bat logstash-plugin ruby
dependencies-report logstash-keystore logstash-plugin.bat setup.bat
ingest-convert.sh logstash-keystore.bat pqcheck system-install
# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
# 检查配置文件是否出错。--path.settings指定配置文件所在目录;-f指定具体要检查的配置文件;--config.test_and_exit表示检查配置文件且检查完退出
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2018-09-30T22:32:30,002][INFO ][logstash.setting.writabledirectory] Creating directory {
:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}
[2018-09-30T22:32:30,030][INFO ][logstash.setting.writabledirectory] Creating directory {
:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}
[2018-09-30T22:32:34,201][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
Configuration OK #显示配置OK就说明刚刚的配置文件没问题
[2018-09-30T22:32:56,973][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
将系统日志输出到10514端口:
# vim /etc/rsyslog.conf #配置系统日志文件,在RULES下面增加一行
*.* @@192.168.100.160:10514 #*.* 表示所有类型的日志;将所有日志都输出到192.168.100.160的10514端口
- 启动服务:
# systemctl restart rsyslog #重启rsyslog服务,使配置文件生效
# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf #启动logstash服务
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2018-09-30T22:49:54,963][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-09-30T22:49:55,111][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {
:uuid=>"4923c0c7-3e8c-47d1-a484-e66a164e0d3d", :path=>"/var/lib/logstash/uuid"}
[2018-09-30T22:50:04,030][INFO ][logstash.runner ] Starting Logstash {
"logstash.version"=>"6.4.1"}
[2018-09-30T22:50:21,698][INFO ][logstash.pipeline ] Starting pipeline {
:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2018-09-30T22:50:26,644][INFO ][logstash.pipeline ] Pipeline started successfully {
:pipeline_id=>