ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。
好处:
(1)提高安全性
(2)集中存放日志
(3)缺陷:对日志的分析困难
概述
(1)提供了一个分布式多用户能力的全文搜索引擎,通常用于索引和搜索大容量的日志数据,也可用于搜索许多不同类型的文档。
(2)Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。
ElasticSearch核心概念(作用)
(1)接近实时
(2)集群(es数据日志搜索)
(3)节点
(4)索引(es)
索引(库)——类型(表)——文档(记录)
(5)分片和副本(备份——每个都有副本,如其中一个挂了,副本还可以继续正常工作、容灾)
概念
通常与 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 提供图形化的 web 界面来浏览 Elasticsearch 日志数据,可以用来汇总、分析和搜索重要数据。
总:将Elasticsearch中的数据优化可视化的展示出来
主要功能
(1)Elasticsearch无缝之集成
(2)整合数据,复杂数据分析
(3)让更多团队成员受益
(4)接口灵活,分享更容易
(5)配置简单,可视化多数据源
(6)简单数据导出
概念
(1)一款强大的数据数据处理工具
(2)可实现数据传输,格式处理,格式化输出(输出给es)
(3)数据输入,数据加工(如过滤、改写等)以及数据输出
Logstash主要组件
(1)shipper:主要负责监控日志,日志变动,集新的日志
(2)indexer:存储(日志存储者)主要是日志接收和写入本地
(3)broker:连接组件,并对组件进行搜索日志文件存储另一个平台上
(4)search and storage:搜索和存储
(5)web interface:展示web界面
Logstash理念、作用
input(数据采集) filter(数据过滤) output(数据输出)
Filebeat
Filebeat概念
(1)轻量级的开源日志文件数据搜集器。
(2)通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。常应用于 EFLK 架构当中。行解析
Filebeat 结合 logstash 带来好处
(1)通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力
(2)从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取
(3)将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件
(4)使用条件数据流逻辑组成更复杂的处理管道
缓存/消息队列(redis、kafka、RabbitMQ等)
可以对高并发日志数据进行流量削峰和缓冲,这样的缓冲可以一定程度的保护数据不丢失,还可以对整个架构进行应用解耦。
Fluentd
概念
是一个流行的开源数据收集器。
特点
由于 logstash 太重量级的缺点:
(1)解决Logstash 性能低、资源消耗比较多等问题,随后就有 Fluentd 的出现。
(2)相比较 logstash,Fluentd 更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为 logstash 的一种替代方案,常应用于 EFK 架构当中。在 Kubernetes 集群中也常使用 EFK 作为日志数据收集的方案。
(3)在 Kubernetes 集群中一般是通过 DaemonSet 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。
(1)由于会通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
(2)单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。数十上百台服务器会很繁琐并且效率低下,使用集中化的日志管理:开源的syslog,将所有服务器上的日志收集汇总
(3)一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
总:日志集中化、集中化管理
提高效率、性能安全
收集:能够采集多种来源的日志数据
传输:能够稳定的把日志数据解析过滤并传输到存储系统
存储:存储日志数据
分析:支持 UI 分析
警告:能够提供错误报告,监控机制
(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
(3)Elasticsearch 对格式化后的数据进行索引和存储。
(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。
总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。
web服务器部署logstash+kibana:192.168.116.50
es节点1:192.168.116.60
es节点2:192.168.116.70
(1)需要先准备好相关的安装包(后三个用于前端图形化展示es状态)
yum -y install java-1.8.0-openjdk-devel.x86_64
vim /etc/elasticsearch/elasticsearch.yml
#yml键值对格式 键: 值(冒号后面要加一个括号)
cluster.name: my-elk-cluster #集群名称
node.name: node1 #当前节点名称
node.master: true #开启主节点
node.data: true #开启数据节点(两个都开启是混合模式)
path.data: /var/lib/elasticsearch #数据文件
path.logs: /var/log/elasticsearch #日志文件
bootstrap.memory_lock: true #锁定使用内存(禁用交换分区使性能下降)
network.host: 192.168.116.60 #监听地址(本机ip)
http.port: 9200 #es和客户端通信的端口(默认9200)
transport.tcp.port: 9300 #es节点之间通信的端口(默认9300)
#启用发现机制(es内置发现模块,通过单播发现集群内的服务节点)
discovery.zen.ping.unicast.hosts: ["192.168.116.60:9300", "192.168.116.70:9300"]
master主节点:
主要功能:维护元数据,管理集群节点状态;不负责数据写入和查询。
配置要点:内存可以相对小一些,但是机器一定要稳定,最好是独占的机器。
配置格式:node.master: true ;node.data: false
data数据节点
主要功能:负责数据的写入与查询,压力大。
配置要点:大内存,最好是独占的机器。
配置格式:node.master: false;node.data: true
client客户端节点
主要功能:负责任务分发和结果汇聚,分担数据节点压力。
配置要点:大内存,最好是独占的机器。
配置格式:node.master: false; node.data: false
还有一种混合节点 node.master: true 和 node.data: true ,这种在生产环境中不建议使用,我们这里的实验测试环境会将主节点和数据节点放在一台主机上。
三类节点分配比例
一般来说,主节点最多3台,数据节点可以为每个主节点分配 2~4 台(3个主节点就是一共6~12台),客户端可以为数据节点总数的1/3左右。
根据读写情况来决定,写多则数据节点多,读多则客户端多。
(5)优化系统(放开内存、进程数和文件限制)
(6)优化es拥有的内存使用权限
由于ES构建基于lucene,而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据,以提供快速的查询性能。lucene的索引文件segements是存储在单文件中的,并且
不可变,对于OS来说,能够很友好地将索引文件保持在cache中,以便快速访问。因此,我们很有必要将一半的物理内存留给lucene,另一半的物理内存留给es(TM heap)。
在ES内存设置方面,可以遵循以下原则
当机器内存小于64G时,遵循通用的原则,508给ES,50%留给操作系统,供lucene使用;
当机器内存大于64G时,遵循原则:建议分配给Es分配4~32G 的内存即可,其它内存留给操作系统,供lucene使用。
(7)启动(注意es启动最低需要4G内存)
(8)依次安装其余三个软件
#安装node.js(大约10分钟)
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make && make install
#安装phantomjs
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin
#安装 Elasticsearch-head-master 数据可视化工具
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master/
npm install
(9)在es配置文件中添加跨域访问配置,并重启服务
vim /etc/elasticsearch/elasticsearch.yml
#添加
http.cors.enabled: true
http.cors.allow-origin: "*"
#重启服务加载配置
systemctl restart elasticsearch.service
cd /opt/elasticsearch-head-master/
npm run start &
#通过命令插入一个测试索引,索引为 index-demo,类型为 test。
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
curl -X DELETE '192.168.116.60:9200/index-demo'
(1)准备logstash和kibana的安装包,和jdk环境
(2)安装启动logstash,并将命令加入系统识别路径
(3)测试使用logstash
logstash [选项] ...
-f 通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e 从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t 测试配置文件是否正确,然后退出。
使用命令行输入标准输出到屏幕
测试命令行输入,标准输出到es的节点中
(4)测试无误后,自定义logstash配置文件
Logstash 配置文件基本由三部分组成:input、output 以及 filter(根据需要选择使用)
input{...}:表示从数据源采集数据,常见的数据源如Kafka、日志文件等。
output{...}:表示将logstash收集的数据经由过滤器处理之后输出到Elasticsearch。
filter{...}:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式.
grok:对若干个大文本字段进行再分割成一些小字段(?<字段名>正则表达式)字段名:正则表达式匹配到的内容。
date:对数据中的时间格式进行统一和格式化。
mutate:可以重命名,删除,替换和修改事件中的字段。比如对一些无用的字段进行剔除,或增加自定义的字段。
mutiline:对多行数据进行统一编排,将多行数据汇总为一个单一的行。
#在logstash配置文件目录下,创建配置文件
cd /etc/logstash/conf.d/
ls
logstash -f 配置文件名
vim /etc/kibana/kibana.yml
#修改主要配置
#取消注释,Kiabana 服务的默认监听端口为5601
server.port: 5601
#取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
#取消注释,配置es服务器的ip,如果是集群则配置该集群中master节点的ip
elasticsearch.url: ["http://192.168.116.60:9200","http://192.168.116.70:9200"]
#取消注释,设置在 elasticsearch 中添加.kibana索引
kibana.index: ".kibana"
#取消注释,配置kibana的日志文件路径(需手动创建),不然默认是messages里记录日志
logging.dest: /var/log/kibana.log
#创建日志文件,并修改归属权限
touch /var/log/kibana.log
chown kibana:kibana /var/log/kibana.log
#启动kibana
systemctl start kibana.service
nginx服务器部署filebeat:192.168.116.40
logstash+kibana服务器:192.168.116.50
es节点1:192.168.116.60
es节点2:192.168.116.70
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
#下载nginx,添加测试页面
#配置nginx官方源
cd /etc/yum.repos.d/
vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
#下载并启动
yum -y install nginx
systemctl enable --now nginx
#添加测试页面
cd /usr/share/nginx/html/
echo 'this is nginxlog test1 webpage
' > test1.html
echo 'this is nginxlog test2 webpage
' > test2.html
tar xf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64 /usr/local/filebeat
修改filebeat配置文件 /usr/local/filebeat/filebeat.yml
nohup ./filebeat -e -c filebeat.yml nohup后台启动(不会因为退出终端而终端)
-e 同时输出到屏幕(便于实验),也可以使用重定向到文件中
-c 指定配置文件
但是此索引包含了nginx的access.log和error.log,我们可以在配置文件中添加条件判断分割日志,然后重启服务测试
在客户端访问nginx测试页面,然后刷新es,出现了分割的索引
在kibana中创建对应索引