首页 > 其他分享 >ELK的架构与原理

ELK的架构与原理

时间:2023-12-08 17:24:49浏览次数:26  
标签:ELK 架构 192.168 nginx elasticsearch 原理 日志 local logstash

小白也能学的日志收集系统ELK

原创 对抗一下 步步运维步步坑 2023-11-27 11:46 发表于四川 收录于合集 #中间件4个 #运维技术11个

介绍

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(但是后期出现的filebeat(beats中的一种)可以用来替代logstash的数据收集功能,比较轻量级)。市面上也被成为Elastic Stack。  

Filebeat

是用于转发和集中日志数据的轻量级传送工具。

Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。

 

Filebeat的工作方式如下:

启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

 

Logstash

是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。

Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

Elasticsearch

Elastic Stack核心的分布式搜索和分析引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。

Kibana

是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。并且可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。还可以让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。  

特征

收集

能够采集多种来源的日志数据

传输

能够稳定的把日志数据解析过滤并传输到存储系统

存储

存储日志数据

分析

支持 UI 分析

警告

能够提供错误报告,监控机制

>

图片

如上图所示,该ELK框架由beats(日志分析我们通常使用filebeat)+elasticsearch+kibana构成,这个框架比较简单,入门级的框架。其中filebeat也能通过module对日志进行简单的解析和索引。并查看预建的Kibana仪表板。 该框架适合简单的日志数据,一般可以用来玩玩,生产环境建议接入logstash

图片

 

该框架是在上面的框架的基础上引入了logstash,引入logstash带来的好处如下

Logstash具有基于磁盘的自适应缓冲系统通,该系统将吸收传入的吞吐量,从而减轻背压
从其他数据源(例如数据库,S3或消息传递队列)中提取
将数据发送到多个目的地,例如S3,HDFS或写入文件
使用条件数据流逻辑组成更复杂的处理管道

filebeat结合logstash带来的优势:

1、水平可扩展性,高可用性和可变负载处理:filebeat和logstash可以实现节点之间的负载均衡,多个logstash可以实现logstash的高可用

2、消息持久性与至少一次交付保证:使用Filebeat或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。

3、具有身份验证和有线加密的端到端安全传输:从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域

当然在该框架的基础上还可以引入其他的输入数据的方式:比如:TCP,UDP和HTTP协议是将数据输入Logstash的常用方法(如下图所示):

图片

在如上的基础上我们可以在beats和logstash中间添加一些组件redis、kafka、RabbitMQ等,添加中间件将会有如下好处:

第一,降低对日志所在机器的影响,这些机器上一般都部署着反向代理或应用服务,本身负载就很重了,所以尽可能的在这些机器上少做事;

第二,如果有很多台机器需要做日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch造成压力,因此需要对数据进行缓冲,同时,这样的缓冲也可以一定程度的保护数据不丢失;

第三,将日志数据的格式化与处理放到Indexer中统一做,可以在一处修改代码、部署,避免需要到多台机器上去修改配置

部署

elk各个组件的网址可以在官网下载:

官网

或者在中文社区下载:

中文社区

 

包下载

各个组件的网址可以在官网下载:https://www.elastic.co/cn/

中文社区下载:https://elasticsearch.cn/download/

java 环境(所有节点都需要)

链接:

百度网盘

提取码:1010

版本

7.70

图片

环境说明

节点安装包hostname
192.168.50.201 logstash+elasticsearch+kibana elk-1
192.168.50.202 elasticsearch elk-2
192.168.50.203 logstash+redis+nginx elk-3
     

安装步骤

java环境准备

# tar xf jdk-8u121-linux-x64.tar.gz   -C /usr/local/jdk
# vim /etc/profile
JAVA_HOME=/usr/local/java CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASS_PATH

# source /etc/profile
# jave -version

图片

系统设置

vim /etc/security/limits.conf

图片

sysctl -w vm.max_map_count=262144

vim  /etc/sysctl.conf

vm.max_map_count=262144

Node3

安装配置redis

# yum install epel-release -y  
# yum install redis -y
修改配置文件
# vim /etc/redis.conf
bind 0.0.0.0
daemonize yes
启动和自启
# systemctl start redis
# systemctl enable redis
# systemctl status redis

安装配置nginx

# yum install nginx -y
修改日志格式为js
# vi /etc/nginx/nginx.conf

