[TOC]

0x00 前言简述

描述: 本系列主要进行从基础到入门学习ElasticSearch、Logstash、Beat与Kibana基础安装配置,以及ELK Stack在企业中日志收集、搜索分析、展示的应用实践。

0.什么是搜索引擎?

描述: 在学习ELK前我们需要先简单了解一哈什么是搜索引擎,以及搜索引擎的原理。

我们接触比较多的 百度、Google、必应、360搜索、淘宝搜索、京东搜索等等很多只要能搜索就可以被称为搜索引擎。

官方解释: 搜索引擎(Search Engine)是根据一定的策略、运用特定的计算机程序去搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的一套系统。


搜索引擎的组成: 搜索引擎一般由索引组件搜索组件所组成。

WeiyiGeek.搜索引擎组成

WeiyiGeek.搜索引擎组成


搜索引擎工作原理: 如上图所示,其组件的工作顺序

  • 索引组件: 获取数据Acquire Content–>建立文档Build Document–>文档分析Analyze Document–>文档索引(Index Document)。
  • 搜索组件: 用户搜索接口Search User Interface–>建立查询Build Query(将用户键入的信息转换为可处理的查询对象)–>搜索查询Run Query–>展现结果Render Results。


索引组件
描述: 索引组件为上图中红色框部分

为什么索引组件的工作流程是由下往上呢?
举例:例如淘宝,当我们在淘宝中搜索一件商品的时候,在能搜索到的前提下,那它这个商品肯定是提前要存储到淘宝的存储库当中,淘宝卖家把一件衣服上架到了淘宝平台,这就叫做 Raw Content(原始内容);当衣服存储到淘宝的存储库当中呢,搜索引擎就开始获取这件衣服的图片信息和标题内容等,获取到的内容会被存为文档才能供搜索引擎使用,这个叫 Acquire Content获取内容;存为文档之后,一般来说,一句话或者一条信息都可以作为一个文档,但是现在需要建立文档 Build Document,建立文档的过程是向单个文档插入权重值,目的是为了在搜索引擎搜索的时候进行排序,当然是权值越高越容易被搜索到了哈,不然不会出现SEO的。文件建立成功后,搜索引擎还不能直接对文本进行索引呢,还需要将文档即文本内容分割成独立的元素,可以理解为切片、分词等,把一句话拆分成了好多个字或者说字节;这个步骤为 Analyzer Document文档分词,切词过后,文档就要被加上索引列表啦,即我们搜索的时候,通过索引会给你搜索到1-10的数字、搜索2的时候会给你搜索到2-20的数字等,这就叫做添加索引 Idenx Document。这一系列统统被称为索引组件来完成的工作,接下来就等着被搜索引擎搜索吧。

淘宝的搜索框就是我们的用户搜索界面 Search User Interface,当我们在search interface输入东西去搜索内容的时候浏览器会把你输入的内容转换为HTML或Ajax的格式提交给搜索引擎服务器,即淘宝的搜索引擎服务器,由浏览换转换你输入内容的步骤叫做建立查询Build Query;当查询建立后,淘宝的搜索引擎就会拿着你输入的内容去存储库中寻找相匹配的内容,会直接查询上述步骤中已经建立好的索引,此步骤叫做搜索查询 Run Query;搜索到相匹配内容后,就要通过界面展现给你,淘宝的搜索引擎拿到数据后返回到你的浏览器当中,一次完整的搜索就此完成,此步骤叫做Render Results展现结果。

索引是一种数据结构,它允许对它存储在其中的单词进行快速随机访问。当需要从大量文本中快速检索文本目标时,必须首先将文本内容转换成能够进行快速搜索的格式,以建立针对文本的索引数据结构,此即为索引过程。

  • 获取内容(Acquire Content)

    由用户输入原始内容(Raw Content),然后由索引组件去获取内容(Acquire Content),是通过网络爬虫或其它方式来搜集需要索引的内容。Lucene并不提供任何获取内容的组件,因此,需要由其它应用程序负责完成这一项功能,例如入著名的开源爬虫程序Solr、Nutch、Grub及Aperture等。必要时还可以自行开发相关程序以高效获取自有的特定环境中的数据。获取到的内容需要剪切为小数据块,即文档(Document)。

  • 建立文档(Build Document)

    通过Acquire Centent获取的原始内容需要转换为专用部件(文档)才能供搜索引擎使用。
    一般来说,一个网页、一个PDF文档、一封邮件或者一条日志信息都可以作为一个文档。文档由带“值(Value)”的”域(Field)”组成,例如标题(Title)、正文(body)、摘要(abstract)、作者(Author)和链接(url)等。不过,二进制格式的文档处理起来要麻烦一些,例如PDF文档。对于建立文档的过程来说有一个常见操作:向单个的文档和域中插入加权值,以便在搜索结果中对其进行排序。权值可在索引操作前静态生产,也可在搜索期间才动态生成。权值决定了其搜索相关度。

  • 文档分析(Analyze Document)

    搜索引擎不能直接对文本进行索引,确切地说,必须首先将文本分割成一系列被称为语汇单元(token)的独立原子元素,此过程即为文档分析。每个token大致能与自然语言中的“单词”对应起来,文档分析就是用于确定文档中的文本域如何分割成token序列。此即为切词或分词。
    文档分析中要解决的问题包括如何处理连接一体的各个单词、是否需要语法修正(例如原始内容存在错别字、是否需要向原始token中插入同义词)、是否需要将大写字符统一转换为小写字符,以及是否将单数和复数格式的单词合并成同一个token等。这通常需要词干分析器等来完成此类工作,Lucene提供了大量内嵌的分析器,也支持用户自定义分析器,甚至联合Lucene的token工具和过滤器创建自定义的分析链。

  • 文档索引(Idenx Document)

    在索引步骤中,文档将被加入到索引列表。事实上,Lucene为此仅提供了一个非常简单的API,而后自行内生地完成了此步骤的所有功能。


