【网络架构】ELK

目录

一、ELK介绍

[1.1 ELK是什么](#1.1 ELK是什么)

[1.2 Elasticsearch](#1.2 Elasticsearch)

[1.3 Logstash](#1.3 Logstash)

[1.4 Kibana](#1.4 Kibana)

[1.5 为什么使用ELK](#1.5 为什么使用ELK)

二、ELK原理

[2.1 工作原理](#2.1 工作原理)

[2.2 ELK的应用架构图](#2.2 ELK的应用架构图)

三、ELK的安装部署

[3.1 环境部署](#3.1 环境部署)

[3.2 前期环境](#3.2 前期环境)

[3.3 安装Elasticsearch](#3.3 安装Elasticsearch)

[3.3.1 修改配置](#3.3.1 修改配置)

[3.3.2 查看节点信息](#3.3.2 查看节点信息)

[3.4 安装Logstash](#3.4 安装Logstash)

[3.4.1 安装服务](#3.4.1 安装服务)

[3.4.2 使用Logstash](#3.4.2 使用Logstash)

[3.4.3 对接elasticsearch](#3.4.3 对接elasticsearch)

[3.5 安装kibana](#3.5 安装kibana)

四、Logstash配合其他软件

[4.1 收集nginx日志](#4.1 收集nginx日志)

[4.1.1 环境介绍](#4.1.1 环境介绍)

[4.1.2 配置](#4.1.2 配置)

[4.2 收集tomcat日志](#4.2 收集tomcat日志)

[4.2.1 环境介绍](#4.2.1 环境介绍)

[4.2.2 配置](#4.2.2 配置)

[4.3 使用Redis接收tomcat日志](#4.3 使用Redis接收tomcat日志)

[4.3.1 环境介绍](#4.3.1 环境介绍)

[4.3.2 配置](#4.3.2 配置)

[4.3.3 其他logstash服务器从redis读取数据](#4.3.3 其他logstash服务器从redis读取数据)


一、ELK介绍

1.1 ELK是什么

通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为 elastic.co,ELK stack 的主要优点有如下几个:处理方式灵活: elasticsearch 是实时全文索引,具有强大的搜索功能配置相对简单:elasticsearch 的 API 全部使用 JSON 接口,logstash 使用模块配置,kibana 的配置文件部分更简单。检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。集群线性扩展:elasticsearch 和 logstash 都可以灵活线性扩展前端操作绚丽:kibana 的前端设计比较绚丽,而且操作简单。

1.2 Elasticsearch

一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索。

搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。

Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎,Apache Lucene - Welcome to Apache Lucene

Elasticsearch 的特点:

  • 实时搜索、实时分析

  • 分布式架构、实时文件存储

  • 文档导向,所有对象都是文档

  • 高可用,易扩展,支持集群,分片与复制

  • 接口友好,支持 json

1.3 Logstash

Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。

1.4 Kibana

Kibana 为 elasticsearch 提 供 一 个 查 看 数 据 的 web 界 面 , 其 主 要 是 通 过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。

1.5 为什么使用ELK

ELK 组件在海量日志系统的运维中,可用于解决以下主要问题:

  • 分布式日志数据统一收集,实现集中式查询和管理

  • 故障排查

  • 安全信息和事件管理

  • 报表功能

二、ELK原理

2.1 工作原理

(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。

(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。

(3)Elasticsearch 对格式化后的数据进行索引和存储。

(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。

总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。

2.2 ELK的应用架构图

三、ELK的安装部署

3.1 环境部署

bash 复制代码
Elasticsearch集群:
node1节点1:192.168.254.10    #内存4G及以上
node2节点2:192.168.254.20    #内存4G及以上

Logstash、Kibana节点:
应用程序节点3:192.168.254.100

3.2 前期环境

bash 复制代码
#java环境
yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel

#关闭防火墙
systemctl stop firewalld
setenforce 0

3.3 安装Elasticsearch

bash 复制代码
#得到一个安装包,此链接可能无效,请自行获取
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.2.rpm
rpm -ivh elasticsearch-6.7.2.rpm
#为配置文件做备份
cd /etc/elasticsearch/
mkdir bak
cp -a *.yml bak

3.3.1 修改配置

节点一:

bash 复制代码
vim elasticsearch.yml

#修改集群名字
cluster.name: my-elk-cluster
node.name: node1
node.master: true
node.data: true
#设置 节点名称 主从之间不能一致  master作为主节点  data作为数据节点
bootstrap.memory_lock: true
#内存锁开启  禁止使用  swap
network.host: 0.0.0.0
#监听地址
http.port: 9200
#  默认使用端口
transport.tcp.port: 9300
#内部传输端口
discovery.zen.ping.unicast.hosts: ["192.168.254.10:9300", "192.168.254.20:9300"]
#自动集群发现,加入主机名  使用单播 类似心跳线

节点二:

bash 复制代码
vim elasticsearch.yml

#修改集群名字
cluster.name: my-elk-cluster
node.name: node2
node.master: true
node.data: true
#设置 节点名称 主从之间不能一致  master作为主节点  data作为数据节点
bootstrap.memory_lock: true
#内存锁开启  禁止使用  swap
network.host: 0.0.0.0
#监听地址
http.port: 9200
#  默认使用端口
transport.tcp.port: 9300
#内部传输端口
discovery.zen.ping.unicast.hosts: ["192.168.254.10:9300", "192.168.254.20:9300"]
#自动集群发现,加入主机名  使用单播 类似心跳线

节点一与节点二:

bash 复制代码
#性能调优参数
vim /etc/security/limits.conf
......
*  soft    nofile          65536
*  hard    nofile          65536
*  soft    nproc           32000
*  hard    nproc           32000
*  soft    memlock         unlimited
*  hard    memlock         unlimited


#修改systemd服务管理器
vim /etc/systemd/system.conf
DefaultLimitNOFILE=65536    #设置打开文件数量的默认限制
DefaultLimitNPROC=32000    #设置进程数量的默认限制
DefaultLimitMEMLOCK=infinity    #取消内存锁定限制:将内存锁定限制设置为无限制(infinity),允许服务或进程锁定尽可能多的内存。


    

vim /etc/sysctl.conf
#一个进程可以拥有的最大内存映射区域数,参考数据(分配 2g/262144,4g/4194304,8g/8388608)
vm.max_map_count=262144

sysctl -p

#重启
reboot

systemctl start elasticsearch.service
systemctl status elasticsearch.service

3.3.2 查看节点信息

bash 复制代码
浏览器访问  
http://192.168.254.10:9200  
http://192.168.254.20:9200 
查看节点 Node1、Node2 的信息

谷歌插件下载:去谷歌商店,搜索elasticsearch head,下载后可以在此插件页面添加节点IP即可可视化查看

3.4 安装Logstash

节点3:

3.4.1 安装服务

bash 复制代码
#此处自行去网上获取安装rpm包
rpm -ivh logstash-6.7.2.rpm
#开启服务
systemctl start logstash.service
ln -s  /usr/share/logstash/bin/logstash   /usr/bin/
# 做软连接

3.4.2 使用Logstash

bash 复制代码
Logstash 命令常用选项:
-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t:测试配置文件是否正确,然后退出。

#先在本地测试一下
logstash -e 'input { stdin{} } output { stdout{} }'
# 等待时间较长,要耐心
# 当出现[INFO ] 2024-07-16 00:42:10.635 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600},代表成功
#随便输入你想输入的信息后回车,软件会返回给你一些值

3.4.3 对接elasticsearch

bash 复制代码
方式一:命令
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.254.10:9200"] } }'
//结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问


方式二:配置文件
cd /etc/logstash/conf.d
vim system-log.conf

input {
    file {
      path => "/var/log/messages"
      type => "system"
      start_position => "beginning"
    }
}
output {
  elasticsearch {
  hosts => [ "192.168.254.10:9200","192.168.254.20:9200" ]
  index => "system-%{+YYYY.MM.dd}"
  }
}


chmod +r /var/log/messages 
#添加权限
logstash   -f  system-log.conf
#读取配置文件

#进入浏览器即可查看

3.5 安装kibana

bash 复制代码
rpm -ivh kibana-6.7.2-x86_64.rpm 
cd /etc/kibana/
cp kibana.yml kibana.yml.bak -a

vim kibana.yml

2   		 server.port: 5601          		#打开端口
7    server.host: "0.0.0.0"      	#监听端口
28   elasticsearch.hosts: ["http://192.168.254.10:9200", "http://192.168.254.20:9200"]  
     #elasticsearch服务器地址
37   kibana.index: ".kibana"         #打开索引,默认.kibana
96   logging.dest: /var/log/k.log      #指定日志文件, 需要手动建立文件
114  i18n.locale: "zh-CN"              #中文设置

chown kibana:kibana /var/log/k.log
systemctl start kibana
ss -nap |grep 5601

#浏览器测试
访问192.168.254.100:5601

四、Logstash配合其他软件

4.1 收集nginx日志

4.1.1 环境介绍

bash 复制代码
logstash、nginx节点:192.168.254.20

elasticsearch:
node1:192.168.254.100
node2:192.168.254.120

4.1.2 配置

logstash、nginx节点:

bash 复制代码
vim /etc/nginx/nginx.conf

http {
# 添加在 http  语句块中   
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';

#修改默认日志格式
access_log  /var/log/nginx/access.log  access_json;

systemctl stop firewalld
setenforce 0
systemctl start nginx

vim /etc/logstash/conf.d/nginx-log.conf

input {
        file {
               path => "/var/log/nginx/access.log"
               type => "nginx"
               start_position => "beginning"
               codec => "json"    #转换格式为json
               stat_interval => 3    #自动检测,3秒间隔
}
}

output {
        elasticsearch {
        hosts => [ "192.168.254.100:9200", "192.168.254.120:9200"]
        index => "nginx-%{+YYYY.MM.dd}"
        }
}

logstash -f  nginx-log.conf

4.2 收集tomcat日志

4.2.1 环境介绍

bash 复制代码
tomcat节点、logstash节点:192.168.254.20

elasticsearch:
node1:192.168.254.100
node2:192.168.254.120

4.2.2 配置

logstash、tomcat节点:

bash 复制代码
vim /usr/local/tomcat/conf/server.xml 
# 最后一行

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="tomcat_access_log" suffix=".log"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>


chmod +r /usr/local/tomcat/logs/*
#修改权限
bash 复制代码
vim /etc/logstash/conf.d/tomcat-log.conf

input {
  file {
    path => "/usr/local/tomcat/logs/tomcat_access_log.*.log"
    type => "tomcat-acceslog"
    start_position => "beginning"
    stat_interval => "3"
  }
}

output {
  if [type] == "tomcat-acceslog" {
    elasticsearch {
      hosts => ["192.168.254.100:9200","192.168.254.120:9200"]
      index => "logstash-tomcat-accesslog-%{+YYYY.MM.dd}"
  }} 
}


logstash -f tomcat-log.conf

4.3 使用Redis接收tomcat日志

4.3.1 环境介绍

bash 复制代码
tomcat、logstash节点:192.168.254.20

elasticsearch:
node1:192.168.254.100
node2:192.168.254.120

redis:192.168.254.50

4.3.2 配置

logstash节点:

bash 复制代码
vim /etc/logstash/conf.d/redis_tomcat-log.conf
input {
  file {
    path => "/usr/local/tomcat/logs/tomcat_access_log.*.log"
    type => "tomcat-acceslog"
    start_position => "beginning"
    stat_interval => "3"
  }

}

output {
  if [type] == "tomcat-acceslog" {
        redis {
        data_type => list
        key => "tomcat-accesslog-50"
        host => "192.168.254.50"
        port => "6379"
        db => "0"
}
}

}

redis节点:

bash 复制代码
redis-cli

keys*
1) "tomcat-accesslog-50"

4.3.3 其他logstash服务器从redis读取数据

bash 复制代码
vim /etc/logstash/conf.d/redis.conf 

input {
   redis {
   data_type => "list"
   key => "tomcat-accesslog-50"
   host => "192.168.254.50"
   port => "6379"
   db => "0"
}
}


output {
  elasticsearch {
     hosts => ["192.168.254.100:9200", "192.168.254.120:9200"]
     index => "logstash-tomcat50-accesslog-%{+YYYY.MM.dd}"
}
}

读取后,redis中的数据就会消失

相关推荐
这个DBA有点耶2 小时前
银行核心系统数据库迁移怎么选?6 步法+5 个避坑指南
数据库·安全·架构
caoerzhong3 小时前
JeeWMS 开源仓库管理系统多租户架构解析:一套 Java WMS 如何同时服务多个货主与多个仓库
java·架构·开源·vue
聚搜云——JuSouClouD3 小时前
阿里云代理商能帮忙设计架构方案吗?有哪些增值服务
阿里云·架构·云计算
白远山4 小时前
智慧场馆解决方案软件开发实战:从架构设计到落地部署指南
java·开发语言·架构·需求分析
m0_587383004 小时前
折扣卡CPS软件开发实战:从系统架构设计到上线指南
java·小程序·架构·需求分析
Dawson Zhu4 小时前
基于 OKF 知识图谱的 Text2SQL 领域知识注入实践——半导体晶圆厂数据资产知识库 MVP 剖析
人工智能·语言模型·架构·aigc·agi
晚安日记wanna4 小时前
批量请求失败只弹一个 Toast面试官想听五层
前端·面试·架构
大模型码小白4 小时前
告别造假数据,直接连数据库查真实时序数据喂给 TimechoAI 大模型
java·数据库·人工智能·microsoft·架构
晚安日记wanna4 小时前
大表 DDL 面试翻车现场Online DDL 为什么还会锁死业务
数据库·面试·架构
晚安日记wanna4 小时前
MySQL 主从延迟别只答并行复制
数据库·面试·架构