分布式日志分析系统--ELK

ELK概述

ELK是elastic的三个开源项目( Elasticsearch、Logstash和Kibana)的首字母缩写,三个项目各有不同的功能。后来elastic又增加了许多新项目,于是从5.X版本后改名为Elastic Stack。
在这里插入图片描述

Elastic Stack是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。通常将Elastic Stack称为ELK Stack(代指Elasticsearch、Logstash和Kibana),目前Elastic Stack包括一系列丰富的轻量型数据采集代理,这些代理统称为Beats,可用来向Elasticsearch 发送数据。

官方帮助手册:https://www.elastic.co/cn/elastic-stack/

Elasticsearch
  是一个实时的全文搜索,存储库和分析引擎。

Logstash
  是服务器端数据处理的管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到Elasticsearch存储库中。
  Logstash将收集过来的数据做转换,做过滤,比如转换成json格式,我们需要在Logstash上定义转换逻辑和转换策略。
  
Kibana
  则可以让用户在Elasticsearch中使用图形和图表对数据进行可视化。

ELK下载:https://www.elastic.co/cn/downloads/

ELK权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

ELK主要特点

ELK的主要特点
  1.功能强大: Elasticsearch是实时全文索引,具有强大的搜索功能。
  2.配置相对简单: Elasticsearch 全部其于JSON,Logstash使用模块化配置,Kibana的配置都比较简单。
  3.检索性能高效: 基于优秀的设计,每次查询可以实时响应,即使百亿级数据的查询也能达到秒级响应。
  4.集群线性扩展: Elasticsearch和Logstash都可以灵活线性扩展前端操作方便:Kibana提供了比较美观UI前端,操作也比较简单。

ELK主要组件

ELK主要组件
  1.Elasticsearch 管理
  2.Beats 实现日志收集
  3.Logstash 实现日志过滤转换
  4.Kibana 实现图形化展示

ELK应用架构

在这里插入图片描述

基于Filebeat的ELK集群架构
在这里插入图片描述

Elasticsearch

Elasticsearch是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch在Apache Lucene的基础上开发而成,由Elasticsearch N.V.(即现在的Elastic)于2010年首次发布。Elasticsearch以其简单的REST风格API、分布式特性、速度和可扩展性而闻名,是Elastic Stack的核心组件。

Elasticsearch支持数据的实时全文搜索、支持分布式和高可用、提供API接口,可以处理大规模的各种日志数据的处理,比如: Nginx、Tomcat、系统日志等功能。

Elasticsearch基于Java语言开发,利用全文搜索引擎Apache Lucene 实现。

原理

原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到Elasticsearch中。数据采集指在Elasticsearch中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在Elasticsearch中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在Kibana中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对Elastic Stack进行管理。

JSON格式

