1-1-ELK基础和安装

熊 6 阅读 日志平台

1. ELK介绍

1.1 ELK简介

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查询动态

1.2 为什么使用ELK

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

往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析 , 但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器 , 你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理 , 例如 : 开源的syslog , 将所有服务器上的日志收集汇总。集中化管理日志后 , 日志的统计和检索又成为一件比较麻烦的事情 , 一般我们使用grep、awk和wc等Linux命令能实现检索和统计 , 但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

一般大型系统是一个分布式部署的架构 , 不同的服务模块部署在不同的服务器上 , 问题出现时 , 大部分情况需要根据问题暴露的关键信息 , 定位到具体的服务器和服务模块 , 构建一套集中式日志系统 , 可以提高定位问题的效率。

1.3 完整日志系统基本特征

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

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

  • 存储 : 存储日志数据

  • 分析 : 支持 UI 分析

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

2. ELK架构分析

2.1 beats+elasticsearch+kibana模式

elk-base-struct-1

如上图所示 , 该ELK框架由beats( 日志分析我们通常使用filebeat)+elasticsearch+kibana构成 , 这个框架比较简单 , 入门级的框架。其中filebeat也能通过module对日志进行简单的解析和索引。并查看预建的Kibana仪表板。

该框架适合简单的日志数据 , 一般可以用来玩玩 , 生产环境建议接入logstash

2.2 beats+logstash+elasticsearch+kibana模式

elk-base-struct-2

该框架是在上面的框架的基础上引入了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的常用方法(如下图所示) :

elk-base-struct-3

2.3 beats+缓存/消息队列+logstash+elasticsearch+kibana模式

elk-base-struct-4

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

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

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

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

3. 基础概念

3.1 elasticsearch 介绍

Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库 , 其中每个字段均可被索引 , 而且每个字段的数据均可被搜索 , ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。

基本概念有 : Cluster 集群、Node节点、Index索引、Document文档、Shards &Replicas分片与副本等

elasticsearch的优势 :

  • 分布式 : 横向扩展非常灵活

  • 全文检索 : 基于lucene的强大的全文检索能力;

  • 近实时搜索和分析 : 数据进入ES , 可达到近实时搜索 , 还可进行聚合分析

  • 高可用 : 容错机制 , 自动发现新的或失败的节点 , 重组和重新平衡数据

  • 模式自由 : ES的动态mapping机制可以自动检测数据的结构和类型 , 创建索引并使数据可搜索。

  • RESTful API : JSON + HTTP

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能 , 但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性 , 从而让全文搜索变得简单。

Lucene只是一个库。想要使用它 , 你必须使用Java来作为开发语言并将其直接集成到你的应用中 , 更糟糕的是 , Lucene非常复杂 , 你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能 , 但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性 , 从而让全文搜索变得简单。

当ElasticSearch的节点启动后 , 它会利用多播(multicast)(或者单播 , 如果用户更改了配置)寻找集群中的其它节点 , 并与之建立连接。

elk-base-struct-5

ES核心概念

  1. Cluster : 集群

    ES可以作为一个独立的单个搜索服务器。不过 , 为了处理大型数据集 , 实现容错和高可用性 , ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

  2. Node : 节点

    形成集群的每个服务器称为节点。

  3. Shard : 分片

    当有大量的文档时 , 由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等 , 一个节点可能不够。这种情况下 , 数据可以分为较小的分片。每个分片放到不同的服务器上。

    当你查询的索引分布在多个分片上时 , ES会把查询发送给每个相关的分片 , 并将结果组合在一起 , 而应用程序并不知道分片的存在。即 : 这个过程对用户来说是透明的。

  4. Replia : 副本

    为提高查询吞吐量或实现高可用性 , 可以使用分片副本。

    副本是一个分片的精确复制 , 每个分片可以有零个或多个副本。ES中可以有许多相同的分片 , 其中之一被选择更改索引操作 , 这种特殊的分片称为主分片。

    当主分片丢失时 , 如 : 该分片所在的数据不可用时 , 集群将副本提升为新的主分片。

  5. 全文检索

    全文检索就是对一篇文章进行索引 , 可以根据关键字搜索 , 类似于mysql里的like语句。

    全文索引就是把内容根据词的意义进行分词 , 然后分别创建索引 , 例如”你们的激情是因为什么事情来的” 可能会被分词成 : “你们“ , ”激情“ , “什么事情“ , ”来“ 等token, 这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。

ES数据架构的主要概念

这里主要以关系数据库Mysql进行对比

elk-base-struct-6
  1. 关系型数据库中的数据库(DataBase) , 等价于ES中的索引(Index)

  2. 一个数据库下面有N张表(Table) , 等价于1个索引Index下面有N多类型(Type)

  3. 一个数据库表(Table)下的数据由多行(ROW)多列(column , 属性) 组成 , 等价于1个Type由多个文档(Document)和多Field组成。

  4. 在一个关系型数据库里面 , schema定义了表、每个表的字段 , 还有表和字段之间的关系。 与之对应的 , 在ES中 : Mapping定义索引下的Type的字段处理规则 , 即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。

  5. 在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET。

3.2 kibana介绍

Kibana是一个开源的数据分析和可视化平台 , 专门设计用于与Elasticsearch配合使用。它提供了一个用户友好的界面 , 让用户能够搜索、查看、分析和展示存储在Elasticsearch索引中的数据。Kibana作为Elastic Stack的一部分 , 广泛应用于日志分析、性能监控、内容搜索等多个领域。

Kibana的主要特点包括 :

  1. 数据可视化 : Kibana提供了多种可视化工具 , 如图表、地图、表格和热图 , 帮助用户直观地理解数据。

  2. 强大的搜索功能 : 用户可以执行复杂的搜索查询 , 使用过滤器和聚合来细化搜索结果。

  3. 仪表板和可视化 : 用户可以创建和分享仪表板 , 将多个可视化组件组合在一起 , 以监控和展示数据的特定方面。

  4. 安全性 : Kibana支持用户身份验证、角色管理和索引模式 , 确保数据的安全性和访问控制。

  5. 可扩展性 :Kibana可以通过插件扩展其功能 , 社区和商业插件提供了额外的可视化类型、报告工具和其他功能。

  6. 与 Elastic Stack 集成 : Kibana与Elasticsearch、Logstash和Beats无缝集成 , 形成了一个强大的端到端解决方案 , 用于数据收集、搜索、分析和可视化。

Kibana的用户界面可以通过Web浏览器访问 , 支持多种操作系统 , 包括Windows、Linux和macOS。它通常作为独立的服务运行 , 也可以作为Docker容器部署。

Kibana的使用场景非常广泛 , 从IT运维监控、网络安全分析到业务智能和市场研究 , Kibana都能提供强大的数据探索和分析能力。随着数据量的不断增长 ,Kibana在帮助用户理解和利用数据方面发挥着越来越重要的作用。

kibana是您走进Elastic Stack的窗口 , Kibana让您能够可视化Elasticsearch中的数据并操作Elastic Stack , 因此您可以在这里解开任何疑问 : 例如 , 为何会在凌晨 2:00 被传呼 , 雨水会对季度数据造成怎样的影响。

  1. 一张图片胜过千万行日志

    Kibana让您能够自由地选择如何呈现您的数据。或许您一开始并不知道自己想要什么。不过借助Kibana的交互式可视化 , 您可以先从一个问题出发 , 看看能够从中发现些什么。

  2. 从基础入手

  Kibana核心搭载了一批经典功能 : 柱状图、线状图、饼图、环形图 , 等等。它们充分利用了Elasticsearch 的聚合功能。

  1. 将地理数据融入任何地图

    利用我们的Elastic Maps Services来实现地理空间数据的可视化 , 或者发挥创意 , 在您自己的地图上实现自定义位置数据的可视化。

  2. 时间序列也在菜单之列

    您可以利用Timelion , 对您Elasticsearch中的数据执行高级时间序列分析。您可以利用功能强大、简单易学的表达式来描述查询、转换和可视化。

  3. 利用 graph 功能探索关系

  凭借搜索引擎的相关性功能 , 结合graph探索 , 揭示您Elasticsearch数据中极其常见的关系。

3.3 logstash介绍

3.3.1 基础

官方介绍 : Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道 , 负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网 , Logstash提供里很多功能强大的滤网以满足你的各种应用场景。

Logstash的事件( logstash将数据流中等每一条数据称之为一个event) 处理流水线有三个主要角色完成 : inputs –> filters –> outputs :

  • inpust : 必须( 标准输入) , 负责产生事件( Inputs generate events) , 常用 : File、syslog、redis、beats( 如 : Filebeats)

  • filters : 可选 , 负责数据处理与转换( filters modify them) , 常用 : grok、mutate、drop、clone、geoip

  • output : 必须( 标准输出) , 负责数据输出( outputs ship them elsewhere) , 常用 : elasticsearch、file、graphite、statsd

1769223-20200312142147405-558505419

Logstash管道中的每个input阶段都在自己的线程中运行。将写事件输入到内存( 默认) 或磁盘上的中心队列。每个管道工作线程从该队列中取出一批事件 , 通过配置的filter处理该批事件 , 然后通过output输出到指定的组件存储。管道处理数据量的大小和管道工作线程的数量是可配置的

