ELK Stack:配置elasticsearch集群设置CentOS/RHEL 7/8

时间:2020-02-23 14:38:05  来源:igfitidea点击:

这是一个由多个部分组成的Elasticsearch教程,其中我们将使用Elasticsearch 7.5

  • 使用3个节点安装和配置ElasticSearh Cluster 7.5

  • 启用HTTPS并配置SSS/TLS以保护Elasticsearch Cluster

  • 为Elasticsearch Cluster安装和配置带有SSL/TLS的Kibana 7.5

  • 配置Metricbeat 7.5以通过HTTPS监视Elasticsearch群集设置

  • 使用Elasticsearch安装和配置Logstash 7.5

ELK Stack的简要概述

Elastic Stack或者ELK Stack组件具有多种实际用例,随着更多插件添加到现有组件中,新的用例正在兴起。如前所述,我们可以在用例中使用部分组件。下面的示例用例列表绝不是详尽无遗的,而是重点介绍了一些最常见的用例:

  • 日志和安全性分析

  • 产品搜寻

  • 指标分析

  • 网页搜索和搜索

弹性搜索

Elasticsearch是一个分布式且可扩展的数据存储,Kibana将从该存储中提取可视化中使用的所有聚合结果。它本质上是有弹性的,并且可以进行横向扩展,这意味着可以根据需要以非常简单的方式将节点添加到Elasticsearch集群中。

Elasticsearch是一项高度可用的技术,这意味着:

  • 首先,在整个群集中复制数据,这样,如果发生故障,则仍然至少有一个数据副本

  • 其次,由于其分布式特性,Elasticsearch可以将索引和搜索负载分布在各种Elasticsearch节点类型上,以确保服务连续性并尊重SLA

鸣谢:Advanced Elasticsearch 7.X Elasticsearch集群体系结构

我们将在本文后面讨论不同类型的elasticsearch节点类型。

Elasticsearch常用术语

以下是最常见的术语,在配置elasticsearch集群之前必须非常了解这些术语:

  • Node:在机器上运行的Elasticsearch的单个实例。

  • Cluster:集群是单个名称,在该名称下,Elasticsearch的一个或者多个节点/实例相互连接。

  • Document:文档是一个JSON对象,它包含键值对中的实际数据。

  • Index:一种逻辑名称空间,Elasticsearch在其下存储数据,并且可以使用分片和副本与多个Lucene索引一起构建。

  • 文档类型:Elasticsearch中的文档类型代表一类相似的文档。类型由名称(例如用户或者博客文章)和映射(包括每个域的数据类型和Lucene配置)组成。 (索引可以包含多个类型。)

  • 碎片:碎片是可以存储在单个节点或者多个节点上的容器,由Lucene段组成。索引分为一个或者多个分片以使数据可分发。

  • Replica:驻留在分片中的数据的副本,以实现高可用性。

环境

我在有四个虚拟机的Linux Server上安装了Oracle VirtualBox。

所有这些VM都运行20GB磁盘,8GB RAM和4vCPU。以下是有关这些VM的其他详细信息

参数VM1VM2VM3VM4
Hostnameserver1server2server3centos-8
FQDNserver1. example.comserver2. example.comserver3. example.comcentos-8。example.com
IP地址|192.168.0.11|192.168.0.12|192.168.0.13|192.168.0.14
Cluster Node type主节点摄取节点ingest数据节点Kibana

Logstash

Filebeat
OSCentOS 7.6CentOS 7.6CentOS 7.6CentOS 8
'硬盘'20 GB20 GB20 GB20 GB
内存8 GB8 GB8 GB8 GB
vCPU4444

更新主机文件

在elasticsearch集群设置的所有节点上更新hosts文件。或者,我们也可以配置DNS服务器来解析主机名。

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.11   server1 server1.example.com
192.168.0.12   server2 server2.example.com
192.168.0.13   server3 server3.example.com
192.168.0.14   centos-8 centos-8.example.com

安装Java

在所有节点上执行本章中的步骤,以配置elasticsearch集群设置。

为了配置Elasticsearch Cluster,第一步是确保正确安装了Java SE环境。 Elasticsearch需要Java版本6或者更高版本才能运行。我们可以从Oracle官方发行版下载它。