Elasticsearch索引指相互关联的文档集合,Elasticsearch 会以JSON文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值((字符串、数字、布尔值、日期、数组、地理位置或其他类型的数据)之间建立联系。

倒排索引

Elasticsearch使用的是一种名为倒排索引的数据结构,这一结构的设计可以十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引API中启动的,通过此API既可向特定索引中添加JSON文档,也可更改特定索引中的JSON文档。

ES与MySQL对比

在这里插入图片描述

在这里插入图片描述

ES相关概念

● Near Realtime(近实时):Elasticsearch是一个近乎实时的搜索平台,这意味着从索引文档到可搜索文档之间只有一个轻微的延迟(通常是一秒钟)。

● Cluster(集群):群集是一个或多个节点的集合,它们一起保存整个数据,并提供跨所有节点的联合索引和搜索功能。每个集群都有自己的唯一集群名称,节点通过名称加入集群。

● Node(节点):节点是指属于集群的单个Elasticsearch实例,存储数据并参与集群的索引和搜索功能。可以将节点配置为按集群名称加入特定集群,默认情况下,每个节点都设置为加入一个名为elasticsearch的群集。

● Index(索引):索引是一些具有相似特征的文档集合,类似于MySql中数据库的概念。

● Type(类型):类型是索引的逻辑类别分区,通常为具有一组公共字段的文档类型,类似MySql中表的概念。注意:在Elasticsearch 6.0.0及更高的版本中,一个索引只能包含一个类型。

● Document(文档):文档是可被索引的基本信息单位,以JSON形式表示,类似于MySql中行记录的概念。

● Shards(分片):当索引存储大量数据时,可能会超出单个节点的硬件限制,为了解决这个问题,Elasticsearch提供了将索引细分为分片的概念。分片机制赋予了索引水平扩容的能力、并允许跨分片分发和并行化操作,从而提高性能和吞吐量。

● Replicas(副本):在可能出现故障的网络环境中,需要有一个故障切换机制,Elasticsearch提供了将索引的分片复制为一个或多个副本的功能,副本在某些节点失效的情况下提供高可用性。

ES安装说明

官方文档:https://www.elastic.co/guide/en/elastic-stack/index.html

ES系统版本和JAVA版本说明
官方文档:https://www.elastic.co/cn/support/matrix

1.环境初始化

CPU 2C 内存4G或更多
操作系统:ubuntu20.04, ubuntu18.04, Rocky8.x, centos7.x操作系统盘50G
主机名设置规则为es-nodeX
生产环境建议准备单独的数据磁盘

1.1集群中各个服务器配置自己的主机名

[root@ubuntu2004 ~]# hostnamectl set-hostname es-node1

我有3个主机es-node1、es-node2、es-node3

1.2关闭防火墙和SElinux

root@es-node1:~# systemctl disable ufw
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable ufw
Removed /etc/systemd/system/multi-user.target.wants/ufw.service.
sed -i ' /SELINUX/s/enforcing/disabled/' /etc/selinux/config

1.3配置本地域名解析

root@es-node1:~# vim /etc/hosts
192.168.10.145 es-node1.lei.org
192.168.10.146 es-node2.lei.org
192.168.10.147 es-node3.lei.org

2.优化系统资源限制配置

内核参数vm.max_map_count用于限制一个进程可以拥有的VMA(虚拟内存区域)的数量使用默认系统配置,二进制安装时会提示下面错误,包安装会自动修改此配置。

默认值很小,不调大会导致ES起不来。

2.1修改vm.max_map_count配置
基于二进制包的安装会自动修改为262144

查看默认配置

root@es-node3:~# sysctl -a |grep vm.max_map_count
vm.max_map_count = 65530
[root@es-node1 ~]#echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
[root@es-node1 ~]#sysctl -p
vm.max_map_count = 262144

在这里插入图片描述
2.3查看fs.file-max的默认值

[root@es-node1 ~]#echo "fs.file-max = 需要修改的值" >> /etc/sysctl.conf

在这里插入图片描述

2.3limits.conf
vim /etc/security/limits.conf

*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                soft    nofile          1000000
*                hard    nofile          1000000
*                soft    mem1ock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

3.编辑ES服务文件elasticsearch. yml

官方参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/index.html
https://www.elastic.co/guide/en/elasticsearch/reference/master/settings.html
https://www.elastic.co/guide/en/elasticsearch/reference/master/important-settings.html

[root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml

#ELK集群名称,同一个集群内每个节点的此项必须相同,新加集群的节点此项和其它节点相同即可加入集群,而无需再验证
cluster.name: ELK-Cluster

#当前节点在集群内的节点名称,同一集群中每个节点要确保此名称唯一
node.name: es-node1

#ES数据保存目录
path.data: /data/es-data

#ES日志保存目录
path.1ogs: /data/es-logs

#服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap ,提高启动速度
bootstrap.memory_lock: true

#指定监听IP,如果绑定了错误的IP,可将此修改为指定IP
network.host: 0.0.0.0

#监听端口
http.port: 9200

#发现集群的node节点列表,可以添加部分或全部节点IP

#在新增节点到集群时,此处需指定至少一个已经在集群中的节点地址
discovery.seed_hosts: ["192.168.10.145", "192.168.10.146", "192.168.10.147"]

#集群初始化时指定希望哪些节点可以被选举为master,只在初始化时使用,新加节点到已有集群时此项可不配置
cluster.initial_master_nodes: ["192.168.10.145", "192.168.10.146", "192.168.10.147"]

#一个集群中的N个节点启动后,才允许进行数据恢复处理,默认是1,一般设为为所有节点的一半以上,
#防止出现脑裂现象,当集群无法启动时,可以将之修改为1,或者将下面行注释掉,实现快速恢复启动
gateway.recover_after_nodes: 2

#设置是否可以通过正则表达式或者_all匹配索引库进行删除或者关闭索引库,
#默认true表示必须需要明确指定索引库名称,不能使用正则表达式和_all,生产环境建议设置为true,防止误删索引库。
action.destructive_requires_name: true

#不参与主节点选举
node.master: false

#存储数据,此值为false则不存储数据而成为一个路由节点
#如果将true改为false ,需要先执行/usr/share/elasticsearch/bin/elasticsearch-noderepurpose清理数据
node.data: true

单节点配置

[root@ubuntu2004 ~]#grep -v '#' /etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["10.0.0.100"]
cluster.initial_master_nodes: ["node-1"]

集群配置

[root@es-node1 ~]#grep -Ev '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: es-cluster
node.name: es-node1         #集群中,只需要修改此行,每个节点都不能相同
path.data: /data/es-data
path.1ogs: /data/es-logs
bootstrap.memory_1ock: 
truenetwork.host: 0.0.0.0
discovery.seed_hosts: ["10.0.0.101", "10.0.0.102", "10.0.0.103"]
cluster.initia1_master_nodes: ["10.0.0.101", "10.0.0.102,"10.0.0.103"]
gateway.recover_after_nodes: 2
action.destructive_requires_name: true

[root@es-node1 ~]#scp /etc/elasticsearch/elasticsearch.yml es-node2: /etc/elasticsearch/
[root@es-node1 ~]#scp /etc/elasticsearch/elasticsearch.yml es-node3: /etc/e1asticsearch/

开启bootstrap.memory_lock: true后,如果内存不够的话,会导致无法启动的错误。
官方解决错误的文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html#systemd

在这里插入图片描述

[root@node1 ~]#systemctl edit elasticsearch[service]
LimitMEMLOCK=infinity

[root@node1 ~]#cat /etc/systemd/system/elasticsearch.service.d/override.conf
[service]
LimitMEMLOCK=infinity

[root@node1 ~]#systemctl daemon-reload
[root@node1 ~]#systemctl restart elasticsearch.service
[root@node1 ~]#systemctl is-active elasticsearch.service
active

优化ELK

内存不是越大越好
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#heap-size-settings

推荐使用宿主机物理内存的一半,ES的heap内存最大不超过30G,26G是比较安全的
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/master/advanced-configuration.html#set-jvm-heap-size
在这里插入图片描述
翻译为
在这里插入图片描述
内存优化建议:

为了保证性能,每个ES节点的JVM内存设置具体要根据node要存储的数据量来估算,建议符合下面约定
  1.在内存和数据量有一个建议的比例:对于一般日志类文件,1G内存能存储48G~96GB数据
  2.JVM堆内存最大不要超过30GB
  3.对于主分片的数量,单个分片控制在30-50GB

建议将heap内存设置为物理内存的一半且最小和最大设置一样大,但最大不能超过30G

[root@es-node1 ~]# vim /etc/elasticsearch/jvm.options
-xms2g
-xm×2g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值