Logstash是一个功能强大的工具 , 可与各种部署集成。它提供了大量插件 , 可帮助你解析 , 丰富 , 转换和缓冲来自各种来源的数据。如果你的数据需要Beats中没有的其他处理 , 则需要将Logstash添加到部署中。

elk-base-struct-7

Logstash是Elastic栈非常重要的一部分 , 但是它不仅仅为Elasticsearch所使用。它可以介绍广泛的各种数据源。Logstash可以帮利用它自己的Filter帮我们对数据进行解析 , 丰富 , 转换等。

elk-base-struct-8

最后 , 它可以把自己的数据输出到各种需要的数据储存地 , 这其中包括Elasticsearch。

elk-base-struct-9

3.3.2 工作原理

elk-base-struct-10
  • 输入 , 以下是常见的输入内容

    1. file : 从文件系统上的文件读取 , 与UNIX命令非常相似tail -0F

    2. syslog : 在已知端口上侦听syslog消息进行解析

    3. redis : 使用redis通道和redis列表从redis服务器读取。Redis通常用作集中式Logstash安装中的“代理” , 该安装将Logstash事件从远程Logstash“托运人”排队。

    4. beats : 处理Beats发送的事件 , beats包括filebeat、packetbeat、winlogbeat。

  • 过滤 , 以下是常见的过滤器

    1. grok : 解析并构造任意文本。Grok是目前Logstash中将非结构化日志数据解析为结构化和可查询内容的最佳方式。Logstash内置了120种模式 , 您很可能会找到满足您需求的模式!

    2. mutate : 对事件字段执行常规转换。您可以重命名 , 删除 , 替换和修改事件中的字段。

    3. drop : 完全删除事件 , 例如调试事件。

    4. clone : 制作事件的副本 , 可能添加或删除字段。

    5. geoip : 添加有关IP地址的地理位置的信息(也在Kibana中显示惊人的图表!)

  • 输出 , 以下是常见的输出内容

    1. elasticsearch : 将事件数据发送给Elasticsearch。如果您计划以高效 , 方便且易于查询的格式保存数据...... Elasticsearch是您的最佳选择

    2. file : 将事件数据写入磁盘上的文件。

    3. graphite : 将事件数据发送到graphite , 这是一种用于存储和绘制指标的流行开源工具。http://graphite.readthedocs.io/en/latest/

    4. statsd : 将事件数据发送到statsd , 这是一种“侦听统计信息 , 如计数器和定时器 , 通过UDP发送并将聚合发送到一个或多个可插入后端服务”的服务。如果您已经在使用statsd , 这可能对您有用!

  • 编解码器

    编解码器基本上是流过滤器 , 可以作为输入或输出的一部分运行。使用编解码器可以轻松地将消息传输与序列化过程分开。流行的编解码器包括 json, multiline 等。

    • json : 以JSON格式编码或解码数据。

    • multiline : 将多行文本事件(例如java异常和堆栈跟踪消息)合并到一个事件中

3. ELK部署

ELK官网: https://www.elastic.co/cn/

ELK中文社区 : 搜索客 , 搜索人自己的社区 (elasticsearch.cn)

ELK下载地址: Past Releases of Elastic Stack Software | Elastic

ELK官方使用文档 : Elasticsearch Guide 8.13] | Elastic

ELK各个版本对应支持一览表: 支持一览表 | Elastic

ELK官方文档总览: Elastic documentation | Elastic

4.1 安装部署elasticsearch

4.1.1 linux系统参数设置

  1. 设置系统配置

    ulimit                    #暂时修改 , 切换到该用户es , ulimit -n 65535
    /etc/security/limits.conf #永久修改 es - nofile 65535
    ulimit -a                 #查看当前用户的资源限制
    
    #配置文件描述符
    ulimit -n 65535                #临时修改
    vim /etc/security/limits.conf  #永久修改
    es     soft  nofile   65535
    es     hard  nofile   65535
    
    #配置线程数
    ulimit -u 4096                 #临时修改
    vim /etc/security/limits.conf  #永久修改
    es         soft    nproc     65535
    es         hard    nproc     65535
  2. 禁用sawpping 方式一:

    swapoff -a       #临时禁用所有的swap文件
    vim /etc/fstab   #注释掉所有的swap相关的行 , 永久禁用

    方式二 :

    cat /proc/sys/vm/swappiness  #查看该值
    sysctl vm.swappiness=1       #临时修改该值为1
    vim /etc/sysctl.conf         #修改文件 永久生效
    vm.swappiness = 1            #如果有该值 , 则修改该值 , 若没有 , 则追加该选项 , sysctl -p生效命令

    方式三 :

    配置elasticsearch.yml文件 , 添加如下配置 : 
    bootstrap.memory_lock: true
    GET _nodes?filter_path=**.mlockall   #检查如上配置是否成功 
    注意 : 如果试图分配比可用内存更多的内存 , mlockall可能会导致JVM或shell会话退出!
  3. 配置虚拟内存

    sysctl -w vm.max_map_count=262144  #临时修改该值
    vim /etc/sysctl.conf               #永久修改
    vm.max_map_count=262144

这里官方提供的安装包在elasticsearch 6版本之前需要手动安装jdk1.8环境。在elasticsearch 7版本的时候, 提供了自带jdk和没有jdk的两个版本。在elasticsearch 8版本之后所有软件包默认带有jdk了

4.1.2 安装

4.1.2.1 apt/yum安装

清华大学下载地址 : Index of /elasticstack/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