搜索组件
描述:索引处理就是从索引中查找单词,从而找到包含该单词的文档的过程。搜索质量主要由查准率(Precision)和查全率两个指标进行衡量。
查准率用来衡量搜索系列过非相关文档的能力。
而查全率用来衡量搜索系统查找相关文档的能力。
另外,除了快速搜索大量文本和搜索速度之后,搜索过程还涉及到了许多其它问题,例如单项查询、多项查询、短语查询、通配符查询、结果ranking和排序,以及友好的查询输入方式等。这些问题的解决,通常需要多个组件协作完成。

  • 用户搜索界面(Search User Interface)

    UI(User Interface)是搜索引擎的重要组成部分,用户通过搜索引擎进行搜索交互时,他们会提交一个搜索请求,该请求需要先转换成合适的查询对象格式,以便搜索引擎能执行查询。

  • 建立查询(Build Query)

    用户提交的搜索请求通常以HTML表单或Ajax请求的形式由浏览器提交到搜索引擎服务器,因此,需要事先由查询解析器一类的组件将这个请求转换成搜索引擎使用的查询对象格式。

  • 搜索查询(Run Query)

    当查询请求建立完成后,就需要查询检索索引并返回与查询语句匹配的并根据请求排好序的文档。搜索查询组件有着复杂的工作机制,他们通常根据搜索理论模型执行查询操作。常见的搜索理论模型由纯布尔模型、向量空间模型及概率模型三种。Lucene采用了向空间模型和纯布尔模型。

  • 展现结果(Render Results)

    查询获得匹配查询语句并排好序的文档结构集后,需要用直观、经济的方式为用户展现结果。UI也需要为后续的搜索或者操作提供清晰的向导,如完善搜索结果、寻找与匹配结果相似的文档、进入下一页等。


如果在企业中我们也需要搭建这么一套搜索引擎的流程,我们要通过什么实现呢?答案当然就是本章主人公了。下面来图解完成一套搜索引擎的应用组件。

WeiyiGeek.图解ELK组件

WeiyiGeek.图解ELK组件

  • Kibana组件来代替用户搜索接口(Search User Interface)功能,还要提供了一个Web界面供用户搜索。
  • Elasticsearch组件来代替建立查询(Build Query)和搜索查询(Run Query)以及把搜索结果返回给用户接口的展现结果(Render Results)功能。
  • Lucene组件来代替文档索引(Index Document)和文档分析(Analyze Document)的功能。 Lucene是Apache旗下的一款非常出色的项目,提供基于Java的索引和搜索技术,以及拼写检查,命中突出显示和高级分析/标记化功能。
  • Logstash组件来代替原始内容(Raw Content)和获取内容(Acquire Content)及构建文档(Build Document)的功能,(也可以使用程序直接往ES里面写入数据)。


1.什么是 ELK?

答: ELK 是由 elastic 公司提供的一套完整的日志收集以及展示的解决方案,它是三个开源项目的首字母缩写分别是 Elasticsearch、Logstash 和 Kibana, 当前核心产品包括 Elasticsearch、Kibana、Beats 和 Logstash 其组合更名成为Elastic (ELK) Stack 解决方案。

WeiyiGeek.Elastic Stack

WeiyiGeek.Elastic Stack

Q: 上面三款工具本来是被称为ELK的后来被更名为Elastic Stack,为什么会出现这种情况呢?
答: 因为Logstash被用来作为日志的抽取工具实在是弱爆了,性能非常差,硬件资源消耗大,因为Logstash使用JRuby所研发,我们知道Python使用C语言所研发,Ruby也是使用C语言所编写,而JRuby却是用Java所研发,Java本来就很慢,而还用Java写Ruby成为了JRuby,那更是慢上加慢,Ruby这样的动态语言比较适合做Web网站的快速开发,但是像日志采集的后端应用,需要负责日志的采集和解析,尤其像解析日志会很耗CPU资源的,这样大的日志数据量更容易碰天花板。

所以后来就有人用GoLang重写了一款工具叫Beats,Beats被称为轻量型数据采集器。Beats平台集合了多种单一用途的数据采集器,他们从成百上千或成千上万台机器和系统向Logstash或Elasticsearch发送数据。


1.1 ElasticSearch

描述: ElasticSearch 英 [ɪˈlæstɪk] 英 [sɜːtʃ] 简称ES,它是一个实时的分布式存储、搜索和分析引擎。它可以用于全文搜索、结构化搜索以及分析,其基于在Apache Lucene 全文搜索引擎之上使用Java语言编写。

Tips : 当前 Elasticsearch 是最受欢迎的企业搜索引擎,其次是Apache Solr也是基于Lucene。

Tips : Elasticsearch 是 Elastic Stack 的核心,是一款速度快、可扩展的搜索和分析引擎。


1.2 Logstash

描述: Logstash 英 [lɒɡ] 英 [stæʃ] 是一个具有实时传输能力的数据搜索引擎,使用它可以从第三方数据存储库中拉取数据,方法十分多样,如读取(文本日志文件)、解析、并将数据发送给ES。例如他可以收集和筛选应用日志、数据库日志等。


1.3 Kibana

描述: Kibana 为 ES 提供了分析和可视化的Web平台,它可以在ES的存储索引中查找、交互数据,并生成各种维度表格、图形,从华夫饼图到热点图,再到时序数据分析,应有尽有。


1.4 Beats

描述: Beats 它是一个面向轻量型采集器的平台(支持多种扩展),这些采集器可从边缘机器发送数据到ES和Kibana之中。

例如,常用采集器包括 Filebeat、Winlogbeat、Metricbeat、Auditbeat、Functionbeat、Heartbeat、Packetbeat

Tips : Logstash 和 Beats 有助于收集、聚合和 丰富您的数据并将其存储在 Elasticsearch 中。

Tips : Filebeats 轻量级数据收集引擎,基于原先 Logstash-fowarder 的源码改造出来,适用于多种数据场景的采集。主要将其当作Logstash的替代品, 它是 ELK Stack 在 Agent 的第一选择。

Q: 为什么有了Beast还要向Logstash发送数据呢?为什么不直接取代Logstash呢?
答: 因为Beast虽然好用,也很强大,但Logstash的一部分功能Beast还是不具备的, 所以某些特殊的应用场景还会依然会用到Logstash。


