Elasticsearch 在Linux下的安装部署和配置

环境

CentOS-7-x86_64-DVD-2009.iso

https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

elasticsearch-7.10.0-linux-x86_64.tar.gz

https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-10-0

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz

安装

# mkdir -p /usr/local/elasticsearch
# chown esuser:esuser /usr/local/elasticsearch
# useradd esuser
# passwd esuser
# su - esuser
$ mv elasticsearch-7.10.0-linux-x86_64.tar.gz /usr/local/elasticsearch/
$ cd /usr/local/elasticsearch/
$ tar -xvzf elasticsearch-7.10.0-linux-x86_64.tar.gz 
$ cd elasticsearch-7.10.0
$ ls
bin  config  jdk  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.asciidoc

注意:默认情况下,不允许使用root用户运行ES,会报错:

Caused by: java.lang.RuntimeException: can not run elasticsearch as root

前台运行

$ ./bin/elasticsearch

验证是否启动成功

$ curl localhost:9200/
{
  "name" : "localhost.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "8CLFbx4LSwW_maztFPGiTg",
  "version" : {
    "number" : "7.10.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
    "build_date" : "2020-11-09T21:30:33.964949Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

说明:访问地址要和config/elasticsearch.ymlnetwork.host配置保持一致

后台运行

要将ES作为守护进程运行,请在命令行上指定-d,并使用-p选项将进程ID记录在文件中:

如果对ES密钥库进行了密码保护,系统将提示你输入密钥库的密码。有关更多详细信息,请参阅安全设置。日志消息可以在$ES_HOME/logs/目录中找到。

$ ./bin/elasticsearch -d -p pid

关闭以守护进程方式启动的ES,,杀死pid文件中记录的进程ID:

$ pkill -F pid

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/install-elasticsearch.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#install-linux

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#targz-running

配置

重要的Elasticsearch配置

Path配置

ES将索引的数据写入索引,并将数据流写入 data目录。ES将自己的应用程序日志写入logs目录,其中包含有关集群健康和操作的信息。

对于macOS.tar.gz、Linux.tar.gz和Windows.zip安装,默认情况下datalogs$ES_HOME的子目录。但是,$ES_HOME中的文件在升级过程中有被删除的风险。

在生产环境中,强烈建议将$ES_HOME/config/elasticsearch.yml中的path.datapath.logs设置为$ES_HOME之外的位置

类Unix系统中配置示例:

path:
  data: /var/data/elasticsearch
  logs: /var/log/elasticsearch

如果有必要,可以在path.data中指定多个路径。ES在所有提供的路径上存储节点的数据,但将每个分片的数据保持在同一路径上。

注意:

ES不会在节点的数据路径上均衡分片。单个路径中的高磁盘使用率会触发整个节点磁盘使用率高水位。如果触发,ES将不会向节点添加分片,即使节点的其他路径有可用的磁盘空间。如果需要额外的磁盘空间,建议添加一个新节点,而不是额外的数据路径。

Linux和macOS安装path.data支持多个类Unix风格路径:

path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3

集群名称配置

一个节点只有在与集群中的所有其他节点共享其cluster.name时才能加入集群。默认名称是elasticsearch,但应该将其更改为描述集群用途的适当名称。

cluster.name: logging-prod

节点名称配置

ES使用node.name作为ES特定实例的易读标识符。此名称包含在许多API的响应中。ES启动时,节点名默认为机器的主机名,但可以在elasticsearch.yml中显式配置:

node.name: prod-data-2

网络主机配置

默认情况下,ES只绑定到环回地址,如127.0.0.1[::1]。此绑定足以在服务器上运行单个开发环境节点

注意:

可以从单个节点上的相同$ES_HOME位置启动多个节点。此设置可用于测试ES形成集群的能力,但不建议用于生产环境。

要与其他服务器上的节点形成集群,节点需要绑定到非环回地址。虽然有许多网络设置,但通常只需配置network.host即可:

network.host: 192.168.1.10

network.host设置还可以理解一些特殊值,如 _local_, _site_, _global_ 和修饰符,如 :ip4:ip6。请参阅network.host特殊值

Discovery和集群信息配置

在投入生产之前,配置两个重要的集群发现和形成设置,以便集群中的节点可以相互发现并选择master节点。

discovery.seed_hosts

开箱即用,无需任何网络配置,ES将绑定到可用的环回地址,并扫描本地端口93009305,以与同一服务器上运行的其他节点连接。这种行为提供了一种自动集群体验,而无需进行任何配置。
当希望与其他主机上的节点形成集群时,使用静态discovery.seed_hosts设置。此设置提供集群中其他节点的列表,这些节点符合master节点资格,可能处于活动状态并可联系,以启动发现过程. 此设置接受集群中所有符合master节点条件的节点的YAML序列或地址数组。每个地址可以是IP地址,也可以是通过DNS解析为一个或多个IP地址的主机名。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
   - [0:0:0:0:0:ffff:c0a8:10c]:9301 
  • 端口号可选,默认为 9300, 可修改
  • 如果主机名解析为多个IP地址,则节点将尝试在所有已解析的地址上发现其他节点。
  • IPv6地址必须括在方括号内

如果符合master节点条件的节点没有固定的名称或地址,使用可选主机提供商 动态查找其地址。

cluster.initial_master_nodes

第一次启动ES集群时,cluster bootstrapping步骤确定了在第一次选举中投票的符合master节点资格的节点集。在开发模式下,在没有配置发现设置的情况下,此步骤由节点本身自动执行。

因为自动引导本质上是不安全的,在生产模式下启动新集群时,必须明确列出符合master节点资格的节点,这些节点的投票应在第一次选举中被计算。可以使用cluster.initial_master_nodes设置来设置此列表。

在集群首次成功建立后,从每个节点的配置中删除cluster.initial_master_nodes设置。重新启动群集或向现有群集添加新节点时,请勿使用此设置。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11
   - seeds.mydomain.com
   - [0:0:0:0:0:ffff:c0a8:10c]:9301
cluster.initial_master_nodes: 
   - master-node-a
   - master-node-b
   - master-node-c

通过node.name标识初始master节点(https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html#node-name),默认为其主机名。确保cluster.initial_master_nodes中的值与node.name完全匹配。如果使用完全限定域名(FQDN)作为节点名称,例如master-node-a.example.com,则必须使用此列表中的FQDN。相反,如果node.name是一个没有任何尾随限定符的裸主机名,则还必须省略cluster.initial_master_nodes中的尾随限定符。

查阅bootstrapping a cluster

堆大小配置

默认情况下,ES告诉JVM使用一个最小和最大值都为1GB的堆。当部署到生产环境时,配置堆大小以确保ES有足够的可用堆空间非常重要。

ES将通过Xms(最小堆大小)和Xmx(最大堆大小)设置分配jvm.options中指定的整个堆。XmsXmx设置必须彼此相等。

这些设置的值取决于服务器上可用的RAM量:

  • XmxXms设置为不超过物理RAM的50%。ES需要内存用于JVM堆以外的目的,为此留出空间非常重要。例如,ES使用堆外缓冲区进行高效的网络通信,依赖于操作系统的文件系统缓存来高效访问文件,JVM本身也需要一些内存。ES进程使用的内存超过使用Xmx设置配置的限制是正常的。

  • XmxXms设置为不超过JVM用于压缩对象指针的阈值。确切的阈值各不相同,但接近32GB。可以通过在日志中查找类似以下行来验证是否低于阈值:

    heap size [1.9gb], compressed ordinary object pointers [true]
    
  • XmxXms设置为不超过从零开始的压缩oops的阈值。确切的阈值各不相同,但26 GB在大多数系统上是安全的,在某些系统上可能高达30 GB。可以通过使用JVM选项-XX:+UnlockDiagnosticVMOptions-XX:+PrintCompressedOopsMode 启动ES,并查找类似以下行来验证是否低于此阈值:

    heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
    

    此行显示启用了从零开始的压缩oops。如果未启用从零开始的压缩oops,你将看到类似以下行:

    heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
    

ES可用的堆越多,它可以用于内部缓存的内存就越多,但留给操作系统用于文件系统缓存的内存越少。此外,较大的堆可能会导致垃圾收集暂停时间更长。

下面是一个如何通过config/jvm.options.d/文件设置堆大小的示例:

-Xms2g 
-Xmx2g 

将最小堆内存和最大堆内存都设置为 2g。

使用jvm.options.d是配置生产部署堆大小的首选方法。

备注:默认情况下,jvm.options.d为空目录,可以在该目录下手动新建配置,如jvm.options,文件格式可参考config/jvm.options

还可以通过ES_JAVA_OPTS环境变量设置堆大小。这通常不建议用于生产部署,但对于测试很有用,因为它覆盖了设置JVM选项的所有其他方式。

ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch 
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch 

1 设置最小堆内存和最大堆内存都为 2g。

2 设置最小堆内存和最大堆内存都为 4000 MB。

JVM 堆 dump路径设置

默认情况下,ES 配置JVM 将内存不足的堆dump到默认数据目录。RPM以及Debian包,数据目录为/var/lib/eelasticsearch。在Linux 和 MacOSWindows发行版中,data目录位于ES安装的根目录下。如果此路径不适合接收堆dump,则修改 jvm.options-XX:HeapDumpPath=…条目:

  • 如果指定了一个目录,JVM将根据运行实例的PID为堆dump生成一个文件名。
  • 如果指定固定文件名而不是目录,则当JVM需要对内存不足的异常执行堆dump时,该文件必须不存在。否则,堆dump将失败。

GC日志配置

默认情况下,ES启用垃圾收集(GC)日志。这些是在jvm.options配置的并且输出到与ES日志相同的默认位置。默认配置每64 MB轮换一次日志,最多可消耗2 GB的磁盘空间。

可以使用JEP 158: 统一JVM日志中描述的命令行选项重新配置JVM日志记录。除非直接更改默认的jvm.options文件,否则除了你自己的设置外,还会应用ES默认配置。要禁用默认配置,首先通过提供-Xlog:disable选项禁用日志,然后提供自己的命令行选项。这将禁用所有JVM日志,因此务必查看可用选项并启用所需的一切。

要查看原始JEP中未包含的更多选项,请参阅使用JVM统一日志框架启用日志

Examples

通过创建带有一些示例选项的$ES_HOME/config/jvm.options.d/GC.options,将默认GC日志输出位置更改为/opt/my-app/gc.log

# 关闭之前所有的日志记录配置
-Xlog:disable

# JEP 158的默认设置,除了使用“utctime”而不是“uptime”来匹配下一行 
-Xlog:all=warning:stderr:utctime,level,tags

# 使用各种选项将GC日志记录到自定义位置
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,pid,tags:filecount=32,filesize=64m

配置ESDocker容器将GC调试日志发送到标准错误(stderr)。这使容器编排器能够处理输出。如需使用ES_JAVA_OPTS环境变量,请指定:

MY_OPTS="-Xlog:disable -Xlog:all=warning:stderr:utctime,level,tags -Xlog:gc=debug:stderr:utctime"
docker run -e ES_JAVA_OPTS="$MY_OPTS" # etc

临时目录设置

默认情况下,ES使用启动脚本在系统临时目录下创建的私有临时目录。

在某些Linux发行版上,系统实用程序会将最近没有访问过的文件和目录将从/tmp中删除。这将导致ES运行期间私有临时目录被删除,如果需要使用临时目录的功能长时间未使用的话。后续如果某些功能使用需要此临时目录,将会产生问题。

如果使用.deb.rpm包安装ES,并在systemd下运行它,ES使用的私有临时目录将被排除在定期清理之外。

如果打算在Linux或MacOS上长时间运行.tar.gz发行版,考虑为ES创建一个专用的临时目录,将该目录设置在不会从中清除旧文件和目录的路径下。此目录应设置权限,以便只有运行ES的用户可以访问它。然后,在启动ES之前,将$ES_TMPDIR环境变量设置为指向此目录

JVM致命错误日志设置

默认情况下,ES配置JVM将致命错误日志写入默认日志目录。针对RPM以及Debian包,该目录为/var/log/elasticsearch。针对Linux,MacOS和Windows发行版中,logs目录位于ES安装目录的根目录下。

这些日志是JVM在遇到致命错误(如分段错误)时生成的日志。如果此路径不适合接收日志,则修改jvm.options-XX:ErrorFile=…条目

集群备份

快照可以防止因为灾害导致的永久数据丢失。快照生命周期管理是对集群进行定期备份的最简单方法。有关更多信息,请参阅集群备份.
注意:

不能通过简单地复制ES集群所有节点的数据目录来备份ES。ES在运行时可能会对其数据目录的内容进行更改;复制其数据目录不能保证其内容的一致性。备份群集的唯一可靠方法是使用快照和还原功能。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html

重要的系统配置

配置系统设置

在哪配置系统设置取决于用于安装ES的软件包以及使用的操作系统。

当使用.zip.tar.gz包时,可以配置系统设置:

  • 使用ulimit临时配置,或
  • /etc/security/limits.conf中永久配置

使用RPM或Debian软件包时,大多数系统设置都在 系统配置文件 中设置. 然后,使用systemd的系统要求在 systemd配置文件 中指定系统限制

ulimit

在Linux系统上,ulimit可用于临时更改资源限制。通常需要在运行ES的用户启动ES前,切换为root,以配置资源限制。例如,要将打开的文件句柄数(ulimit-n)设置为65536,可以执行以下操作:

sudo su  
ulimit -n 65535 
su esuser 

新的资源配置仅应用于当前会话。可通过 ulimit -a 查询当前所有限制。

/etc/security/limits.conf

在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久限制。例如,要将esuser用户的最大打开文件数设置为65535,在limits.conf文件中添加以下行:

esuser  -  nofile  65535

此更改仅在elasticsearch用户下次打开新会话时生效。

Ubuntu下的limits.conf

Ubuntu会忽略由init.d启动的进程的limits.conf文件。要启用limits.conf文件,请编辑/etc/pam.d/su并取消注释以下行:

# session    required   pam_limits.so
系统配置文件

使用RPM或Debian软件包时,可以在系统配置文件中指定系统设置和环境变量,该文件位于:

包类型 系统配置文件路径
RPM /etc/sysconfig/elasticsearch
Debian /etc/default/elasticsearch

但是,对于使用systemd的系统,需要通过systemd指定系统限制

Systemd配置

在使用systemd的系统上使用RPM或Debian软件包时,必须通过systemd指定系统限制。

systemd服务文件(/usr/lib/systemd/system/eelasticsearch.service)包含默认应用的限制。

要覆盖它们,添加一个名为/etc/systemd/system/exelasticsearch.service.d/overrid.conf的文件(或者,运行sudo systemctl edit elasticsearch,会在默认编辑器中自动打开该文件)。在此文件中设置任何需要的变更,例如:

[Service]
LimitMEMLOCK=infinity

一旦完成更改,运行以下命令以重载服务单元:

sudo systemctl daemon-reload
参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setting-system-settings.html

禁用交换(swapping)

大多数操作系统都试图将尽可能多的内存用于文件系统缓存,并急切地交换掉未使用的应用程序内存。这可能会导致JVM堆的一部分,甚至其可执行页面被换出到磁盘。

swapping 对性能和节点稳定性非常不利,应该不惜一切代价避免。它可能会导致垃圾收集持续分钟而不是毫秒,并可能导致节点响应缓慢,甚至与集群断开连接。在弹性分布式系统中,更容易导致操作系统杀死节点。

有三种方法可以禁用交换。首选项是完全禁用交换。如果这不是一种选择,那么是选择最小化swappiness还是选择内存锁定取决于你的环境

禁用所有swap文件

通常,ES是在机器上运行的唯一服务,其内存使用由JVM选项控制。不需要启用交换。

在Linux系统上,可以通过运行以下命令暂时禁用交换::

sudo swapoff -a

这不需要重新启动Elasticsearch。

要永久禁用,则需要编辑/etc/fstab文件,并注释掉任何包含单词swap的行。

在Windows上,可以通过系统属性→高级→性能→高级→虚拟内存完全禁用分页文件来实现等效功能。

配置swappiness

Linux系统上可用的另一个选择是确保sysctlvm.swappiness设置为1。这减少了内核交换的倾向,在正常情况下不应导致交换,同时仍然允许整个系统在紧急情况下交换。

开启bootstrap.memory_lock

另一种选择是在Linux/Unix系统上使用mlockall,在Windows上使用VirtualLock,以尝试将进程地址空间锁定到RAM中,防止任何ES堆内存被换出。

一些平台在使用内存锁时仍然会交换堆内存。为了防止堆外内存交换,取而代之,禁用所有交换文件。

要启用内存锁,需在elasticsearch.yml中将bootstrap.memory_lock设置为true

bootstrap.memory_lock: true

如果mlockall试图分配的内存超过可用内存,则可能会导致JVM或shell会话退出!

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

GET _nodes?filter_path=**.mlockall

如果看到mlockallfalse,则意味着mlockall请求失败。还将在日志中看到一行包含更多信息,带有单词Unable to lock JVM Memory的日志。

在Linux/Unix系统上,最可能的原因是运行Elasticsearch的用户没有锁定内存的权限。可以按如下方式授权:

  • 使用.zip.tar.gz安装包

    启动ES前以root用户执行ulimit -l unlimited。可选的,设置/etc/security/limits.conf memlockunlimited

    # allow user 'elasticsearch' mlockall
    elasticsearch soft memlock unlimited
    elasticsearch hard memlock unlimited
    
  • RPM 和 Debian

    系统配置文件中设置 MAX_LOCKED_MEMORYunlimited

  • 使用systemd的系统

    systemd配置中设置LimitMEMLOCKinfinity

mlockall失败的另一个可能原因是JNA临时目录(通常是/tmp的子目录)是用noexec选项挂载的。这可以通过使用ES_JAVA_OPTS环境变量为JNA指定一个新的临时目录来解决:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
./bin/elasticsearch

或者在 jvm.options配置文件中设置该JVM标识。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setup-configuration-memory.html

文件描述符

这仅适用于Linux和MacOS,如果在Windows上运行ES,可以安全地忽略它。在Windows上,JVM使用仅受可用资源的限制的API

ES使用了大量的文件描述符或文件句柄。文件描述符用尽可能是灾难性的,很可能会导致数据丢失。确保将运行ES的用户的打开文件描述符数量限制增加到65536或更高。

对于.zip.tar.gz 包,在启动ES之前以root用户设置ulimit -n 65535,或者在/etc/security/limits.conf中将nofile设置为65535

在MacOS上,还必须将JVM选项-XX:-MaxFDLimit传递给ES,以便使用更高的文件描述符限制。

RPM和Debian软件包已经将文件描述符的最大数量默认为65535,不需要进一步配置。

可以使用Nodes stats检查为每个节点配置的max_file_descriptors:

GET _nodes/stats/process?filter_path=**.max_file_descriptors
参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/file-descriptors.html

虚拟内存

默认情况下,ES使用mmapfs目录用于存储其索引。默认操作系统对mmap计数的限制可能太低,这可能会导致内存不足异常。

在Linux上,可以通过以 root身份运行以下命令来增加限制。

sysctl -w vm.max_map_count=262144

要永久设置该值,需更新/etc/sysctl.conf中的vm.max_map_count设置。要在重新启动后进行验证,请运行sysctl vm.map_map_count

RPM和Debian软件包将自动配置此设置。无需进一步配置。CentOS7.9中验证,该配置项默认为65535,无法正常启动

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/vm-max-map-count.html

线程数量

ES为不同类型的操作使用了许多线程池。重要的是,它能够在需要时创建新线程。确保Elasticsearch用户至少可创建4096个线程。

这可以通过在启动Elasticsearch之前以root用户运行ulimit -u 4096来完成 ,或者在/etc/security/limits.conf中将nproc设置为4096

发行包在systemd下作为服务运行时,将自动配置ES进程的线程数。不需要额外的配置。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/max-number-of-threads.html

DNS缓存设置

ES运行时有一个安全管理器。有了安全管理器,JVM默认无限期缓存正向主机名解析,默认缓存反向主机名解析10秒。ES使用默认值覆盖此行为,以缓存正向解析60秒,反向解析10秒。这应适用于大多数环境,包括DNS解析随时间变化的环境。如果没有覆盖此配置,可以编辑JVM选项中的es.networkaddress.cache.ttles.networkaddress.cache.negative.ttl。注意,ES会忽略 Java安全策略 中的 networkaddress.cache.ttl=networkaddress.cache.negative.ttl= 。除非移除es.networkaddress.cache.ttles.networkaddress.cache.notanegative.ttl设置。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/networkaddress-cache-ttl.html

JNA临时目录未使用noexec挂着

这仅适用于Linux。

ES使用Java Native Access(JNA)库来执行一些依赖于平台的本地代码。在Linux上,支持此库的本地代码在运行时从JNA存档中提取。默认情况下,此代码被提取到ES临时目录,该目录默认为/tmp的子目录。可选的,可以使用JVM标志-Djna.tmpdir=<path>控制此位置。由于本地库作为可执行文件映射到JVM虚拟地址空间,因此提取此代码的位置的底层挂载点不能使用noexec挂载,因为这会阻止JVM进程将此代码映射为可执行文件。在一些强化的Linux安装中,这是/tmp的默认挂载选项。底层挂载是用noexec挂载的一个迹象是,在启动时,JNA将无法加载,提示java.lang.UnsatisfiedLinkerError异常,并显示一条类似failed to map segment from shared object的提示信息。注意,消息可能因JVM版本差异而不同。此外,依赖于通过JNA执行本地代码的ES组件将失败,并显示because JNA is not available的提示。如果看到此类错误信息,则必须重新挂载用于JNA的临时目录,并且不使用noexec挂载。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/executable-jna-tmpdir.html

TCP重传超时

集群中的每对节点都通过许多TCP连接进行通信,这些TCP连接 保持打开状态 直到其中一个节点关闭或节点之间的通信因底层基础框架故障而中断。

TCP通过向通信应用程序隐藏临时网络中断,在偶尔不可靠的网络上提供可靠的通信。在通知发送者任何问题之前,操作系统将多次重新传输任何丢失的消息。大多数Linux发行版默认重新传输任何丢失的数据包15次。重传呈指数级推迟,因此这15次重传需要900多秒才能完成。这意味着使用此方法检测网络分区或故障节点需要消耗Linux几分钟的时间。Windows默认只重传5次,超时时间约为6秒。

Linux默认允许在可能经历很长一段时间数据包丢失的网络上进行通信,但对于单个数据中心内的生产网络来说,这个默认值是过高的,正如大多数Elasticsearch集群一样。高可用集群必须能够快速检测节点故障,以便通过重新分配丢失的分片、重新路由搜索以及可能选择新的主节点来迅速做出反应。因此,Linux用户应该减少TCP重传的最大次数。

可以通过以root身份运行以下命令,将TCP重传的最大次数减少到 5 。五次重传对应的超时时间约为六秒。

sysctl-w net.ipv4.tcp_reres2=5

要永久设置此值,更新/etc/sysctl.conf中的net.ipv4.tcp_reres2设置。要在重新启动后运行sysctl net.ipv4.tcp_reres2查看是否生效。

此设置适用于所有TCP连接,也会影响与群体外系统的通信可靠性。如果的集群通过不可靠的网络与外部系统通信,则可能需要为net.ipv4.tcp_reres2选择更高的值。因此,Elasticsearch不会自动调整此设置。

相关配置

ES还实现了自己的内部健康检查,超时时间比Linux上的默认重传超时时间短得多。由于这些是应用程序级健康检查,因此它们的超时必须考虑到应用程序级的影响,如垃圾收集暂停。不应该减少与这些应用程序级健康检查相关的任何超时。

还必须确保网络基础设施不会干扰节点之间的长期连接,[即使这些连接看起来是空闲的](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-transport.html#long-实时连接)。当设备达到一定年龄时断开连接是Elasticsearch集群的常见问题来源,不得使用。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/system-config-tcpretries.html

posted @ 2024-11-17 22:04  授客  阅读(17)  评论(0编辑  收藏  举报