1.ELK架构是什么
ELK是Elasticsearch+Logstash+Kibana的简称。
Elasticsearch是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建在Lucene搜索引擎库之上,是当前使用较为广泛的开源搜索引擎之一。
Logstash是一个开源的数据搜集引擎是一个用来搜集、分析、过滤日志的工具,使用它可以将搜集来的日志信息进行处理然后进行输出。Logstash支持许多功能强大的插件,可以合理使用这些插件来对搜集到 的日志信息进行过滤和处理。
Kibana是一个基于Web的图形界面,可以使用它对Elasticsearch索引中的数据进行搜索、查看、交互操作。还可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Filebeat是一个轻量级的日志搜集器,用于搜集和转发日志数据,Filebeat一般都会安装在需要搜集日志的服务器上,指定需要搜集日志的日志文件的位置,搜集日志信息并转发到Elasticsearch 或Logstash上进行索引。
其中, Filebeat 主要用于在服务器中采集服务日志信息并输出到 Logstash, Logstash 负责接收所有 Filebeat 传递过来的日志数据,并对数据进行过滤筛选处理后输出到 Elasticsearch, Elasticsearch 主要用于日志消息的存储,搜索和分析,在 Elasticsearch 中存储的索引信息最终会通过 Kibana 在页面上直观的进行展示。最终用户可以在 Kibana 页面中操作索引,查询日志, 监控 Elasticsearch 和 Kibana 的健康状态,以及配置多种 Dashboard 来展示聚合数据信息。
总结来说,ELK 日志监控大体上分为两部分,Elasticsearch、Logstash 和 Filebeat 负责数据的搜集,过滤,存储和分析,Kibana 负责操作存储在 Elasticsearch 中的索引信息,监控 Elasticsearch 和 Kibana 的健康状态以及管理用户信息。 同时用户还可以配置多种 Dashboard 来展示数据聚合信息。
2.为什么采用ELK架构
(1)Elasticsearch、Logstash、Kibana、Filebeat 均为开源组件,并且使用 ELK 搭建日志监控系统的方案也比较成熟。
(2)一般的日志监控系统架构都是采用 ELK(Elasticsearch、Logstash、Kibana)架构去搭建的,但是由于 Logstash 本身是基于 jdk 的,且它集成了许多插件,所以占用内存较大,在每台服务器上都部署一 个 Logstash 有些占用资源,因此我们使用轻量级的 Filebeat 组件来完成搜集日志的操作。但是 Filebeat 只能采集日志数据却无法对数据进行过滤,因此我们在将日志信息输出到 Elasticsearch 之前先使 用 Logstash 对数据进行过滤处理,再将处理好的数据输出到 Elasticsearch。
(3)在微服务场景下,可能存在如下两种情况:
- 开发或生产环境的微服务项目部署在多台服务器上,此时需要监控多台服务器下的日志信息情况;
- 一台服务器下既存在开发环境的微服务项目,又存在生产环境的微服务项目,此时需要将搜集到的日志信息加以区分。
这种情况下我们可以在 Filebeat 采集日志时为日志信息指定每个不同环境的唯一前缀后再输出。
3.ElasticSearch8.X源码部署
(1)什么是ElasticSearch
官网:https://www.elastic.co/cn/elasticsearch/
ElasticSearch是⼀个开源,是⼀个基于Apache Lucene库构建的Restful搜索引擎. Elasticsearch是在Solr之后⼏年推出的。
它提供了⼀个分布式,多租户能⼒的全⽂搜索引擎,具有HTTP Web界⾯(REST)和⽆架构JSON⽂档。
Elasticsearch的官⽅客户端库提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript。
应⽤场景:维基百科、Stack Overflow、GitHub、电商⽹站、⽇志数据分析、商品价格监控⽹站、BI系统、站内搜索
(2)Elasticsearch核心概念
- Index索引
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合,相当于关系型数据库中的一个Database。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
- 类型Type
类型是索引内部的逻辑分区,在一个索引内部可定义一个或多个类型(type),类似于传统数据库中的表。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。
- 文档Document
文档是索引和搜索的原子单位,它是存储在ES中的一个JSON格式的字符串,其中包含了一个或多个域(Field)的容器。在ES中每个文档都有一个类型和ID,每个文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。
- 集群Cluster
集群由一个或多个节点组成,对外提供索引和搜索功能。在一个集群中所有的节点都有一个唯一的名称默认为“Elasticsearch”,当某个节点被设置为相同的集群名称时,会自动加入到集群。如果有多个集群,需要设置不同的名称,否则节点可能会加入到错误的集群。需要注意的是一个节点只能加入一个集群。
- 节点Node
一个运行中的Elasticsearch实例称为一个节点,它是一个逻辑上独立的服务,可以存储数据,是ES集群的一部分。ES集群由一个或者多个拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力。ES集群中的节点有三种不同的类型:
主节点:负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等,并决定哪些分片分配给相关的节点、追踪集群中节点的状态等。主节点并不需要涉及到文档级别的变更和搜索等操作,可以通过属性node.master进行设置。
数据节点:存储数据和其对应的倒排索引,同时对数据进行增删改查和聚合等操作。默认每一个节点都是数据节点(包括主节点),可以通过node.data属性进行设置。通常随着集群的扩大,需要增加更多的数据节点来提高性能和可用性。
协调节点:如果node.master和node.data属性均为false,则此节点称为协调节点,用来响应客户请求,均衡每个节点的负载。
- 路由Routing
当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择。默认情况下这个值由文档的ID生成,如果文档中指定了一个父文档,则从父文档ID中生成。
注:Routing值和路由计算具体到哪个分片有关。
- 分片Sharding
ES中的索引数据量太大的时候,可以通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,这个数据块称为分片,相当于水平分表。一个分片便是一个Lucene的实例,ES中的index就是指向主分片和副本分片的逻辑空间。实际的文档数据被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
主分片:每个文档都存储在一个分片中,当存储一个文档的时候,ES首先将数据存储在主分片中,然后复制到不同的副本中。ES默认为一个索引创建 5 个主分片, 并分别为每个分片创建一个副本,通过参数可以指定。在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。
副本分片:副本分片是主分片的复制,每个主分片有0个或者多个副本。当主分片异常的时候,可以从副本分片中选择一个作为主分片,提高可用性。同时,查询可以在副本分片进行,减轻主分片的压力,提高性能。
- 元数据
Elasticsearch中以 “ _” 开头的属性都成为元数据,都有自己特定的意思。
(3)上传安装包和解压
tar -zxvf elasticsearch-8.4.1-linux-x86_64.tar.gz
(4)elasticsearch默认不允许以root账号运行,新建一个用户运行es
创建用户:useradd es_user
设置密码:passwd es_user
(5)修改目录权限
# chmod是更改文件的权限
# chown是改改文件的属主与属组
# chgrp只是更改文件的属组。
chgrp -R es_user /usr/local/software/elasticsearch-8.4.1
chown -R es_user /usr/local/software/elasticsearch-8.4.1
chmod -R 777 /usr/local/software/elasticsearch-8.4.1
(6)修改文件和进程最大打开数,需要root用户,如果系统本身有这个文件最大打开数和进程最大打开数配置,则不用
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
(7)修改虚拟内存空间,默认太小
在配置文件中改配置 最后一行上加上,执行 sysctl -p(立即生效)
vi /etc/sysctl.conf
vm.max_map_count=262145
(8)修改elasticsearch的JVM内存,机器内存不足,常规线上推荐16到24G内存
vi config/jvm.options
-Xms1g
-Xmx1g
(9)修改 elasticsearch相关配置
vi config/elasticsearch.yml
cluster.name: my-application
node.name: node-1
path.data: /usr/local/software/elasticsearch-8.4.1/data
path.logs: /usr/local/software/elasticsearch-8.4.1/logs
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
ingest.geoip.downloader.enabled: false
配置说明:
cluster.name: 指定Elasticsearch集群的名称。所有具有相同集群名称的节点将组成一个集群。
node.name: 指定节点的名称。每个节点在集群中应该具有唯一的名称。
path.data: 指定用于存储Elasticsearch索引数据的路径。
path.logs: 指定Elasticsearch日志文件的存储路径。
network.host: 指定节点监听的网络接口地址。0.0.0.0表示监听所有可用的网络接口,开启远程访问连接
http.port: 指定节点上的HTTP服务监听的端口号。默认情况下,Elasticsearch的HTTP端口是9200。
cluster.initial_master_nodes: 指定在启动集群时作为初始主节点的节点名称。
xpack.security.enabled: 指定是否启用Elasticsearch的安全特性。在这里它被禁用(false),意味着不使用安全功能。
xpack.security.enrollment.enabled: 指定是否启用Elasticsearch的安全认证和密钥管理特性。在这里它被禁用(false)。
ingest.geoip.downloader.enabled: 指定是否启用GeoIP数据库下载功能。在这里它被禁用(false)
(10)启动ElasticSearch,切换到es_user用户启动
./elasticsearch &
(11)常见命令访问es的服务状态
#查看集群健康情况
http://ip:9200/_cluster/health
#查看分片情况
http://ip:9200/_cat/shards?v=true&pretty
#查看节点分布情况
http://ip:9200/_cat/nodes?v=true&pretty
#查看索引列表
http://ip:9200/_cat/indices?vip
(12)部署es常见的问题
磁盘空间需要85%以下,不然ES状态会不正常
不要用root用户安装
linux内存不够
linux文件句柄
没开启远程访问 或者 网络安全组没看开放端口
有9300 tcp端口,和http 9200端口,要区分
没权限访问,重新执行目录权限分配
4.Kibana8.X源码部署
(1)什么是Kibana
- 基于node.js开发,数据可视化和仪表盘工具,连接到Elasticsearch,通过简单易用的用户界面创建各种图表、图形和仪表盘
- 帮助用户快速探索和理解数据,并进行强大的数据分析和可视化
(2)上传安装包和解压
tar -zxvf kibana-8.4.1-linux-x86_64.tar.gz
(3)配置用户权限
chgrp -R es_user /usr/local/software/kibana-8.4.1
chown -R es_user /usr/local/software/kibana-8.4.1
chmod -R 777 /usr/local/software/kibana-8.4.1
(4)修改配置文件
vim config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://ip:9200"] #es部署机器的IP地址
i18n.locale: "zh-CN" #汉化
server.port: 指定Kibana服务器监听的端口号,Kibana将在5601端口上监听HTTP请求。
server.host: 指定Kibana服务器绑定的网络接口地址, "0.0.0.0"表示监听所有可用的网络接口。
elasticsearch.hosts: 指定ES集群的主机地址,可以配置多个,Kibana将连接到位于"120.24.7.58"主机上、使用默认HTTP端口9200的es
i18n.locale: 指定Kibana界面的语言区域,"zh-CN"表示使用简体中文作为语言。
(5)启动,切换到es_user 用户
./kibana &
- 访问:192.168.140.100:5601
(6)开发者工具
5.SpringBoot部署应用
(1)创建SpringBoot项目,编写测试接口
@RequestMapping("/log")
public String log(){
logService.log();
return "SUCCESS";
}
(2)配置logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_HOME" value="./logs" />
<!--采用打印到控制台,记录日志的方式-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 采用保存到日志文件 记录日志的方式,
%d{yyyy-MM-dd HH:mm:ss.SSS}:输出日志发生的时间,精确到毫秒。
[%thread]:输出日志所在的线程名。
%-5level:输出日志级别,使用占位符%5level可以保持日志级别的对齐。
%logger{36}:输出日志所在的类名(只输出类名的后36个字符)。
%msg:输出日志消息。
%n:新行。
-->
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/order.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/order-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 指定某个类单独打印日志 -->
<logger name="com.lixiang.service.impl.LogServiceImpl"
level="INFO" additivity="false">
<appender-ref ref="rollingFile" />
<appender-ref ref="console" />
</logger>
<root level="INFO" additivity="false">
<appender-ref ref="rollingFile" />
</root>
</configuration>
(3)打包部署服务器
ps -ef | grep order-service-1.0.jar | grep -v grep | awk '{print $2}' | xargs kill -9
nohup java -Xms512m -Xmx512m -jar /usr/local/order/order-service-1.0.jar > order.log 2>&1 &
6.LogStash8.X源码部署
(1)什么是Logstash
- Logstash是一个用于数据收集、转换和传输的数据处理引擎,支持从各种来源(如文件、日志、数据库等)收集数据。
- 基于java开发,并对数据进行结构化、过滤和转换,然后将数据发送到Elasticsearch等目标存储或分析系统。
- 常见的数据采集流程
- Logstash 采集 –> Elasticsearch –> Kibana
- Beats 采集(Filebeat/Metricbeat)–> Elasticsearch –> Kibana
- Beats 采集(Filebeat/Metricbeat)–> Logstash –> Elasticsearch –> Kibana
(2)LogStash宏观配置文件组成
(3)上传安装包和解压
tar -zxvf logstash-8.4.1-linux-x86_64.tar.gz
(4)修改配置文件
- JVM内存不够的话修改
config/jvm.options
- 创建新配置文件
touch config/test-logstash.conf
input {
file {
path => "/usr/local/order/logs/order.log"
start_position => "beginning"
stat_interval => "3"
type => "order-service-log"
}
}
output {
if [type] == "order-service-log" {
elasticsearch {
hosts => ["http://192.168.140.100:9200"]
index => "order-service-%{+YYYY.MM.dd}"
}
}
}
input:指定Logstash接收数据的输入插件,使用file插件作为输入。file插件用于读取并处理文件中的数据。
file:指定使用的输入插件是file插件。
path:指定要读取的文件路径,Logstash会读取位于"/usr/local/software/log/access.log"路径下的文件。
start_position:指定从文件的哪个位置开始读取数据。设置为"beginning"表示从文件的开始位置开始读取数据。
stat_interval:指定文件的状态检查间隔(以秒为单位)。设置为"3"表示每隔3秒检查一次文件状态,以判断是否有新数据。
type:指定数据的类型名称。设置为"nginx-access-log"表示数据的类型是Nginx访问日志。
output:指定Logstash处理完数据后的输出插件。使用elasticsearch插件将处理后的日志数据发送到Elasticsearch。
elasticsearch:指定使用的输出插件是elasticsearch插件。
hosts:指定Elasticsearch集群的主机地址。Logstash将处理后的数据发送到位于"192.168.140.100"主机上,HTTP端口9200的ES节点
index:指定数据在Elasticsearch中的索引名称,比如【 filebeat-8.4.1-2023.07.02 】
使用[@metadata][beat]字段、[@metadata][version]字段和当前日期来构建索引名称
可以根据采集数据的来源和版本动态创建索引。
(5)启动,进入bin目录
./logstash -f /usr/local/software/logstash-8.4.1/config/test-logstash.conf &
(6)访问kibana,查看索引管理