名词概念:
Elasticsearch : 主要用于存储、搜索、分析,是一个基于 JSON 的分布式搜索和分析引擎。
Logstash : 它是动态数据收集管道,拥有可扩展的插件生态系统。
Kibana : 可以让您数据可视化、导航、共享,专为 Elastic Stack 而设计,是一个功能强大且可定制的可视化图层和用户界面。
Beats : 它是一个面向轻量型采集器的平台,这些采集器可从边缘机器发送数据。例如后续讲解的fileBeat以及WinlogBeat等。
Elastic 代理 : 它是一个一体化的代理,用于在保护主机的同时跨多个数据源采集数据。
Fluentd : 与Logstash一样属于日志收集处理工具也是一个开源的数据收集器,专为处理数据流设计,使用JSON作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发(基本很少使用)。


2.为什么要使用ELK?

描述: 当前Elasticsearch是全文搜索功能使用最多的一种技术,可利用其分布式集群来存储PB级数据,并且搜索快、准、多维度全文搜索。

  • 分布式集群 : 分布式架构水平扩展, 高可用确保您的集群(和数据)的安全性和可用性,存储PB量级数据、找寻数据快、准。
  • 数据源丰富 : 可以从多数据源采集数据。
  • 数据的价值 : 按需提取并分析展示数据。
  • 多种交互方式 : ES使用的是标准的 RESTful 风格的 API 和 JSON。此外还支持多种编程语言与 Elasticsearch 进行交互。

Tips: Elasticsearch 和 Kibana 都是在免费开源的基础上构建而成的,适用于各种各样的用例,从日志开始,到您能想到的任何项目,无一不能胜任。Elastic 提供的丰富功能(诸如 Machine Learning、安全和 Reporting)更加凸显了其巨大价值(要收费);此外,由于这些功能是专门针对 Elastic 开发的,所以只有 Elastic 才能提供。


2.1 数据输入:文档和索引

描述: Elasticsearch 是一个分布式文档存储。 而不是将信息存储为行柱状数据,Elasticsearch 存储已序列化的复杂数据结构 作为 JSON 文档。 当集群中有多个 Elasticsearch 节点时,存储文档分布在整个集群中,可以立即访问从任何节点。

文档|Documents
描述: Elasticsearch 是一个分布式文档存储, 并且其有无模式的能力,意味着文档可以没有明确指定如何处理每个不同字段的索引。 并当启您用动态映射时, Elasticsearch 会自动检测并将新字段添加到索引中。

您可以定义规则来控制动态映射并显式定义映射以完全控制字段的存储和索引方式,定义您自己的映射使您能够:

  • 区分全文字符串字段和精确值字符串字段
  • 执行特定于语言的文本分析
  • 优化部分匹配的字段
  • 使用自定义日期格式
  • 使用数据类型,例如 geo_point 和 geo_shape 不能自动检测到


索引|Indices
描述: 当信息存储为 JSON 文档后其会被编入索引,并且此时可以进行全面搜索。一个索引可以被认为是一个优化的文档集合,每个文档是字段的集合,该字段是包含的键值对的数据。

Elasticsearch 使用一种称为 支持非常快速的全文搜索的倒排索引。倒排索引列出出现在任何文档中的每个唯一单词并标识所有每个单词出现的文档。

默认情况下,Elasticsearch 索引每个字段中的所有数据,并且每个索引字段具有专用的、优化的数据结构。 例如,文本字段是 存储在倒排索引中,数值和地理字段存储在 BKD 树中。 能够使用每个字段的数据结构来组装和返回搜索 结果是让 Elasticsearch 如此快速的原因。


2.2 信息输出:搜索和分析

描述: 您可以使用 Elasticsearch 作为文档存储并检索文档及其元数据,但其真正核心套件是建立在 Apache Lucene 搜索引擎库上的搜索功能。

Elasticsearch 提供了一个简单、一致的 REST API 来管理您的集群和索引 并搜索您的数据。你可以通过命令行或 Kibana 中的开发人员控制台或弹性搜索客户端(Java、JavaScript、Go、.NET、PHP、Perl、Python、Ruby)


搜索|Search
描述: Elasticsearch REST API 支持结构化查询、全文查询并且我们可以将两者结合起来的进行更为复杂的查询。

结构化查询是类似于您可以在 SQL 中构造的查询类型,除了搜索单个术语外,您还可以执行短语搜索,相似性搜索和前缀搜索,并获得自动完成查询的结果。

并且您可以使用 Elasticsearch 的 全面的 JSON 风格的查询语言 ( Query DSL )。 你也可以 构建 SQL 样式的查询 来搜索和聚合数据 原生在 Elasticsearch 中,JDBC 和 ODBC 驱动程序广泛的支持第三方应用程序通过 SQL 与 Elasticsearch 交互。


分析|Analysis
描述: Elasticsearch 聚合使您能够构建复杂的数据摘要并获得 洞察关键指标、模式和趋势。由于聚合利用了用于搜索的相同数据结构,所以它们是也非常快,这也使您能够实时分析和可视化数据。

Elasticsearch 可以自动化时间序列数据的分析,其使用机器学习功能以创建准确的数据中正常行为的基线,并识别异常模式。例如你可以用其检测与值、计数或频率的时间偏差相关的异常统计稀有度, 某个群体成员的异常行为


2.3 可扩展性和弹性

描述: Elasticsearch 旨在始终可用并根据您的需求进行扩展,你也可以手动进行进行设置集群、节点和分片。

节点|Nodes

您可以将服务器(节点)添加到集群中增加容量,Elasticsearch 会自动分配您的数据和查询负载跨所有可用节点。


分片|Slice
Elasticsearch 索引实际上包括一个或多个物理分片的分组,其中每个分片实际上是一个自包含索引。通过将索引中的文档分布在多个分片,并将这些分片分布在多个节点上,Elasticsearch 可以确保冗余,既可以防止硬件故障,又可以增加 当节点添加到集群时查询容量。随着集群的增长(或缩小), Elasticsearch 会自动迁移分片以重新平衡集群。

Tips: 有两种类型的分片主分片和副本。 索引中的每个文档属于一个主分片。 副本分片是主分片的副本。 副本提供数据的冗余副本以防止硬件失败并增加服务读取请求的能力,例如搜索或检索文档。

Tips: 索引中的主分片数量在索引创建时是固定的已创建,但副本分片的数量可以随时更改,无需中断索引或查询操作。

