ELK理论和架构
最近因为运维平台旧日志管理平台的瓶颈似乎已经出现,在出现问题的时候想要查询日志发现速度没有那么快,所以对现有的架构想做出一些修改,这里为了记录查找的一些资料和本次的相关修改。
1.ELK架构
(1)平台架构如下图:
在整个平台中,各计算节点和管理节点间安装filebeat进行数据收集和数据索引创建,filebeat收集日志信息收集后直接发送给ELK集群中的Elasticsearch,Elasticsearch对数据进行分析、存储后通过kibana进行展示。
(2)现在思考架构为下图所示:
filebeat安装在各node上收集日志,然后发送给redis进行缓存,logstash到redis中获取日志信息,经过filter后发送给Elasticsearch进行分析、存储,通过Kibana进行展示,其中Redis+Logstash可以与Elasticsearch安装在同一节点,也可以分开安装。
2.ELK相关概念及原理
没有使用日志集中管理的平台一般会出现很多问题,比如日志的归档问题、文本搜索问题、多维度查询问题,因此需要对日志进行集中化的管理。
一般使用ELK这种分布式部署的架构,不同的服务模块部署在不同的服务器或者虚拟机上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志管理系统,可以提高定位问题的效率。
ELK提供了一套解决方案,且都是开源软件,相互配合使用,高效的满足了很多场景的应用,是目前主流的一种日志系统。
ELK具体介绍:
ELK是三个开源软件的缩写,分别是:Elasticsearch、Logstash、Kibana,都是开源软件,新增加了一个beats,它是一个轻量级的日志收集处理工具(Agent),beat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。
(1)Elasticsearch
基于Lucene的开源搜索引擎,是一个分布式的搜索分析系统,提供搜集、分析、存储数据三大功能。
(2)Logstash
是一个管理日志和事件的工具,可以进行收集、解析,并存储以供以后使用,Logstash有一个内置的web界面,用来搜索你的所有日志。
logstash在部署时有两种运行模式:standalone和centralized:
① standalone:是所有的事情都在一台服务器上运行,包括日志收集、日志索引、前端WEB界面都部署在一台机器上。
② centralized:就是多服务器模式,从很多服务器运输(ship)日志到一台总的日志(collector)服务器上用来索引和查找。
注意:logstash本身并没有什么shipper和collector这种说法,因为不论是运输日志的进程还是汇集,总的日志的进程运行的都是同一个程序,只是使用的配置文件不同。
(3)Kibana
可视化日志和数据系统,作为web前端可以很容易的和Elasticsearch系统结合。
(4)beats
目前beats包含四种工具:
① Packetbeat:搜集网络流量数据;
② Topbeat:搜集系统、进程和文件系统级别的CPU和内存使用情况;
③ Filebeat:搜集文件数据,也是使用最多的beat;
④ Winlogbeat:搜集Windows事件日志数据;
Filebeat可以代替Logstash作为应用服务器端日志收集引擎,支持将收集到的数据输出到Kafka、Redis等消息队列。
简单介绍Filebeat:
1)Filebeat组成:harvester、input
①harvester
harvester负责读取文件,对单个文件的内容进行逐行读取,并将内容发送到输出;系统会为每个文件启动一个harvester,它主要负责打开、读取、关闭文件,这就意味着文件描述符在harvester状态运行时保持打开状态。
② input
input负责管理harvester并查找要读取的所有源;如果输入类型为log,则输入将查找驱动器上与定义的glob路径匹配的所有文件,并为每个文件启动harvester。
2)Filebeat如何保持文件状态
Filebeat保持每个文件的状态,并经常刷新状态到registry文件中,状态用于记住harvester正在读取的最后一个偏移量并确保发送所有日志。如果无法访问输出(如elasticsearch或是logstash),Filebeat会跟踪发送的最后一行,并在输出再次可用时据需读取文件,在Filebeat运行时,状态信息也会保存在内存中以用于每个输入。重新启动Filebeat时,来自registry文件的数据用于重建状态,Filebeat会在最后一个已知位置继续运行每个harvester。
对于每个input,Filebeat保持它找到的每个文件的状态,由于可以重命名或移动文件,因此文件名和路径不足以标识文件,对于每个文件,Filebeat存储唯一标识以检测先前是否收获了文件。
3)Filebeat如何确保至少一次交付
Filebeat保证事件将至少一次传递到配置的output,并且不会丢失数据。Filebeat能够实现此行为,因为它将每个事件的传递状态存储在registry文件中。
在已定义的output被阻止且尚未确认所有事件的情况下,Filebeat将继续发送事件,直到输出确认已收到事件。
如果Filebeat在发送事件的过程中关闭,它不会等待output在关闭之前确认所有事件。重新启动Filebeat时,将再次发送任何发送到output但在Filebeat关闭之前未确认的事件。这可确保每个事件至少发送一次,但最终可能会将重复事件发送到output。
3.单节点ELK搭建
为了熟悉配置和架构,首先从单节点开始搭建,通过搭建过程和调试进一步熟悉ELK的架构和配置。
3.1单节点ELK架构
Filebeat安装在客户端,对客户端的日志文件进行数据收集,Filebeat、Logstash、Elasticsearch、Kibana等软件为了方便部署统一安装在一个节点。
3.2环境准备
整个部署使用两个节点:
centos-1 192.168.5.1 :Redis+Logstash+Elasticsearch+Kibana+filebeat
以下为所有使用到的软件:
elasticsearch-6.4.2.rpm kibana-6.4.2-x86_64.rpm logtrail-6.4.2-0.1.30.zip logstash-6.4.2.rpm filebeat-6.4.2-x86_64.rpm
redis-3.2.12-2.el7.x86_64.rpm ##这里没有用到,考虑还在初级阶段,从我的第一次架构构建中剔除掉,增加部署部署、排查的成功率。
jdk-8u181-linux-x64.rpm
因为Elasticsearch需要java 环境,在centos-1节点执行安装jdk软件:
jdk软件需要单独下载安装,并添加进环境变量:
#rpm -ivh jdk-8u181-linux-x64.rpm
#cat >> /etc/profile << EOF >export JAVA_HOME=/usr/java/default >export PATH=$PATH:$JAVA_HOME/bin >export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar >EOF
#source /etc/profile
在两个节点对域名进行本地解析:
#cat >> /etc/hosts << EOF >192.168.5.1 centos-1 >EOF
3.3部署Elasticsearch
配置Elasticsearch,上传elasticsearch-6.4.2.rpm,通过编辑以下安装脚本参数,然后执行bash安装。
其中有一些环境参数配置,是Elasticsearch软件安装需要,否则会出现启动报错的情况。
#cat ela-install.sh sed -i '/swap/s/^/#/' /etc/fstab swapoff -a echo elasticsearch soft nofile 65536 >>/etc/security/limits.conf echo elasticsearch hard nofile 65536 >>/etc/security/limits.conf echo elasticsearch soft nproc 10240 >>/etc/security/limits.conf echo elasticsearch hard nproc 10240 >>/etc/security/limits.conf echo DefaultLimitNOFILE=65536 >>/etc/systemd/system.conf echo DefaultLimitNPROC=32000 >>/etc/systemd/system.conf echo DefaultLimitMEMLOCK=infinity >>/etc/systemd/system.conf systemctl daemon-reload echo "环境配置ok" rpm -ivh /root/install/elasticsearch-6.4.2.rpm && systemctl daemon-reload && systemctl enable elasticsearch.service echo -Xms`free -g|grep Mem|awk '{printf"%1d",$2/2}'`g >> /etc/elasticsearch/jvm.options echo -Xmx`free -g|grep Mem|awk '{printf"%1d",$2/2}'`g >> /etc/elasticsearch/jvm.options echo "n p 1 w " | fdisk /dev/sdb && mkfs.ext4 /dev/sdb1 echo /dev/vdb1 /var/lib/elasticsearch ext4 defaults 0 0 >>/etc/fstab mount /dev/vdb1 /var/lib/elasticsearch echo "磁盘初始化成功" mv /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak cat >> /etc/elasticsearch/elasticsearch.yml << EOF cluster.name: log-es path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch http.port: 9200network.publish_host: 192.168.5.1 ##修改为本节点IP node.name:centos-1 EOF chown elasticsearch:elasticsearch /var/lib/elasticsearch -R chown elasticsearch:elasticsearch /etc/elasticsearch/elasticsearch.yml chown elasticsearch:elasticsearch /etc/elasticsearch/jvm.options systemctl start elasticsearch.service echo "es配置成功"
安装完成后,可以通过以下指令测试其状态和连通性:
#systemctl status elasticseach #netstat -ant | grep 9200 #curl http://es1:9200
3.4部署Kibana
部署Kibana的脚本如下:
#cat kibana-install.sh
#####################install Kibana######################### rpm -ivh kibana-6.4.2-x86_64.rpm touch /var/log/kibana.log chmod 777 /var/log/kibana.log mv /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak cat >> EOF << server.host: 192.168.5.1 elasticsearch.url: http://192.168.5.1:9200 logging.dest: /var/log/kibana.log EOF #install logtrail plugin
##初次搭建不建议使用kibana插件 echo "install logtrail plugin" /usr/share/kibana/bin/kibana-plugin install file:///root/logtrail-6.4.2-0.1.30.zip cat >> /usr/share/kibana/plugins/logtrail/logtrail.json << EOF { "version" : 2, "index_patterns" : [ { "es": { "default_index": "syslog-*" }, "tail_interval_in_seconds": 10, "es_index_time_offset_in_seconds": 0, "display_timezone": "local", "display_timestamp_format": "MMM DD HH:mm:ss", "max_buckets": 500, "default_time_range_in_days" : 0, "max_hosts": 100, "max_events_to_keep_in_viewer": 5000, "default_search": "", "fields" : { "mapping" : { "timestamp" : "@timestamp", "hostname" : "beat.hostname", "program": "source", "message": "message" }, "message_format": "{{{message}}}", "keyword_suffix" : "keyword" }, "color_mapping" : { } }, ] } EOF echo "logtrail 安装完成" systemctl enable kibana && systemctl start kibana echo "kibana启动完成"
kibana的状态和连接性可以通过以下指令验证:
#netstat -ant | grep 5601 #curl http://es1:5601
如果kibana状态正常启动的话,curl http://es1:5601 会输出如下结果:
<script>var hashRoute = '/app/kibana'; var defaultRoute = '/app/kibana'; var hash = window.location.hash; if (hash.length) { window.location = hashRoute + hash; } else { window.location = defaultRoute;
3.5安装Logstash
安装Logstash脚本如下:
#cat logstash-install.sh rpm -ivh logstash-6.4.2.rpm mv /etc/logstash/logstash.yml /etc/logstash/logstash.yml.bak cat >> /etc/logstash/logstash.yml << EOF path.data: /var/lib/logstash pipeline.workers: 4 pipeline.output.workers: 16 pipeline.batch.size: 2000 pipeline.batch.delay: 5path.logs: /var/log/logstash EOF cat >> /etc/logstash/conf.d/first-pipeline.conf << EOF input { beats { port => "5044" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}"} } geoip { source => "clientip" } } output { elasticsearch { hosts => [ "192.168.5.1:9200" ] } } EOF systemctl start logstash && systemctl enable logstashsystemctl status logstash
3.6filebeat部署
首先节点应该有本地静态解析,其次,最好配置在两节点之间配置时间同步。
Filebeat的部署脚本如下:
rpm -ivh filebeat-6.4.2-x86_64.rpm mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak cat >> /etc/filebeat/filebeat.yml << EOF
filebeat.prospectors:
- type: log
paths:
- /var/log/messages
output.logstash:
hosts: ["localhost:5044"]
EOF systemctl start filebeat && systemctl enable filebeat systemctl status filebeat tailf /var/log/filebeat/filebeat
4.web端登录
在浏览器上输入:http://192.168.5.1:5601 在discover栏查看日志数据
5.添加redis做缓存中间件
5.1架构
5.2部署过程
整个部署过程时基于标题“3”来进行修改的,只需要修改三个地方就可以了:
(1)安装redis,并修改redis的配置IP
#yum -y install redis #sed -i s/127.0.0.1/192.168.5.1/g /etc/redis.conf #systemctl start redis
(2)修改filebeat的output配置
将/etc/filebeat/filebeat.yml文件中的output项改为如下配置:
output.redis: hosts: ["192.168.5.1"] #输出到redis的机器 port: 6379 db: 1 #redis数据库的一个整数索引标识,redis总共0-15默认16个库。 timeout: 5 key: "mylogs" #以default_list的keys传输到redis data_type: "list"
然后重新启动filebeat服务。
(3)修改logstash的input配置
将logstash的.conf配置文件中的input项改为如下:
input { redis { data_type =>"list" key =>"mylogs" host =>"192.168.5.1" port => 6379 threads => "8" db => 1 } }
重新启动logstash服务
5.3验证日志数据
(1)redis验证
通过redis查看keys有没有缓存:
#redis-cli -h 192.168.5.1 >select 1 >keys *
(2)登录kibana查询
在浏览器端输入http://192.168.5.1:5601查看
感谢若干博客大佬,因为很多资料是以前收集的,没有能够知道是出自何处,所以不一一提及,若有朋友指出我再添加上来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?