1.应用/需求前景

(1)业务发展越来越庞⼤,服务器越来越多;
(2)各种访问⽇志、应⽤⽇志、错误⽇志量越来越多,导致运维⼈员⽆法很好的去管理⽇志;
(3)开发⼈员排查问题,需要到服务器上查⽇志,不⽅便;
(4)运营⼈员需要⼀些数据,需要我们运维到服务器上分析⽇志。

2.为什么要使用ELk

如果我们查看某些服务为什么错误,可以直接使⽤grep等命令进⾏查看,可是如果我们查看规模 较⼤,⽇志较多的时候,此⽅法效率就⼩了很多。现在我们对待⼤规模的⽇志,解决思路是建⽴ 集中式⽇志收集系统,将所有节点上的⽇志统⼀收集,管理,访问。 ⼀个完整的集中式⽇志系统,需要包含以下⼏个主要特点:
l 收集:能够采集多种来源的⽇志数据。
l 传输:能够稳定的把⽇志数据传输到中央系统。 l 存储:如何存储⽇志数据。
l 分析:可以⽀持 UI 分析。
l 警告:能够提供错误报告,监控机制。
⽽ELK则提供⼀整套的解决⽅案,并且都是开源软件,之间相互配合,完美衔接,⾼效的满⾜了 很多场合的应⽤。

3.ELK简介

1、ELK是3个开源软件的缩写,分别为Elasticsearch 、 Logstash和Kibana , 它们都是开源软 件。不过现在还新增了⼀个Beats,它是⼀个轻量级的⽇志收集处理⼯具(Agent),Beats占⽤ 资源少,适合于在各个服务器上搜集⽇志后传输给Logstash,官⽅也推荐此⼯具,⽬前由于原本 的ELK Stack成员中加⼊了Beats⼯具所以已改名为Elastic Stack。
2、Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据3⼤功能。它的特点有: 分布式,零配置,⾃动发现,索引⾃动分⽚,索引副本机制,restful⻛格接⼝,多数据源,⾃动 搜索负载等。
3、Logstash主要是⽤来⽇志的搜集、分析、过滤⽇志的⼯具,⽀持⼤量的数据获取⽅式。⼀般 ⼯作⽅式为c/s架构,Client端安装在需要收集⽇志的主机上,server端负责将收到的各节点⽇志 进⾏过滤、修改等操作在⼀并发往Elasticsearch上去。
4、Kibana也是⼀个开源和免费的⼯具,Kibana可以为 Logstash和 ElasticSearch提供的⽇志分 析友好的 Web 界⾯,可以帮助汇总、分析和搜索重要数据⽇志。
5、Beats在这⾥是⼀个轻量级⽇志采集器,其实Beats家族有6个成员,早期的ELK架构中使⽤ Logstash收集、解析⽇志,但是Logstash对内存、CPU、io等资源消耗⽐较⾼。相⽐ Logstash,Beats所占系统的CPU和内存⼏乎可以忽略不计

环境配置

1.环境准备

节点IP 节点规划 主机名
192.168.200.120 Elasticsearch+Kibana(数 据) elk-1
192.168.200.130 Elasticsearch+Logstash(数 据) elk-2
192.168.200.140 Elasticsearch(数据) elk-3