Tips: 考虑和权衡分片大小和为索引配置的主分片数量。

  • 分片数量,维护这些索引的开销就越大。
  • 分片大小,ES移动分片所需的时间就越长需要重新平衡集群。
  • 查询量,查询大量小分片使每个分片的处理速度更快,但更多查询意味着更多的开销,因此查询更小的较大分片的数量可能会更快。


集群|Cluster
集群节点之间需要良好、可靠的连接。 提供 更好的连接,您通常将节点放在同一数据中心或附近的数据中心。 为了保持高可用性,您还需要避免任何单点故障, 当一个集群发生故障时,为了使另一个位置的服务器需要能够接管。此时你需要搭建配置跨集群复制 (CCR)。

Tips : CCR 提供了一种从主集群自动同步(主动的-被动的)索引的方法到可以作为热备份的辅助远程集群。主集群上的索引是活动领导者索引并处理所有写请求。 复制到的指数 辅助集群是只读的追随者。如果初级集群失败,辅助集群可以接管。您还可以使用 CCR 创建辅助集群以向您的用户提供地理位置邻近的读取请求。

Monitor
为了保证Elasticsearch 集群安全稳定的运行,你需要进行监控、以及监控检查,以便发生异常后第一时间进行恢复。


3.我到底能够使用 Elasticsearch 做什么?

描述: Elasticsearch 可以存储、搜索、分析数字、文本、地理位置、结构化数据、非结构化数据适用于所有数据类型。全文本搜索只是全球众多公司利用 Elasticsearch 解决各种挑战的冰山一角。

Elastic Stack 所构建解决方案:

  • Logs 快速且可扩展的日志管理,绝不会让您失望。
  • Metrics 对您的系统指标进行监测和可视化。
  • APM 获得有关自己应用程序性能的洞见。
  • Uptime 监测可用性问题并进行应对。
  • Site Search 轻松为您的网站打造卓越的搜索体验。
  • App Search 搜索文档、地理数据等形形色色的内容。
  • Workplace Search 集中式搜索,应对企业内的数据孤岛情况。
  • Maps 实时探索位置数据。
  • SIEM 交互式调查和自动威胁检测。
  • Endpoint Security 预防、检测、猎捕并应对威胁。

参考地址: https://www.elastic.co/cn/elasticsearch/


常用架构组合解决方案
描述: 常用的ELK架构组合解决方案,可根据实际场景进行选择。

基础架构:

  • 1/ Kibana -> elasticsearch -> Logstash(收集)
  • 2/ Kibana -> elasticsearch -> filebeat(收集)
  • 3/ Kibana -> elasticsearch -> Logstash(过滤) -> filebeat(收集)

扩展架构:

  • 1/ Kibana -> elasticsearch -> Logstash(过滤) -> redis(缓存) -> Logstash(收集)
  • 2/ Kibana -> elasticsearch -> Logstash(过滤) -> redis(缓存) -> filebeat(收集)
  • 3/ Kibana -> elasticsearch -> Logstash(过滤) -> redis(缓存) -> Logstash(转发)-> filebeat(收集)

0x01 安装使用

0.环境依赖须知