官网下载地址 : https://www.elastic.co/cn/downloads/past-releases#elasticsearch

  1. 安装elasticsearch

    root@elasticsearch01:~# dpkg -i elasticsearch-8.13.1-amd64.deb 
  2. 准备存放目录

    root@elasticsearch02:~# mkdir /data
    root@elasticsearch02:~# chown elasticsearch -R /data

  3. 修改elasticsearch配置文件

    root@elasticsearch01:~# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 
    cluster.name: elasticsearch-cluster           # cluster集群名称 , 与其他集群的名称一致
    node.name: elasticsearch-cluster-node01       # 写一个node名称 , 与其他node名称不一致
    path.data: /data/esdata                       # 将数据保存在挂载的独立的data磁盘目录下
    path.logs: /data/eslog                        # 日志保存的目录
    bootstrap.memory_lock: true                   # 开启的话就会固定占用默认的2g内存, 防止数据写入SWAP
    network.host: 0.0.0.0                         # 监听的IP地址
    http.port: 9200                               # 监听端口
    discovery.seed_hosts: ["192.168.71.29", "192.168.71.30", "192.168.71.31"]      #集群中node节点发现列表
    cluster.initial_master_nodes: ["192.168.71.29", "192.168.71.30","192.168.71.31"] # 集群初始化那些节点可以被选举为master 
    gateway.recover_after_data_nodes: 2           #一个集群中的N个节点启动后,才允许进行数据恢复处理 , 默认是1
    action.destructive_requires_name: true        #设置是否可以通过正则或者_all删除或者关闭索引库 , 默认true表示必须需要
    显式指定索引库名称 , 生产环境建议设置为true , 删除索引库的时候必须指定 , 
    否则可能会误删索引库中的索引库。 
    xpack.security.enabled: false                 #关闭证书验证
    xpack.security.enrollment.enabled: false      #关闭证书验证
    xpack.security.http.ssl:
    xpack.security.transport.ssl:
    http.host: 0.0.0.0
    
    #Elasticsearch7新增参数 , 设置每个节点在选中的主节点的检查之间等待的时间。默认为1秒
    cluster.fault_detection.leader_check.interval: 2s 
    #Elasticsearch7新增参数 , 启动后30秒内 , 如果集群未形成 , 那么将会记录一条警告信息 , 警告信息未master not fount开始 , 默认为10秒
    discovery.cluster_formation_warning_timeout: 30s 
    #Elasticsearch7新增参数 , 节点发送请求加入集群后 , 在认为请求失败后 , 再次发送请求的等待时间 , 默认为60秒
    cluster.join.timeout: 30s
    #Elasticsearch7新增参数 , 设置主节点等待每个集群状态完全更新后发布到所有节点的时间 , 默认为30秒
    cluster.publish.timeout: 90s 
    #集群内同时启动的数据任务个数 , 默认是2个
    cluster.routing.allocation.cluster_concurrent_rebalance: 32
    #添加或删除节点及负载均衡时并发恢复的线程个数 , 默认4个
    cluster.routing.allocation.node_concurrent_recoveries: 32
    #初始化数据恢复时 , 并发恢复线程的个数 , 默认4个
    cluster.routing.allocation.node_initial_primaries_recoveries: 32
    # 开启xpack安全验证
    xpack.security.enabled: true
    xpack.license.self_generated.type: basic
    xpack.security.transport.ssl.enabled: true
    # 证书配置
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
  4. 将此配置文件传到另外一个elasticsearch主机上 , 修改node名称即可 , 实现集群分布

    root@elasticsearch02:~# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 
    cluster.name: elasticsearch-cluster
    node.name: elasticsearch-cluster-node02
    path.data: /data/esdata
    path.logs: /data/eslog
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    discovery.seed_hosts: ["192.168.71.29", "192.168.71.30", "192.168.71.31"]
    cluster.initial_master_nodes: ["192.168.71.29", "192.168.71.30","192.168.71.31"]
    gateway.recover_after_data_nodes: 2
    action.destructive_requires_name: true
    xpack.security.enabled: false                        
    xpack.security.enrollment.enabled: false
    xpack.security.http.ssl:
    xpack.security.transport.ssl:
    http.host: 0.0.0.0
  5. 修改elasticsearch内存限制

    • 由于默认占用内存为2G , 生产中肯定不够使用 , 我们需要将占用的固定内存改为物理机内存的50% , 最大不要超过32G

      root@elasticsearch02:~# vi  /lib/systemd/system/elasticsearch.service
      LimitMEMLOCK=infinity  # 修改elasticsearch启动服务的无限制使用内存
    • 修改elasticsearch的内存使用配置文件 , 为了覆盖默认堆大小,需要将最大最小内存设置一样

      root@elasticsearch01:~# vi  /etc/elasticsearch/jvm.options
      -Xms2g  # 最小内存为2g
      -Xmx2g   # 最大内存为2g
    • 修改/etc/security/limits.conf配置文件 , centos系统前面写*可以生效 , 但是ubuntu需要写上elsaticsearch用户名 , 才能生效。

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

  6. 启动elasticsearch服务

    root@elasticsearch01:~# systemctl daemon-reload
    root@elasticsearch01:~# systemctl restart elasticsearch
  7. 验证服务

    root@elasticsearch01:~# ss -ntlp
    State       Recv-Q      Send-Q           Local Address:Port            Peer Address:Port      Process                                         
    LISTEN      0           128                    0.0.0.0:22                   0.0.0.0:*          users:(("sshd",pid=733,fd=3))                  
    LISTEN      0           4096             127.0.0.53%lo:53                   0.0.0.0:*          users:(("systemd-resolve",pid=663,fd=14))      
    LISTEN      0           4096                         *:9300                       *:*          users:(("java",pid=4532,fd=449))               
    LISTEN      0           4096                         *:9200                       *:*          users:(("java",pid=4532,fd=490))               
    LISTEN      0           128                       [::]:22                      [::]:*          users:(("sshd",pid=733,fd=4))  
  8. 通过网站访问elasticsearch, 查看是否能够访问 : 192.168.71.29:9200、 192.168.71.30:9200、192.168.71.31:9200

    root@elasticsearch01:~# curl 192.168.71.29:9200
    {
      "name" : "elasticsearch-cluster-node01",
      "cluster_name" : "elasticsearch-cluster",
      "cluster_uuid" : "BP7ppt1yTwKQB2W_MupHCw",
      "version" : {
        "number" : "8.13.1",
        "build_flavor" : "default",
        "build_type" : "deb",
        "build_hash" : "9287f29bba5e270bd51d557b8daccb7d118ba247",
        "build_date" : "2024-03-29T10:05:29.787251984Z",
        "build_snapshot" : false,
        "lucene_version" : "9.10.0",
        "minimum_wire_compatibility_version" : "7.17.0",
        "minimum_index_compatibility_version" : "7.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    root@elasticsearch01:~# curl 192.168.71.30:9200
    {
      "name" : "elasticsearch-cluster-node02",
      "cluster_name" : "elasticsearch-cluster",
      "cluster_uuid" : "BP7ppt1yTwKQB2W_MupHCw",
      "version" : {
        "number" : "8.13.1",
        "build_flavor" : "default",
        "build_type" : "deb",
        "build_hash" : "9287f29bba5e270bd51d557b8daccb7d118ba247",
        "build_date" : "2024-03-29T10:05:29.787251984Z",
        "build_snapshot" : false,
        "lucene_version" : "9.10.0",
        "minimum_wire_compatibility_version" : "7.17.0",
        "minimum_index_compatibility_version" : "7.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    root@elasticsearch01:~# curl 192.168.71.31:9200
    {
      "name" : "elasticsearch-cluster-node03",
      "cluster_name" : "elasticsearch-cluster",
      "cluster_uuid" : "BP7ppt1yTwKQB2W_MupHCw",
      "version" : {
        "number" : "8.13.1",
        "build_flavor" : "default",
        "build_type" : "deb",
        "build_hash" : "9287f29bba5e270bd51d557b8daccb7d118ba247",
        "build_date" : "2024-03-29T10:05:29.787251984Z",
        "build_snapshot" : false,
        "lucene_version" : "9.10.0",
        "minimum_wire_compatibility_version" : "7.17.0",
        "minimum_index_compatibility_version" : "7.0.0"
      },
      "tagline" : "You Know, for Search"
    }

由于对应包里面的systemd文件中是静默输出,可以通过去掉运行命令中的--quiet查看具体的输出信息, 以方便排错

ExecStart=/usr/share/elasticsearch/bin/systemd-entrypoint -p ${PID_DIR}/elasticsearch.pid --quiet
修改为
ExecStart=/usr/share/elasticsearch/bin/systemd-entrypoint -p ${PID_DIR}/elasticsearch.pid 

如果没有配置内存限制, 会提示如下图所示报错 :

image-20240406130536184

4.1.2.2 二进制安装

  1. 下载elasticsearch

  2. 解压

    [root@elasticsearch-85 ~]# tar -xf elasticsearch-8.13.1-linux-x86_64.tar.gz -C /usr/local/src/
    [root@elasticsearch-85 ~]# ln -sv /usr/local/src/elasticsearch-8.13.1 /usr/local/src/elasticsearch
    '/usr/local/src/elasticsearch' -> '/usr/local/src/elasticsearch-8.13.1'
  3. 创建对应用户, 用以启动elasticsearch

    [root@elasticsearch-85 ~]# useradd -r -M -s /bin/false es
  4. 创建对应systemd文件, 之后直接启动即可

    [root@elasticsearch-85 elasticsearch]# cat /usr/lib/systemd/system/elasticsearch.service
    [Unit]
    Description=Elasticsearch
    Documentation=https://www.elastic.co
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=simple
    
    User=es
    Group=es
    
    ExecStart=/usr/local/src/elasticsearch/bin/elasticsearch
    
    # StandardOutput is configured to redirect to journalctl since
    # some error messages may be logged in standard output before
    # elasticsearch logging system is initialized. Elasticsearch
    # stores its logs in /var/log/elasticsearch and does not use
    # journalctl by default. If you also want to enable journalctl
    # logging, you can simply remove the "quiet" option from ExecStart.
    StandardOutput=journal
    StandardError=inherit
    
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65535
    
    # Specifies the maximum number of processes
    LimitNPROC=4096
    
    # Specifies the maximum size of virtual memory
    LimitAS=infinity
    LimitMEMLOCK=infinity 
    
    # Specifies the maximum file size
    LimitFSIZE=infinity
    
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=0
    
    # SIGTERM signal is used to stop the Java process
    KillSignal=SIGTERM
    
    # Send the signal only to the JVM rather than its control group
    KillMode=process
    
    # Java process is never killed
    SendSIGKILL=no
    
    # When a JVM receives a SIGTERM signal it exits with code 143
    SuccessExitStatus=143
    
    # Allow a slow startup before the systemd notifier module kicks in to extend the timeout
    TimeoutStartSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    # Built for packages-8.13.1 (packages)
    

4.1.3 配置文件说明

rpm/deb包涉及到的目录:

  • elasticsearch整体存放目录: /usr/share/elasticsearch

  • 配置文件目录: /etc/elasticsearch

  • PID目录: /var/run/elasticsearch

  • 服务启动时读取的参数配置文件:

    • /etc/default/elasticsearch(ubuntu)

    • /etc/sysconfig/elasticsearch(centos)

Cluser配置

配置

含义

cluster.name: holelin_elasticsearch

所属的集群名 , 默认为elasticsearch , 可自定义( 最好给生产环境的ES集群改个名字 , 改名字的目的其实就是防止某台服务器加入了集群这种意外)

Node配置

配置

含义

node.name: holelin_elasticsearch_node01

节点名 , 默认为UUID前7个字符 , 可自定义

node.master: true

指定该节点是否可以作为master节点 , 默认是true。ES集群默认是以第一个节点为master , 如果该节点出故障就会重新选举master。(默认elasticsearch7中已经弃用, 用node.role替换)

node.data: true

该节点是否存索引数据 , 允许该节点存储数据。默认true。(默认elasticsearch7中已经弃用, 用node.role替换)

node.client: false

当该值设置为true时 ,node.master值自动设置为false , 不参加master选举。(默认elasticsearch7中已经弃用, 用node.role替换)

node.max_local_storage_nodes: 1

( 默认值 : 1) 设置能运行的节点数目 , 一般采用默认的1即可 , 因为我们一般也只在一台机子上部署一个节点。 , 在某些情况下 , 例如在开发环境中 , 你可能希望多个节点共享同一个数据路径。为了允许多个节点共享数据路径 , 你可以使用node.max_local_storage_nodes设置 , 并将其设置为一个大于1的正整数。这样 , 指定数量的节点将被允许使用相同的数据路径。(默认elasticsearch7中已经弃用, 用elasticsearch8版本已经移除了该参数)

node.role: []

在Elasticsearch 7.x 版本中 , node.role 是一个配置选项 , 用于定义节点的角色和功能。这个设置允许你更细致地控制节点的行为 , 以及它们在集群中承担的职责。通过指定不同的角色 , 你可以优化集群的性能和资源使用。 master : 具有这个角色的节点有资格被选举为主节点(master-eligible)。主节点负责管理集群的全局操作 , 如创建或删除索引、跟踪集群状态等。 data : 数据节点 , 负责存储数据和执行数据相关的操作 , 如索引、搜索和分片管理。 ingest : 摄取节点 , 可以执行摄取处理 , 如预处理数据或应用摄取管道。 coordinating : 协调节点 , 仅用于处理客户端请求、分发任务给数据节点 , 并聚合结果返回给客户端。协调节点不存储数据 , 也不参与主节点的选举。

Indices部分

配置

含义

index.number_of_shards: 5

(默认值为5) 设置默认索引分片个数。 需要注意: “number_of_shards” 是索引创建后一次生成的,后续不可更改设置 “number_of_replicas” 是可以通过update-index-settings API实时修改设置。

index.number_of_replicas: 1

(默认值为1) 设置索引的副本个数

  • Indices Circuit Breaker

    elasticsearch包含多个circuit breaker来避免操作的内存溢出。每个breaker都指定可以使用内存的限制。另外有一个父级breaker指定所有的breaker可以使用的总内存

    配置

    含义

    indices.breaker.total.limit

    所有breaker使用的内存值 , 默认值为 JVM 堆内存的70% , 当内存达到最高值时会触发内存回收。

  • Field Data Circuit Breaker

    允许elasticsearch预算待加载field的内存 , 防止field数据加载引发异常

    配置

    含义

    indices.breaker.fielddata.limit

    field数据使用内存限制 , 默认为JVM 堆的60%。

    indices.breaker.fielddata.overhead

    elasticsearch使用这个常数乘以所有fielddata的实际值作field的估算值。默认为 1.03。

  • Request Circuit Breaker

    请求断路器,允许elasticsearch防止每个请求的数据结构超过了一定量的内存

    配置

    含义

    indices.breaker.request.limit

    request数量使用内存限制 , 默认为JVM堆的40%。

    indices.breaker.request.overhead

    elasticsearch使用这个常数乘以所有request占用内存的实际值作为最后的估算值。默认为 1。

  • Indices Fielddata Cache

    字段数据缓存主要用于排序字段和计算聚合。将所有的字段值加载到内存中 , 以便提供基于文档快速访问这些值

    配置

    含义

    indices.fielddata.cache.size : unbounded

    设置字段数据缓存的最大值 , 值可以设置为节点堆空间的百分比 , 例 : 30% , 可以值绝对值 , 例 : 12g。默认为无限。 该设置是静态设置 , 必须配置到集群的每个节点。

  • Indices Node Query Cache

    query cache负责缓存查询结果 , 每个节点都有一个查询缓存共享给所有的分片。缓存实现一个LRU驱逐策略 : 当缓存使用已满 , 最近最少使用的数据将被删除 , 来缓存新的数据。query cache只缓存过滤过的上下文

    配置

    含义

    indices.queries.cache.size

    查询请求缓存大小 , 默认为10%。也可以写为绝对值 , 例 : 512m。 该设置是静态设置 , 必须配置到集群的每个数据节点。

  • Indexing Buffer

    • 索引缓冲区用于存储新索引的文档。缓冲区写满 , 缓冲区的文件才会写到硬盘。缓冲区划分给节点上的所有分片。

    • Indexing Buffer的配置是静态配置 , 必须配置都集群中的所有数据节点

    配置

    含义

    indices.memory.index_buffer_size

    允许配置百分比和字节大小的值。默认10% , 节点总内存堆的10%用作索引缓冲区大小。

    indices.memory.min_index_buffer_size

    如果index_buffer_size被设置为一个百分比 , 这个设置可以指定一个最小值。默认为 48mb。

    indices.memory.max_index_buffer_size

    如果index_buffer_size被设置为一个百分比 , 这个设置可以指定一个最小值。默认为无限。

    indices.memory.min_shard_index_buffer_size

    设置每个分片的最小索引缓冲区大小。默认为4mb。

  • Indices Shard Request Cache

    • 当一个搜索请求是对一个索引或者多个索引的时候 , 每一个分片都是进行它自己内容的搜索然后把结果返回到协调节点 , 然后把这些结果合并到一起统一对外提供。分片缓存模块缓存了这个分片的搜索结果。这使得搜索频率高的请求会立即返回。

    • 注意 : 请求缓存只缓存查询条件 size=0的搜索 , 缓存的内容有hits.total, aggregations, suggestions , 不缓存原始的hits。通过now查询的结果将不缓存。 缓存失效 : 只有在分片的数据实际上发生了变化的时候刷新分片缓存才会失效。刷新的时间间隔越长 , 缓存的数据越多 , 当缓存不够的时候 , 最少使用的数据将被删除

    • 缓存过期可以手工设置 , 例如:

      curl -XPOST 'localhost:9200/kimchy,elasticsearch/_cache/clear?request_cache=true'
    • 默认情况下缓存未启用 , 但在创建新的索引时可启用 , 例如:

      curl -XPUT localhost:9200/my_index -d'
      {
        "settings": {
          "index.requests.cache.enable": true
        }
      }'
    • 当然也可以通过动态参数配置来进行设置:

      curl -XPUT localhost:9200/my_index/_settings -d'
      { "index.requests.cache.enable": true }'
    • 每请求启用缓存 , 查询字符串参数request_cache可用于启用或禁用每个请求的缓存。例如:

      curl 'localhost:9200/my_index/_search?request_cache=true' -d'
      {
        "size": 0,
        "aggs": {
          "popular_colors": {
            "terms": {
              "field": "colors"
            }
          }
        }
      }'
    • 分片请求缓存是在节点级别进行管理的 , 并有一个默认的值是JVM堆内存大小的1% , 可以通过配置文件进行修改。 例如 : indices.requests.cache.size: 2%

      分片缓存大小的查看方式:curl 'localhost:9200/_stats/request_cache?pretty&human' 或者curl 'localhost:9200/_nodes/stats/indices/request_cache?pretty&human'

  • Indices Recovery

    配置

    含义

    indices.recovery.concurrent_streams

    限制从其它分片恢复数据时最大同时打开并发流的个数。默认为 3。

    indices.recovery.concurrent_small_file_streams

    从其他的分片恢复时打开每个节点的小文件(小于5M)流的数目。默认为 2。

    indices.recovery.file_chunk_size

    默认为 512kb。

    indices.recovery.translog_ops

    默认为 1000。

    indices.recovery.translog_size

    默认为 512kb。

    indices.recovery.compress

    恢复分片时 , 是否启用压缩。默认为 true。

    indices.recovery.max_bytes_per_sec

    限制从其它分片恢复数据时每秒的最大传输速度。默认为 40mb。

  • Indices TTL Interval

    配置

    含义

    indices.ttl.interval

    允许设置多久过期的文件会被自动删除。默认值是60s。

    indices.ttl.bulk_size

    设置批量删除请求的数量。默认值为1000。

Paths配置

配置

含义

path.data: /path/to/data

数据目录 #注意 : 数据目录可以有多个 , 可以通过逗号分隔指定多个目录。一个索引数据只会放入一个目录中!!

path.logs: /path/to/log

日志目录

path.plugins: /path/to/plugins

插件目录

path.conf: /path/to/conf

配置文件存储位置。

path.work: /path/to/work

临时文件的路径 。

Memory配置

配置

含义

Bootstrap.mlockall: true

( 默认为false) 锁住内存 , 当JVM进行内存转换的时候 , es的性能会降低 , 所以可以使用这个属性锁住内存。同时也要允许elasticsearch的进程可以锁住内存 , linux下可以通过ulimit -l unlimited命令 , 或者在/etc/sysconfig/elasticsearch文件中取消 MAX_LOCKED_MEMORY=unlimited 的注释即可。如果使用该配置则ES_HEAP_SIZE必须设置 , 设置为当前可用内存的50% , 最大不能超过31G , 默认配置最小为256M , 最大为1G。

  • 可以通过请求查看mlockall的值是否设定:curl http://localhost:9200/_nodes/process?pretty

  • 如果mlockall的值是false , 则设置失败。可能是由于elasticsearch的临时目录( /tmp) 挂载的时候没有可执行权限。

    • 可以使用下面的命令来更改临时目录:./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir

Network,Transport,HTTP配置

配置

含义

network.bind_host

设置绑定的ip地址,可以是ipv4或ipv6的。

network.publish_host

设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址。

network.host

同时设置bind_host和publish_host两个参数 , 值可以为网卡接口、127.0.0.1、私有地址以及公有地址。

http_port

接收http请求的绑定端口。可以为一个值或端口范围 , 如果是一个端口范围 , 节点将绑定到第一个可用端口。默认为 : 9200-9300。

transport.tcp.port

节点通信的绑定端口。可以为一个值或端口范围 , 如果是一个端口范围 , 节点将绑定到第一个可用端口。默认为 : 9300-9400。

transport.tcp.connect_timeout

套接字连接超时设置 , 默认为 30s。

transport.tcp.compress

设置为true启用节点之间传输的压缩( LZF) , 默认为false。

transport.ping_schedule

定时发送ping消息保持连接 , 默认transport客户端为5s , 其他为-1( 禁用) 。

httpd.enabled

是否使用http协议提供服务。默认为 : true( 开启) 。

http.max_content_length

最大http请求内容。默认为100MB。如果设置超过100MB , 将会被MAX_VALUE重置为100MB。

http.max_initial_line_length

http的url的最大长度。默认为 : 4kb。

http.max_header_size

http中header的最大值。默认为8kb。

http.compression

支持压缩( Accept-Encoding) 。默认为 : false。

http.compression_level

定义压缩等级。默认为 : 6。

http.cors.enabled

启用或禁用跨域资源共享。默认为 : false。

http.cors.allow-origin

启用跨域资源共享后 , 默认没有源站被允许。在//中填写域名支持正则 , 例如 /https?://localhost(:[0-9]+)?/。 * 是有效的值 , 但是开放任何域名的跨域请求被认为是有安全风险的elasticsearch实例。

http.cors.max-age

浏览器发送‘preflight’OPTIONS-request 来确定CORS设置。max-age 定义缓存的时间。默认为 : 1728000 ( 20天) 。

http.cors.allow-methods

允许的http方法。默认为OPTIONS、HEAD、GET、POST、PUT、DELETE。

http.cors.allow-headers

允许的header。默认 X-Requested-With, Content-Type, Content-Length。

http.cors.allow-credentials

是否允许返回Access-Control-Allow-Credentials头部。默认为 : false。

http.detailed_errors.enabled

启用或禁用输出详细的错误信息和堆栈跟踪响应输出。默认为 : true。

http.pipelining

启用或禁用http管线化。默认为 : true。

http.pipelining.max_events

一个http连接关闭之前最大内存中的时间队列。默认为 : 10000。

Discovery配置

elasticsearch 6 之前的配置

配置

含义

discovery.zen.minimum_master_nodes: 3

预防脑裂( split brain) 通过配置大多数节点( 总节点数/2+1) 。默认为3。

discovery.zen.ping.multicast.enabled: false

设置是否打开组播发现节点。默认false。

discovery.zen.ping.unicast.hosts

单播发现所使用的主机列表 , 可以设置一个属组 , 或者以逗号分隔。每个值格式为 host:port 或 host( 端口默认为 : 9300) 。默认为 127.0.0.1 , [::1]。(elasticsearch6之前用该选择, 添加IP到集群中)

discovery.zen.ping.timeout: 3s

设置集群中自动发现其它节点时ping连接超时时间 , 默认为3秒 , 对于比较差的网络环境可以高点的值来防止自动发现时出错。

discovery.zen.join_timeout

节点加入到集群中后 , 发送请求到master的超时时间 , 默认值为ping.timeout的20倍。

discovery.zen.master_election.filter_client : true

当值为true时 , 所有客户端节点( node.client : true或node.date , node.master值都为false) 将不参加master选举。默认值为 : true。

discovery.zen.master_election.filter_data : false

当值为true时 , 不合格的master节点( node.data : true和node.master : false) 将不参加选举。默认值为 : false。

discovery.zen.fd.ping_interval

发送ping监测的时间间隔。默认为 : 1s。

discovery.zen.fd.ping_timeout

ping的响应超时时间。默认为30s。

discovery.zen.fd.ping_retries

ping监测失败、超时的次数后 , 节点连接失败。默认为3。

discovery.zen.publish_timeout

通过集群api动态更新设置的超时时间 , 默认为30s。

discovery.zen.no_master_block

设置无master时 , 哪些操作将被拒绝。all 所有节点的读、写操作都将被拒绝。write 写操作将被拒绝 , 可以读取最后已知的集群配置。默认为 : write。

elasticsearch 7 之后的配置

配置

含义

discovery.seed_hosts

elasticsearch 7 8默认就是单播配置, 提供群集中符合条件的主节点的地址列表。 如果没有给出端口 , 则通过按顺序检查以下设置来确定 : transport.profiles.default.port ; transport.port 。(elasticsearch7之后用该选择, 添加IP到集群中)

cluster.initial_master_nodes

在一个全新的群集中设置符合主条件的节点的初始集合。默认情况下 , 此列表为空 , 这意味着此节点希望加入已启动的集群。一旦形成群集 , 请删除此设置。在重新启动节点或向现有群集添加新节点时 , 不要使用此设置。

discovery.find_peers_interval

设置节点在尝试另一轮发现之前等待的时间。默认为1s

discovery.cluster_formation_warning_timeout

启动后30秒内 , 如果集群未形成 , 那么将会记录一条警告信息 , 警告信息未master not fount开始 , 默认为10秒

cluster.join.timeout

节点发送请求加入集群后 , 在认为请求失败后 , 再次发送请求的等待时间 , 默认为60秒

cluster.publish.timeout

设置主节点等待每个集群状态完全更新后发布到所有节点的时间 , 默认为30秒

cluster.routing.allocation.cluster_concurrent_rebalance

集群内同时启动的数据任务个数 , 默认是2个

cluster.routing.allocation.node_concurrent_recoveries

添加或删除节点及负载均衡时并发恢复的线程个数 , 默认4个

cluster.routing.allocation.node_initial_primaries_recoveries

初始化数据恢复时 , 并发恢复线程的个数 , 默认4个

cluster.election.duration

设置在节点认为每次选举失败并计划重试之前 , 允许每次选举花费的时间。默认值为500ms。从默认设置更改此设置可能会导致群集无法选择主节点。

cluster.election.initial_timeout

( 静态) 设置节点在尝试第一次选择之前最初等待的时间上限 , 或在选定的主节点失败之后等待的时间。默认值为100ms。从默认设置更改此设置可能会导致群集无法选择主节点。

cluster.election.max_timeout

设置节点在尝试第一次选举之前等待的最大上限 , 以便持续很长时间的网络分区不会导致选举过于稀疏。默认值为10s。从默认设置更改此设置可能会导致群集无法选择主节点。

cluster.fault_detection.follower_check.interval

设置选定的主节点在对群集中每个其他节点进行跟随检查之间等待的时间。默认值为1s。从默认设置更改此设置可能会导致集群变得不稳定。

cluster.fault_detection.follower_check.timeout

设置选定的主控器在认为对跟随检查的响应失败之前等待的时间。默认值为10s。从默认设置更改此设置可能会导致集群变得不稳定。

cluster.fault_detection.follower_check.retry_count

设置在选定的主节点认为该节点有故障并将其从群集中删除之前 , 每个节点必须连续发生多少次跟随检查失败。默认值为3。从默认设置更改此设置可能会导致集群变得不稳定。

cluster.fault_detection.leader_check.interval

设置每个节点在检查选定的主节点之间等待的时间。默认值为1s。从默认设置更改此设置可能会导致集群变得不稳定。

cluster.fault_detection.leader_check.retry_count

设置在节点认为选定的主节点有故障并尝试查找或选择新的主节点之前 , 必须连续发生多少引线检查失败。默认值为3。从默认设置更改此设置可能会导致集群变得不稳定。

cluster.fault_detection.leader_check.timeout

设置在节点认为选定的主节点有故障并尝试查找或选择新的主节点之前 , 必须连续发生多少引线检查失败。默认值为3。从默认设置更改此设置可能会导致集群变得不稳定。

Gateway配置

配置

含义

gateway.expected_nodes: 0

设置这个集群中节点的数量 , 默认为0 , 一旦这N个节点启动 , 就会立即进行数据恢复。(elasticsearch 7之后该配置已经被gateway.expected_data_nodes替代)

gateway.expected_master_nodes

设置这个集群中主节点的数量 , 默认为0 , 一旦这N个节点启动 , 就会立即进行数据恢复。(elasticsearch 7之后该配置已经被gateway.expected_data_nodes替代)

gateway.expected_data_nodes

设置这个集群中数据节点的数量 , 默认为0 , 一旦这N个节点启动 , 就会立即进行数据恢复。

gateway.recover_after_time: 5m

设置初始化数据恢复进程的超时时间 , 默认是5分钟。

gateway.recover_after_nodes

设置集群中N个节点启动时进行数据恢复。(elasticsearch 7之后该配置已经被gateway.expected_after_data_nodes替代)

gateway.recover_after_master_nodes

设置集群中N个主节点启动时进行数据恢复。(elasticsearch 7之后该配置已经被gateway.expected_after_data_nodes替代)

gateway.recover_after_data_nodes

设置集群中N个数据节点启动时进行数据恢复。必须参与数据恢复的数据节点的最小数量

elasticsearch7 之后有效的参数: gateway.expected_data_nodes ,gateway.recover_after_data_nodes ,gateway.recover_after_time: 5m

4.1.4 监控elasticsearch集群服务器的健康性

用curl命令对集群的健康性状态进行检查 , 如果返回值是green , 说明正常 , 是yellow , 说明是副本的分片丢失 , 如果是red , 表示主片丢失。

[root@elasticsearch-85 ~]# curl -sXGET http://192.168.71.29:9200/_cluster/health?pretty=true 
{
  "cluster_name" : "elasticsearch-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

以下是编辑对集群健康性检查的python脚本 , 如果返回值是50 , 说明elasticsearch集群正常。

[root@elasticsearch-85 ~]# cat test.py 
#!/usr/bin/env python
#coding:utf-8
#Author liu
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false="false"
obj = subprocess.Popen(("curl -sXGET http://192.168.71.29:9200/_cluster/health?pretty=true"),shell=True,stdout=subprocess.PIPE)
data=obj.stdout.read()
data1=eval(data)
status=data1.get("status")
if status == "green":
        print("50")
else:
        print("100")
[root@elasticsearch-85 ~]# python3 test.py 
50

4.1.5. 插件安装

插件是为了完成不同的功能 , 官方提供了一些插件但大部分是收费的 , 另外也有一些开发 爱好者提供的插件 , 可以实现对elasticsearch集群的状态监控与管理配置等功能。

4.1.5.1 elasticsearch 插件之head

在elasticsearch 5.x版本以后不再支持直接安装head插件 , 而是需要通过启动 一个服务方式。

git地址 : https://github.com/mobz/elasticsearch-head

4.1.5.1.1 通过npm安装
  1. 由于git地址在外网,手动下载对应包

  2. 解压

    [root@elasticsearch-85 ~]# unzip elasticsearch-head-master.zip 
  3. 安装

    [root@elasticsearch-85 elasticsearch-head-master]# npm install grunt -save
    npm WARN deprecated coffee-script@1.10.0: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
    npm notice created a lockfile as package-lock.json. You should commit this file.
    npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
    
    + grunt@1.0.1
    added 97 packages from 67 contributors and audited 97 packages in 14.184s
    
    6 packages are looking for funding
      run `npm fund` for details
    
    found 22 vulnerabilities (2 low, 7 moderate, 10 high, 3 critical)
      run `npm audit fix` to fix them, or `npm audit` for details
    [root@elasticsearch-85 elasticsearch-head-master]# ll node_modules/grunt     #确认生成文件
    total 32
    drwxr-xr-x 2 root root 4096 Apr  6 19:49 bin
    -rw-r--r-- 1 root root 7111 Apr  6  2016 CHANGELOG
    drwxr-xr-x 4 root root 4096 Apr  6 19:49 lib
    -rw-r--r-- 1 root root 1592 Mar 23  2016 LICENSE
    drwxr-xr-x 5 root root 4096 Apr  6 19:49 node_modules
    -rw-r--r-- 1 root root 2509 Apr  6 19:49 package.json
    -rw-r--r-- 1 root root  878 Feb 12  2016 README.md
    [root@elasticsearch-85 elasticsearch-head-master]# npm install 
    
    [root@elasticsearch-85 elasticsearch-head-master]# npm run start   #前台启动插件
    
    > elasticsearch-head@0.0.0 start /root/elasticsearch-head-master
    > grunt server
    
    >> Local Npm module "grunt-contrib-jasmine" not found. Is it installed?
    
    Running "connect:server" (connect) task
    Waiting forever...
    Started connect web server on http://localhost:9100
    
  4. 修改elasticsearch配置文件, 添加如下内容

    http.cors.enabled: true 
    http.cors.allow-origin: "*"

  5. 访问页面: http://IP:9100

    image-20240406200144065

4.1.5.1.2 通过docker安装
  1. 安装并启动docker

    [root@elasticsearch-85 ~]# yum install docker 
    [root@elasticsearch-85 ~]# systemctl start podman
  2. 下载并启动elasticsearch head插件

    [root@elasticsearch-85 ~]# docker run -p 9100:9100 mobz/elasticsearch-head:5
  3. 之后访问页面即可

    image-20240406201132622

4.1.5.2 elasticsearch 插件之 kopf

Git 地址为https://github.com/lmenezes/elasticsearch-kopf , 但是目前还不支持5.x版本的elasticsearch , 但是可以安装在elasticsearc 1.x 或2.x的版本安装。

4.1.5.3 elasticsearch 插件之 cerebo

4.1.5.3.1 安装

新开源的elasticsearch集群 web 管理程序 , 需要java11或者更高版本 , https://github.com/lmenezes/cerebro

  1. 下载对应软件包

    image-20240406201703491

  2. 直接安装对应的rpm包

    [root@elasticsearch-79 ~]# rpm -ivh cerebro-0.9.4-1.noarch.rpm 
  3. cerebro直接运行以下命令就可以直接启动, 开启端口为9000。运行过程中可以通过-java-home指定java命令位置

    [root@elasticsearch-79 ~]# /usr/share/cerebro/bin/cerebro 
    
    [root@elasticsearch-79 ~]# /usr/share/cerebro/bin/cerebro -h
    Usage:  [options]
    
      -h | -help         print this message
      -v | -verbose      this runner is chattier
      -d | -debug        enable debug output for the launcher script
      -no-version-check  Don't run the java version check.
      -main <classname>  Define a custom main class
      -jvm-debug <port>  Turn on JVM debugging, open at the given port.
    
      # java version (default: java from PATH, currently java version "11.0.22" 2024-01-16 LTS)
      -java-home <path>         alternate JAVA_HOME
    
      # jvm options and output control
      JAVA_OPTS          environment variable, if unset uses ""
      -Dkey=val          pass -Dkey=val directly to the java runtime
      -J-X               pass option -X directly to the java runtime
                         (-J is stripped)
    
      # special option
      --                 To stop parsing built-in commands from the rest of the command-line.
                         e.g.) enabling debug and sending -d as app argument
                         $ ./start-script -d -- -d
    
    In the case of duplicated or conflicting options, basically the order above
    shows precedence: JAVA_OPTS lowest, command line options highest except "--".
    Available main classes:
    	-jar "/usr/share/cerebro/lib/cerebro.cerebro-0.9.4-launcher.jar"
  4. 配置cerebro配置文件

    [root@elasticsearch-79 ~]# cat /etc/cerebro/application.conf
    java.home = /usr/local/src/jdk
    hosts = [
      {
      #  host = "http://localhost:9200"
         host = "http://192.168.71.30:9200" 
      #  name = "Localhost cluster"
      #  headers-whitelist = [ "x-proxy-user", "x-proxy-roles", "X-Forwarded-For" ]
      }
    
    ]
  5. 之后直接启动服务即可

    [root@elasticsearch-79 ~]# systemctl start cerebro
    
    [root@elasticsearch-79 ~]# systemctl cat cerebro
    # /usr/lib/systemd/system/cerebro.service
    [Unit]
    Description=Elasticsearch web admin tool
    Requires=network.target
    
    [Service]
    Type=simple
    WorkingDirectory=/usr/share/cerebro
    EnvironmentFile=/etc/default/cerebro
    ExecStart=/usr/share/cerebro/bin/cerebro
    ExecReload=/bin/kill -HUP $MAINPID
    Restart=always
    RestartSec=60
    SuccessExitStatus=143
    TimeoutStopSec=5
    User=cerebro
    ExecStartPre=/bin/mkdir -p /run/cerebro
    ExecStartPre=/bin/chown cerebro:cerebro /run/cerebro
    ExecStartPre=/bin/chmod 755 /run/cerebro
    PermissionsStartOnly=true
    LimitNOFILE=1024
    
    [Install]
    WantedBy=multi-user.target

另外可以通过命令下载docker镜像即可

docker run -p 9000:9000 --env-file env-ldap  lmenezes/cerebro

4.1.5.3.2 基本使用

之后页面访问9000端口即可

image-20240406210758326

登录之后看到如图所示内容

image-20240406210848605

cerebro中可以通过点击Create index实现创建索引的功能

image-20240406211034833

这里设置五个分片两个副本

image-20240406211329361

之后可以通过head查看分配。 其中粗线条为主分片

image-20240406211447982
image-20240406211513340

4.1.6 读写性能提升

读写就是插入和查询嘛 , 写的话可能有并发写 , 还有就是是否写完要立马可见 , 查的话还是和需求有关系 , 还有就是对查询一个语法的使用 , 还有就是查询数据会不会在内存中命中 , 这样的就减少去访问磁盘了 , 这里不说查询的一些语法和怎么查询更优 , 因为个人觉得这是属于应用级别的 , 和集群相关性不强 , 这里大概例举几个配置。

首先这里说一句 , 当并发写入的时候 , 必定涉及到thread pool的配置 , 这些配置不建议修改 , 但是实在不行 , 也可以提高到cpu核数的两倍 , 所以涉及到并发的 , 和计算的 , 当然cpu越好性能就会也好。

写和查询的时候会涉及到一些参数 , 可以根据实际情况调整提升性能:(下面的都不是默认值了 , 可以在官网去查询)

#可以配置在elasticsearch.yml文件中indices.memory.index_buffer_size: 20%
indices.memory.min_index_buffer_size: 96mb
indices.queries.cache.size: 20%
indices.requests.cache.size: 2%
#这里是索引级别的配置,需要配置在索引里面
index.merge.scheduler.max_thread_count: 1 #这个如果是ssd,使用默认的配置就好,这里配置为机械磁盘
index.refresh_interval: 60s
index.store.type: hybridfs
index.translog.sync_interval: 10s
index.translog.flush_threshold_size: 1024mb

当然还有很多的配置,比如有配置translog的类型,可以提升性能,但是可能会牺牲数据的一致性。优化这种事情还是根据实际情况进行针对性的优化和取舍比较好。

4.1.7 HTTP filter

为了使用 HTTP filter,我们来修改 Elasticsearch 的配置文件 config/elasticsearch.yml :

xpack.security.http.filter.allow: "192.168.0.4"
xpack.security.http.filter.deny: "192.168.0.0/24"

我们在Elasticsearch的配置文件中添加上面的两行配置。重新启动Elasticsearch。上面的两行表示只允许从 IP 地址 192.168.0.4 来进行访问,但是不支持从任何其它的 IP 地址,比如 192.168.0.0/24 进行访问。

同时可以用以下API更改配置。这样更改配置不用重启服务

curl -u elastic:password -XPUT 'http://192.168.0.3:9200/_cluster/settings?pretty=true' -H 'Content-Type: application/json' -d '
{
    "persistent": {
    "xpack.security.http.filter.deny": "_all",
    "xpack.security.http.filter.allow": ["localhost"]
  }
}'

4.2 安装部署 kibana

Kibana官网下载地址 : https://www.elastic.co/cn/downloads/past-releases#kibana

  1. 下载软件包, 并且安装

    root@kibana:~# dpkg -i kibana-8.13.1-amd64.deb
  2. 修改kibana配置文件/etc/kibana/kibana.yml

    root@kibana:~# grep -i "^[a-Z]" /etc/kibana/kibana.yml 
    server.port: 5601        # 默认的监听端口5601
    server.host: "0.0.0.0"   # 监听的IP地址 
    elasticsearch.hosts: ["http://192.168.71.29:9200"]   # 对端elasticsearch集群主机的IP地址
    i18n.locale: "zh-CN"     # 添加此项支持汉化版
  3. 启动kibana服务 , 并设置为开机启动

    root@kibana:/etc/kibana# systemctl enable kibana --now
    Created symlink /etc/systemd/system/multi-user.target.wants/kibana.service → /lib/systemd/system/kibana.service.
  4. 直接访问页面: http://IP:5601。如果后端的elasticsearch出现故障, kibana页面也无法访问

    image-20240407000133674
  5. 用样例数据测试功能

    image-20240407001342879
    image-20240407001446452

  1. 在Discover中查看数据

    image-20240407002605102
  2. 在head插件中插件kibana数据

    image-20240407003000285
  3. 在elasticsearch主机上查看创建的数据。默认以前版本的索引信息是创建时的索引名称,现在是已经HASH之后的

    root@elasticsearch03:/data/esdata/indices# pwd
    /data/esdata/indices
    root@elasticsearch03:/data/esdata/indices# ls
    2HaJ6hBKQjKJIyPB6jAVdg  eRSRkIyeTxaKst3DbOvNXA  K6DUkkz1RhKsOG-0ECO1nw  sLydbwtRQR-3OG47AC43Ww  zEpfaYIxTRuSbA4RSdlayg
    cDY5InpTSHmU8pGrrmpEeA  fZJjiyb9QpevdyGIbR2scw  L4hMUiFARjCsLuSgpkgXig  Smar6OBcTGiVwJHQwJpe6Q  zNfBjUy0TnWTFpmhyDfT7Q
    _CK5dOlxQJu5LMFcWicfVg  gXI4ckI4Sy2eml3TTDKUpg  p-xgFirJQ3-zraf_ZwXeXA  UELWjmRmRHOkts1ccZFydQ
    cpyP_CNfRuqF5F8cl4XLUQ  JCehYR_uSYmZl7rL0LmzxQ  _q9RwxUMTzOcvuE0bY6Lcw  uIEbzWHUQheZ_DPTralj-g
    c_yUA5V7RIGxi7XjxCLjgA  JtHWVGE9QHm1QH6mKJvjQA  Rc2SQwjdRCiFRO9XZyBcnw  xYf5iYahTBm4tMKzX_NfTA

4.3 安装部署 logstash

官方文档 https://www.elastic.co/cn/products/logstash

4.3.1 安装

针对logstash和前两个工具一样, 在logstash7 之前的版本需要手动安装java环境。7之后的版本默认已经安装有对应的java

下载地址1 : https://www.elastic.co/cn/downloads/logstash

下载地址2 : https://elasticsearch.cn/download/

安装过程下载对应rpm/deb包即可。另外直接下载对应的二进制包。这里以deb包为例。

root@ubuntu2204:~# dpkg -i logstash-8.13.1-amd64.deb 

涉及到的配置文件说明

  • jvm.options : 这个文件用于配置Java虚拟机(JVM)的启动选项 , 比如堆内存大小、垃圾收集器设置等。这些选项直接影响 Logstash运行时的JVM行为和性能。

  • log4j2.properties : 这个文件用于配置Logstash的日志记录行为。它遵循Log4j2的配置格式 , 允许你设置日志级别、模式、输出目标( 如控制台、文件等) 以及其他日志相关属性。

  • logstash-sample.conf : 这是一个示例配置文件 , 通常随Logstash安装一起提供。它展示了如何编写Logstash配置文件 , 包括输入、过滤和输出的配置示例。新手可以从这个文件开始学习如何配置Logstash。

  • logstash.yml : 在Logstash 6.x及之前的版本中 , 这个文件用于配置Logstash的主要设置 , 如HTTP端口、节点名称、管道路径等。从Logstash 7.x开始 , 这个文件被 pipelines.yml 取代。

  • pipelines.yml : 从Logstash 7.x开始引入的文件 , 用于管理和配置多个管道( pipeline) 。每个管道代表一个独立的数据处理流程 , 包括输入、过滤和输出的配置。这个文件允许用户定义和运行多个管道 , 而无需启动多个Logstash进程。

  • startup.options : 这个文件包含了Logstash启动时的命令行选项。它通常用于设置JVM选项 , 但也可以用于其他启动时的配置 , 如指定配置文件路径、设置环境变量等。

    如果需要使用自己安装的java环境, 可以在这个文件调整之后,需要执行软件包中的bin/ system-install文件, 重新配置环境。

    同时配置

    [root@elasticsearch-79 ~]# cat /etc/sysconfig/logstash 
    JAVA_HOME="/usr/local/src/jdk"

如果需要手动启动logstash , 运行命令/logstash -f logstash-simple.conf

4.3.2 命令行参数

  • -e : 意即执行(exec)。我们在 "Hello World" 的时候已经用过这个参数了。事实上你可以不写任何具体配置 ,直接运行 bin/logstash -e '' 达到相同效果。这个参数的默认值是下面这样 :

    input {    stdin { }}output {    stdout { }}

  • --conf或者-f

    这种配置文件的形式 ,是我们工作中最常用的形式

    意即文件。真实运用中 ,我们会写很长的配置 ,甚至可能超过shell所能支持的 1024 个字符长度。所以我们必把配置固化到文件里 ,然后通过 bin/logstash -f agent.conf 这样的形式来运行。

    如果我们想运行一个文件夹下的所有配置文件 ,logstash还提供一个方便我们规划和书写配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 来运行。logstash会自动读取 /etc/logstash.d/ 目录下所有 *.conf 的文本文件 ,然后在自己内存里拼接成一个完整的大配置文件 ,再去执行。 但是 ,logstash列出目录下所有文件时 ,是字母排序的。而logstash 配置段的filter和output都是顺序执行 ,所以顺序非常重要。采用多文件管理的用户 ,推荐采用数字编号方式命名配置文件 ,同时在配置中 ,严谨采用 if 判断限定不同日志的动作。

  • -t或者--configtest

    意即测试。用来测试Logstash读取到的配置文件语法是否能正常解析。Logstash配置语法是用grammar.treetop定义的。尤其是使用了上一条提到的读取目录方式的读者 , 尤其要提前测试。

  • --log或者-l

    意即日志。Logstash默认输出日志到标准错误。生产环境下你可以通过bin/logstash -l logs/logstash.log命令来统一存储日志。

  • --pipeline-workers或-w

    运行filter和output的pipeline线程数量。默认是CPU核数。

  • --pipeline-batch-size或 -b

    每个Logstash pipeline线程 ,在执行具体的 filter 和 output 函数之前 ,最多能累积的日志条数。默认是125条。越大性能越好 ,同样也会消耗越多的JVM内存。

  • --pipeline-batch-delay或-u

    每个Logstash pipeline线程 ,在打包批量日志的时候 ,最多等待几毫秒。默认是5 ms。

  • --pluginpath或-P

    可以写自己的插件 ,然后用bin/logstash --pluginpath /path/to/own/plugins加载它们。

  • --verbose

    输出一定的调试日志。

  • --debug

    输出更多的调试日志。

4.3.3 配置文件

可以通过logstash的主配置文件修改个性化配置 , 可不做更改

root@ubuntu2204:~# cat /etc/logstash/logstash.yml 
#使用分层表单来设置管道的批处理大小和批处理延迟
   pipeline:
     batch:
       size: 125        #管道批处理大小
       delay: 5             #管道批处理延迟
 
#若要表示与平面键相同的值 : 
   pipeline.batch.size: 125
   pipeline.batch.delay: 5
 
 
#节点名称 , 在集群中具备唯一性 , 默认为logstash主机的主机名
node.name: logstast-node1
 
#logstash及其插件所使用的数据路径 , 默认路径为logstash家目录下的data目录
path.data: /usr/local/logstash-7.0.0/data/
 
#管道的ID , 默认为main
pipeline.id: main
 
#输入、输出及过滤器的总工作数量 , 也就是logstash的工作进程 , 此工作进程默认为主机的cpu核心数量
pipeline.workers: 16 
 
#在输入阶段 , 单个工作线程将从输入中收集的最大事件数 , 此事件数堆内存开销较大 , 内存开销可在jvm.options中设置堆内存大小来优化此选项
pipeline.batch.size: 125
 
#在将一个较小的批发送到filters+output之前,轮询下一个事件时等待的时间(以毫秒为单位)
pipeline.batch.delay: 50
 
#设置为true时 , 在强制关闭logstash期间 , 即使内存中还有事件 , 那么为true将会强制关闭 , 导致数据丢失;默认为false , false在强制关闭logstash期间 , 将拒绝退出 , 直到所有在管道中的事件被安全输出 , 再关闭。
pipeline.unsafe_shutdown: false
 
#指定管道配置的目录 , 在此目录下的所有管道配置文件都将被logstash读取 , 除管道配置外 , 不要放任何文件
path.config: /usr/local/logstash-7.0.0/conf.d/
 
#在启动时 , 测试配置是否有效并退出 , 检测配置文件是否正确 , 包括检测管道配置文件 , 默认为false
config.test_and_exit: true
 
#定期检查配置是否更改并重新加载管道 , 默认为false
config.reload.automatic: true
 
#logstash间隔多久检查一次配置中的更改 , 默认为3秒
config.reload.interval: 600s
 
#设置为true时 , 将完全编译的配置显示为调试日志消息
config.debug: false
 
#用于事件缓冲的内部排队模型;可以指定内存memory或者磁盘persisted , 内存处理速度相对磁盘来说效率要高 , 默认为内存
queue.type: memory
 
#启用持久队列时将存储数据文件的目录路径,默认为logstash路径下的queue
path.queue: /usr/local/logstash-7.0.0/queue/
 
#启用持久队列时使用的页面数据文件的大小(queue.type: persisted)队列数据由分成页面的仅附加数据文件组成
queue.page_capacity: 64mb
 
#启用持久队列时队列中未读事件的最大数量(queue.type: persisted) , 默认为0 , 0为无限制
queue.max_events: 0
 
#队列的总容量 , 以字节数表示 , 默认为1G , 根据业务需求而定
queue.max_bytes: 1024mb
 
#启用持久队列时强制检查点之前最大的ACK事件数量(queue.type: persisted) , 设置为0 , 表示无限制 , 默认为1024
queue.checkpoint.acks: 1024
 
#启用持久队列时强制检查点之前写入事件的最大数量(queue,type: persisted) , 设置为0 , 表示无限制 , 默认为1024
queue.checkpoint.writes: 1024
 
#启用持久队列(queue,type: persisted) , 强制在头部页面上设置检查点的间隔(以毫秒为单位) , 有周期性检查点的默认值是1000毫秒
queue.checkpoint.interval: 1000
 
#用于指示logstast启用插件支持DLQ功能的标志 , 默认为false
dead_letter_queue.enable: false
 
#每个死信队列的最大大小 , 如果条目超过此设置会增加死信队列的大小 , 则会删除条目 , 默认为1024mb
dead_letter_queue.max_bytes: 1024mb
 
#为死信队列存储数据文件的目录路径
path.dead_letter_queue: /usr/local/logstash-7.0.0/letter-queue
 
#度量标准REST端点的绑定地址 , 默认为127.0.0.1
http.host: "127.0.0.1"
 
#度量标准REST端点的绑定端口 , 默认为9600
http.port: 9600
 
#日志级别 , 可以设置为以下几种级别 , 默认为info
log.level: info
           fatal
           error
           warn
           info (default)
           debug
           trace
 
#logstash日志目录位置 , 默认为logstash路径下的logs
path.logs: /usr/local/logstash-7.0.0/logs
 
 
#logstash插件路径
path.plugins: []

4.3.4基本使用

首先 , 让我们通过最基本的Logstash管道来测试一下刚才安装的Logstash

Logstash管道有两个必需的元素 , 输入和输出 , 以及一个可选元素过滤器。输入插件从数据源那里消费数据 , 过滤器插件根据你的期望修改数据 , 输出插件将数据写入目的地。

logstash有两种方式运行 , 分别是命令行的方式、定义配置文件方式

  1. 使用命令行运行一个简单的logstash程序

    root@elasticsearch01:~# /usr/share/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

    在控制台输入abc , 控制台会输出如下内容 :

    {
        "@timestamp" => 2024-04-07T07:17:45.932730425Z,
             "event" => {
            "original" => "abc"
        },
              "host" => {
            "hostname" => "elasticsearch01"
        },
           "message" => "abc",
          "@version" => "1"
    }
    image-20240407151823114
  2. 配置语法讲解

    最基本的配置文件定义 , 必须包含input和output , 修改logstash.conf文件

    
    # 最基本的配置文件定义 , 必须包含input 和 output。
    input{
      stdin{ }
    }
    output{
      stdout{
        codec=>rubydebug
      }
    }
    
    # 如果需要对数据进操作 , 则需要加上filter段
    
    input{
      stdin{ }
    }
    filter{
      # 里面可以包含各种数据处理的插件 , 如文本格式处理 grok、键值定义 kv、字段添加、
      # geoip 获取地理位置信息等等...
    }
    output{
      stdout{
        codec=>rubydebug
      }
    }
    
    # 可以定义多个输入源与多个输出位置
    input{
      stdin{ }
      file{
        path => ["/var/log/message"]
        type => "system"
        start_position => "beginning"
      }
    }
    output{
      stdout{
        codec=>rubydebug
      }
      file {
        path => "/var/datalog/mysystem.log.gz"
        gzip => true
      }
    }

    运行命令:

    logstash -f logstash.conf

4.3.5 持久化配置

当发生异常情况 , 比如logstash重启 , 有可能发生数据丢失 , 可以选择logstash持久化到磁盘 , 修改之前重启logstash数据丢失 , 修改之后重启logstash数据不丢失。在config/logstash.yml中进行配置以下内容:

queue.type: persisted
path.queue: /usr/share/logstash/data  #队列存储路径;如果队列类型为persisted , 则生效
queue.page_capacity: 250mb  #队列为持久化 , 单个队列大小
queue.max_events: 0  #当启用持久化队列时 , 队列中未读事件的最大数量 , 0为不限制
queue.max_bytes: 1024mb   #队列最大容量
queue.checkpoint.acks: 1024  #在启用持久队列时强制执行检查点的最大数量,0为不限制
queue.checkpoint.writes: 1024  #在启用持久队列时强制执行检查点之前的最大数量的写入事件 , 0为不限制
queue.checkpoint.interval: 1000  #当启用持久队列时 , 在头页面上强制一个检查点的时间间隔

4.3.6 性能测试

Logstash有kibana专门的模拟数据插件 , 以及速率分析工具 , 此处准备模拟数据量1千万条。

操作步骤 :

配置Logstash目录下面的pipeline/logstash.conf , 配置完重启Logstash

input{
  generator {
    count => 10000000 # 模拟数据1千万条
    # 模拟数据具体内容
    message => 'INFO 2018-07-30 0911 springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator[startingWith:40] - Generating unique operation named: getUsingGET1$i'
    # multiline插件 , 用于合并事件
    codec => multiline {
      pattern => "^\s" # 匹配空格
      what =>"previous" # 当匹配到空格 , 合并到上一个事件 , 如果是next , 则合并到下一个事件
    }
    type => "probe_log" # 类型名称
  }
}
 
filter {
  grok {
    # 通过正则表达式匹配日志
    match => {
      "message" => "%{LOGLEVEL:level}\s%{TIMESTAMP_ISO8601:timestamp}\s%{JAVACLASS:class}[%{WORD:method}:%{NUMBER:line}]\s-\s(?([\s\S]*))"
    }
  }
  date {
    match => [ "timestamp" , "yyyy-MM-dd HHss", "ISO8601" ]  # 匹配timestamp字段
    target => "@timestamp"  # 覆盖@timestamp
  }
  mutate {
    remove_field => "timestamp" #移除timestamp字段
  }
}

output {
  # 输出到elasticsearch
  elasticsearch {
    hosts => ["192.168.2.227:9200"]
    index => "logstash-api-%{+YYYY.MM.dd}"
  }
}

测试结果

模拟数据量1千万条 , 通过kibana的monitoring监控

elk-base-struct-11

后面四个分别为 :

  • 使用持久队列过滤

  • 使用持久队列不过滤

  • 使用内存队列过滤

  • 使用内存队列不过滤的情况

由此估算出下面一张表 :

elk-base-struct-12

参考链接

ELK 原理与实践详细介绍 (qq.com)

ELK之一-----Elasticsearch介绍与部署 - 一叶知秋~~ - 博客园 (cnblogs.com)

ElasticSearch(三)-常见配置以及配置文件详解 | HoleLin's Blog

Elasticsearch 7x 配置文件详解_elasticsearch7配置详解-CSDN博客

ELK系列(一)、Elasticsearch相关概念说明 (qq.com)

ELK系列(七)、Logstash原理及使用入门 (qq.com)

LogStash的配置详解 (qq.com)

elasticsearch如何设计集群 - 一寸HUI - 博客园 (cnblogs.com)