另外,我们也可以使用OpenJDK。

由于我使用的是CentOS环境,因此我将使用yum安装Java。

# yum -y install java-1.8.0-openjdk-devel.x86_64

我在本文中使用Java OpenJDK 1.8.

# rpm -qa | grep openjdk
java-1.8.0-openjdk-devel-1.8.0.232.b09-0.el7_7.x86_64
java-1.8.0-openjdk-headless-1.8.0.232.b09-0.el7_7.x86_64
java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64

验证Java版本

# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

安装Elasticsearch

在所有节点上执行本章中的步骤,以配置elasticsearch集群设置。

有多种安装Elasticsearch的方法,我们只需下载elasticsearch rpm并手动安装即可。

[root@server3 ~]# rpm -ivh https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-x86_64.rpm
Retrieving https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-x86_64.rpm
warning: /var/tmp/rpm-tmp.RhUwqE: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Updating/installing...
   1:elasticsearch-0:7.5.1-1          ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service
Created elasticsearch keystore in /etc/elasticsearch

在安装过程中,默认情况下会创建一个用户和一个具有" elasticsearch"名称的组。

安装后,Elasticsearch不会自动开始。它被阻止自动启动,以避免连接到具有相同集群名称的已运行节点。

[root@server3 ~]# rpm -qa | grep elasticsearch
elasticsearch-7.5.1-1.x86_64

配置Elasticsearch集群

循序渐进的教程来配置elasticsearch custer。通过示例学习有关不同类型的Elasticsearch节点类型的所有信息。 ELK Stack Elasticsearch教程。获取elasticsearch集群的健康状态。 elasticsearch获取集群节点

由于我只有三个节点来配置Elasticsearch集群,因此我将全部三个节点用作主节点,数据节点和摄取节点。尽管我将禁用其他elasticsearch节点类型,因为本文不需要这些类型。打开elasticsearch.yml文件,其中包含大多数Elasticsearch配置选项

配置文件为YAML格式,以下几节是可以配置的一些参数。

cluster.name

  • 集群中所有节点的集群名称都应该相同。

  • 当节点与集群中的所有其他节点共享其cluster.name时,该节点只能加入集群。

  • 确保不要在不同的环境中重复使用相同的集群名称,否则最终可能会导致节点加入了错误的集群。

  • 由于跨集群搜索支持,所以冒号(::)不再是集群名称的有效字符。

cluster.name: my-cluster

节点名称

  • Elasticsearch使用node.name作为Elasticsearch特定实例的人类可读标识符,因此它被包含在许多API的响应中。

  • 它默认为计算机在Elasticsearch启动时具有的主机名,但可以在elasticsearch.yml中显式配置

  • 根据应用程序需求,我们可以动态添加和删除节点(服务器)。

  • Elasticsearch无缝地添加和删除节点。

node.name: server1

网络主机

  • 默认情况下,Elasticsearch绑定到localhost或者127.0.0.1,这对开发非常有用。

  • 我们还可以将Elasticsearch绑定到0.0.0.0。在服务器环境中," 0.0.0.0"表示所有可用的IPv4地址。

  • 例如,如果服务器有两个IP地址" 192.168.0.1"和" 192.168.0.2",则可以通过这两个IP地址访问Elasticsearch实例。当我们绑定到0.0.0.0时,也可以通过本地127.0.0.1来访问它。

  • 如果集群中需要多个节点,则需要将Elasticsearch绑定到一个外部地址,以便集群中的其他节点可以通信。

network.host: 192.168.0.11

Discovery.seed_hosts(discovery.zen.ping.unicast.hosts)

  • 此设置以前称为discovery.zen.ping.unicast.hosts

  • 提供群集中符合主机要求的节点的列表。

  • 每个值的格式为host:port或者host,其中port缺省为设置transport.profiles.default.port。

discovery.seed_hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]

cluster.initial_master_nodes

  • 首次启动Elasticsearch集群设置需要在集群中的一个或者多个主资格节点上显式定义初始的主资格节点集。这称为群集引导。

  • 仅在首次启动集群时才需要:已加入集群的节点将这些信息存储在其数据文件夹中,以在完全集群重新启动中使用,而正在加入运行中的集群的新启动的节点将从集群中获取此信息。集群的当选主。

  • 从技术上讲,只需在群集中的一个符合主机资格的节点上设置" cluster.initial_master_nodes",仅提及设置值中的单个节点即可,但这在群集完全形成之前没有提供容错功能。

cluster.initial_master_nodes: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]

不同的Elasticsearch节点类型

Elasticsearch节点类型不同,还必须为Elasticsearch集群设置选择相应的节点类型

  • "符合主资格的节点":主节点负责集群管理,包括索引的创建/删除和跟踪属于集群的节点,这使其有资格被选为主节点,从而控制着主节点。簇。

  • 数据节点:数据节点包含实际的索引数据。他们处理文档上的所有索引和搜索操作

  • ingest node:将node.ingest设置为true(默认)的节点。摄取节点能够将摄取管道应用于文档,以便在建立索引之前转换和丰富文档。

  • 部落节点:部落节点可以一次读写多个集群

  • 机器学习节点:将xpack.ml.enabled和node.ml设置为true的节点,这是Elasticsearch默认发行版中的默认行为。

  • "协调节点":协调节点是接收请求的节点。它将查询发送到需要执行查询的所有分片,收集结果,然后将其发送回客户端

  • "仅可投票的主节点":仅可投票的主节点是参与主选举但不会充当集群的已选主节点的节点。

  • "仅投票节点"可以在选举中充当决胜局。

说明:

在尝试配置Elasticsearch集群时,使用"符合主机资格"一词来描述仅投票节点可能会造成混淆,因为这样的节点实际上根本没有资格成为主机节点。

示例Elasticsearch配置文件(elasticsearch.yml)

以下是我的Elasticsearch集群设置节点中的示例Elasticsearch配置(/etc/elasticsearch/elasticsearch.yml)

第一个集群节点-server1

[root@server1 ~]# sed  '/^#/d' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-cluster
node.name: server1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.0.11
discovery.seed_hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]
cluster.initial_master_nodes: ["192.168.0.11"]
node.master: true
node.voting_only: false
node.data: false
node.ingest: false
node.ml: false
xpack.ml.enabled: true
cluster.remote.connect: false

第二个群集节点-server2

[root@server2 ~]# sed  '/^#/d' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-cluster
node.name: server2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.0.12
discovery.seed_hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]
node.master: true
node.voting_only: false
node.data: true
node.ingest: true
node.ml: false
xpack.ml.enabled: true
cluster.remote.connect: false

第三个集群节点-server3

[root@server3 ~]# sed  '/^#/d' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-cluster
node.name: server3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.0.13
discovery.seed_hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]
node.master: true
node.voting_only: false
node.data: true
node.ingest: true
node.ml: false
xpack.ml.enabled: true
cluster.remote.connect: false

配置防火墙

提示:

在所有节点上执行本章中的步骤,以配置elasticsearch集群设置。

Elasticsearch将在两个端口上启动,如下所示:

  • 9200:用于创建HTTP连接

  • 9300:用于通过JAVA客户端和集群内节点的互连来创建TCP连接

# firewall-cmd --add-port={9200,9300-9400}/tcp --permanent
success
# firewall-cmd --reload
success

启动Elasticsearch Service

在RHEL/CentOS 7和8中,默认情况下我们具有基于systemd的服务,而不是SysV。因此,我们将使用systemctl重新启动elasticsearch服务

提示:

最初仅在主节点上启动elasticsearch集群服务。仅当Elasticsearch群集设置在主节点上启动并运行后,我们才能在其他Elasticsearch节点类型上启动此服务。其中由于我们将所有三个集群节点都配置为主节点,因此我们将在所有节点上并行启动服务。

启动elasticsearch服务

# systemctl start elasticsearch

同时启用服务以在重新启动后自动启动

# systemctl enable elasticsearch 
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

检查Elasticsearch集群状态

通过示例了解有关Elasticsearch集群节点类型的信息。在RHEL/CentOS 7和8 Linux中配置Elasticsearch集群的步骤。现在使用Elasticsearch 7,covery.zen.ping.unicast.hosts替换为Discovery.seed_hosts。 Elasticsearch教程。 ELK堆栈概述

在所有主节点上启动elasticsearch服务后,请检查相应IP /主机名的elasticsearch集群状态。

[root@server1 ~]# curl -XGET server1:9200
{
  "name" : "server1",
  "cluster_name" : "my-cluster",
  "cluster_uuid" : "J1gcH5S6S52VAq7iJtQDqg",
  "version" : {
    "number" : "7.5.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
    "build_date" : "2019-12-16T22:57:37.835892Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

重要的提示:

我们必须在群集状态的突出显示部分中获得正确的群集uuid。如果我们在此处得到" na",则意味着elasticsearch无法形成簇。 elasticsearch日志文件将在elasticsearch.yml中的path.logs定义的位置下可用。例如,在我的Elasticsearch集群设置中,日志文件将在/var/log/elasticsearch/my-cluster.log中生成,其中my-cluster是我的Elasticsearch集群设置的名称。

如果正确生成了集群uuid,请在其他集群数据节点上继续启动其他elasticsearch服务。

接下来使用以下API请求使用相应的服务器IP或者主机名检查数据节点上的Elasticsearch集群状态

# curl -XGET server1:9200
# curl -XGET server2:9200
# curl -XGET server3:9200

获取Elasticsearch集群运行状况

要检索集群健康状态信息,我们需要通过_cluster端点运行以下查询。

[root@server1 ~]# curl -XGET 192.168.0.11:9200/_cluster/health?pretty
{
  "cluster_name" : "my-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 19,
  "active_shards" : 38,
  "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
}

前面的表达式显示了Elasticsearch Cluster安装程序的集群运行状况输出。其中我们可以看到集群的各种详细信息,例如集群的名称,状态,是否超时,节点数,数据节点数,活动的主分片数量,活动的数量分片,初始化分片的数量,待处理任务的数量等等。

检查Elasticsearch集群状态

集群状态检索有关Elasticsearch集群设置的综合状态的信息。

[root@server1 ~]# curl -XGET 192.168.0.10:9200/_cluster/state?pretty |less
<Output trimmed>
  "nodes" : {
    "w3gQLlyVT0-xN77BUTCxPQ" : {
      "name" : "server3",
      "ephemeral_id" : "lOtXNcGgRyW-lOTH0N89MA",
      "transport_address" : "192.168.0.13:9300",
      "attributes" : {
        "xpack.installed" : "true"
      }
    },
    "F4FKqWIbT8WnPrv84y9_gA" : {
      "name" : "server1",
      "ephemeral_id" : "XqbaxLswQ_ixAJKqBDIDpQ",
      "transport_address" : "192.168.0.11:9300",
      "attributes" : {
        "xpack.installed" : "true"
      }
    },
    "GnAN94xeTnC47W8PrCWbCA" : {
      "name" : "server2",
      "ephemeral_id" : "B_0RRXv1RH-ZjbtKLIxryA",
      "transport_address" : "192.168.0.12:9300",
      "attributes" : {
        "xpack.installed" : "true"
      }
    }
<Output trimmed>

查看elasticsearch集群统计信息

配置Elasticsearch集群后,我们可以使用_cluster stats API从整个集群中检索信息。他们检索基本索引指标,例如内存使用量,分片号以及有关集群中节点的信息(包括节点数,已安装的插件和操作系统)。

我们可以使用以下命令查看集群统计信息:

# curl -XGET 192.168.0.12:9200/_cluster/stats?pretty

获取elasticsearch集群节点详细信息

集群节点API_cat/nodes返回有关集群中Elasticsearch节点类型的信息。

[root@server1 ~]# curl -XGET server1:9200/_cat/nodes
192.168.0.13 13 97 1 0.23 0.13 0.11 dim - server3
192.168.0.11 35 97 2 0.19 0.11 0.12 dim - server1
192.168.0.12 14 98 2 0.07 0.07 0.06 dim * server2

其中

  • m表示符合主机资格的节点

  • d表示数据节点

  • " i"表示摄取节点

使用*,我们知道server1是集群中的当前主节点。

获取Elasticsearch集群主节点

配置好Elasticsearch集群后,可以使用masterAPI来获取Elasticsearch集群的主节点,包括ID,绑定的IP地址和elasticsearch集群设置的名称。

[root@server1 ~]# curl -XGET server1:9200/_cat/master
GnAN94xeTnC47W8PrCWbCA 192.168.0.12 192.168.0.12 server2
[root@server1 ~]# curl -XGET server1:9200/_cat/master?v
id                     host         ip           node
GnAN94xeTnC47W8PrCWbCA 192.168.0.12 192.168.0.12 server2

生产Elasticsearch集群设置的其他配置

在生产环境中配置Elasticsearch集群设置时需要注意的其他几点

避免脑裂

  • 集群中两个主节点的存在会导致所谓的"裂脑"。在弹性搜索中,有一个主节点,然后有一个符合条件的主节点,如果该主节点发生故障,该节点可以成为一个主节点。

  • 在主节点发生故障的情况下,重要的是要使大多数符合条件的主节点都同意选择哪个主节点。当群集的两个不同部分选择不同的主节点时,就会发生裂脑。通过调整最小主节点设置可以防止裂脑,这可能是有问题的节点。

  • 设置正确数字的公式为

(total number of master eligible nodes in the cluster/2)+1
  • 当我们配置elasticsearch集群以在elasticsearch集群设置中设置主节点或者符合条件的主节点的最小数量时,应考虑这一点。

内存配置

Elasticsearch Cluster Setup可用的内存越多,可用于缓存的内存就越多,从而提高了整体性能。

另外,要对数据运行聚合,还需要考虑内存问题。在为生产配置Elasticsearch集群时,确保Elasticsearch有足够的内存很重要。

1.禁用交换

交换对性能,节点稳定性非常不利,应不惜一切代价避免交换。它可能导致垃圾回收持续几分钟而不是毫秒,并且可能导致节点响应缓慢甚至断开与群集的连接。

通常,Elasticsearch是在盒子上运行的唯一服务,其内存使用情况由JVM选项控制。无需启用交换功能。禁用交换

# swapoff -a

不需要重启Elasticsearch。

要永久禁用交换,请修改/etc/fstab并注释/删除包含文件系统类型作为交换的行。

2.配置交换

Linux系统上可用的另一个选项是确保将sysctl值vm.swappiness设置为1. 这样可以减少内核的交换趋势,并且在正常情况下不应导致交换,同时仍允许整个系统在紧急情况下进行交换。

3.设置JVM内存

默认情况下,当我们启动Elasticsearch时,JVM的堆大小为1GB。我们可以使用节点统计信息API监视堆使用情况和垃圾收集。配置Elasticsearch集群后,还应该在/etc/elasticsearch/jvm.options文件中配置JVM设置,例如堆大小,垃圾回收等。

让我们来看一下使用节点统计信息API的Elasticsearch集群设置内存使用情况,如下所示:

[root@server1 ~]# curl -XGET 'http://server1:9200/_nodes/server1/stats/jvm?pretty&human'
<Output trimmed>
      "jvm" : {
        "timestamp" : 1577313710573,
        "uptime" : "5.8h",
        "uptime_in_millis" : 21209043,
        "mem" : {
          "heap_used" : "299.1mb",
          "heap_used_in_bytes" : 313702368,
          "heap_used_percent" : 30,
<Output trimmed>

我们可以通过设置-Xms和-Xmx设置来增加堆大小。在" jvm.options"文件的" JVM Heap Size"部分下,设置以下内容:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g

说明:

在生产环境中运行时,建议以不会与同一台计算机上运行的任何其他应用程序共享资源的方式配置Elasticsearch集群。根据可用内存,将堆大小设置为"不超过物理内存的50%",以便Elasticsearch可以利用文件系统缓存。

进行了这些更改之后,请重新启动Elasticsearch实例并使用node stats API来验证堆大小。

4.启用bootstrap.memory_lock

另一种选择是在Linux/Unix系统上使用mlockall尝试将进程地址空间锁定在RAM中,以防止在配置elasticsearch集群时交换出任何Elasticsearch内存。

启用bootstrap.memory_lock

  • systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认情况下应用的限制。

  • 要覆盖它们,请添加一个名为/etc/systemd/system/elasticsearch.service.d/override.conf的文件(或者,我们可以运行systemctl edit elasticsearch,这会在默认编辑器中自动打开该文件)

  • 在此文件中添加以下内容

[Service]
LimitMEMLOCK=infinity
  • 完成后,运行以下命令以重新加载单元:
# systemctl daemon-reload
  • 接下来,将此行添加到/etc/elasticsearch/elasticsearch.yml文件中:
bootstrap.memory_lock: true

启动Elasticsearch之后,我们可以通过检查此请求的输出中的mlockall的值来查看是否成功应用了此设置:

[root@server1 ~]# curl -XGET  'http://server1:9200/_nodes?pretty&filter_path=**.mlockall'
{
  "nodes" : {
    "w3gQLlyVT0-xN77BUTCxPQ" : {
      "process" : {
        "mlockall" : true
      }
    },
    "F4FKqWIbT8WnPrv84y9_gA" : {
      "process" : {
        "mlockall" : true
      }
    },
    "GnAN94xeTnC47W8PrCWbCA" : {
      "process" : {
        "mlockall" : true
      }
    }
  }
}

配置文件描述符

  • 文件描述符不过是操作系统分配的文件的处理程序。

  • 打开文件后,会将文件描述符(它是整数)分配给该文件。

  • 另外,由于节点需要彼此通信,因此Elasticsearch使用大量文件描述符进行网络通信。

  • Elasticsearch建议65,536或者更高。

  • 我们可以在启动Elasticsearch之前通过以超级用户身份运行以下命令来设置描述符:

# ulimit -n 655356
  • 另外,我们可以通过编辑/etc/security/limits.conf并为运行Elasticsearch的用户设置no文件来永久设置该限制。
elasticsearch  -  nofile  65535

对错误方案进行故障排除

错误:尚未发现主节点,该节点先前尚未加入自举(v7 +)集群

[server1] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and [cluster.initial_master_nodes] is empty on this node: have discovered [{server1}

说明:在cluster.initial_master_nodes列表中使用的节点名称必须与节点的node.name属性完全匹配。如果我们混合使用标准主机名和裸机名,或者node.name和cluster.initial_master_nodes之间还有其他不匹配,那么集群将无法成功形成,并且我们将看到类似以下的日志消息。

[master-a.example.com] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [master-a, master-b] to bootstrap a cluster: have discovered [{master-b.example.com}{...

此消息显示节点名称" master-a.example.com"和" master-b.example.com",以及" cluster.initial_master_nodes"条目" master-a"和" master-b",它是从此消息中清除它们不完全匹配。

在启动我的Elasticsearch集群时,我最终遇到了同样的错误。正如我们所看到的,"集群uuid在这些节点上是不同的"。

[root@server3 ~]# curl -XGET  localhost:9200/_cat/nodes
192.168.0.12 7 22 34 0.59 0.18 0.06 dilm * server2
[root@server3 ~]# curl -XGET  localhost:9200/_cat/nodes
192.168.0.13 26 24 0 0.00 0.01 0.05 dilm * server3
192.168.0.11 10 22 0 0.00 0.01 0.05 dilm - server1

解决方案:关闭所有集群节点上的elasticsearch服务。

# systemctl stop elasticsearch

通过删除所有群集节点上其数据文件夹的内容来完全擦除每个节点。数据文件夹是使用elasticsearch.yml中的path.data定义的。我们使用默认的path.data值/var/lib/ealsticsearch

警告:

这只能在启动集群时在测试环境上完成,而不能在生产环境上完成。这将完全清除节点中所有与群集相关的详细信息。

# rm -rf /var/log/elasticsearch/*

接下来,这次用elasticsearch.yml文件正确配置elasticsearch集群

重新启动所有节点,并确认它们已形成单个集群。

# systemctl start elasticsearch

使用API请求进行验证,以确保所有节点都属于同一集群

# curl -XGET server1:9200/_cat/nodes
192.168.0.12 29 96 1 0.05 0.04 0.05 dim   * server2
192.168.0.13 31 97 0 0.08 0.09 0.13 dim   - server3
192.168.0.11 15 79 0 0.00 0.01 0.05 dim   - server1