描述: 我们可以从elastic官方网站上查询到 Elasticsearch 官方支持的操作系统和 JVM 的版本 矩阵列表(https://www.elastic.co/cn/support/matrix) 。

Elasticsearch 包含一个捆绑版本的 OpenJDK 来自 JDK 维护者 (GPLv2+CE),你需要选择指定的JDK版本

Tips : 非常注意,Java 9、Java 10、Java 12 和 Java 13 是短期版本,ES官方建议不要使用它们。

Tips : 非常注意,ES是基于JAVA开发的所有其依赖于JVM环境, 在7.x版本官方强烈推荐JDK 11以上的环境,并且在ES包中的jdk目录已为我们准备好该版本对应的OpenJDK, 当前 7.15 版本采用的是 OpenJDK16,只需要为其设置ES_JAVA_HOME环境变量即可。

Tips : 非常注意,JAVA家目录的环境变量名称时需要采用ES_JAVA_HOME而非JAVA_HOME,否则会在启动ES时报JAVA_HOME已被启用而强烈推荐ES_JAVA_HOME。

这是什么OpenJDK?
描述: OpenJDK(http://jdk.java.net/) 是唯一的开源 Java SE 实现 Oracle 计划做出贡献,它在Java平台、标准版和相关项目的开源实现上进行协作的地方。(Open Source, Open Innovation, Open Standards)

谁在使用 OpenJDK?
描述: 主要的 Linux 发行版,例如 Ubuntu、Fedora 或 Red Hat Enterprise Linux 提供 OpenJDK 作为其默认的 Java SE 执行。

Tips: Oracle 针对 JDK 版本的支持年限参考(https://www.oracle.com/java/technologies/java-se-support-roadmap.html)

Tips: 官方快速下载最新的稳定版本并开始使用(https://www.elastic.co/cn/start)


重要系统配置
Elasticsearch 应该在服务器上单独运行并使用所有它可用的资源。 为此您需要配置您的操作系统允许运行 Elasticsearch 的用户访问更多资源比默认允许的多。

在线上生产环境必须考虑设置以下方面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# (1) 禁用交换,以提高对性能和节点稳定性
sudo swapoff -a
sysctl -w vm.swappiness=1

tee -a /etc/profile <<'EOF'
swapoff -a
sysctl -w vm.swappiness=1
EOF

tee -a /etc/security/limits.conf <<'EOF'
# 在启动 Elasticsearch 之前将 memlock 设置为无限制
elk soft memlock unlimited
elk hard memlock unlimited
EOF

tee -a /etc/sysctl.conf <<'EOF'
sysctl -w vm.swappiness=1
EOF

curl -X GET "localhost:9200/_nodes?filter_path=**.mlockall&pretty"
# 在 Windows 上,可以通过系统属性 → 高级 → 性能 → 高级 → 虚拟内存完全禁用分页文件来实现。


# (2) 增加文件描述符数量的限制,例如设置elk用户可打开数量为 65,536 或 更高.
# (3) 增加线程数,ES使用多个线程池来进行不同类型的操作,确保 ES 用户可以创建的线程数为 至少 4096 或者更高。
ulimit -HSn 65535 && ulimit -HSu 65535
tee -a /etc/profile <<'EOF'
ulimit -HSn 65535
ulimit -HSu 65535
EOF

tee -a /etc/security/limits.conf <<'EOF'
elk soft nofile 65535
elk hard nofile 65535
elk soft nproc 65535
elk hard nproc 65535
EOF

curl -X GET "localhost:9200/_nodes/stats/process?filter_path=**.max_file_descriptors&pretty"


# Elasticsearch 默认使用 mmapfs 目录来存储其索引。操作系统对 mmap 计数的默认限制可能太低,这可能会导致内存不足异常,所以确保足够的虚拟内存。
sysctl -w vm.max_map_count=262144
tee -a /etc/sysctl.conf <<'EOF'
sysctl -w vm.max_map_count=262144
EOF

# JVM DNS 缓存设置
es.networkaddress.cache.ttl=60
es.networkaddress.cache.negative.ttl=10

# ES使用 Java Native Access (JNA) 库来执行一些 平台相关的本机代码,没有挂载的临时目录(tmp) noexec , 防止 JVM 进程能够将此代码映射为可执行文件
# 必须将 JNA 使用的临时目录重新挂载到不安装 noexec.
dd if=/dev/zero of=/dev/estemp bs=1M count=1000
mke2fs -t ext4 /dev/estemp
tee -a /etc/fstab <<'EOF'
/dev/estemp /usr/local/elasticsearch-7.15.0/temp ext4 rw,noexec,nosuid,nodev 0 0
EOF
mount -a
mount | egrep --color -w '/dev/estemp'
# /dev/estemp on /usr/local/elasticsearch-7.15.0/temp type ext4 (rw,nosuid,nodev,noexec,relatime)
export ES_TMPDIR = "/usr/local/elasticsearch-7.15.0/temp"
-Djna.tmpdir="/usr/local/elasticsearch-7.15.0/temp"

# TCP重传超时, 大多数 Linux 发行版默认重新传输任何丢失的数据包 15 次,为了高可用集群(每个ES节点通过TCP连接进行通信)必须能够及时发现节点故障,我们将最大 TCP 重传次数减少到 5。
sysctl -w net.ipv4.tcp_retries2=5
tee -a /etc/sysctl.conf <<'EOF'
sysctl -w net.ipv4.tcp_retries2=5
EOF

参考地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html


Elasticsearch 目录文件说明:
描述: 在 Elasticsearch.tar.gz 解压存档时, 默认情况下所有文件和目录都包含在 $ES_HOME 家目录下。

1
2
$ ls /usr/local/elasticsearch-7.15.0/
bin config jdk lib LICENSE.txt logs modules NOTICE.txt plugins README.asciidoc

  • home : 通过解压存档创建的目录,Elasticsearch 主目录或ES_HOME="/usr/local/elasticsearch-7.15.0/"
  • bin : 二进制脚本,包括启动节点的 elasticsearch 和安装插件的 elasticsearch-plugin
  • conf : 配置文件包括elasticsearch.yml
  • data : 节点上分配的每个索引/分片的数据文件的位置,可在配置文件中配置path.data
  • logs : 日志文件位置。
  • plugins : 插件文件位置,每个插件都将包含在一个子目录中。
  • repo : 共享文件系统存储库位置,可以容纳多个位置。 文件系统存储库可以放置在此处指定的任何目录的任何子目录中。


1.ElasticSearch 安装配置

官方多种方式安装文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html#install-elasticsearch

1.1 基于Linux主机安装

环境说明:

1
2
3
4
5
6
7
8
9
10
11
12
# Liunx 主机以及发行版
$ cat /etc/issue.net && uname -a
Ubuntu 20.04.2 LTS
Linux elk1 5.4.0-78-generic #87-Ubuntu SMP Fri Jun 18 16:29:09 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ hostname
elk1

# ES 相关套件版本
$ elasticsearch : 7.15.0
$ elasticsearch jdk : openjdk 16
$ Kibana : 7.15.0


部署流程&脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# (1) 使用ES前重要系统配置(临时&永久)
sudo swapoff -a
ulimit -HSn 65535
ulimit -HSu 65535
sysctl -w vm.swappiness=1
sysctl -w vm.max_map_count=262144
sysctl -w net.ipv4.tcp_retries2=5

# 系统启动配置
if [[ $(grep -c "ulimit" /etc/profile) -ne 2 ]];then
tee -a /etc/profile <<'EOF'
swapoff -a
ulimit -HSn 65535
#ulimit -HSu 65535
EOF
fi
# 系统资源限制配置
if [[ $(grep -E -c "^elk" /etc/security/limits.conf) -eq 0 ]];then
tee -a /etc/security/limits.conf <<'EOF'
# 在启动 Elasticsearch 之前将 memlock 设置为无限制
elk soft memlock unlimited
elk hard memlock unlimited
# 文件描述符数量与线程数
elk soft nofile 65535
elk hard nofile 65535
elk soft nproc 65535
elk hard nproc 65535
EOF
fi
# 系统内核参数配置&生效设置
tee -a /etc/sysctl.conf <<'EOF'
# 禁用 swap
vm.swappiness=1
# 确保足够的虚拟内存
vm.max_map_count=262144
# TCP重传超时次数
net.ipv4.tcp_retries2=5
EOF
sysctl -p

# (2) 下载并安装适用于 Linux 的elasticsearch
export ES_VERSION="7.15.0"
wget -L https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz
wget -L https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz.sha512
if [ $? -eq 0 ];then
sudo tar -xzf elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz -C /usr/local
cd /usr/local/elasticsearch-${ES_VERSION}/
else
echo -e "\e[31m[*] check shasum elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz failed! \e[0m"
exit 1
fi
# 自定义 JDK 版本使用
# wget -L https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz -O openjdk-11.tar.gz
# tar -zxf openjdk-11.tar.gz -C /usr/local/
# cd /usr/local/openjdk


# (3) jdk 与 elasticsearch 环境变量配置
if [[ $(grep -c "ES_HOME" /etc/profile) -eq 0 ]];then
tee -a /etc/profile <<'EOF'
ES_VERSION="7.15.0"
ES_HOME="/usr/local/elasticsearch-${ES_VERSION}"
ES_JAVA_HOME="${ES_HOME}/jdk"
PATH=${ES_JAVA_HOME}/bin:${ES_HOME}/bin:$PATH
export ES_VERSION ES_HOME ES_JAVA_HOME PATH
EOF
else
echo -e "\e[31[*] melasticsearch environment failed! \e[0m"
exit 1
fi
source /etc/profile
echo $PATH
# /usr/local/elasticsearch-7.15.0/jdk/bin:/usr/local/elasticsearch-7.15.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

# (4) 创建运行 elasticsearch 用户与权限设置
groupadd elk && useradd elk -g elk
chown -R elk:elk /usr/local/elasticsearch-${ES_VERSION}

# (5) 环境验证
java --version
# openjdk 16.0.2 2021-07-20
# OpenJDK Runtime Environment Temurin-16.0.2+7 (build 16.0.2+7)
# OpenJDK 64-Bit Server VM Temurin-16.0.2+7 (build 16.0.2+7, mixed mode, sharing)
setsid sudo -u elk /usr/local/elasticsearch-7.15.0/bin/elasticsearch -version # 此处采用elk用户进行执行elasticsearch
# Version: 7.15.0, Build: default/tar/79d65f6e357953a5b3cbcc5e2c7c21073d89aa29/2021-09-16T03:05:29.143308416Z, JVM: 16.0.2

# (6) 自启动服务创建
sudo tee /usr/lib/systemd/system/elasticsearch.service <<'EOF'
[Unit]
Description=Elasticsearch Server Systemd
Documentation=https://elastic.co
After=network.target
Wants=network.target

[Service]
Type=simple
User=elk
Group=elk
LimitNOFILE=65536
LimitNPROC=65536
LimitMEMLOCK=infinity
WorkingDirectory=/usr/local/elasticsearch-7.15.0
ExecStart=/usr/local/elasticsearch-7.15.0/bin/elasticsearch
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=no

[Install]
WantedBy=multi-user.target
EOF

# 以默认得elastic.yml配置文件进行启动ES
sudo systemctl daemon-reload && systemctl start elasticsearch.service

Tips : ES 只能使用非root用户进行运行否则启动时将会报错。例如: setsid sudo -u elk /usr/local/elasticsearch-7.15.0/bin/elasticsearch


单实例ES启动后环境验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# (1) 查看以elk启动得elasticsearch进程
$ systemctl status elasticsearch.service
# ● elasticsearch.service - Elasticsearch Server Systemd
# Loaded: loaded (/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
# Active: inactive (dead) since Sun 2021-09-26 20:14:46 CST; 9min ago
# Docs: https://elastic.co
# Main PID: 5538 (code=exited, status=0/SUCCESS)
# Tasks: 62 (limit: 2244)
# Memory: 1.3G
# CGroup: /system.slice/elasticsearch.service
# ├─5724 /usr/local/elasticsearch-7.15.0/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cac>
# └─5749 /usr/local/elasticsearch-7.15.0/modules/x-pack-ml/platform/linux-x86_64/bin/controller
$ ps uax | grep "elasticsearch"
# elk 1976 113 60.7 4370648 1218980 ? Sl 19:51 0:18 /usr/local/elasticsearch-7.15.0/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-6557889709816638897 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m -Xms979m -Xmx979m -XX:MaxDirectMemorySize=513802240 -XX:G1HeapRegionSize=4m -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=15 -Des.path.home=/usr/local/elasticsearch-7.15.0 -Des.path.conf=/usr/local/elasticsearch-7.15.0/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /usr/local/elasticsearch-7.15.0/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
# elk 2005 0.0 0.3 108404 7532 ? Sl 19:51 0:00 /usr/local/elasticsearch-7.15.0/modules/x-pack-ml/platform/linux-x86_64/bin/controller

# (2) 默认得elasticsearch.yml,只能本地回环地址访问。
curl http://127.0.0.1:9200/
# {
# "name" : "elk1",
# "cluster_name" : "elasticsearch",
# "cluster_uuid" : "R8kofupCROGCAt6WrXT8bQ",
# "version" : {
# "number" : "7.15.0",
# "build_flavor" : "default",
# "build_type" : "tar",
# "build_hash" : "79d65f6e357953a5b3cbcc5e2c7c21073d89aa29",
# "build_date" : "2021-09-16T03:05:29.143308416Z",
# "build_snapshot" : false,
# "lucene_version" : "8.9.0",
# "minimum_wire_compatibility_version" : "6.8.0",
# "minimum_index_compatibility_version" : "6.0.0-beta1"
# },
# "tagline" : "You Know, for Search"
# }
curl http://10.10.107.225:9200/
# curl: (7) Failed to connect to 10.10.107.225 port 9200: Connection refused

# (3) elasticsearch.yml 单实例配置
tee ${ES_HOME}/config/elasticsearch.yml <<'EOF'
# ======================== Elasticsearch Configuration =========================
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
# Use a descriptive name for the node:
node.name: elk
# Add custom attributes to the node:
node.attr.type: single
# Lock the memory on startup:
bootstrap.memory_lock: true

# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
network.host: 10.10.107.225

# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
http.port: 9200


# Discovery
discovery.type: single-node

# Security configuration
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# Plugins
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
EOF

# (4) elastic 认证之配置内置用户的密码
[email protected]:$ ${ES_HOME}/bin/elasticsearch-setup-passwords interactive
# Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
# You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]Y

# Enter password for [elastic]:
# Reenter password for [elastic]:
....
# Enter password for [remote_monitoring_user]:
# Reenter password for [remote_monitoring_user]:
# Changed password for user [apm_system]
# Changed password for user [kibana_system]
# Changed password for user [kibana]
# Changed password for user [logstash_system]
# Changed password for user [beats_system]
# Changed password for user [remote_monitoring_user]
# Changed password for user [elastic]
# 上面过程中我们需要设置多个默认用户的信息,每个内置用户负责不同的内容。

# (5) 外部客户端通过浏览器访问 http://10.10.107.225:9200/ 或者以下方法
curl -I -H "Content-Type:application/json" -X GET -u elastic:weiyigeek -p 'http://10.10.107.225:9200'
HTTP/1.1 200 OK
X-elastic-product: Elasticsearch
content-type: application/json; charset=UTF-8
content-length: 532

# (6) 修改elastic用户密码为weiyi123456。
curl -H "Content-Type:application/json" -X POST -u elastic 'http://10.10.107.225:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "weiyi123456" }'
# Enter host password for user 'elastic':
# {}





# 使用修改后的密码查看ES健康状态
curl -H "Content-Type:application/json" -X GET -u elastic:weiyi123456 'http://10.10.107.225:9200/_cluster/health?pretty'
# {
# "cluster_name" : "elasticsearch",
# "status" : "green",
# "timed_out" : false,
# "number_of_nodes" : 1,
# "number_of_data_nodes" : 1,
# "active_primary_shards" : 2,
# "active_shards" : 2,
# "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
# }

WeiyiGeek.es1单实例

WeiyiGeek.es1单实例

Tips : 默认得data与logs目录都在${ES_HOME}目录下。

Tips : 内置用户名称及其作业说明。

  • elastic : 超级用户
  • apm_system: APM服务器在Elasticsearch中存储监视信息时使用
  • kibana_system:用于负责Kibana连接Elasticsearch
  • logstash_system:Logstash将监控信息存储在Elasticsearch中时使用
  • beats_system:Beats在Elasticsearch中存储监视信息时使用
  • remote_monitoring_user:Metricbeat用户在Elasticsearch中收集和存储监视信息时使用

Tips : 手动后台运行与关闭ES操作

1
2
3
4
5
# Use elk To run Elasticsearch as a daemon, specify -d on the command line, and record the process ID in a file using the -p option
setsid sudo -u elk /usr/local/elasticsearch-7.15.0/bin/elasticsearch -d -p /usr/local/elasticsearch-7.15.0/es.pid

# To shut down Elasticsearch, kill the process ID recorded in the pid file:
pkill -F /usr/local/elasticsearch-7.15.0//es.pid


1.2 基于Docker容器安装

描述: 此处Docker安装环境就不再累述了,如果有不会得读者请访问Docker官方网站(https://docs.docker.com/), 同时此处也将Kibana基于Docker安装也一起完成。

  • (1) 简单启动一下把镜像运行容器里面的的配置文件分别拷贝到/app/{elastic,kibana}

    1
    2
    3
    4
    5
    mkdir -vp /app/{elastic,kibana}/data
    docker run --rm --name elastic docker.elastic.co/elasticsearch/elasticsearch:7.13.1
    docker run --rm --name kibana docker.elastic.co/kibana/kibana:7.13.1
    docker cp elastic:/usr/share/elasticsearch/config/elasticsearch.yml /app/elastic/
    docker cp kibana:/usr/share/kibana/config/kibana.yml /app/kibana/
  • (2) 分别在配置文件中将elastic、kibana的x-pack功能开启认证(重要)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    tee /app/elastic/elasticsearch.yml <<'EOF'
    cluster.name: "docker-cluster"
    node.name: "elastic-single"
    network.host: 0.0.0.0
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    # 插件跨域配置
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
    EOF

    tee /app/kibana/kibana.yml <<'EOF'
    # Default Kibana configuration for docker target
    server.name: "kibana"
    server.host: "0.0.0.0"
    server.publicBaseUrl: http://log.weiyigeek.top
    elasticsearch.hosts: [ "http://elastic:9200" ]
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "weiyigeek"
    monitoring.ui.container.elasticsearch.enabled: true
    # change locale zh-CN
    i18n.locale: zh-CN
    EOF
  • (3) 创建自定义桥接网络以及启动容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    docker network create elastic
    docker run -d --name elastic \
    --network elastic \
    -p 9200:9200 -p 9300:9300 \
    -e "node.name=elastic-node-1" \
    -e "discovery.type=single-node" \
    -v /app/elastic/data:/usr/share/elasticsearch/data \
    -v /app/elastic/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    --privileged=true \
    docker.elastic.co/elasticsearch/elasticsearch:7.14.1

    docker run -d --name kibana \
    --network elastic \
    -p 5601:5601 \
    -e "ELASTICSEARCH_HOSTS=http://elastic:9200" \
    -v /app/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
    -v /app/kibana/data:/usr/share/elasticsearch/data \
    --privileged=true \
    docker.elastic.co/kibana/kibana:7.14.1

    # -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" \
    # 容器启动状态查看
    $ docker stats kibana elastic
    CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    e01fa7403823 kibana 0.14% 263.8MiB / 15.64GiB 1.65% 232kB / 3.43MB 0B / 0B 19
    9f90fe28213c elastic 0.00% 1.427GiB / 15.64GiB 9.13% 3.18MB / 219kB 0B / 12MB 90
  • (4) 设置elasticsear系统相关账号的认证密码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ docker exec -it elastic bash
    [[email protected] elasticsearch]# bin/elasticsearch-setup-passwords interactive
    Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
    You will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to continue [y/N]y
    Enter password for [elastic]: # weiyigeek 此处测试我们全部设置为相同的
    Reenter password for [elastic]:
    .....
    Enter password for [remote_monitoring_user]:
    Reenter password for [remote_monitoring_user]:
    Changed password for user [apm_system]
    .....
    Changed password for user [elastic]
  • (5) 分别访问elastic(http://192.168.12.111:9200/)和Kibana(http://192.168.12.111:5601)服务进行查看是否正常

WeiyiGeek.登陆验证测试

WeiyiGeek.登陆验证测试


2.Kibana 安装配置

官方安装文档: https://www.elastic.co/guide/en/kibana/current/install.html#_install_kibana_yourself

  • Step 1.下载与ES对应版本的Kibana,此处仍然采用上述环境;

    1
    2
    3
    4
    5
    6
    7
    8
    curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.15.0-linux-x86_64.tar.gz
    curl https://artifacts.elastic.co/downloads/kibana/kibana-7.15.0-linux-x86_64.tar.gz.sha512 | shasum -a 512 -c -
    sudo tar -xzf kibana-7.15.0-linux-x86_64.tar.gz -C /usr/local
    mv /usr/local/kibana-7.15.0-linux-x86_64 /usr/local/kibana-7.15.0
    sudo chown -R elk:elk /usr/local/kibana-7.15.0
    cd /usr/local/kibana-7.15.0
    /usr/local/kibana-7.15.0$ ls
    # bin config data LICENSE.txt node node_modules NOTICE.txt package.json plugins README.txt src x-pack
  • Step 2.配置Kibana.yml连接我们ES节点的关键项.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [email protected]:/usr/local/kibana-7.15.0/config$ grep -E -v "^#|^$" kibana.yml
    server.port: 5601
    server.host: "0.0.0.0"
    server.name: "ES-kibana"
    elasticsearch.hosts: ["http://10.10.107.225:9200"]
    kibana.index: ".kibana"
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "weiyigeek"
    elasticsearch.pingTimeout: 1500
    i18n.locale: "zh-CN"
  • Step 3.采用elk用户启动kibana测试与验证

    1
    2
    3
    4
    5
    6
    [email protected]:/usr/local/kibana-7.15.0/bin$ ./kibana
    # log [21:24:15.074] [info][plugins-service] Plugin "metricsEntities" is disabled.
    # log [21:24:15.142] [info][server][Preboot][http] http server running at http://0.0.0.0:5601
    # log [21:24:15.328] [warning][config][deprecation] plugins.scanDirs is deprecated and is no longer used
    [email protected]:/usr/local/kibana-7.15.0/bin$ ps aux | grep "kibana"
    # elk 12505 4.3 10.0 1247832 402708 pts/0 Sl+ 21:23 0:30 /usr/local/kibana-7.15.0/node/bin/node --preserve-symlinks-main --preserve-symlinks /usr/local/kibana-7.15.0/src/cli/dist
  • Step 4.访问Kibana的UI界面应用地址为http://10.10.107.225:5601,我们也可以使用它来进行调用调试ES。

WeiyiGeek.Kibana-DevelopmentTools

WeiyiGeek.Kibana-DevelopmentTools

Tips: 默认得Kibana也不能采用root,如果你非要使用root用户运行可以加上 --allow-root 参数

Tips: 安装好Kibana后我们可以激活解锁白金级功能 30 天免费试用(可选),例如机器学习、安全性、警报、图形分析等, 在 Kibana 中打开管理应用程序单击许可证管理下的开始试用按钮。


3.Head 插件安装使用

描述: Head 插件时一个可以帮助用户代理访问ES,并以图像界面展示数据的插件,前面我们配置了ES的跨域就是为了安装此插件。

环境依赖:

1
2
elasticsearch-head : https://github.com/mobz/elasticsearch-head/archive/master.zip
Node.js : https://npm.taobao.org/mirrors/node/latest-v16.x/node-v16.10.0-linux-x64.tar.gz


安装配置

  • Step 1.elasticsearch-head 与 Node.js 下载解压以及环境变量配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 下载解压
    wget -L https://npm.taobao.org/mirrors/node/latest-v16.x/node-v16.10.0-linux-x64.tar.gz
    wget -L https://github.com/mobz/elasticsearch-head/archive/master.zip
    sudo tar -zxf node-v16.10.0-linux-x64.tar.gz -C /usr/local/
    sudo mv /usr/local/node-v16.10.0-linux-x64 /usr/local/node-v16.10.0
    sudo unzip master.zip -d /usr/local/elasticsearch-7.15.0/
    sudo ls -alh /usr/local/

    # 配置环境变量
    vim /etc/profile
    NODE_HOME=/usr/local/node-v16.10.0
    NODE_PATH=${NODE_HOME}/lib/node_modules
    PATH=$PATH:$NODE_HOME/bin
    export NODE_HOME NODE_PATH PATH

    # 配置生效
    source /etc/profile

    # 权限设置
    sudo chown -R elk:elk /usr/local/elasticsearch-7.15.0
    sudo chown -R elk:elk /usr/local/node-v16.10.0


  • Step 2.node与ES-Header依赖环境验证
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 验证Node.js
    node --version
    v16.10.0
    npm --version
    7.24.0

    # 切换到elk用户
    su - elk
    cd /usr/local/elasticsearch-7.15.0/elasticsearch-head-master/

    # 在head 插件目录中执行npm进行安装。
    [email protected]:/usr/local/elasticsearch-7.15.0/elasticsearch-head-master/$ npm install -g grunt --registry=https://registry.npm.taobao.org
    [email protected]:/usr/local/elasticsearch-7.15.0/elasticsearch-head-master/$ npm install -g grunt-contrib-clean --registry=https://registry.npm.taobao.org

    # 检测是否安装成功,如果执行命令后出现版本号就表明成功
    grunt -version
    # grunt-cli v1.4.3
    # grunt v1.4.1


  • Step 3.在插件目录中配置Head插件相关参数。

    1
    2
    3
    4
    5
    6
    7
    8
    vi /usr/local/elasticsearch-7.15.0/elasticsearch-head-master/Gruntfile.js
    # 在 97 行中添加一个HOSTNAME。
    options: {
    hostname: '10.10.107.225',
    port: 9100,
    base: '.',
    keepalive: true
    }
  • Step 4.启动ES的head插件,我们可以直接在head根目录执行grunt server命令, 然后你就可以看到如下回显。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ grunt server
    Running "connect:server" (connect) task
    Waiting forever...
    Started connect web server on http://10.10.107.225:9100

    $ ps aux | grep "grunt"
    elk 11938 0.2 1.6 668504 65376 pts/0 Sl 21:04 0:00 grunt

    # 如需要后台执行可以执行如下命令 nohup grunt server &

如果在运行时报如下错误,使用 npm install安装相关依赖模块即可解决。例如: npm install -g grunt-contrib-clean grunt-contrib-concat

1
2
3
4
5
6
7
8
grunt server
>> Local Npm module "grunt-contrib-clean" not found. Is it installed?
>> Local Npm module "grunt-contrib-concat" not found. Is it installed?
>> Local Npm module "grunt-contrib-watch" not found. Is it installed?
>> Local Npm module "grunt-contrib-connect" not found. Is it installed?
>> Local Npm module "grunt-contrib-copy" not found. Is it installed?
>> Local Npm module "grunt-contrib-jasmine" not found. Is it installed?
Warning: Task "connect:server" not found. Use --force to continue.

  • Step 5.利用浏览器进行访问ES的Head地址http://10.10.107.225:9100/,非常注意由于我们的ES我们加入了认证所以在域名后加上了?auth_user=elastic&auth_password=weiyi123456参数
    WeiyiGeek.ES的Head插件访问

    WeiyiGeek.ES的Head插件访问