【网络架构】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中的数据就会消失

相关推荐
白总Server12 小时前
JVM解说
网络·jvm·物联网·安全·web安全·架构·数据库架构
CodingBrother12 小时前
软考之面向服务架构SOA
微服务·架构
随遇而安622&50820 小时前
分布式微服务项目,同一个controller方法间的转发导致cookie丢失,报错null pointer异常
分布式·微服务·架构·bug
未命名冀20 小时前
微服务day07
微服务·架构·jenkins
车载诊断技术21 小时前
电子电气架构--- 实施基于以太网的安全车载网络
网络·人工智能·安全·架构·汽车·电子电器架构
向上的车轮21 小时前
ODOO学习笔记(8):模块化架构的优势
笔记·python·学习·架构
Kika写代码1 天前
【基于轻量型架构的WEB开发】课程 13.2.4 拦截器 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
spring·架构·java-ee
丶21361 天前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
CodingBrother1 天前
软考之面向服务架构SOA-通信方法
架构
码哥字节1 天前
重生之从零设计 MySQL 架构
数据库·mysql·架构