修改配置文件

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  log_format main '{
       "time_local": "$time_local", '
       '"remote_addr": "$remote_addr", '
       '"remote_user": "$remote_user", '
       '"body_bytes_sent": "$body_bytes_sent", '
       '"request_time": "$request_time", '
       '"status": "$status", '
       '"host": "$host", '
       '"request": "$request", '
       '"request_method": "$request_method", '
       '"uri": "$uri", '
       '"http_referrer": "$http_referer", '
       '"http_x_forwarded_for": "$http_x_forwarded_for", '
       '"http_user_agent": "$http_user_agent" '
       '}';

  access_log /var/log/nginx/access.log main;
  sendfile on;
  keepalive_timeout 65;
  include /etc/nginx/conf.d/*.conf;
  server {
      listen 8001 ;
      listen [::]:8001;
      server_name _;
      root /usr/share/nginx/html;
       # Load configuration files for the default server block.
      include /etc/nginx/default.d/*.conf;
      location / {
  }
  error_page 404 /404.html;
  location = /40x.html {
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
      }
  }
  server {
      listen 8080;
      }
}

为了使Nginx和httpd不产生冲突,把Nginx监听端口改为8001

启动和自启

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

安装配置httpd

# yum install httpd -y
#

修改配置文件

vi /etc/httpd/conf/httpd.conf

<IfModule log_config_module>        
LogFormat "{ \
  \"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \
  \"@version\": \"1\", \
  \"tags\":[\"apache\"], \
  \"message\": \"%h %l %u %t \\\"%r\\\" %>s %b\", \
  \"clientip\": \"%a\", \
  \"duration\": %D, \
  \"status\": %>s, \
  \"request\": \"%U%q\", \
  \"urlpath\": \"%U\", \
  \"urlquery\": \"%q\", \
  \"bytes\": %B, \
  \"method\": \"%m\", \
  \"site\": \"%{Host}i\", \
  \"referer\": \"%{Referer}i\", \
  \"useragent\": \"%{User-agent}i\" \
  }" ls_apache_json    
  <IfModule logio_module>      
  </IfModule>    
  CustomLog "logs/access_log" ls_apache_json
  </IfModule>
  <IfModule alias_module>

启动和自启

# systemctl start httpd
# systemctl enable httpd
# systemctl status httpd

Node1 + Node2

创建用户

由于elasticsearch不能使用root用户运行,需要在node1和node2结点上创建elk用户

# useradd elk
# echo 123456 | passwd --stdin elk

node1和node2部署elasticsearch集群

上传压缩包并解压

# tar -zxvf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /usr/local/es
# tar -zxvf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /usr/local/es

修改node1配置文件

vi /usr/local/elasticsearch/config/elasticsearch.yml

network.host: 192.168.50.31
cluster.name: my-cluster
node.name: node1
bootstrap.memory_lock: false
http.port: 9200
discovery.seed_hosts: ["192.168.50.31","192.168.50.32"]
cluster.initial_master_nodes: ["192.168.50.31"]
node.max_local_storage_nodes: 100
http.cors.enabled: true                
http.cors.allow-origin: "*"  
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User"

修改node2配置文件

vim /usr/local/elasticsearch/config/elasticsearch.yml

cluster.name: my-cluster
node.name: node2
bootstrap.memory_lock: false
network.host: 192.168.50.32
http.port: 9200
discovery.seed_hosts: ["192.168.50.31","192.168.50.32"]
cluster.initial_master_nodes: ["192.168.50.31"]
node.max_local_storage_nodes: 100
http.cors.enabled: true                
http.cors.allow-origin: "*"

把elasticsearch的权限改为elk用户

# chown -R kawhi:kawhi /usr/local/es
# chown -R kawhi:kawhi /usr/local/es

启动

# su - elk
# cd /usr/local/es/bin
# nohup ./elasticsearch > /dev/null 2>&1

验证

访问 http://node1:9200

访问 http://node2:9200

图片

Node1

部署elasticsearch-head-master插件

# yum install npm git-y
# git clone git://github.com/mobz/elasticsearch-head.git
# cd /usr/local/head-master/
# cd _site  
# npm install
# nohup npm run start >/dev/null 2>&1

 

验证

访问 http://node1:9100

图片

Node1 + Node3 部署LogStash

上传包并解压

# tar -zvxf logstash-7.7.0.tar.gz -C /usr/local/logstash
# tar -zvxf logstash-7.7.0.tar.gz -C /usr/local/logstash
#创建日志收集配置文件夹
# mkdir /usr/local/logstash/conf.d/
# mkdir /usr/local/logstash/conf.d/

配置

node1添加日志收集文件,从node3的redis数据库读取数据,存储到elasticsearch中

vi  /usr/local/logstash/conf.d/redis_to_elk.conf

input {    
   redis {
   port => "6379"
   host => "192.168.50.33"
   data_type => "channel"
   key => "logstash:redis"
   type => "redis-input"   }
}
output {
   elasticsearch {
   hosts => ["192.168.50.31"]
   index => "logstash-%{+YYYY.MM.dd}"
}
}

node3添加日志收集文件,把apache和nginx的日志存储到redis中

vi/usr/local/logstash/conf.d/web_to_redis.conf

input {
   file {
   path => ["/var/log/nginx/access.log"]
type => "nginx_log"
}
file {
       path => ["/etc/httpd/logs/access_log"]
   type => "apache_access_log"
}
}
output {
   redis{
   host => "192.168.50.33"
   key => 'logstash:redis'
   data_type => 'channel'
   port => '6379'    
}
stdout {
   codec    => rubydebug
}
}

启动服务

node3

# cd /usr/local/logstash/bin/
# ./logstash -f /usr/local/logstash/conf.d/web_to_redis.conf &

 

node1

# cd /usr/local/logstash/bin/
# ./logstash -f /usr/local/logstash/conf.d/redis_to_elk.conf &

查看logstash运行情况

命令行最后输出以下语句证明启动成功

Successfully started Logstash API endpoint {:port=>9600}

node1部署 kibana

上传压缩包并解压

# tar -zxvf kibana-7.7.0-linux-x86_64.tar.gz -C /usr/local/kibana

修改配置文件

vi /usr/local/kibana/config/kibana.yml

server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.50.31:9200"]
i18n.locale: "zh_CN"

启动服务

# cd /usr/local/kibana/bin/
# ./kibana --allow-root &

验证

图片

 

图片

ELK日志收集系统部件部署完成

测试

生成日志 通过浏览器访问node3的Nginx服务器和apache服务器产生日志

图片

配置kibana的模板

图片

图片

图片

图片

查看日志收集情况

图片

自此ELK日志收集系统部署完成并成功运转

图片

图片

可查看到是否 有数据输入

yum 安装

环境说明

192.168.50.31kibana, filebeatnode1
192.165.50.31 logstash, filebeat elasticsearch node2
192.168.50.32 nginx. httpd, filebeat node

jdk 版本不变

JDK安装省略

源配置

# cat /etc/yum.repo.d/elasticsearch.repo

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://mirror.tuna.tsinghua.edu.cn/elasticstack/7.x/yum/
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

node1

# yum install logstash kibana filebeat

node2

# yum instasll elasticsearch fiebeat -y

node3

# yum install nginx httpd filebeat-y

服务配置省略

elasticsearch

# vim /etc/elasticsearch/elasticsearch.yml

path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.50.32
cluster.name: my-cluster
node.name: node2
bootstrap.memory_lock: false
http.port: 9200
discovery.seed_hosts: ["192.168.50.31","192.168.50.32"]
cluster.initial_master_nodes: ["192.168.50.31"]
node.max_local_storage_nodes: 100
http.cors.allow-origin: "*"

启动和自启

# systemctl start elasticsearch
# systemctl enable elasticsearch

验证

curl  http://192.168.50.32:9200kibana

Kibana

# vim /etc/kibana/kibana.yml

server.host: "192.168.50.31"
elasticsearch.hosts: ["http://192.168.50.32:9200"]
i18n.locale: "zh-CN"

启动和自启

# systemctl start kibana
# systemctl enable kibana

logstash

# vim /etc/default/logstash

$JAVA_HOME ="/usr/local/java"
vim /etc/logstash/logstash.yml

path.data: /var/lib/logstashpipeline.ordered: auto
path.logs: /var/log/logstash
# vim /etc/logstash/conf.d/pipeline.conf

input {        
beats{
      port => 5555
      codec => json  # 直接将filebeat保存在message中的json字串解析出来
      }
}
filter {
  json {
   source => message
  tag_on_failure => ["_jsonparsefailure"]
  skip_on_invalid_json => true
  add_field => {
   "hostname" => "%{[agent][hostname]}"}}  
   if  "messages" in [tags]{  
  grok{
      match => {"messasge" => "%{SYSLOGLINE}"}}}
}
 
output {
if "apache" in [tags] {
elasticsearch {
hosts => ["192.168.50.32:9200"]
index => "apache-access-log-%{+yyyy.MM.dd}"}}
if "messages" in [tags] {
elasticsearch {
hosts => ["192.168.50.32:9200"]
index => "messages-log-%{+yyyy.MM.dd}"}}
}

启动和自启

# systemctl start logstash
# systemctl enable logstash

验证

# netstate -tnlp |grep 5555

filebeat

vim /etc/filebeat/filebeat.yml

filebeat.config.inputs:
enable: true
path: "${path.config}/inputs.d/*.yml"
output.logstash:
hosts: ["192.168.50.31:5555"]

mkdir /etc/filebeat/inputsvim /etc/filebeat/inputs/logs.yml (此处只写出了node3上面)


- input_type: log paths:
   - /var/log/messages
tags: ["messages", "node3"]
- input_type: log
paths:
   - /var/log/httpd/access_log
tags: ["http-access-log", "apache"]
- input_type: log
paths:
   - /var/log/httpd/error_log
tags: ["http-error-log", "apache"]
- input_type: log
paths:
   - /var/log/nginx/access.log
tags: ["nginx-access-log", "nginx"]
- input_type: log
paths:
   - /var/log/nginx/error.log
tags: ["nginx-error-log", "nginx"]

启动和自启

# systemctl start filebeat
#ystemctl enable filebeat

 

期待你的

分享

点赞

在看

图片

添加博主

微信号|yfq940-

对抗一下

创作不易,支持一下呗

赞赏二维码喜欢作者

收录于合集 #中间件  4个 上一篇全网最详细nginx配置详解下一篇Nginx的负载均衡实现 阅读 427 步步运维步步坑   ​        

人划线

 

标签:ELK,架构,192.168,nginx,elasticsearch,原理,日志,local,logstash
From: https://www.cnblogs.com/cherishthepresent/p/17888611.html

相关文章

  • Docker部署ELK日志系统
    Docker部署ELK日志系统皓林 Java老王 2023-12-0515:27 发表于广东 一、Docker安装Elasticsearch官网镜像地址:https://hub.docker.com/_/elasticsearch1.1 下载镜像 查看镜像sudo dockerpullelasticsearch:7.6.1sudo dockerimages1.2 运行 elasticsear......
  • Spring源码系列:MyBatis整合和原理
    前言Mybatis是啥?Mybatis是一个支持普通SQL查询、存储过程以及映射的一个持久层半ORM框架。那么在了解Spring整合Mybatis这部分源码之前,我们先来看下Mybatis的实际运用。一.Mybatis的使用首先,项目的结构如下:pom依赖:<dependency><groupId>org.mybatis</groupId><artifactId......
  • 通过数据驱动设计动态的全面预算管理架构
    在过去的20年里,电子表格一直是企业用于规划、预测、预算和管理报告的主要工具,尽管有的企业具备针对财务的系统,但其应用效率和规划技术仍然难以满足市场需求。并且,大部分企业对于财务管理的部署成本相对较低,其可访问性、安全性、及时性都难以保障,随着企业在用户和信息需求方面的增长......
  • 以太网通信原理
    三层网络通信:使用IP地址进行传输图1二层通信图二三层通信图三二层通信2、二层通信在局域网中,当主机或其它三层网络设备有数据要发送给另一台主机或三层网络设备时,它需要知道对方的网络层地址(即IP地址)。但是仅有IP地址是不够的,因为IP报文必须封装成帧才能通过物理网络发送,因此发......
  • 脚手架架构设计和框架搭建
    站在前端研发的角度,分析开发脚手架的必要性脚手架核心价值是将研发过程自动化:项目重复代码拷贝/git操作/发布上线操作标准化:项目创建/gitflow/发布流程/回滚流程数据化:研发过程数据化、系统化,使得研发过程可量化自研脚手架和自动化构建工具的区别市面上已经有了如Jenkins......
  • 邀请函 | 合作发展,赋能增效--新架构下汽车电子软件研发技术研讨会
    会议介绍    随着汽车智能化、网联化快速演进,“软件定义汽车、架构定义软件”愈发形成行业共识。汽车上的软件应用在提升用户体验、推动行业技术创新方面发挥着至关重要的作用。    在此背景下,如何有效地提升软件开发效率、更好地管理软件质量、满足行业安全标准......
  • PAVELINK.SOA-Converter新版本发布,助力SOA架构开发
    背景  随着汽车行业的不断迭代发展,市场及消费者对汽车提出了更高的要求,智能网联、自动驾驶等新技术的应用推动整车厂对车载芯片、汽车软件等方面投入了更多的精力,SOA(面向服务的架构)逐渐成为大多整车厂顺应市场趋势和技术趋势的首选。SOA架构使服务间的通讯变得更加简单,ECU更......
  • 搜索引擎蜘蛛池的原理是什么,蜘蛛池如何搭建?
    搜索引擎蜘蛛池是一种利用蜘蛛程序抓取互联网上的网页并返回相关数据的技术。它的原理主要是通过模拟搜索引擎蜘蛛的行为,将大量的网页链接提交给搜索引擎,从而增加网站在搜索引擎中的曝光率和排名。如何联系蚂蚁seo?baidu搜索:如何联系蚂蚁SEO?baidu搜索:如何联系蚂蚁SEO?baidu搜索:如何联......
  • keepalived工作原理
    keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。keepalived工作原理keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouterRedundancyProtocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可......
  • redis分布式锁实现原理
    在.netcore中,可以使用StackExchange.Redis实现redis分布式锁,///<summary>///分布式锁///</summary>///<paramname="Redis">RedisDB</param>///<paramname="Key">锁标识</param>///<paramname="Seconds">过......