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查看

 

 

 感谢若干博客大佬,因为很多资料是以前收集的,没有能够知道是出自何处,所以不一一提及,若有朋友指出我再添加上来

 

posted @   小尾巴想看雪  阅读(522)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示