ELK的原理与架构

一、概述

日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
而ELK是由 Elasticsearch(日志存储和搜索)、Logstash(日志收集)、Kibana(查看日志)三个开源软件的组成的一个组合体,ELK是elastic公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK又称为ELKstack。
ELK 组件在海量日志系统的运维中,可用于解决以下主要问题:- 分布式日志数据统一收集,实现集中式查询和管理

  1. 故障排查
  2. 安全信息和事件管理
  3. 报表功能

ELK工作原理展示图:
【APPServer集群】–【logstash Agent 采集器】-【ElasticSearch cluster】–.【Kibana Server】–.【Browser】
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从Es集群中查询数据生成图表,再返回给Browser。简单来说,进行日志处理分析,一般需要经过以下几个步骤:
1.将日志进行集中化管理( beats)
2.将日志格式化( logstash)
3.对格式化后的数据进行索引和存储(elasticsearch)
4.前端数据的展示(kibana)

要收集哪些日志
1)系统日志——》为监控做准备
2)服务日志
1、数据库—》mysql—》慢查询日志、错误日志、普通日志
2、tomcat,因为log4j是java开发的
3)业务日志——》log4j
日志收集后,如何展示(可视化)

  1. kibana
  2. grafana
    日志收集展示出来后,怎么使用啊
    1)给与大数据分析,做为立体化展示的数据源
    2)给研发使用(排障、解决bug等等)
    3)统计数据流量、做为分析报告的数据源

二、优点

  1. 处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能 (支持任意key全文搜索)
  2. 配置相对简单:elasticsearch的API全部使用JSON接口,logstash使用模块配置,kibana的配置文件部分更简单。
  3. 检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
  4. 集群线性扩展:elasticsearch和logstash都可以灵活线性扩展,节点读写出现瓶颈可以扩容(3 5 7 11个服务器)
  5. 前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单(早期比较简单)

三、Elasticsearch

一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。
Elasticsearch使用Java语言开发,是建立在全文搜索引擎ApacheLucene基础之上的搜索引擎,
Elasticsearch的特点:

  1. 实时搜索、实时分析
  2. 分布式架构、实时文件存储
  3. 文档导向,所有对象都是文档
  4. 高可用,易扩展,支持集群,分片与复制
  5. 接口友好,支持json
    默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片
    激活Windows
    和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

四、Logstash

Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。

五、kibana

Kibana 为 elasticsearch 提供一个查看数据的 web 界面,其主要是通过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。

六、搭建

1、环境搭建

192.168.133.50 host1
192.168.133.100 host2
192.168.133.75 web

systemctl stop firewalld
setenforce 0
hostname host1                                                  host1上执行
su
hostname host2                                                  host2上执行
su
hostname web                                                    web上执行
su
echo "192.168.133.50 host1
192.168.133.100 host2
192.168.133.75 web">> /etc/hosts

在这里插入图片描述
在这里插入图片描述

2、搭建时间同步:

2.1、主服务器设置

[root@host1 ~]# yum install ntp -y
[root@host1 ~]# vim /etc/ntp.conf

在这里插入图片描述
改成
在这里插入图片描述

[root@host1 ~]# service ntpd start
Redirecting to /bin/systemctl start ntpd.service

2.2、从服务器设置

[root@host2 ~]# yum install ntpdate -y
[root@host2 ~]# service ntpd start
Redirecting to /bin/systemctl start ntpd.service
[root@host2 ~]# /usr/sbin/ntpdate 192.168.133.75
16 Dec 11:40:08 ntpdate[42044]: the NTP socket is in use, exiting
[root@localhost mysql]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

在这里插入图片描述

[root@host2 ~]# crontab -l
*/10 * * * * /usr/sbin/ntpdata 192.168.133.75

3、安装

host1和host2上操作,只展示host1上的操作

3.1、安装包elasticsearch-5.5.0.rpm

[root@host1 ~]# cd /opt

在这里插入图片描述

rpm -ivh elasticsearch-5.5.0.rpm

在这里插入图片描述

[root@host1 opt]# cd /etc/elasticsearch/
[root@host1 elasticsearch]# cp elasticsearch.yml{,.bak}
[root@host1 elasticsearch]# vim elasticsearch.yml
 17 #cluster.name: my-application                                  开启并修改集群名字17 cluster.name: zy-elk
23 #node.name: node-1                                         开启并改成主机名两台机器分别改23 node.name:host1                                               host1上改
23 node.name:host2                                               host2上改
33 #path.data: /path/to/data                               开启设置数据目录需要新建并给权限33 path.data: /data/elk_data
37 #path.logs: /path/to/logs                                  开启并修改日志文件路径37 path.logs: /var/log/elasticsearch/
43 #bootstrap.memory_lock: true                               内存锁取消43 bootstrap.memory_lock: false
55 #network.host: 192.168.0.1                                  开启并更改监听端口55 network.host: 0.0.0.0
59 #http.port: 9200                                              开启端口59 http.port: 9200
68 #discovery.zen.ping.unicast.hosts: ["host1", "host2"]           自动集群发现,加入主机名68 discovery.zen.ping.unicast.hosts: ["host1", "host2"]

在这里插入图片描述
在这里插入图片描述

[root@host1 elasticsearch]# mkdir -p /data/elk_data
[root@host1 elasticsearch]# chown -R elasticsearch.elasticsearch /data/elk_data/
[root@host1 elasticsearch]# systemctl enable --now elasticsearch.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@host1 elasticsearch]# netstat -ntap|grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      39393/java 

这时可以在客户机上打开http://192.168.133.50:9200
在这里插入图片描述
客户机上打开http://192.168.133.100:9200
在这里插入图片描述
http://192.168.133.50:9200/_cluster/health?pretty
这里可显示状态为正常
在这里插入图片描述
http://192.168.133.50:9200/_cluster/state?pretty

3.2、安装Elasticsearch-head插件

Elasticsearch在5.0 版本后,Elasticsearch-head插件需要作为独立服务进行安装,需要使用npm.工具(Wodeas的包管理T具)安装。安装 Elasticsearch-head 需要提前安装好依赖软件node 和 phantomjs。
node:是一个基于 Chrome v8引擎的 JavaScript运行环境。
phantomjs:是一个基于websit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于webkit浏览器做的事情,它都可以做到。

1、安装node

[root@host1 elasticsearch]# yum install gcc gcc-c++ make -y
[root@host1 opt]# ls

在这里插入图片描述

[root@host1 opt]# tar xf node-v8.2.1.tar.gz
[root@host1 opt]# cd node-v8.2.1/
[root@host1 node-v8.2.1]# ./configure
[root@host1 node-v8.2.1]# make && make install

2、安装phantomjs

在这里插入图片描述

[root@host1 opt]# tar xf phantomjs-2.1.1-linux-x86_64.tar.bz2  -C /usr/local/src/  解压到指定目录
[root@host1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/           进入目录
[root@host1 phantomjs-2.1.1-linux-x86_64]# ln -s /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/* /usr/local/bin/

3、安装elasticsearch-head

在这里插入图片描述

[root@host1 opt]# tar zxvf elasticsearch-head.tar.gz  -C /usr/local/src/
[root@host1 opt]# cd /usr/local/src/elasticsearch-head/
[root@host1 ~]# vi /etc/elasticsearch/elasticsearch.yml                      末尾增加2行

在这里插入图片描述

http.cors.enabled: true
#开启跨域访问支持,默认是false
http.cors.allow-origin: "*"
#指定跨域访问允许的域名地址为所有
[root@host1 elasticsearch-head]# systemctl restart elasticsearch
[root@host1 ~]# systemctl status elasticsearch

在这里插入图片描述

4、启动服务器

[root@host1 elasticsearch-head]# cd /usr/local/src/elasticsearch-head/
[root@host1 elasticsearch-head]# npm run start &

在这里插入图片描述
在这里插入图片描述
这时可以去打开192.168.133.50:9100
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在host1上创建一个索引索引为index-demo,类型为test,可以看到成功创建

[root@host1 elasticsearch-head]#  curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"ceshi","mesg":"hello elk"}'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点开后可看到详细信息
在这里插入图片描述

4、ELK Logstash 部署(在web节点上操作)

[root@web ~]# yum install httpd -y
[root@web ~]# systemctl start httpd
[root@web ~]# cd /opt

在这里插入图片描述

[root@web opt]# rpm -ivh logstash-5.5.1.rpm
[root@web opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

在这里插入图片描述

4.1、logstash(Apache)与elasticsearch(node)功能是否正常,做对接测试

Logstash这个命令测试
字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是“空”则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出

[root@web opt]# logstash -e 'input { stdin{} } output { stdout{} }'

在这里插入图片描述

4.2、使用rubydebug显示详细输出,codec为一种编解码器

[root@web opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

在这里插入图片描述

4.3、使用logstash将信息写入elasticsearch中 输入 输出 对接

[root@web opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.133.50:9200"] } }'

在这里插入图片描述

4.4、logstash配置文件

[root@web opt]# ll /var/log/messages 

在这里插入图片描述

[root@web opt]# chmod o+r /var/log/messages              给其它用户(Other Users)增加可读

在这里插入图片描述

[root@web opt]# vi /etc/logstash/conf.d/system.conf
input {
    
    
       file{
    
    
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
        }
      }
output {
    
    
        elasticsearch {
    
    
          hosts => ["192.168.133.50:9200"]
          index => "system-%{+YYYY.MM.dd}"
          }
        }

在这里插入图片描述
位置确定

[root@web opt]# vi /etc/logstash/logstash.yml 

在这里插入图片描述

[root@web opt]# systemctl restart logstash.service

到192.168.133.50:9100查看就可以看到我们刚刚查到的日志了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
登录192.168.133.50 host1主机
在host1主机安装kibana

[root@host1 ~]# cd /usr/local/src

在这里插入图片描述

[root@host1 src]#  rpm -ivh kibana-5.5.1-x86_64.rpm
[root@host1 kibana]# cp kibana.yml kibana.yml.bak
[root@host1 kibana]#  vi /etc/kibana/kibana.yml
 2 #server.port: 5601                                                                                             kibana打开的端口开启
改
2 server.port: 5601
7 #server.host: "localhost"                                                                                   监听端口开启并修改
改
7 server.host: "0.0.0.0"
21 #elasticsearch.url: "http://localhost:9200"                                                      开启并修改和elasticsearch建立联系
改
21 elasticsearch.url: "http://192.168.133.50:9200"
30 #kibana.index: ".kibana"                                                                      在elasticsearch中添加.kibana索引
开启
30 kibana.index: ".kibana"
[root@host1 kibana]# systemctl start kibana.service
[root@host1 kibana]# systemctl status kibana.service

在这里插入图片描述

然后在客户机上打开http://192.168.133.50:5601

在这里插入图片描述
可以根据之前的索引键进行创建
在这里插入图片描述
创建完毕后就可以查看了
在这里插入图片描述
在这里插入图片描述

4.5、对接Apache主机的Apache 日志文件(访问的、错误的)

[root@web ~]# cd /etc/logstash/conf.d/
[root@web conf.d]# touch apache_log.conf
[root@web conf.d]# vi apache_log.conf
input {
       file{
        path => "/etc/httpd/logs/access_log"
        type => "access"
        start_position => "beginning"
        }
       file{
        path => "/etc/httpd/logs/error_log"
        type => "error"
        start_position => "beginning"
        }
        
      }
output {
        if [type] == "access" {
        elasticsearch {
          hosts => ["192.168.133.50:9200"]
          index => "apache_access-%{+YYYY.MM.dd}"
          }
        }
        if [type] == "error" {
        elasticsearch {
          hosts => ["192.168.133.50:9200"]
          index => "apache_error-%{+YYYY.MM.dd}"
          }
        }
        }

在这里插入图片描述

[root@web conf.d]# pwd
/etc/logstash/conf.d
[root@web conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf                       在此文件夹下运行

在这里插入图片描述
登录192.168.133.75 web主机 不然无法显示access日志
在这里插入图片描述
这样在192.168.133.50:9200上既可以看到这两个索引了
在这里插入图片描述
也可以创建索引进行查看
在这里插入图片描述

七、elk架构选择

1、普通版

鉴于正常logstash放在服务器上,有可能线程过多,占用资源
我们可以把logstash单独放一个服务器作为日志服务器
日志分割周期性进行传递
NFS挂载
rsync(数据量小的时候用,或者和NFS搭配)

2、升级版

logstash只做格式化过滤和输出
加入filebeat收集放在服务器上
logstash做集群化,多个logstash
或者在
filebeat和logstash中加入一些中间件
比如redis作用汇聚
MQ消息代理kafka

猜你喜欢

转载自blog.csdn.net/yan_0916/article/details/122229605