ELK学习
一、是什么
- Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
- Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志
二、什么场景用
通常当系统发生故障时,工程师需要登录到各个服务器上,使用 grep / sed / awk 等 Linux 脚本工具去日志里查找故障原因。在没有日志系统的情况下,首先需要定位处理请求的服务器,如果这台服务器部署了多个实例,则需要去每个应用实例的日志目录下去找日志文件。每个应用实例还会设置日志滚动策略(如:每天生成一个文件),还有日志压缩归档策略等。
这样一系列流程下来,对于我们排查故障以及及时找到故障原因,造成了比较大的麻烦。因此,如果我们能把这些日志集中管理,并提供集中检索功能,不仅可以提高诊断的效率,同时对系统情况有个全面的理解,避免事后救火的被动。
总的来说有一下三点
- 数据查找:通过检索日志信息,定位相应的 bug,找出解决方案。
- 服务诊断:通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态
- 数据分析:可以做进一步的数据分析。
三、相对于同类型的软件的优势
FileBeat 是一个轻量级的日志收集系统,占用的资源比较少,但是无法进行格式转发,,但是它可以借用filed进行格式转换,转换为els能识别的格式
Logstash 是可以直接进行日志格式转换的,转换为els能识别的格式
内容介绍部分
ELK 就是三个组成的日志分析架构,Elasticsearch,Logstash,Kibana
简单的架构图
App Server 代表的是你的需要收集的服务器的路径
Logstash Agent是去搜集这些日志的
ElasticSearch Cluster是负责中专服务和存储的
Kibana Server是去提供的日志分析友好的 Web 界面
重点———注意了,这里els想要有序且快速的被kibana传输,可以借用一个叫kafka的中间件
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
PV—指的是一个用户每打开一个网站网页就会生成一个pv
swap分区是在硬盘上的,一旦数据交换到这个是上面那么可定就会变的很慢,所以要么不做这个分区,要么就定期去清理里面的数据
常见的问题::优化,一个是高并发的时候,如何增加你的线程和进程。二个是如何去管理你的swap分区,也就是缓存如何优化
三个就是如何确保你的安全优化。四、高并发的时候数据库往往会出现死锁的现象,你如何去冲破死锁的限制。
1、elasticsearch介绍
它是提供了一个分布式多用户能力的全文搜索引擎
核心概念有
—接近实时
—集群
—节点
—索引
++++索引(库)----类型(表)----文档(记录)
分片和副本
2、Logstash介绍
它是一款强大的数据处理工具,可以实现数据传输,格式处理,格式输出,数据输入,数据加工(如过滤,改写)以及数据输出
3、Kibaba主要功能
它是一个wab页面的展示形式,有下面的优点
—和elasticsearch无缝之集成
—整合数据,复杂数据分析
—让更多团队成员受益
—接口灵活,分享更容易
—配置简单,可视化多数据源
—简单数据导出
实验篇
1、实验设计
1、地址规划
节点 | 组件 | centos 7.4 |
---|---|---|
10.4.7.11 | elasticsearch,kibaba | node1 |
10.4.7.12 | elasticsearch | node2 |
10.4.7.21 | logstash | apache |
2、实验拓扑图
3、需求描述
配置ELK日志分析集群,使用Logstash收集日志,使用Kibaba查看分析日志
4、准备安装环境
关闭防火墙和selinux、node1和node2节点板内存分配4G,apache节点最少分配1g内存
2、开始实验
说明:关闭防火墙核心防护和配置yum仓库等不在操作了
systemctl status firewalld
setenforce 0
hostnamectl set-hostname node
vi /etc/hosts
添加
10.4.7.11 node1
10.4.7.12 node2
检查自带的java环境
[root@node2 ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
1、将ela的rpm放到node1和2的root下然后安装
[root@node1 ~]# ll
总用量 32616
-rw-r--r--. 1 root root 33396354 8月 11 2017 elasticsearch-5.5.0.rpm
[root@node1 ~]#
2、安装服务,并重新加载,设置开机自启
[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@node1 ~]# cd /etc/elasticsearch/
3、修改配置文件
[root@node1 ~]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml
省略部分内容
cluster.name: my-elk-cluster ##集群名字17
node.name: node1 ##节点名字23
path.data: /data/elk_data ##数据存放路径33
path.logs: /var/log/elasticsearch/ ##日志存放路径37
bootstrap.memory_lock: false ##不在启动的时候锁定内存:锁定物理内存防止es内存被交换出去43
network.host: 0.0.0.0 ##提供服务绑定ip地址 0.0.0.0代表所有地址55
http.port: 9200 ##侦听端口为9200 59
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
4、创建数据存放路径并授权,然后启动
[root@node1 elasticsearch]# mkdir -p /data/elk_data
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk_data
[root@node1 elasticsearch]# id elasticsearch
uid=987(elasticsearch) gid=981(elasticsearch) 组=981(elasticsearch)
[root@node1 elasticsearch]# systemctl start elasticsearch.service
[root@node1 elasticsearch]# netstat -luntp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 22764/java
5、查看节点信息,用真机
10.4.7.11:9200,,有下面节点信息
6、对节点2 进行操作
[root@node2 ~]# scp 10.4.7.11:/etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
[root@node2 ~]# vim /etc/elasticsearch/elasticsearch.yml
省略部分内容
node.name: node2 ##更改下
[root@node2 ~]# mkdir -p /data/elk_data
[root@node2 ~]# chown elasticsearch.elasticsearch /data/elk_data
[root@node2 ~]# systemctl restart elasticsearch.service
[root@node2 ~]# netstat -lunt |grep 9200
tcp6 0 0 :::9200 :::* LISTEN
[root@node2 ~]#
7、检查集群健康和状态
在真机浏览器上打开http://10.4.7.12:9200/_cluster/health?pretty
进行集群信息检查-http://10.4.7.12:9200/_cluster/state?pretty
这里有一点要注意9300是内部数据的端口 9200是外部数据端口
3、在node节点上安装插件elasticsearch-head
安装后会有图形化界面展示
[root@node1 ~]# yum -y install gcc gcc-c++ make
1、编译安装node依赖包
首先将包传到两个node节点,,两边一样这里以一边为例
[root@node1 opt]# tar zxf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3
[root@node1 node-v8.2.1]# make install
2、安装phantomjs前端架构
上传软件包到/root 两边一样的,这里我以一边为例子
[root@node1 ~]# tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 ~]# /root/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin/
3、安装elasticsearch-head数据的可视化工具
上传软件包放在/root 上面,两边一样这里以一边为例
[root@node1 ~]# tar zxf elasticsearch-head.tar.gz
[root@node1 ~]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
up to date in 16.732s
[root@node1 elasticsearch-head]#
4、修改主配置文件
两边一样的,这里以一边为例
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml ##末行添加2行
[root@node1 ~]# tail -3 /etc/elasticsearch/elasticsearch.yml
#
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##跨域访问允许的域名地址
[root@node1 ~]# systemctl restart elasticsearch
5、启动elasticsearch-head服务器
两边一样的 ,这里以一边为例子
[root@node1 ~]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
另开一个端口
[root@node1 ~]# netstat -luntp |grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 125783/grunt
在浏览器打开能看到下面的结果
我们也可以通过节点信息看到那个节点是master节点,两个都看可以发现都是master节点,这是因为这里用的去中心的机制,两个节点挂一个另一个能正常的工作
6、创建一个索引
node1主机上执行,说明:索引为index-demo,类型为test,可以看到创建成功 -H 后面指定的文件格式是json的文件格式
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"yunduan","mesg":"hello world"}'
浏览器刷新后后出现,你会发现这个服务自己做了一些分片,切成了5个,,并且主分片矿体家加粗了,
在数据浏览的地方能看到这个,你创建的索引
后面相当于是一个表而“yunduan“,”hello world” 是两个字段
备注::索引相当于把是数据库,类型相当于数据库中的表,文档相当于表中的一条记录;;;;这样es就相当于一个数据库
4、在master节点安装httpd和Logstash
1、关防火墙,核心防护,更改主机名,安装httpd服务,确认java环境
[root@master ~]# yum -y install httpd
确认没有日志的
[root@master ~]# cd /var/log/httpd
[root@master httpd]# ls
[root@master httpd]#
开启服务
[root@master httpd]# systemctl start httpd
[root@master httpd]# ls
access_log error_log
[root@master httpd]# ll
total 4
-rw-r--r--. 1 root root 0 Sep 21 10:31 access_log
-rw-r--r--. 1 root root 817 Sep 21 10:31 error_log
[root@master httpd]#
在浏览器访问下access_log就会有数据了
2、安装logstash
首先需要把包创到这个/root目录
[root@master ~]# rpm -ivh logstash-5.5.1.rpm
warning: logstash-5.5.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:logstash-1:5.5.1-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash
[root@master ~]# systemctl start logstash
[root@master ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
[root@master ~]#
3、logstash(Apache)与elasticsearch功能是否正常 、做对接测试
用的是logstash这命令进行测试的
字段描述:
-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e 后面跟着字符串 该字符串可以被当成logstash的配置(如果是“”,则默认使用stdin做为输入,stdout作为输出)
-f 测试配置文件是否正确,然后退
4、输入采用标准输入 输出采用标准 登录到master服务器进程操作
[root@master ~]# logstash -e 'input { stdin{} } output { stdout{} }' ##用这个不能显示详细信息
[root@master ~]# logstash -e 'input { stdin{} } output { stdout{codec=>rubydebug} }'
可以输入一些东西,看到显示了详细的信息
5、输入输出连接es
[root@master ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["10.4.7.11:9200"] } }'
过一会后同样输入一条数据
www.yunduan.com
然后在浏览器页面上可以看到有新的索引和数据产生
然后点击数据浏览,可以看到自己刚才输入的数据,,也可看详细信息
5、登录到master Apache主机做对接配置
说明:logstash配置文件主要有三部分组成:input、output、filter(根据需要,主要是用于过滤不同软件的日志的,比如dns,nginx等)
1、开权限方便其他用户读取数据,配置文件修改,重启
[root@master ~]# chmod o+r /var/log/messages
[root@master ~]# ll /var/log/messages
-rw----r--. 1 root root 702154 Sep 21 11:03 /var/log/messages
[root@master ~]#
[root@master ~]# vim /etc/logstash/conf.d/system.conf
[root@master ~]# cat /etc/logstash/conf.d/system.conf
input {
file{ ##指定采集位置函数中的
path => "/var/log/messages" ##指定路径
type => "system" ##打一个标签
start_position => "beginning" ##指定了开始的位置在哪里
}
}
output { ##输出
elasticsearch { ##输出到es中
hosts => ["20.0.0.10:9200"] ##指定IP地址
index => "system-%{+YYYY.MM.dd}" ##生成的日期格式 索引
}
}
[root@master ~]# systemctl restart logstash
2、在浏览器刷新并观察
首先刷新后可以看到system-2021.09.21这个索引产生了
然后点数据浏览可看到系统日志
任意点一个就能看到数据详细信息了
然后数据查询和基本查询都是可以帮你更好的去查询指定的信息
6、在主机上安装kibana服务
1、安装kibana服务到node2也可以安装node1或者另外开一个主机
首先把kibana放在/root上
[root@node2 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
warning: kibana-5.5.1-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:kibana-5.5.1-1 ################################# [100%]
[root@node2 ~]# cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
[root@node2 ~]# vi /etc/kibana/kibana.yml
省略部分内容
server.port: 5601 ##打开kibana的端口2行
server.host: "0.0.0.0" ##侦听地址改为所有7行
elasticsearch.url: "http://20.0.0.10:9200" ##和es建立联系21
##这里注意点:生产环境一定会做一个负载均衡elasticsearch.rul后面跟的是VIP地址或负载均衡地址
kibana.index: ".kibana" ##在es中添加.kibana索引30
[root@node2 ~]# systemctl start kibana.service
[root@node2 ~]# systemctl enable kibana.service
2、在浏览器上测试安装的内容
添加索引
首先添加logstash这里你填写的在es那边有就会不报错,如果没有就会报找不到
点discover就能出现图形化的界面了
上面是系统日志的展示,那么想建立http要做下面操作
7、添加http日志到kibana
[root@master ~]# vim /etc/logstash/conf.d/apache_log.conf
[root@master ~]# cat /etc/logstash/conf.d/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 => ["10.4.7.11:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["10.4.7.11:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@master ~]#
2、启动logstash,主要要加指定配置文件
[root@master ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache_log.conf
这个时候能看到有多了两个标签正则启动成功了
点数据浏览能可能到有两个索引了
3、在kibana添加httpd的日志展示
然后创建两个索引,也就是apache_access和apache_error
4、观察结果
你可以重启下http看下结果
你看重启了httpd和在浏览器访问了后出现的日志
<video class="" autoplay="" tabindex="2" mediatype="video" crossorigin="anonymous" src="https://vd3.bdstatic.com/mda-kfmaqa0m4upjx832/mda-kfmaqa0m4upjx832.mp4?v_from_s=hkapp-haokan-suzhou&auth_key=1632199018-0-0-865bc6596fcf45091d01bf4f5eadc176&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=3000185_2" style="position: absolute; top: 0px; left: 0px;" __idm_id__="251168769"></video>