这些节点只负责成为主节点,维护整个集群的状态。 再根据数据量设置⼀批data节点【node.master: false node.data: true】
这些节点只负责存储数据,后期提供建⽴索引和查询索引的服务,这样的话如果⽤户请求⽐较频繁,这 些节点的压⼒也会⽐较⼤ 所以在集群中建议再设置⼀批client节点【node.master: false node.data:false】
这些节点只负责处理⽤户请求,实现请求转发,负载均衡等功能。 master节点:普通服务器即可(CPU 内存 消耗⼀般)
data节点:主要消耗磁盘,内存
client节点:普通服务器即可(如果要进⾏分组聚合操作的话,建议这个节点内存也分配多⼀点

2.修改主机名

使⽤hostnamectl命令修改3个主机名,以做区分:
[root@localhost ~]# hostnamectl set-hostname elk-1
[root@elk-1 ~]# reboot
[root@elk-1 ~]#
elk-2节点:
[root@localhost ~]# hostnamectl set-hostname elk-2
[root@elk-2 ~]# reboot
[root@elk-2 ~]#
elk-3节点:
[root@localhost ~]# hostnamectl set-hostname elk-3
[root@elk-3 ~]# reboot
[root@elk-3 ~]#

3.配置hosts

配置hosts文件(以elk-1为例,每个主机都要进行相同操作),命令如下:
elk-1节点:
[root@elk-1 ~]# vi /etc/hosts
[root@elk-1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.120 elk-1
192.168.200.130 elk-2
192.168.200.140 elk-3

4.安装JDK

部署ELK环境需要jdk1.8以上的JDK版本软件环境,我们使⽤opnejdk1.8,3节点全部安装(以 elk-1节点为例,每个主机都要进行相同操作),命令如下:
[root@elk-1 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
……
[root@elk-1 ~]# java -version
openjdk version “1.8.0_322”
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)

Elasticserach安装

安装Elasticserach

http://172.16.21.133/middle/project3/gpmall-single/gpmall-repo/packages/elasticsearch-6.0.0.rpm
将提供的rpm包上传⾄3台节点的/root/⽬录下,或者上传⾄⼀节点后使⽤scp进⾏拷⻉,之后使⽤ rpm命令进⾏安装,3节点全部安装:
[root@elk-1 ~]# rpm -ivh elasticsearch-6.0.0.rpm warning: elasticsearch-6.0.0.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY Preparing… ################################# [100%] Creating elasticsearch group… OK Creating elasticsearch user… OK Updating / installing… 1:elasticsearch-0:6.0.0-1 ################################# [100%] ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service
[root@elk-2 ~]# rpm -ivh elasticsearch-6.0.0.rpm warning: elasticsearch-6.0.0.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY Preparing… ################################# [100%] Creating elasticsearch group… OK Creating elasticsearch user… OK Updating / installing… 1:elasticsearch-0:6.0.0-1 ################################# [100%] ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service
[root@elk-3 ~]# rpm -ivh elasticsearch-6.0.0.rpm warning: elasticsearch-6.0.0.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY Preparing… ################################# [100%] Creating elasticsearch group… OK Creating elasticsearch user… OK Updating / installing… 1:elasticsearch-0:6.0.0-1 ################################# [100%] ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service

配置 Elasticserach

配置elasticsearch的配置⽂件,配置⽂件:/etc/elasticsearch/elasticsearch.yml elk-1节点:增加以下红⾊字样(//为解释,这⾥⽤不到的配置⽂件被删除),注意IP。 [root@elk-1 ~]# vi /etc/elasticsearch/elasticsearch.yml
[root@elk-1 ~]# cat /etc/elasticsearch/elasticsearch.yml
# ======= Elasticsearch Configuration ===========
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
# Before you set out to tweak and tune the configuration, make sure you
# understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options: # https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# —————————Cluster ——————————
# Use a descriptive name for your cluster:
cluster.name: ELK
//配置es的集群名称,默认是elasticsearch,es会⾃动发现在同⼀⽹段下的es,如果在同⼀⽹ 段下有多个集群,就可以⽤这个属性来区分不同的集群。
# ————————————Node ————————-
# Use a descriptive name for the node:
node.name: elk-1
//节点名,默认随机指定⼀个name列表中名字,该列表在es的jar包中config⽂件夹⾥name.txt ⽂件中,其中有很多作者添加的有趣名字。
node.master: true
//指定该节点是否有资格被选举成为master,默认是true,es是默认集群中的第⼀台机器为 master,如果这台机挂了就会重新选举master。
node.data: true
//指定该节点是否存储索引数据,默认为true。其他两节点为true
# ————————- Paths ———————— #
Path to directory where to store the data (separate multiple locations by comma):
path.data: /var/lib/elasticsearch
//索引数据存储位置(保持默认,不要开启注释)
# Path to log files:
path.logs: /var/log/elasticsearch
//设置⽇志⽂件的存储路径,默认是es根⽬录下的logs⽂件夹
# ———————- Network —————————
# Set the bind address to a specific IP (IPv4 or IPv6):
network.host: 192.168.200.120
//设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
# Set a custom port for HTTP:
http.port: 9200
//启动的es对外访问的http端⼝,默认9200
# For more information, consult the network module documentation.
# ——————————Discovery ————————
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is [“127.0.0.1”, “[::1]”]
#discovery.zen.ping.unicast.hosts: [“host1”, “host2”]
discovery.zen.ping.unicast.hosts: [“elk-1”,”elk-2”,”elk-3”]
//设置集群中master节点的初始列表,可以通过这些节点来⾃动发现新加⼊集群的节点。

elk-2节点:
[root@elk-2 ~]# vi /etc/elasticsearch/elasticsearch.yml
[root@elk-2 ~]# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: ELK
node.name: elk-2
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.200.130
http.port: 9200
discovery.zen.ping.unicast.hosts: [“elk-1”,”elk-2”,”elk-3”]

elk-3节点:
[root@elk-2 ~]# vi /etc/elasticsearch/elasticsearch.yml
[root@elk-2 ~]# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: ELK
node.name: elk-3
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.200.140
http.port: 9200
discovery.zen.ping.unicast.hosts: [“elk-1”,”elk-2”,”elk-3”]

启动服务

通过命令启动es服务,启动后使⽤ps命令查看进程是否存在或者使⽤netstat命令查看是否端⼝启 动。命令如下:(此处仍以elk-1为例,3个节点命令相同)
[root@elk-1 ~]# systemctl start elasticsearch
[root@elk-1 ~]# ps -ef |grep elasticsearch
elastic+ 2792 1 99 17:26 ? 00:00:07 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -cp /usr/share/elasticsearch/lib/ org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid —quiet
root 2852 2273 0 17:26 pts/0 00:00:00 grep —color=auto elasticsearch
[root@elk-1 ~]# netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:
LISTEN 1087/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0: LISTEN 2192/master
tcp6 0 0 192.168.200.120:9200 :::
LISTEN 2792/java
tcp6 0 0 192.168.200.120:9300 ::: LISTEN 2792/java
tcp6 0 0 :::22 :::
LISTEN 1087/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2192/master

有以上端⼝或者进程存在,证明es服务启动成功。

检测集群状态

[root@elk-1 ~]# curl ‘192.168.200.120:9200/_cluster/health?pretty’
{
“cluster_name” : “ELK”,
“status” : “green”,
“timed_out” : false,
“number_of_nodes” : 3,
“number_of_data_nodes” : 3,
“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

部署Kibana

安装Kibana

https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm
[root@elk-1 ~]# rpm -ivh kibana-6.0.0-x86_64.rpm
警告:kibana-6.0.0-x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中… ################################# [100%]
正在升级/安装…
1:kibana-6.0.0-1 ################################# [100%]

配置Kibana

[root@elk-1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@elk-1 ~]# systemctl start nginx
[root@elk-1 ~]# vim /etc/nginx/nginx.conf
upstream elasticsearch {
zone elasticsearch 64K;
server elk-1:9200;
server elk-2:9200;
server elk-3:9200;
}

  1. server {<br /> listen 8080;<br /> server_name 192.168.200.120;<br /> location / {<br /> proxy_pass http://elasticsearch;<br /> proxy_redirect off;<br /> proxy_set_header Host $host;<br /> proxy_set_header X-Real-IP $remote_addr;<br /> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br /> }<br /> access_log /var/log/es_access.log;<br /> }

配置Kibana的配置⽂件,配置⽂件在/etc/kibana/kibana.yml,在配置⽂件增加或修改以下内 容:
[root@elk-1 ~]# vim /etc/kibana/kibana.yml
[root@elk-1 ~]# cat /etc/kibana/kibana.yml |grep -v ^#
server.port: 5601
server.host: 111.111.0.134
elasticsearch.url: “http://111.111.0.134:8080
//注意此处的8080记得修改,否则反向代理无法实现,当你访问的不是8080时,一旦服务宕机,无法实现节点的转换。

启动Kibana

[root@elk-1 ~]# systemctl start kibana
[root@elk-1 ~]# ps -ef |grep kibana
kibana 12339 1 19 17:44 ? 00:00:01 /usr/share/kibana/bin/../node/bin/node —no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
root 12351 2273 0 17:44 pts/0 00:00:00 grep —color=auto kibana
[root@elk-1 ~]# netstat -nplt |grep node
tcp 0 0 192.168.200.120:5601 0.0.0.0:* LISTEN 12339/node
image.png

部署Logstash

安装Logstash

https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm
[root@elk-2 ~]# rpm -ivh logstash-6.0.0.rpm
警告:logstash-6.0.0.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中… ################################# [100%]
正在升级/安装…
1:logstash-1:6.0.0-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash

配置Logstash

配置/etc/logstash/logstash.yml,修改增加如下:
[root@elk-2 ~]# vim /etc/logstash/logstash.yml
http.host: “192.168.200.130”
增加logstash权限:
[root@elk-2 ~]# chmod 644 /var/log/messages
[root@elk-2 ~]# chown -R logstash:logstash /var/log/logstash/
配置logstash收集syslog⽇志:
[root@elk-2 ~]# vim /etc/logstash/conf.d/syslog.conf
input { //定义⽇志源
file {
path => “/var/log/messages” //定义⽇志来源路径 ⽬录要给644权限,不然 ⽆法读取⽇志
type => “systemlog” //定义类型
start_position => “beginning”
stat_interval => “3”
}
}
output { //定义⽇志输出
elasticsearch {
hosts =>
[“192.168.200.120:9200”,”192.168.200.130:9200”,”192.168.200.140:9200”]
index => “system-log-%{+YYYY.MM.dd}”
}
}
检测配置⽂件是否错误:
[root@elk-2 ~]# ln -s /usr/share/logstash/bin/logstash /usr/bin
//创建软链接,方便logstash命令
[root@elk-2 ~]# logstash —path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf —config.test_and_exit
Sending Logstash’s logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK
//为OK则代表语法没问题
参数解释:
—path.settings : ⽤于指定logstash的配置⽂件所在的⽬录
-f : 指定需要被检测的配置⽂件的路径
—config.test_and_exit : 指定检测完之后就退出,不然就会直接启动了

启动logstash

检查配置⽂件没有问题后,启动Logstash服务:
[root@elk-2 ~]# systemctl start logstash
使⽤命令ps,查看进程:
[root@elk-2 ~]#ps -ef |grep logstash logstash 21835 1 12 16:45 ? 00:03:01 /bin/java - XX:+UseParNewGC -XX:+UseConcMarkSweepGC - XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly - XX:+DisableExplicitGC -Djava.awt.headless=true -Dfile.encoding=UTF-8 - XX:+HeapDumpOnOutOfMemoryError -Xmx1g -Xms256m -Xss2048k - Djffi.boot.library.path=/usr/share/logstash/vendor/jruby/lib/jni - Xbootclasspath/a:/usr/share/logstash/vendor/jruby/lib/jruby.jar - classpath : -Djruby.home=/usr/share/logstash/vendor/jruby - Djruby.lib=/usr/share/logstash/vendor/jruby/lib -Djruby.script=jruby - Djruby.shell=/bin/sh org.jruby.Main /usr/share/logstash/lib/bootstrap/environment.rb logstash/runner.rb — path.settings /etc/logstash root 21957 20367 0 17:10 pts/2 00:00:00 grep —color=auto logstash
使⽤netstat命令,查看进程端⼝:
[root@elk-2 ~]# netstat -lntp
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN 1443/sshd tcp 0 0 127.0.0.1:25 0.0.0.0: LISTEN 2009/master tcp6 0 0 111.111.1.137:9200 ::: LISTEN 19365/java tcp6 0 0 :::10514 ::: LISTEN 21835/java tcp6 0 0 111.111.1.137:9300 ::: LISTEN 19365/java tcp6 0 0 :::22 ::: LISTEN 1443/sshd tcp6 0 0 ::1:25 ::: LISTEN 2009/master tcp6 0 0 111.111.1.137:9600 ::: LISTEN 21835/java

可能遇到的问题:
(1)启动服务后,有进程但是没有端⼝。⾸先查看⽇志内容:
[root@elk-2 ~]# cat /var/log/logstash/logstash-plain.log | grep que
(2)通过⽇志确定是权限问题,因为之前我们以root的身份在终端启动过Logstash,所以产⽣ 的相关⽂件的权限⽤户和权限组都是root:
[root@elk-2 ~]# ll /var/lib/logstash/
total 4
drwxr-xr-x. 2 root root 6 Dec 6 15:45 dead_letter_queue
drwxr-xr-x. 2 root root 6 Dec 6 15:45 queue
-rw-r—r—. 1 root root 36 Dec 6 15:45 uuid
(3)修改/var/lib/logstash/⽬录的所属组为logstash,并重启服务:
[root@elk-2 ~]# chown -R logstash /var/lib/logstash/
[root@elk-2 ~]# systemctl restart logstash //重启服务后即可

Kibana上查日志

部署Kibana完成后,还没有检索⽇志。现在Logstash部署完成,我们回到Kibana服务器上查看⽇ 志索引,执⾏命令如下:
[root@elk-1 ~]# curl ‘192.168.200.120:9200/_cat/indices?v’
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open system-log-2022.03.09 UeKk3IY6TiebNu_OD04YZA 5 1 938 0 816kb 412.2kb green open .kibana KL7WlNw_T7K36_HSbchBcw 1 1 1 0 7.3kb 3.6kb
获取/删除指定索引详细信息:
[root@elk-1 ~]# curl -XGET/DELETE ‘192.168.200.120:9200/system-log2022.03.09?pretty’

Web界面配置

浏览器访问192.168.200.120:5601,到Kibana上配置索引: