ELK---介绍--安装配置

ELK介绍

需求背景:

  • 业务发展越来越庞大,服务器越来越多
  • 各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
  • 开发人员排查问题,需要到服务器上查日志,不方便
  • 运营人员需要一些数据,需要我们运维到服务器上分析日志

为什么要用到ELK:

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

一个完整的集中式日志系统,需要包含以下几个主要特点:

  • 收集-能够采集多种来源的日志数据
  • 传输-能够稳定的把日志数据传输到中央系统
  • 存储-如何存储日志数据
  • 分析-可以支持 UI 分析
  • 警告-能够提供错误报告,监控机制

而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。

ELK简介:

ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。

Elastic Stack包含:

  • Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。
  • Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。
  • Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
  • Beats在这里是一个轻量级日志采集器

https://www.elastic.co/cn/

ELK架构图:

在这里插入图片描述

ELK安装准备工作

准备3台机器,这样才能完成分布式集群的实验,当然能有更多机器更好:

  • 192.168.153.140 master-node jdk es kibana
  • 192.168.153.141 data-node1 jdk es logstash
  • 192.168.153.142 date-node2 jdk es beat

然后三台机器都得关闭防火墙和selinux.

配置jdk

tar -xzvf jdk-8u211-linux-x64.tar.gz
mkdir /usr/java
mv jdk1.8.0_211/ /usr/java/jdk18

配置java环境变量

vi /etc/profile

将下列放到到/etc/profile

export JAVA_HOME=/usr/java/jdk18
export PATH=$ PATH:$JAVA_HOME/bin

让环境变量生效

source /etc/profile

测试java的环境变量是否配置好了

[root@master-node ~]# java -version
openjdk version “1.8.0_131”
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

安装es (ES集群:共同承担数据和负载的压力)

[root@master-node ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
[root@master-node ~]# rpm -ivh elasticsearch-6.0.0.rpm

配置es

elasticsearch配置文件在这两个地方,有两个配置文件:

[root@master-node ~]#  ll /etc/elasticsearch
total 16
-rw-rw---- 1 root elasticsearch 3279 May 25 16:28 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 2678 Nov 11  2017 jvm.options
-rw-rw---- 1 root elasticsearch 5091 Nov 11  2017 log4j2.properties
[root@master-node ~]# ll /etc/sysconfig/elasticsearch 
-rw-rw---- 1 root elasticsearch 1593 Nov 11  2017 /etc/sysconfig/elasticsearch

elasticsearch.yml 文件用于配置集群节点等相关信息的,elasticsearch 文件则是配置服务本身相关的配置,例如某个配置文件的路径以及java的一些路径配置什么的。

开始配置集群节点,在 192.168. 153.140上编辑配置文件:

[root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml  # 增加或更改以下内容
cluster.name: master-node  # 集群中的名称
node.name: master  # 该节点名称
node.master: true  # 意思是该节点为主节点
node.data: false  # 表示这不是数据节点
network.host: 0.0.0.0  # 监听全部ip,在实际环境中应设置为一个安全的ip
http.port: 9200  # es服务的端口号
discovery.zen.ping.unicast.hosts: ["192.168.153.140", "192.168.153.141", "192.168.153.142"]

然后到另外两台机子上编辑配置文件,修改以下几处地方:

node.name: data-node1/data-node2
node.master: false
node.data: true

完成后启动所有es服务:

systemctl start elasticsearch.service

查看进程及端口

[root@master-node ~]# ps aux |grep elasticsearch
[root@master-node ~]# netstat -lntp |grep java 
tcp6       0      0 :::9200                 :::*                    LISTEN      1843/java          
tcp6       0      0 :::9300                 :::*                    LISTEN      1843/java 

9300端口是集群通信用的,9200则是数据传输时用的。

curl查看es集群情况

集群的健康检查:

[root@master-node ~]# curl '192.168.153.140:9200/_cluster/health?pretty'
{
  "cluster_name" : "master-node",
  "status" : "green",  # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
  "timed_out" : false,  # 是否有超时
  "number_of_nodes" : 3, # 集群中的节点数量
  "number_of_data_nodes" : 2, # 集群中data节点的数量
  "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
}

查看集群的详细信息:

[root@master-node ~]# curl '192.168.153.140:9200/_cluster/state?pretty'

这个集群的状态信息也可以通过浏览器查看:http://192.168.153.140:9200/

检查没有问题后,我们的es集群就搭建完成了

安装kibana

[root@master-node ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm
[root@master-node ~]# rpm -ivh kibana-6.0.0-x86_64.rpm

安装完成后,对kibana进行配置:

[root@master-node ~]# vim /etc/kibana/kibana.yml  # 增加以下内容
server.port: 5601  # 配置kibana的端口
server.host: 192.168.153.140  # 配置监听ip
elasticsearch.url: "http://192.168.153.140:9200"  # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
logging.dest: /var/log/kibana.log  # 配置kibana的日志文件路径,不然默认是messages里记录日志

创建日志文件:

[root@master-node ~]# touch /var/log/kibana.log; chmod 777 /var/log/kibana.log

启动kibana服务,并检查进程和监听端口:

[root@master-node ~]# systemctl start kibana
[root@master-node ~]# ps aux |grep kibana
kibana     3083 36.8  2.9 1118668 112352 ?      Ssl  17:14   0:03 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
root       3095  0.0  0.0 112660   964 pts/0    S+   17:14   0:00 grep --color=auto kibana
[root@master-node ~]# netstat -lntp |grep 5601
tcp        0      0 192.168.77.128:5601     0.0.0.0:*               LISTEN      3083/node    
[root@master-node ~]# 

注:由于kibana是使用node.js开发的,所以进程名称为node

然后在浏览器里进行访问,如:http://192.168.153.140:5601 ,由于我们并没有安装x-pack,所以此时是没有用户名和密码的,可以直接访问的:

在这里插入图片描述

到此我们的kibana就安装完成了,接下来就是安装logstash,不然kibana是没法用的。

安装logstash

在192.168.153.141上安装logstash:
[root@data-node1 ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm
[root@data-node1 ~]# rpm -ivh logstash-6.0.0.rpm
安装完之后,先不要启动服务,先配置logstash收集syslog日志:
[root@data-node1 ~]# vi /etc/logstash/conf.d/syslog.conf  # 加入如下内容
input {  # 定义日志源
  syslog {
    type => "system-syslog"  # 定义类型
    port => 10514    # 定义监听端口
  }
}
output {  # 定义日志输出
  stdout {
    codec => rubydebug  # 将日志输出到当前的终端上显示
  }
}

检测配置文件是否有错:

[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./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则代表配置文件没有问题
[root@data-node1 /usr/share/logstash/bin]# 

命令说明:

  • –path.settings 用于指定logstash的配置文件所在的目录
  • -f 指定需要被检测的配置文件的路径
  • –config.test_and_exit 指定检测完之后就退出,不然就会直接启动了

配置kibana服务器的ip以及配置的监听端口:

[root@data-node1 ~]# vim /etc/rsyslog.conf (末尾添加)
#### RULES ####

*.* @@192.168.153.141:10514

重启rsyslog,让配置生效:

[root@data-node1 ~]# systemctl restart rsyslog

指定配置文件,启动logstash:

[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
# 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端

打开新终端检查一下10514端口是否已被监听:

[root@data-node1 ~]# netstat -lntp |grep 10514
tcp6       0      0 :::10514                :::*                    LISTEN      4312/java 
[root@data-node1 ~]# 

然后在别的机器ssh登录到这台机器上,测试一下有没有日志输出:

[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
...............
{
          "severity" => 6,
               "pid" => "6658",
           "program" => "avahi-daemon",
           "message" => "Registering HINFO record with values 'X86_64'/'LINUX'.\n",
              "type" => "system-syslog",
          "priority" => 30,
         "logsource" => "data-node1",
        "@timestamp" => 2019-05-29T12:14:06.000Z,
          "@version" => "1",
              "host" => "192.168.153.141",
          "facility" => 3,
    "severity_label" => "Informational",
         "timestamp" => "May 29 20:14:06",
    "facility_label" => "system"
}
................

配置logstash

以上只是测试的配置,这一步我们需要重新改一下配置文件,让收集的日志信息输出到es服务器中,而不是当前终端:

[root@data-node1 ~]# vi /etc/logstash/conf.d/syslog.conf # 更改为如下内容
input {
  syslog {
    type => "system-syslog"
    port => 10514
  }
}
output {
  elasticsearch {
    hosts => ["192.168.153.140:9200"]  # 定义es服务器的ip
    index => "system-syslog-%{+YYYY.MM}" # 定义索引
  }
}

同样的需要检测配置文件有没有错:

[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./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
[root@data-node1 /usr/share/logstash/bin]# 

没问题后,启动logstash服务,并检查进程以及监听端口:

[root@data-node1 ~]# systemctl start logstash
[root@data-node1 ~]# ps aux |grep logstash
logstash   5364  285 20.1 3757012 376260 ?      SNsl 04:36   0:34 /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 logstas/runner.rb --path.settings /etc/logstash
root       5400  0.0  0.0 112652   964 pts/0    S+   04:36   0:00 grep --color=auto logstash

我这里启动logstash后,进程是正常存在的,但是9600以及10514端口却没有被监听。

这是因为权限不够,既然是权限不够,那就设置权限即可:

[root@data-node1 ~]# chown logstash /var/log/logstash/logstash-plain.log 
[root@data-node1 ~]# ll !$
ll /var/log/logstash/logstash-plain.log
-rw-r--r-- 1 logstash root 7597 Mar  4 04:35 /var/log/logstash/logstash-plain.log

设置完权限重启服务之后,发现还是没有监听端口,依旧是权限的问题,这是因为之前我们以root的身份在终端启动过logstash,所以产生的相关文件的属组属主都是root,同样的,也是设置一下权限即可:

[root@data-node1 ~]# ll /var/lib/logstash/
total 4
drwxr-xr-x 2 root root  6 Mar  4 01:50 dead_letter_queue
drwxr-xr-x 2 root root  6 Mar  4 01:50 queue
-rw-r--r-- 1 root root 36 Mar  4 01:58 uuid
[root@data-node1 ~]# chown -R logstash /var/lib/logstash/
[root@data-node1 ~]# systemctl restart logstash

这次就没问题了,端口正常监听了,这样我们的logstash服务就启动成功了:

[root@data-node1 ~]# netstat -lntp |grep 9600
tcp6       0      0 127.0.0.1:9600          :::*                    LISTEN      9905/java
[root@data-node1 ~]# netstat -lntp |grep 10514
tcp6       0      0 :::10514                :::*                    LISTEN      9905/java
[root@data-node1 ~]# 

但是可以看到,logstash的监听ip是127.0.0.1这个本地ip,本地ip无法远程通信,所以需要修改一下配置文件,配置一下监听的ip:

[root@data-node1 ~]# vim /etc/logstash/logstash.yml
http.host: "192.168.153.141"
[root@data-node1 ~]# systemctl restart logstash
[root@data-node1 ~]# netstat -lntp |grep 9600
tcp6       0      0 192.168.77.130:9600     :::*                    LISTEN      10091/java          
[root@data-node1 ~]# 

kibana上查看日志

完成了logstash服务器的搭建之后,回到kibana服务器上查看日志,执行以下命令可以获取索引信息:

[root@master-node ~]# curl '192.168.153.140:9200/_cat/indices?v'
green  open   .kibana               qYMGl3g6Q0KCP81J6u2Fuw   1   1          4            0       38kb           19kb
green  open   system-syslog-2019.05 j5CEIUDNSmuLVWrFMfdf0w   5   1      98613            0     31.1mb         18.3mb

如上,可以看到,在logstash配置文件中定义的system-syslog索引成功获取到了,证明配置没问题,logstash与es通信正常。

获取指定索引详细信息:

[root@master-node ~]# curl -XGET '192.168.153.140:9200/system-syslog-2019.05?pretty'
{
  "system-syslog-2019.05" : {
    "aliases" : { },
    "mappings" : {
      "system-syslog" : {
        "properties" : {
          "@timestamp" : {
            "type" : "date"
          },
          "@version" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          ....................

如果日后需要删除索引的话,使用以下命令可以删除指定索引:

curl -XDELETE 'localhost:9200/system-syslog-2019.05'

es与logstash能够正常通信后就可以去配置kibana了,浏览器访问192.168.153.140:5601,到kibana页面上配置索引:

在这里插入图片描述

在这里插入图片描述

扩展

使用beats采集日志

之前也介绍过beats是ELK体系中新增的一个工具,它属于一个轻量的日志采集器,以上我们使用的日志采集工具是logstash,但是logstash占用的资源比较大,没有beats轻量,所以官方也推荐使用beats来作为日志采集工具。而且beats可扩展,支持自定义构建。

在 192.168.153.142 上安装filebeat,filebeat是beats体系中用于收集日志信息的工具:

[root@data-node2 ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm
[root@data-node2 ~]# rpm -ivh  filebeat-6.0.0-x86_64.rpm

安装完成之后编辑配置文件:

[root@data-node2 ~]# vi /etc/filebeat/filebeat.yml
# 把这两句的注释去掉
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.153.140:9200"]  # 并配置es服务器的ip地址

修改完成后就可以启动filebeat服务了:

[root@data-node2 ~]# systemctl start filebeat
[root@data-node2 ~]# ps axu |grep filebeat
root       3021  0.3  2.3 296360 11288 ?        Ssl  22:27   0:00 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
root       3030  0.0  0.1 112660   960 pts/0    S+   22:27   0:00 grep --color=auto filebeat

启动成功后,到es服务器上查看索引,可以看到新增了一个以filebeat-6.0.0开头的索引,这就代表filesbeat和es能够正常通信了:

[root@master-node ~]# curl '192.168.153.140:9200/_cat/indices?v' 
health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   nginx-test-2019.05.26     ezJiJyOdQPeuTdySeZTgVA   5   1      47253           90      8.1mb            4mb
green  open   system-syslog-2019.05     j5CEIUDNSmuLVWrFMfdf0w   5   1     188645            0     64.7mb         31.2mb
green  open   nginx-test-2019.05.27     TmqfGvL-SMO8mvb5-yDiKw   5   1         16            0     84.2kb         42.1kb
green  open   .kibana                   qYMGl3g6Q0KCP81J6u2Fuw   1   1          4            0       38kb           19kb
yellow open   filebeat-6.0.0-2019.05.29 -gGcL24gTIaDOnFtcOcsng   3   1          0            0       233b           233b
green  open   nginx-test-2019.05.29     UwPN35pySMSx-ViCc4ZQEA   5   1      89923 
0     24.1mb         12.9mb

es服务器能够正常获取到索引后,就可以到kibana上配置这个索引了:

在这里插入图片描述

在这里插入图片描述

以上这就是如何使用filebeat进行日志的数据收集,可以看到配置起来比logstash要简单,而且占用资源还少。

课后扩展

集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值