配置 Elasticsearch

edit

Elasticsearch 自带良好的默认设置,几乎不需要进行任何配置。 大多数设置都可以在使用 Cluster update settings API 的运行集群上进行更改。

配置文件应包含特定于节点的设置(例如node.name和路径),或节点为了能够加入集群所需的设置,例如cluster.namenetwork.host

配置文件位置

edit

Elasticsearch 有三个配置文件:

  • elasticsearch.yml 用于配置 Elasticsearch
  • jvm.options 用于配置 Elasticsearch JVM 设置
  • log4j2.properties 用于配置 Elasticsearch 日志记录

这些文件位于配置目录中,其默认位置取决于安装是否来自存档分发(tar.gzzip)或包分发(Debian 或 RPM 包)。

对于归档分发,配置目录位置默认设置为 $ES_HOME/config。可以通过以下方式更改配置目录的位置: ES_PATH_CONF 环境变量:

ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

或者,您可以通过命令行或通过您的shell配置文件导出ES_PATH_CONF环境变量。

对于软件包分发,配置目录位置默认设置为 /etc/elasticsearch。配置目录的位置也可以通过ES_PATH_CONF环境变量进行更改,但请注意,仅在shell中设置此变量是不够的。相反,此变量是从/etc/default/elasticsearch(对于Debian软件包)和/etc/sysconfig/elasticsearch(对于RPM软件包)中获取的。您需要相应地编辑这些文件中的ES_PATH_CONF=/etc/elasticsearch条目,以更改配置目录的位置。

配置文件格式

edit

配置格式为 YAML。以下是一个更改数据和日志目录路径的示例:

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

设置也可以如下所示进行扁平化处理:

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

在YAML中,您可以将非标量值格式化为序列:

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11
   - seeds.mydomain.com

虽然不太常见,但您也可以将非标量值格式化为数组:

discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11", "seeds.mydomain.com"]

环境变量替换

edit

在配置文件中使用 ${...} 表示法引用的环境变量将被替换为环境变量的值。例如:

node.name:    ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}

环境变量的值必须是简单的字符串。使用逗号分隔的字符串来提供Elasticsearch将解析为列表的值。例如,Elasticsearch会将以下字符串拆分为${HOSTNAME}环境变量的值列表:

export HOSTNAME="host1,host2"

集群和节点设置类型

edit

集群和节点设置可以根据它们的配置方式进行分类:

Dynamic

您可以使用集群更新设置 API在运行中的集群上配置和更新动态设置。您还可以使用elasticsearch.yml在未启动或已关闭的节点上本地配置动态设置。

使用集群更新设置API进行的更新可以是持久的,这些更新在集群重启后仍然有效,或者是临时的,这些更新在集群重启后会被重置。您还可以通过使用API将它们赋值为null来重置临时或持久设置。

如果你使用多种方法配置相同的设置,Elasticsearch 会按照以下优先级顺序应用设置:

  1. 临时设置
  2. 持久设置
  3. elasticsearch.yml 设置
  4. 默认设置值

例如,您可以应用一个临时设置来覆盖一个持久设置或elasticsearch.yml设置。然而,对elasticsearch.yml设置的更改不会覆盖已定义的临时或持久设置。

如果您使用 Elasticsearch Service,请使用用户设置功能来配置所有集群设置。此方法允许 Elasticsearch Service 自动拒绝可能破坏集群的不安全设置。

如果您在自己的硬件上运行 Elasticsearch,请使用 集群更新设置 API 来配置动态集群设置。仅将 elasticsearch.yml 用于静态集群设置和节点设置。该 API 不需要重启,并确保设置的值在所有节点上相同。

我们不再推荐使用瞬态集群设置。请改用持久集群设置。如果集群变得不稳定,瞬态设置可能会意外清除,从而导致潜在的非预期集群配置。请参阅瞬态设置迁移指南

Static

静态设置只能在使用 elasticsearch.yml 的未启动或已关闭节点上进行配置。

静态设置必须在集群中的每个相关节点上进行设置。

重要的Elasticsearch配置

edit

Elasticsearch 几乎不需要配置即可开始使用,但在将集群用于生产之前,有一些项目必须考虑:

我们的 Elastic Cloud 服务会自动配置这些项目,使您的集群默认情况下即可投入生产。

路径设置

edit

Elasticsearch 将您索引的数据写入索引和数据流到 data 目录。Elasticsearch 将其自身的应用程序日志(包含有关集群健康状况和操作的信息)写入 logs 目录。

对于macOS .tar.gzLinux .tar.gzWindows .zip安装,datalogs默认是$ES_HOME的子目录。然而,$ES_HOME中的文件在升级过程中有被删除的风险。

在生产环境中,我们强烈建议您在 elasticsearch.yml 中将 path.datapath.logs 设置为 $ES_HOME 之外的位置。DockerDebianRPM 安装默认会将数据和日志写入 $ES_HOME 之外的位置。

支持的 path.datapath.logs 值因平台而异:

Linux 和 macOS 安装支持 Unix 风格的路径:

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

不要修改数据目录中的任何内容,也不要运行可能干扰其内容的进程。如果除了 Elasticsearch 之外的其他程序修改了数据目录的内容,那么 Elasticsearch 可能会失败,报告损坏或其他数据不一致的情况,或者可能在静默中丢失部分数据的情况下看似正常工作。不要尝试对数据目录进行文件系统备份;没有支持的方法来恢复这样的备份。相反,使用 快照和恢复 来安全地进行备份。不要在数据目录上运行病毒扫描程序。病毒扫描程序可能会阻止 Elasticsearch 正常工作,并且可能会修改数据目录的内容。数据目录不包含可执行文件,因此病毒扫描只会发现误报。

多条数据路径

edit

在7.13.0中已弃用。

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

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

Linux 和 macOS 安装支持在 path.data 中使用多个类 Unix 风格的路径:

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

从多数据路径迁移

edit

对多数据路径的支持在7.13版本中已被弃用,并将在未来的版本中移除。

作为多数据路径的替代方案,您可以创建一个跨越多个磁盘的文件系统,使用硬件虚拟化层如RAID,或软件虚拟化层如Linux上的逻辑卷管理器(LVM)或Windows上的存储空间。如果您希望在单个机器上使用多数据路径,则必须为每个数据路径运行一个节点。

如果您目前在高可用性集群中使用多个数据路径,那么您可以通过类似于滚动重启的过程,迁移到每个节点使用单一路径的设置,而无需停机:依次关闭每个节点,并将其替换为一个或多个配置为使用单一路径的节点。更详细地说,对于当前具有多个数据路径的每个节点,您应遵循以下过程。原则上,您可以在滚动升级到8.0期间执行此迁移,但我们建议在开始升级之前迁移到单数据路径设置。

  1. 拍摄快照以保护您的数据,以防灾难发生。
  2. 可选地,通过使用分配过滤器将数据从目标节点迁移出去:

    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.exclude._name": "target-node-name"
      }
    }

    您可以使用cat allocation API来跟踪此数据迁移的进度。如果某些分片未迁移,则集群分配解释API将帮助您确定原因。

  3. 按照 滚动重启过程 的步骤操作,直到并包括关闭目标节点。
  4. 确保您的集群健康状态为黄色绿色,以便每个分片至少分配给集群中的另一个节点。
  5. 如果适用,请移除在前一步骤中应用的分配过滤器。

    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.exclude._name": null
      }
    }
  6. 通过删除其数据路径的内容来丢弃停止节点持有的数据。
  7. 重新配置您的存储。例如,使用LVM或存储空间将您的磁盘组合成一个文件系统。确保您的重新配置的存储有足够的空间来容纳它将保存的数据。
  8. 通过调整其elasticsearch.yml文件中的path.data设置来重新配置您的节点。如果需要,安装更多节点,每个节点都有自己的path.data设置,指向单独的数据路径。
  9. 启动新节点并按照 滚动重启过程 的其余部分操作。
  10. 确保您的集群健康状态为绿色,以便每个分片都已分配。

您可以选择向集群中添加一些单数据路径节点,使用分配过滤器将所有数据迁移到这些新节点上,然后从集群中移除旧节点。这种方法会暂时使集群的大小翻倍,因此只有在您有能力以这种方式扩展集群时才能使用。

如果您目前使用多个数据路径,但您的集群不是高可用的,那么您可以通过创建快照、使用所需配置创建新集群并将快照恢复到其中来迁移到非弃用配置。

集群名称设置

edit

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

cluster.name: logging-prod

不要在不同的环境中重复使用相同的集群名称。 否则,节点可能会加入错误的集群。

更改集群名称需要进行全集群重启

节点名称设置

edit

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

node.name: prod-data-2

网络主机设置

edit

默认情况下,Elasticsearch 仅绑定到环回地址,例如 127.0.0.1[::1]。这对于在一台服务器上运行一个或多个节点的集群进行开发和测试是足够的,但一个 高可用的生产集群 必须涉及 其他服务器上的节点。有许多 网络设置,但 通常您只需要配置 network.host

network.host: 192.168.1.10

当你为network.host提供一个值时,Elasticsearch会假设你正在从开发模式切换到生产模式,并将许多系统启动检查从警告升级为异常。请参阅开发模式与生产模式之间的区别。

发现和集群形成设置

edit

在进入生产环境之前,配置两个重要的发现和集群形成设置,以便集群中的节点能够相互发现并选举出一个主节点。

discovery.seed_hosts
edit

开箱即用,无需任何网络配置,Elasticsearch 将绑定到可用的环回地址,并扫描本地端口 93009305 以连接到在同一服务器上运行的其他节点。此行为提供了无需任何配置的自动集群体验。

当您想在其他主机上的节点上形成集群时,请使用静态 discovery.seed_hosts 设置。此设置提供集群中其他节点的列表,这些节点有资格成为主节点,并且可能处于活动状态并可联系,以启动发现过程。此设置接受 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 地址必须用方括号括起来。

如果你的主节点候选节点没有固定的名称或地址,请使用 替代主机提供者 来动态查找它们的地址。

cluster.initial_master_nodes
edit

当你第一次启动Elasticsearch集群时,一个 集群引导步骤 决定了在第一次选举中计票的主节点集合。在开发模式下,没有配置发现设置,这一步骤由节点自身自动执行。

因为自动引导是固有的不安全, 在生产模式下启动新集群时,您必须明确列出在第一次选举中应计票的主节点。 您可以在每个主节点上使用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来识别初始主节点,默认情况下为它们的hostname。确保cluster.initial_master_nodes中的值与node.name完全匹配。如果你使用完全限定域名(FQDN),例如master-node-a.example.com作为节点名称,那么你必须在这个列表中使用FQDN。相反,如果node.name是一个没有任何尾随限定符的裸主机名,你也必须在cluster.initial_master_nodes中省略尾随限定符。

参见引导集群发现和集群形成设置

堆大小设置

edit

默认情况下,Elasticsearch 会根据节点的 角色 和总内存自动设置 JVM 堆大小。 我们建议大多数生产环境使用默认大小。

如果需要,您可以通过手动设置JVM堆大小来覆盖默认大小。

JVM堆转储路径设置

edit

默认情况下,Elasticsearch 配置 JVM 在内存不足异常时将堆转储到默认数据目录。在 RPMDebian 软件包中,数据目录是 /var/lib/elasticsearch。在 Linux 和 MacOS 以及 Windows 发行版中, data 目录位于 Elasticsearch 安装的根目录下。

如果此路径不适合接收堆转储,请修改jvm.options文件中的-XX:HeapDumpPath=...条目:

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

GC 日志设置

edit

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

您可以使用JEP 158: Unified JVM Logging中描述的命令行选项重新配置JVM日志记录。除非您直接更改默认的jvm.options文件,否则Elasticsearch的默认配置将应用于您的自定义设置。要禁用默认配置,首先通过提供-Xlog:disable选项来禁用日志记录,然后提供您自己的命令行选项。这将禁用所有JVM日志记录,因此请务必查看可用选项并启用您所需的所有内容。

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

示例

edit

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

# Turn off all previous logging configuratons
-Xlog:disable

# Default settings from JEP 158, but with `utctime` instead of `uptime` to match the next line
-Xlog:all=warning:stderr:utctime,level,tags

# Enable GC logging to a custom location with a variety of options
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,level,pid,tags:filecount=32,filesize=64m

配置一个Elasticsearch Docker容器以将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

临时目录设置

edit

默认情况下,Elasticsearch 使用一个私有临时目录,该目录由启动脚本在系统临时目录下立即创建。

在某些Linux发行版上,系统实用程序会在文件和目录长时间未被访问时从/tmp中清理它们。如果长时间不使用需要临时目录的功能,这种行为可能会导致Elasticsearch运行时私有临时目录被删除。如果随后使用需要此目录的功能,删除私有临时目录会导致问题。

如果您使用 .deb.rpm 包安装 Elasticsearch 并在 systemd 下运行它,Elasticsearch 使用的私有临时目录将不会被定期清理。

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

JVM 致命错误日志设置

edit

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

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

集群备份

edit

在灾难中,快照可以防止永久性数据丢失。 快照生命周期管理是定期备份集群的最简单方法。更多信息,请参阅创建快照

创建快照是备份集群的唯一可靠且受支持的方法。 您不能通过复制其节点数据目录来备份 Elasticsearch 集群。没有支持的方法可以从文件系统级别的备份中恢复任何数据。如果您尝试从这种备份中恢复集群,可能会失败并报告文件损坏或丢失,或者其他数据不一致的情况,或者可能看似成功但实际上已经丢失了部分数据。

安全设置

edit

某些设置是敏感的,仅依赖文件系统权限来保护其值是不够的。为此,Elasticsearch 提供了一个密钥库和 elasticsearch-keystore 工具来管理密钥库中的设置。

只有部分设置设计为可以从密钥库中读取。 将不支持的设置添加到密钥库会导致 _nodes/reload_secure_settings API 中的验证失败,如果未解决,将导致 Elasticsearch 无法启动。要查看设置是否在密钥库中受支持,请在设置参考中查找“Secure”限定符。

对密钥库的所有修改只有在重新启动 Elasticsearch 后才会生效。

这些设置,就像在 elasticsearch.yml 配置文件中的常规设置一样,需要在集群中的每个节点上指定。目前,所有安全设置都是特定于节点的设置,必须在每个节点上具有相同的值。

可重新加载的安全设置

edit

就像在 elasticsearch.yml 中的设置值一样,对密钥库内容的更改不会自动应用到正在运行的 Elasticsearch 节点。重新读取设置需要重新启动节点。然而,某些安全设置被标记为 可重新加载。这些设置可以在运行的节点上重新读取并应用。

您可以在节点启动之前定义这些设置, 或者在定义设置后调用节点重新加载安全设置API 以将它们应用于正在运行的节点。

所有安全设置的值,无论是可重新加载的还是不可重新加载的,在所有集群节点上必须相同。在进行所需的安全设置更改后,使用bin/elasticsearch-keystore add命令,调用:

POST _nodes/reload_secure_settings
{
  "secure_settings_password": "keystore-password" 
}

Elasticsearch密钥库所使用的密码。

此API解密、重新读取整个密钥库并在每个集群节点上验证所有设置,但仅应用可重新加载的安全设置。其他设置的更改在下次重启之前不会生效。一旦调用返回,重新加载已完成,这意味着所有依赖于这些设置的内部数据结构都已更改。一切看起来都应该像是从一开始就具有新值一样。

在更改多个可重新加载的安全设置时,请在每个集群节点上修改所有设置,然后发出reload_secure_settings调用,而不是在每次修改后重新加载。

有可重新加载的安全设置,包括:

审计安全设置

edit

您可以使用审计日志记录来记录与安全相关的事件,例如身份验证失败、拒绝的连接和数据访问事件。此外,通过API对安全配置的更改,例如创建、更新和删除本地内置用户、角色角色映射以及API密钥,也会被记录下来。

审计日志仅在某些订阅级别可用。 有关更多信息,请参阅 https://www.elastic.co/subscriptions

如果已配置,审计设置必须在集群中的每个节点上进行设置。 静态设置,例如 xpack.security.audit.enabled,必须在每个节点的 elasticsearch.yml 中进行配置。对于动态审计设置,请使用 集群更新设置 API 以确保所有节点上的设置相同。

通用审计设置

edit
xpack.security.audit.enabled

(静态) 设置为 true 以在节点上启用审计。默认值为 false。这会将审计事件放入每个节点上名为 _audit.json 的专用文件中。

如果启用,此设置必须在集群中的所有节点上的elasticsearch.yml中进行配置。

审计事件设置

edit

可以通过使用以下设置来控制记录的事件和其他信息:

xpack.security.audit.logfile.events.include
(动态) 指定在审计输出中打印的事件类型。 此外,可以使用_all来详尽地审计所有事件,但通常不鼓励这样做,因为它会变得非常冗长。 默认列表值包含: access_denied, access_granted, anonymous_access_denied, authentication_failed, connection_denied, tampered_request, run_as_denied, run_as_granted, security_config_change
xpack.security.audit.logfile.events.exclude
(动态) 从包含列表中排除指定的类型的事件。 这在events.include设置包含特殊值_all的情况下非常有用。 默认值为空列表。
xpack.security.audit.logfile.events.emit_request_body

(动态) 指定是否将REST请求的完整请求体作为某些类型审计事件的属性包含在内。此设置可用于 审计搜索查询

默认值为 false,因此请求体不会被打印。

请注意,在审计事件中包含请求体时,敏感数据可能会以明文形式被审计,尽管所有安全API(如更改用户密码的API)在审计时都会过滤掉凭证信息。

本地节点信息设置

edit
xpack.security.audit.logfile.emit_node_name
(动态) 指定是否在每个审计事件中包含节点名称作为一个字段。默认值为false
xpack.security.audit.logfile.emit_node_host_address
(动态) 指定是否在每个审计事件中包含节点的IP地址作为字段。 默认值是 false
xpack.security.audit.logfile.emit_node_host_name
(动态) 指定是否在每个审计事件中包含节点的主机名作为字段。 默认值是 false
xpack.security.audit.logfile.emit_node_id
(动态) 指定是否在每个审计事件中包含节点ID作为字段。 与节点名称不同,如果管理员在配置文件中更改了设置,节点名称的值可能会改变,而节点ID将在集群重启后保持不变,管理员无法更改它。 默认值为true

审计日志文件事件忽略策略

edit

以下设置影响忽略策略,这些策略允许对哪些审计事件打印到日志文件进行细粒度控制。 具有相同策略名称的所有设置组合成一个单一策略。 如果某个事件匹配任何策略的所有条件,则该事件将被忽略且不打印。 大多数审计事件都受忽略策略的约束。唯一的例外是security_config_change类型的事件,除非完全排除,否则无法被过滤掉。

xpack.security.audit.logfile.events.ignore_filters.<policy_name>.users
(动态) 用户名或通配符的列表。指定的策略将不会为匹配这些值的用户打印审计事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.realms
(动态) 一个认证领域名称或通配符的列表。指定的策略将不会为这些领域中的用户打印审计事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.actions
(动态) 一个操作名称或通配符的列表。操作名称可以在审计事件的action字段中找到。指定的策略将不会打印与这些值匹配的操作的审计事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.roles
(动态) 角色名称或通配符的列表。指定的策略将不会为拥有这些角色的用户打印审计事件。如果用户拥有多个角色,其中一些角色在策略覆盖范围内,则该策略将覆盖此事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.indices
(动态) 一个索引名称或通配符的列表。当事件中的所有索引都匹配这些值时,指定的策略将不会打印审计事件。如果事件涉及多个索引,其中一些索引在策略覆盖范围内,则该策略将覆盖此事件。

断路器设置

edit

Elasticsearch 包含多个断路器,用于防止操作导致 OutOfMemoryError。每个断路器指定它可以使用的内存限制。此外,还有一个父级断路器,用于指定所有断路器可以使用的总内存量。

除非另有说明,否则可以使用集群更新设置 API 在实时集群上动态更新这些设置。

有关断路器错误的信息,请参阅断路器错误

父断路器

edit

父级断路器可以通过以下设置进行配置:

indices.breaker.total.use_real_memory
(静态) 确定父断路器是否应考虑实际内存使用情况(true)或仅考虑子断路器预留的内存量(false)。默认为true
indices.breaker.total.limit logo cloud
(动态) 总体父断路器的起始限制。如果 indices.breaker.total.use_real_memoryfalse,则默认为 JVM 堆的 70%。如果 indices.breaker.total.use_real_memorytrue,则默认为 JVM 堆的 95%。

字段数据断路器

edit

字段数据断路器估计将字段加载到字段数据缓存所需的堆内存。如果加载该字段会导致缓存超过预定义的内存限制,断路器将停止操作并返回错误。

indices.breaker.fielddata.limit logo cloud
(动态) 字段数据断路器的限制。默认为JVM堆的40%。
indices.breaker.fielddata.overhead logo cloud
(动态) 一个常数,所有字段数据估计值都会乘以该常数来确定最终估计值。默认为 1.03

请求断路器

edit

请求断路器允许Elasticsearch防止每个请求的数据结构(例如,用于计算请求期间聚合的内存)超过一定量的内存。

indices.breaker.request.limit logo cloud
(动态) 请求断路器的限制,默认为JVM堆的60%。
indices.breaker.request.overhead logo cloud
(动态) 所有请求估计值都会乘以这个常数来确定最终的估计值。默认为 1

飞行中的请求断路器

edit

飞行中的请求断路器允许Elasticsearch限制在传输或HTTP级别上所有当前活动的传入请求的内存使用量,使其不超过节点上的特定内存量。内存使用量基于请求本身的内容长度。此断路器还考虑到,内存不仅需要用于表示原始请求,还需要用于表示结构化对象,这反映在默认的开销中。

network.breaker.inflight_requests.limit
(动态) 限制飞行请求断路器的上限,默认为JVM堆的100%。这意味着它受限于为父断路器配置的限制。
network.breaker.inflight_requests.overhead
(动态) 一个常数,所有进行中的请求估计值都会乘以该常数来确定最终估计值。默认为 2。

脚本编译断路器

edit

与之前的基于内存的断路器略有不同,脚本编译断路器限制了在一段时间内内联脚本编译的数量。

有关更多信息,请参阅脚本文档中的“prefer-parameters”部分。

script.max_compilations_rate
(动态) 在一定时间间隔内允许编译的唯一动态脚本数量的限制。默认为 150/5m, 即每5分钟150个。

如果集群经常达到给定的 max_compilation_rate,可能是脚本缓存过小,使用 Nodes Stats 检查最近的缓存驱逐数量,script.cache_evictions_history 和编译次数 script.compilations_history。如果最近有大量的缓存驱逐或编译,脚本缓存可能过小,考虑通过设置 script.cache.max_size 来加倍脚本缓存的大小。

正则表达式断路器

edit

编写不当的正则表达式可能会降低集群的稳定性和性能。正则表达式断路器限制了Painless脚本中正则表达式的使用和复杂性。

script.painless.regex.enabled

(静态) 在Painless脚本中启用正则表达式。接受:

limited (默认)
启用正则表达式,但通过使用 script.painless.regex.limit-factor 集群设置限制复杂性。
true
启用正则表达式,没有复杂性限制。禁用正则表达式断路器。
false
禁用正则表达式。任何包含正则表达式的Painless脚本都会返回错误。
script.painless.regex.limit-factor

(静态) 限制Painless脚本中正则表达式可以考虑的字符数。Elasticsearch通过将设置值乘以脚本输入的字符长度来计算此限制。

例如,输入 foobarbaz 的字符长度为 9。如果 script.painless.regex.limit-factor6,则对 foobarbaz 的正则表达式 可以考虑最多 54 (9 * 6) 个字符。如果表达式超过此限制, 它将触发正则表达式断路器并返回错误。

仅当script.painless.regex.enabled设置为limited时,Elasticsearch才会应用此限制。

EQL 断路器

edit

当执行一个序列查询时,处理该查询的节点需要在内存中保留一些结构,这些结构是实现序列匹配算法所必需的。当需要处理大量数据和/或用户通过设置size查询参数请求大量匹配序列时,这些结构占用的内存可能会超过JVM的可用内存。这会导致OutOfMemory异常,从而使节点崩溃。

为了防止这种情况发生,使用了特殊的断路器, 它在执行序列 查询时限制内存分配。当断路器被触发时,会抛出org.elasticsearch.common.breaker.CircuitBreakingException 并返回一个包含circuit_breaking_exception 的描述性错误消息给用户。

这个 circuit breaker 可以使用以下设置进行配置:

breaker.eql_sequence.limit
(动态) 用于限制在执行EQL序列查询期间内存利用率的断路器限制。此值定义为JVM堆的百分比。默认为50%。如果父断路器设置为小于50%的值,则此设置将使用该值作为其默认值。
breaker.eql_sequence.overhead
(动态) 一个常数,序列查询内存估计值乘以此常数以确定最终估计值。默认为 1
breaker.eql_sequence.type

(静态) 断路器类型。有效值为:

memory (默认)
断路器限制EQL序列查询的内存使用。
noop
禁用断路器。

机器学习断路器

edit
breaker.model_inference.limit
(动态) 训练模型断路器的限制。此值定义为JVM堆的百分比。默认为 50%。如果父断路器设置为小于 50%的值,则此设置将使用该值作为其默认值。
breaker.model_inference.overhead
(动态) 一个常数,所有训练模型的估计值都会乘以该常数以确定最终估计值。参见 断路器设置。默认为 1
breaker.model_inference.type
(静态) 断路器的底层类型。 有两种有效选项:noopmemorynoop 表示断路器不会采取任何措施来防止内存使用过多。memory 表示断路器会跟踪已训练模型使用的内存,并可能中断以防止 OutOfMemory 错误。默认值为 memory

集群级别的分片分配和路由设置

edit

分片分配是将分片副本分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡、当节点被添加到集群或从集群中移除时,或者当影响分配的集群或索引设置被更新时。

主节点的主要职责之一是决定将哪些分片分配给哪些节点,以及何时在节点之间移动分片以重新平衡集群。

有许多设置可用于控制分片分配过程:

除了这些,还有一些其他的杂项集群级设置

集群级分片分配设置

edit

您可以使用以下设置来控制分片分配和恢复:

cluster.routing.allocation.enable

(动态) 启用或禁用特定类型分片的分配:

  • all - (默认) 允许所有类型分片的分配。
  • primaries - 仅允许主分片的分配。
  • new_primaries - 仅允许新索引的主分片分配。
  • none - 不允许任何索引的任何类型分片分配。

此设置仅影响未来的分配,不会重新分配或取消当前已分配的分片。 它也不会影响在重新启动节点时本地主分片的恢复。如果重新启动的节点拥有未分配主分片的一个副本,并且其分配ID与集群状态中的一个活动分配ID匹配,则该主分片将立即恢复。

cluster.routing.allocation.same_shard.host
(动态) 如果true,禁止将一个分片的多个副本分配到同一主机上的不同节点,即具有相同网络地址的节点。默认为false,意味着分片的副本有时可能会被分配到同一主机上的节点。此设置仅在每个主机上运行多个节点时相关。
cluster.routing.allocation.node_concurrent_incoming_recoveries
(动态) 节点上允许同时发生的并发传入分片恢复数量。传入恢复是指目标分片(通常是副本,除非分片正在重新定位)在该节点上分配的恢复。默认值为 2。增加此设置可能会对集群中的其他活动产生性能影响,但可能不会显著加快分片移动的完成速度。我们不建议将此设置从默认值 2 进行调整。
cluster.routing.allocation.node_concurrent_outgoing_recoveries
(动态) 节点上允许发生的并发传出分片恢复的数量。传出恢复是指源分片(最可能是主分片,除非分片正在重新定位)分配在该节点上的恢复。默认值为 2。增加此设置可能会对集群中的其他活动产生性能影响,但可能不会显著加快分片移动的完成速度。我们不建议将此设置从默认值 2 进行调整。
cluster.routing.allocation.node_concurrent_recoveries
(动态) 一个快捷方式,用于同时设置 cluster.routing.allocation.node_concurrent_incoming_recoveriescluster.routing.allocation.node_concurrent_outgoing_recoveries。此设置的值仅在未配置更具体的设置时生效。默认值为 2。增加此设置可能会对集群中的其他活动产生性能影响,但可能不会显著加快分片移动的完成速度。我们不建议将此设置从默认值 2 进行调整。
cluster.routing.allocation.node_initial_primaries_recoveries
(动态) 虽然副本的恢复通过网络进行,但在节点重启后,未分配主节点的恢复使用本地磁盘中的数据。 这些恢复应该快速进行,以便每个节点可以并行进行更多的初始主节点恢复。默认值为4。增加此设置可能会导致分片恢复对集群中的其他活动产生性能影响,但可能不会显著加快分片恢复的完成速度。我们不建议将此设置从默认值4进行调整。

分片重新平衡设置

edit

当一个集群在每个节点上拥有相同数量的分片,并且所有节点需要相同的资源,而没有任何节点上集中了来自任何索引的分片时,该集群就是平衡的。Elasticsearch运行一个称为重新平衡的自动过程,该过程在集群中的节点之间移动分片以改善其平衡。重新平衡遵循所有其他分片分配规则,例如分配过滤强制感知,这些规则可能会阻止其完全平衡集群。在这种情况下,重新平衡会尽力在您配置的规则内实现最平衡的集群。如果您正在使用数据层,那么Elasticsearch会自动应用分配过滤规则,将每个分片放置在适当的层中。这些规则意味着平衡器在每个层中独立工作。

您可以使用以下设置来控制分片在集群中的重新平衡:

cluster.routing.allocation.allow_rebalance

(动态) 指定何时允许分片重新平衡:

  • always - (默认) 始终允许重新平衡。
  • indices_primaries_active - 仅当集群中的所有主分片都已分配时。
  • indices_all_active - 仅当集群中的所有分片(主分片和副本分片)都已分配时。
cluster.routing.rebalance.enable

(动态) 启用或禁用特定类型分片的重新平衡:

  • all - (default) Allows shard balancing for all kinds of shards.
  • primaries - Allows shard balancing only for primary shards.
  • replicas - Allows shard balancing only for replica shards.
  • none - No shard balancing of any kind are allowed for any indices.

重新平衡对于确保集群在发生中断后恢复到健康且完全弹性的状态非常重要。如果您调整此设置,请记住尽快将其设置回all

cluster.routing.allocation.cluster_concurrent_rebalance
(动态) 定义了整个集群中允许的并发分片重新平衡的数量。默认为 2。请注意,此设置仅控制由于集群中的不平衡而导致的并发分片重新定位。此设置不限制由于 分配过滤强制感知 而导致的分片重新定位。增加此设置可能会导致集群在节点之间移动分片时使用额外的资源,因此我们通常不建议将此设置从默认的 2 进行调整。
cluster.routing.allocation.type

选择用于计算集群平衡的算法。默认为 desired_balance,它选择期望平衡分配器。该分配器 运行一个后台任务,该任务计算集群中分片的期望平衡。一旦此后台任务完成,Elasticsearch 将分片移动到其期望的位置。

[8.8] 在8.8版本中已弃用。balanced分配器类型已被弃用,不再推荐使用 也可以设置为balanced以选择旧版的平衡分配器。此分配器在8.6.0之前的Elasticsearch版本中是默认分配器。它在后台运行,阻止主节点并行执行其他工作。它通过选择少量立即改善集群平衡的分片移动来工作,当这些分片移动完成后,它会再次运行并选择另外几个分片进行移动。由于此分配器仅基于集群的当前状态做出决策,因此在平衡集群时有时会多次移动分片。

分片平衡启发式设置

edit

重新平衡通过计算每个节点基于其分片分配的权重,然后在这些节点之间移动分片以减少较重节点的权重并增加较轻节点的权重。当不存在任何分片移动可以使任何节点的权重更接近其他节点的权重超过可配置阈值时,集群达到平衡。

节点的权重取决于它所持有的分片数量以及这些分片的总估计资源使用量,这些资源使用量以分片在磁盘上的大小和支撑分片写入流量的线程数来表示。Elasticsearch 在通过滚动创建时估计属于数据流的分片的资源使用量。新分片的估计磁盘大小是数据流中其他分片的平均大小。新分片的估计写入负载是数据流中最近分片的实际写入负载的加权平均值。不属于数据流写入索引的分片的估计写入负载为零。

以下设置控制 Elasticsearch 如何将这些值组合成每个节点的总体权重度量。

cluster.routing.allocation.balance.threshold
(浮点数, 动态) 触发重新平衡分片移动的最小权重改进。 默认为 1.0f。提高此值将导致 Elasticsearch 更早停止重新平衡分片,使集群处于更不平衡的状态。
cluster.routing.allocation.balance.shard
(浮点数, 动态) 定义分配给每个节点的分片总数的权重因子。 默认为 0.45f。提高此值会增加Elasticsearch在其他平衡变量之前均衡节点间分片总数的倾向。
cluster.routing.allocation.balance.index
(浮点数, 动态) 定义分配给每个节点的每个索引的分片数量的权重因子。默认为 0.55f。提高此值会增加Elasticsearch在其他平衡变量之前均衡每个索引在各节点上的分片数量的倾向。
cluster.routing.allocation.balance.disk_usage
(浮点数, 动态) 定义根据预测的磁盘大小(以字节为单位)平衡分片的权重因子。默认为 2e-11f。提高此值会增加 Elasticsearch 倾向于在其他平衡变量之前均衡节点间总磁盘使用量的趋势。
cluster.routing.allocation.balance.write_load
(浮点数, 动态) 定义每个分片的写入负载的权重因子,以分片所需的估计索引线程数为单位。默认为 10.0f。 提高此值会增加Elasticsearch在其他平衡变量之前均衡节点间总写入负载的倾向。
  • If you have a large cluster, it may be unnecessary to keep it in a perfectly balanced state at all times. It is less resource-intensive for the cluster to operate in a somewhat unbalanced state rather than to perform all the shard movements needed to achieve the perfect balance. If so, increase the value of cluster.routing.allocation.balance.threshold to define the acceptable imbalance between nodes. For instance, if you have an average of 500 shards per node and can accept a difference of 5% (25 typical shards) between nodes, set cluster.routing.allocation.balance.threshold to 25.
  • We do not recommend adjusting the values of the heuristic weight factor settings. The default values work well in all reasonable clusters. Although different values may improve the current balance in some ways, it is possible that they will create unexpected problems in the future or prevent it from gracefully handling an unexpected disruption.
  • Regardless of the result of the balancing algorithm, rebalancing might not be allowed due to allocation rules such as forced awareness and allocation filtering. Use the Cluster allocation explain API to explain the current allocation of shards.

基于磁盘的分片分配设置

edit

基于磁盘的分片分配器确保所有节点都有足够的磁盘空间,而不会执行比必要更多的分片移动。它根据一对称为低水位线高水位线的阈值来分配分片。其主要目标是确保没有节点超过高水位线,或者至少任何此类超额只是暂时的。如果一个节点超过高水位线,Elasticsearch将通过将其部分分片移动到集群中的其他节点来解决这个问题。

节点偶尔暂时超过高水位线是正常的。

分配器还通过禁止向超过低水位线的节点分配更多分片,尝试保持节点低于高水位线。重要的是,如果所有节点都超过了低水位线,那么将无法分配新分片,Elasticsearch也无法在节点之间移动任何分片以保持磁盘使用率低于高水位线。您必须确保集群有足够的总磁盘空间,并且始终有一些节点低于低水位线。

由基于磁盘的分片分配器触发的分片移动也必须满足所有其他分片分配规则,例如 分配过滤强制感知。如果这些规则过于严格,它们 也可能阻止保持节点磁盘使用率所需的分片移动。如果您正在使用数据层,那么Elasticsearch会自动 配置分配过滤规则,以将分片放置在适当的层中,这意味着基于磁盘的分片分配器在每个层中独立工作。

如果一个节点填充其磁盘的速度快于Elasticsearch可以将分片移动到其他地方的速度,那么就有磁盘完全填满的风险。为了防止这种情况,作为最后的手段,一旦磁盘使用率达到洪水阶段水印,Elasticsearch将阻止对受影响节点上的分片所在索引的写入。它还将继续将分片移动到集群中的其他节点。当受影响节点上的磁盘使用率降至高水印以下时,Elasticsearch会自动移除写入阻止。请参阅修复水印错误以解决持续的水印错误。

集群中的节点使用非常不同的磁盘空间量是正常的。集群的平衡取决于多种因素的组合,包括每个节点上的分片数量、这些分片所属的索引以及每个分片在磁盘大小和CPU使用方面的资源需求。Elasticsearch必须在所有这些因素之间进行权衡,一个在考虑所有这些因素的组合时平衡的集群,如果你只关注其中一个因素,可能看起来并不平衡。

您可以使用以下设置来控制基于磁盘的分配:

cluster.routing.allocation.disk.threshold_enabled
(动态) 默认为 true。设置为 false 以禁用磁盘分配决策器。禁用后,它还将移除任何现有的 index.blocks.read_only_allow_delete 索引块。
cluster.routing.allocation.disk.watermark.low logo cloud
(Dynamic) Controls the low watermark for disk usage. It defaults to 85%, meaning that Elasticsearch will not allocate shards to nodes that have more than 85% disk used. It can alternatively be set to a ratio value, e.g., 0.85. It can also be set to an absolute byte value (like 500mb) to prevent Elasticsearch from allocating shards if less than the specified amount of space is available. This setting has no effect on the primary shards of newly-created indices but will prevent their replicas from being allocated.
cluster.routing.allocation.disk.watermark.low.max_headroom
(Dynamic) Controls the max headroom for the low watermark (in case of a percentage/ratio value). Defaults to 200GB when cluster.routing.allocation.disk.watermark.low is not explicitly set. This caps the amount of free space required.
cluster.routing.allocation.disk.watermark.high logo cloud
(动态) 控制高水位线。它默认设置为 90%,这意味着如果节点的磁盘使用率超过 90%,Elasticsearch 将尝试将分片从该节点迁移出去。它也可以设置为一个比率值,例如 0.9。它还可以设置为一个绝对字节值(类似于低水位线),以便在节点可用空间少于指定值时迁移分片。此设置影响所有分片的分配,无论是之前分配的还是未分配的。
cluster.routing.allocation.disk.watermark.high.max_headroom
(Dynamic) Controls the max headroom for the high watermark (in case of a percentage/ratio value). Defaults to 150GB when cluster.routing.allocation.disk.watermark.high is not explicitly set. This caps the amount of free space required.
cluster.routing.allocation.disk.watermark.enable_for_single_data_node
(Static) In earlier releases, the default behaviour was to disregard disk watermarks for a single data node cluster when making an allocation decision. This is deprecated behavior since 7.14 and has been removed in 8.0. The only valid value for this setting is now true. The setting will be removed in a future release.
cluster.routing.allocation.disk.watermark.flood_stage logo cloud

(动态) 控制洪水阶段水印,默认为95%。Elasticsearch对每个在节点上分配了一个或多个分片,并且至少有一个磁盘超过洪水阶段的索引强制执行只读索引块(index.blocks.read_only_allow_delete)。此设置是防止节点耗尽磁盘空间的最后手段。当磁盘利用率低于高水印时,索引块会自动释放。与低和高水印值类似,它也可以设置为比率值,例如0.95,或绝对字节值。

重置my-index-000001索引上的只读索引块的示例:

PUT /my-index-000001/_settings
{
  "index.blocks.read_only_allow_delete": null
}
cluster.routing.allocation.disk.watermark.flood_stage.max_headroom
(动态) 控制洪水阶段水印的最大余量(如果是百分比/比率值)。 当 cluster.routing.allocation.disk.watermark.flood_stage 未明确设置时,默认为 100GB。 这限制了所需的可用空间量。

您不能在 cluster.routing.allocation.disk.watermark.lowcluster.routing.allocation.disk.watermark.highcluster.routing.allocation.disk.watermark.flood_stage 设置中混合使用百分比/比例值和字节值。所有值都必须设置为百分比/比例值,或者所有值都设置为字节值。这种强制执行是为了确保 Elasticsearch 可以验证设置在内部是一致的,确保低磁盘阈值小于高磁盘阈值,并且高磁盘阈值小于洪水阶段阈值。类似的比较检查也适用于最大可用空间值。

cluster.routing.allocation.disk.watermark.flood_stage.frozen logo cloud
(动态) 控制专用冻结节点的洪水阶段水印,默认值为95%。
cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom logo cloud
(动态) 控制专用冻结节点的洪水阶段水印的最大余量(在百分比/比率值的情况下)。当 cluster.routing.allocation.disk.watermark.flood_stage.frozen 未明确设置时,默认为20GB。这限制了专用冻结节点上所需的可用空间量。
cluster.info.update.interval
(动态) Elasticsearch应该多久检查一次集群中每个节点的磁盘使用情况。默认为30s

百分比值指的是已使用的磁盘空间,而字节值指的是空闲磁盘空间。这可能会造成混淆,因为它颠倒了高和低的含义。例如,将低水位线设置为10gb,将高水位线设置为5gb是有意义的,但反过来则不然。

一个将低水位线更新为至少100GB空闲、高水位线至少50GB空闲、洪水阶段水位线10GB空闲的示例,并且每分钟更新一次集群信息:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

关于水印的最大可用空间设置,请注意这些设置仅在水印设置为百分比/比率时适用。最大可用空间值的目的是在水印达到之前限制所需的可用磁盘空间。这对于具有较大磁盘的服务器特别有用,其中百分比/比率水印可能转化为较大的可用磁盘空间需求,而最大可用空间可以用来限制所需的可用磁盘空间量。例如,让我们来看洪水水印的默认设置。它有95%的默认值,而洪水最大可用空间设置的默认值为100GB。这意味着:

  • 对于较小的磁盘,例如100GB,洪水水印将在95%时触发,这意味着在5GB的可用空间时触发,因为5GB小于100GB的最大缓冲值。
  • 对于较大的磁盘,例如100TB,洪水水印将在100GB的可用空间时触发。这是因为仅95%的洪水水印就需要5TB的可用磁盘空间,但这一需求被最大缓冲设置限制为100GB。

最后,只有在未明确设置各自的水印设置(因此,它们具有默认的百分比值)时,最大头空间设置才会具有其默认值。如果明确设置了水印,则最大头空间设置不会具有其默认值,如果需要,则需要明确设置。

分片分配感知

edit

您可以使用自定义节点属性作为感知属性,以使Elasticsearch在分配分片时考虑您的物理硬件配置。如果Elasticsearch知道哪些节点位于同一物理服务器、同一机架或同一区域,它可以将主分片及其副本分片分布开来,以最大限度地降低在发生故障时丢失所有分片副本的风险。

当启用分片分配感知时,使用动态 cluster.routing.allocation.awareness.attributes设置,分片只会被分配到设置了指定感知属性的节点上。 如果你使用多个感知属性,Elasticsearch在分配分片时会分别考虑每个属性。

属性值的数量决定了在每个位置分配的分片副本数量。如果每个位置的节点数量不平衡且存在大量副本,副本分片可能会保持未分配状态。

了解更多关于设计弹性集群的信息。

启用分片分配感知

edit

要启用分片分配感知:

  1. 使用自定义节点属性指定每个节点的位置。例如,如果您希望 Elasticsearch 在不同的机架之间分配分片,您可能会使用一个名为 rack_id 的感知属性。

    你可以通过两种方式设置自定义属性:

    • 通过编辑 elasticsearch.yml 配置文件:

      node.attr.rack_id: rack_one
    • 在启动节点时使用-E命令行参数:

      ./bin/elasticsearch -Enode.attr.rack_id=rack_one
  2. 在每个符合主节点资格的节点的 elasticsearch.yml 配置文件中设置 cluster.routing.allocation.awareness.attributes,以告知 Elasticsearch 在分配分片时考虑一个或多个感知属性。

    cluster.routing.allocation.awareness.attributes: rack_id 

    将多个属性指定为逗号分隔的列表。

    您还可以使用 cluster-update-settings API 来设置或更新 集群的感知属性:

    PUT /_cluster/settings
    {
      "persistent" : {
        "cluster.routing.allocation.awareness.attributes" : "rack_id"
      }
    }

使用此示例配置,如果您启动两个节点并将node.attr.rack_id设置为rack_one,并创建一个包含5个主分片和每个主分片的1个副本的索引,所有主分片和副本将分配在这两个节点之间。

All primaries and replicas are allocated across two nodes in the same rack
Figure 1. All primaries and replicas allocated across two nodes in the same rack

如果你添加两个节点并将node.attr.rack_id设置为rack_two, Elasticsearch会将分片移动到新节点,确保(如果可能) 同一分片的两个副本不在同一个机架中。

Primaries and replicas are allocated across four nodes in two racks with no two copies of the same shard in the same rack
Figure 2. Primaries and replicas allocated across four nodes in two racks, with no two copies of the same shard in the same rack

如果 rack_two 失败并导致其两个节点都宕机,默认情况下 Elasticsearch 会将丢失的分片副本分配到 rack_one 中的节点。为了防止特定分片的多个副本被分配到同一位置,您可以启用强制感知。

强制意识

edit

默认情况下,如果一个位置失败,Elasticsearch 会将分片分散到剩余的位置。如果集群在缺少一个位置时没有足够的资源来托管所有分片,这可能是不希望的。

为了防止在发生整个位置故障时剩余位置过载,请指定应与cluster.routing.allocation.awareness.force.*设置一起存在的属性值。这意味着Elasticsearch将倾向于在发生整个位置故障时保持一些副本未分配,而不是使剩余位置中的节点过载。

例如,如果你有一个名为 zone 的感知属性,并在 zone1zone2 中配置节点,你可以使用强制感知来使 Elasticsearch 在只有一个区域可用时,保留一半的分片副本未分配:

cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: zone1,zone2 

指定所有可能的zone属性值。

使用此示例配置,如果您有两个节点,其 node.attr.zone 设置为 zone1,并且一个索引的 number_of_replicas 设置为 1,Elasticsearch 将分配所有主分片,但不分配副本分片。一旦具有不同 node.attr.zone 值的节点加入集群,它将分配副本分片。相比之下,如果您不配置强制感知,Elasticsearch 会将所有主分片和副本分片分配给这两个节点,即使它们位于同一区域。

集群级分片分配过滤

edit

您可以使用集群级别的分片分配过滤器来控制Elasticsearch在何处分配来自任何索引的分片。这些集群范围的过滤器与每个索引的分配过滤分配感知一起应用。

分片分配过滤器可以根据自定义节点属性或内置的 _name_host_ip_publish_ip_ip_host_id_tier 属性进行设置。

The cluster.routing.allocation 设置是 动态的,使得实时索引可以从一组节点移动到另一组节点。只有在不违反其他路由约束(例如,永远不会在同一节点上分配主分片和副本分片)的情况下,分片才会被重新定位。

集群级分片分配过滤最常见的用例是当你想要停用一个节点时。为了在关闭节点之前将分片从该节点移走,你可以创建一个过滤器,通过其IP地址排除该节点:

PUT _cluster/settings
{
  "persistent" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}

集群路由设置

edit
cluster.routing.allocation.include.{attribute}
(动态) 将分片分配给具有{attribute}属性的节点,该属性至少包含一个逗号分隔的值。
cluster.routing.allocation.require.{attribute}
(动态) 仅将分片分配给其 {attribute} 具有 所有 逗号分隔值的节点。
cluster.routing.allocation.exclude.{attribute}
(动态) 不要将分片分配给其 {attribute} 具有逗号分隔值中任何值的节点。

集群分配设置支持以下内置属性:

_name

通过节点名称匹配节点

_host_ip

根据主机IP地址匹配节点(与主机名关联的IP)

_publish_ip

通过发布IP地址匹配节点

_ip

匹配 _host_ip_publish_ip

_host

通过主机名匹配节点

_id

通过节点ID匹配节点

_tier

根据节点的数据层级角色匹配节点

_tier 过滤是基于 节点 角色的。只有一部分角色是 数据层 角色,而通用的 数据角色 将匹配任何层过滤。一部分角色是 数据层 角色,但通用的 数据角色 将匹配任何层过滤。

在指定属性值时,您可以使用通配符,例如:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._ip": "192.168.2.*"
  }
}

其他集群设置

edit

元数据

edit

可以将整个集群设置为只读模式,使用以下设置:

cluster.blocks.read_only
(动态) 使整个集群变为只读状态(索引不接受写操作),元数据不允许被修改(创建或删除索引)。默认为 false
cluster.blocks.read_only_allow_delete
(动态) 与 cluster.blocks.read_only 相同,但允许删除索引以释放资源。默认为 false

不要依赖此设置来防止对集群的更改。任何有权访问集群更新设置 API的用户都可以使集群再次变为读写状态。

集群分片限制

edit

集群中的分片数量是有限制的,这个限制基于集群中的节点数量。这是为了防止失控的进程创建过多的分片,这可能会损害性能,并且在极端情况下可能会使您的集群不稳定。

这些限制旨在作为一种安全网,以防止失控的分片创建,而不是一种大小建议。您的集群可以安全支持的确切分片数量取决于您的硬件配置和工作负载,并且可能小于默认限制。

我们不建议将这些限制增加到默认值之外。拥有更多分片的集群在正常操作中可能看起来运行良好,但在遇到网络分区或意外节点重启等临时中断时,可能需要非常长的时间才能恢复,并且在执行滚动重启或升级等维护活动时可能会遇到问题。

如果一个操作,例如创建新索引、恢复索引的快照或打开已关闭的索引,会导致集群中的分片数量超过此限制,则该操作将失败并显示错误,指示分片限制。要解决此问题,可以通过添加节点来扩展集群,或者删除一些索引以使分片数量低于限制。

如果集群已经超过限制,可能由于节点成员变化或设置更改,所有创建或打开索引的操作都将失败。

集群分片限制默认情况下,对于普通(非冻结)索引,每个非冻结数据节点为1000个分片,对于冻结索引,每个冻结数据节点为3000个分片。所有打开索引的主分片和副本分片都计入此限制,包括未分配的分片。例如,一个具有5个主分片和2个副本的打开索引计为15个分片。关闭的索引不计入分片计数。

您可以使用以下设置动态调整集群分片限制:

cluster.max_shards_per_node

(动态) 限制集群中主分片和副本分片的总数。Elasticsearch 计算限制如下:

cluster.max_shards_per_node * 非冻结数据节点的数量

已关闭索引的分片不计入此限制。默认值为 1000。 没有数据节点的集群是无限的。

Elasticsearch 拒绝任何创建的分片数超过此限制允许的请求。例如,一个集群的 cluster.max_shards_per_node 设置为 100,并且有三个数据节点,那么该集群的分片限制为 300。如果集群已经包含 296 个分片,Elasticsearch 将拒绝任何向集群添加五个或更多分片的请求。

请注意,如果cluster.max_shards_per_node设置的值高于默认值,则可能还需要调整mmap计数打开文件描述符的限制。

请注意,冻结的分片有其独立的限制。

cluster.max_shards_per_node.frozen

(动态) 限制集群中主分片和副本冻结分片的总数。 Elasticsearch 计算限制如下:

cluster.max_shards_per_node.frozen * 冻结数据节点的数量

已关闭索引的分片不计入此限制。默认值为 3000。 没有冻结数据节点的集群不受限制。

Elasticsearch 拒绝任何创建超过此限制允许的冻结分片的请求。 例如,一个集群的 cluster.max_shards_per_node.frozen 设置为 100,并且有三个冻结数据节点,其冻结分片限制为 300。如果集群已经包含 296 个分片,Elasticsearch 将拒绝任何添加五个或更多冻结分片的请求。

这些限制仅适用于创建分片的行为,并不限制分配给每个节点的分片数量。要限制分配给每个节点的分片数量,请使用 cluster.routing.allocation.total_shards_per_node 设置。

用户定义的集群元数据

edit

用户定义的元数据可以使用集群设置 API 进行存储和检索。这可以用于存储关于集群的任意、不常变化的数据,而无需创建索引来存储它。这些数据可以使用任何以 cluster.metadata. 为前缀的键进行存储。例如,要将集群管理员的电子邮件地址存储在键 cluster.metadata.administrator 下,请发出此请求:

PUT /_cluster/settings
{
  "persistent": {
    "cluster.metadata.administrator": "sysadmin@example.com"
  }
}

用户定义的集群元数据不应用于存储敏感或机密信息。存储在用户定义的集群元数据中的任何信息都将被任何有权访问Cluster Get Settings API的人查看,并且会被记录在Elasticsearch日志中。

索引墓碑

edit

集群状态维护索引墓碑,以明确表示已删除的索引。集群状态中维护的墓碑数量由以下设置控制:

cluster.indices.tombstones.size
(静态) 索引墓碑防止在删除发生时未加入集群的节点加入集群并重新导入索引,就好像删除从未发生过一样。为了防止集群状态变得过于庞大,我们只保留最近的cluster.indices.tombstones.size次删除,默认值为500。如果你预计节点会长时间不在集群中并错过超过500次删除,你可以增加这个值。我们认为这种情况很少见,因此默认值为500。墓碑不会占用太多空间,但我们认为像50,000这样的数字可能太大了。

如果 Elasticsearch 遇到当前集群状态中不存在的索引数据,这些索引将被视为悬空索引。例如,如果你在 Elasticsearch 节点离线时删除了超过 cluster.indices.tombstones.size 个索引,就可能发生这种情况。

您可以使用悬空索引 API来管理这种情况。

日志记录器

edit

控制日志记录的设置可以通过动态更新,使用logger.前缀。例如,要将indices.recovery模块的日志级别提高到DEBUG,请发出此请求:

PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.indices.recovery": "DEBUG"
  }
}

持久任务分配

edit

插件可以创建一种称为持久任务的任务。这些任务通常是长时间运行的任务,并且存储在集群状态中,允许在集群完全重启后恢复任务。

每次创建持久任务时,主节点负责将任务分配给集群中的一个节点,然后被分配的节点将接管任务并在本地执行。分配持久任务给节点的过程由以下设置控制:

cluster.persistent_tasks.allocation.enable

(动态) 启用或禁用持久任务的分配:

  • all - (默认) 允许将持久任务分配给节点
  • none - 不允许为任何类型的持久任务进行分配

此设置不影响已经在执行的持久任务。只有新创建的持久任务,或者必须重新分配的任务(例如,在节点离开集群后),才会受到此设置的影响。

cluster.persistent_tasks.allocation.recheck_interval
(动态) 主节点将在集群状态发生显著变化时自动检查是否需要分配持久任务。然而,可能还有其他因素,如内存使用情况,这些因素会影响持久任务是否可以分配给节点,但不会导致集群状态发生变化。此设置控制执行分配检查的频率,以应对这些因素。默认值为30秒。允许的最小值为10秒。

跨集群复制设置

edit

这些跨集群复制设置可以在活动集群上使用集群更新设置 API动态更新。

远程恢复设置

edit

以下设置可用于限制在远程恢复期间传输的数据速率:

ccr.indices.recovery.max_bytes_per_sec (Dynamic)
限制每个节点上的总入站和出站远程恢复流量。由于此限制适用于每个节点,但可能有许多节点同时执行远程恢复,因此远程恢复字节的总量可能会远高于此限制。如果将此限制设置得过高,则存在正在进行的远程恢复会消耗过多带宽(或其他资源)的风险,这可能会导致集群不稳定。此设置由领导者和跟随者集群共同使用。例如,如果领导者的设置为20mb,领导者将仅向跟随者发送20mb/s,即使跟随者请求并可以接受60mb/s。默认值为40mb

高级远程恢复设置

edit

以下专家设置可以设置为管理远程恢复所消耗的资源:

ccr.indices.recovery.max_concurrent_file_chunks (Dynamic)
控制每个恢复过程中可以并行发送的文件块请求数量。由于多个远程恢复可能已经在并行运行,增加这个专家级设置可能只在以下情况下有帮助:单个分片的远程恢复未达到由ccr.indices.recovery.max_bytes_per_sec配置的总入站和出站远程恢复流量。默认值为5。允许的最大值为10
ccr.indices.recovery.chunk_size(Dynamic)
控制跟随者在文件传输期间请求的块大小。默认为 1mb
ccr.indices.recovery.recovery_activity_timeout(Dynamic)
控制恢复活动的超时时间。此超时主要适用于领导者集群。在恢复过程中,领导者集群必须在内存中打开资源以向跟随者提供数据。如果领导者在此时间段内未收到来自跟随者的恢复请求,它将关闭资源。默认为60秒。
ccr.indices.recovery.internal_action_timeout (Dynamic)
控制远程恢复过程中单个网络请求的超时时间。单个操作超时可能导致恢复失败。默认为60秒。

发现和集群形成设置

edit

发现与集群形成受以下设置影响:

discovery.seed_hosts

(静态) 提供集群中主节点地址的列表。也可以是一个包含以逗号分隔的地址的单个字符串。每个地址的格式为host:porthosthost可以是DNS解析的主机名、IPv4地址或IPv6地址。IPv6地址必须用方括号括起来。如果主机名通过DNS解析为多个地址,Elasticsearch将使用所有这些地址。DNS查找受JVM DNS缓存的影响。如果未指定port,则按以下顺序检查以下设置来确定端口:

  1. transport.profiles.default.port
  2. transport.port

如果这两个都没有设置,那么默认端口是9300discovery.seed_hosts的默认值是["127.0.0.1", "[::1]"]。请参阅discovery.seed_hosts

discovery.seed_providers
(静态) 指定使用哪种类型的 种子主机提供者 来获取用于启动发现过程的种子节点的地址。 默认情况下,它是 基于设置的种子主机 提供者,它从 discovery.seed_hosts 设置中获取种子节点地址。
discovery.type
(静态) 指定 Elasticsearch 是否应形成多节点集群。默认为 multi-node,这意味着 Elasticsearch 在形成集群时会发现其他节点,并允许其他节点稍后加入集群。如果设置为 single-node,Elasticsearch 将形成单节点集群,并抑制由 cluster.publish.timeout 设置的超时。有关何时可能使用此设置的更多信息,请参阅 单节点发现
cluster.initial_master_nodes
(静态) 设置全新集群中初始的主节点集合。默认情况下,此列表为空,这意味着此节点期望加入一个已经启动的集群。一旦集群形成,请移除此设置,并且不要再为此集群设置此项。不要在非主节点上配置此设置。不要在加入现有集群的节点上配置此设置。不要在重新启动的节点上配置此设置。在进行全集群重启时不要配置此设置。请参阅 cluster.initial_master_nodes

专家设置

edit

发现和集群形成也会受到以下专家级设置的影响,尽管不建议将这些设置从默认值更改。

如果您调整这些设置,您的集群可能无法正确形成,或者可能变得不稳定或无法容忍某些故障。

discovery.cluster_formation_warning_timeout
(静态) 设置节点在尝试形成集群之前会尝试多长时间,然后记录一条警告,表明集群未形成。默认值为10s。如果在discovery.cluster_formation_warning_timeout超时后集群仍未形成,则节点将记录一条警告消息,该消息以短语master not discovered开头,描述当前的发现过程状态。
discovery.find_peers_interval
(静态) 设置节点在尝试下一轮发现之前等待的时间。 默认为 1s
discovery.probe.connect_timeout
(静态) 设置尝试连接到每个地址时的等待时间。默认为 30秒
discovery.probe.handshake_timeout
(静态) 设置在尝试通过握手识别远程节点时等待的时间。默认为 30s
discovery.request_peers_timeout
(静态) 设置节点在再次向其对等节点请求后,等待多长时间才认为请求失败。默认为 3s
discovery.find_peers_warning_timeout
(静态) 设置节点在尝试发现其对等节点之前,开始记录详细消息描述连接尝试失败原因的时间长度。默认为3m
discovery.seed_resolver.max_concurrent_resolvers
(静态) 指定在解析种子节点地址时要执行的并发DNS查找的数量。默认为 10
discovery.seed_resolver.timeout
(静态) 指定在解析种子节点地址时,每次DNS查找等待的时间。默认为 5秒
cluster.auto_shrink_voting_configuration
(动态) 控制是否在仍包含至少3个节点的情况下,自动移除已离开的节点。默认值为true。如果设置为false,投票配置将不会自动缩小,您必须使用投票配置排除API手动移除已离开的节点。
cluster.election.back_off_time
(静态) 设置每次选举失败时增加等待时间上限的量。请注意,这是线性退避。默认值为 100ms。更改此设置可能会导致您的集群无法选举出主节点。
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.timeout
(静态) 设置每个节点在选举出的主节点未响应领导者检查时,等待响应的时间。默认值为10s。更改此默认设置可能会导致集群不稳定。
cluster.fault_detection.leader_check.retry_count
(静态) 设置在节点认为选举的主节点出现故障并尝试寻找或选举新主节点之前,必须连续发生多少次主节点检查失败。默认为3。更改此设置可能会导致集群不稳定。
cluster.follower_lag.timeout
(静态) 设置主节点等待滞后节点确认集群状态更新的时间。默认值为90s。如果节点在此时间段内未成功应用集群状态更新,则认为该节点已失败并将其从集群中移除。请参阅 发布集群状态
cluster.max_voting_config_exclusions
(动态) 设置在任何时候投票配置排除的最大数量限制。 默认值是 10。请参阅 添加和删除集群中的节点
cluster.publish.info_timeout
(静态) 设置主节点在记录消息指示某些节点响应缓慢之前,等待每个集群状态更新完全发布到所有节点的时间。默认值为 10s
cluster.publish.timeout
(静态) 设置主节点等待每个集群状态更新完全发布到所有节点的时间,除非discovery.type设置为 single-node。默认值是30s。参见发布集群状态
cluster.discovery_configuration_check.interval
(静态) 设置某些检查的间隔时间,这些检查将记录有关发现配置不正确的警告。默认值为 30s
cluster.join_validation.cache_timeout
(静态) 当一个节点请求加入集群时,被选中的主节点会向其发送一份最近的集群状态副本,以检测可能阻止新节点加入集群的某些问题。主节点会缓存它发送的状态,并在另一个节点很快加入集群时使用缓存的状态。此设置控制主节点在清除该缓存之前等待的时间。默认为 60s
cluster.no_master_block

(动态) 指定在集群中没有活动主节点时拒绝哪些操作。此设置有三个有效值:

all
节点上的所有操作(包括读和写操作)都被拒绝。这也适用于API集群状态的读或写操作,如获取索引设置、更新映射和集群状态API。
write
(默认)写操作被拒绝。读操作成功,基于最后已知的集群配置。这种情况可能导致部分读取到陈旧数据,因为该节点可能与集群的其他部分隔离。
metadata_write
仅元数据写操作(例如映射更新、路由表更改)被拒绝,但常规索引操作继续工作。读和写操作成功,基于最后已知的集群配置。这种情况可能导致部分读取到陈旧数据,因为该节点可能与集群的其他部分隔离。
  • cluster.no_master_block 设置不适用于基于节点的API(例如,集群统计信息、节点信息和节点统计信息API)。对这些API的请求不会被阻止,并且可以在任何可用节点上运行。
  • 为了使集群完全正常运行,它必须有一个活动的主节点。
monitor.fs.health.enabled
(动态) 如果true,节点会定期运行 文件系统健康检查。默认为true
monitor.fs.health.refresh_interval
(静态) 连续的 文件系统健康检查之间的间隔。默认为2m
monitor.fs.health.slow_path_logging_threshold
(动态) 如果一个文件系统健康检查 花费的时间超过此阈值,Elasticsearch 将记录一个警告。默认为 5s

字段数据缓存设置

edit

字段数据缓存包含字段数据全局序号, 这两者都用于支持对某些字段类型的聚合。 由于这些是堆上数据结构,因此监控缓存的使用情况非常重要。

缓存大小

edit

缓存中的条目构建成本高昂,因此默认行为是将缓存保留在内存中。默认缓存大小是无限的,导致缓存增长直到达到由字段数据断路器设置的限制。此行为可以进行配置。

如果设置了缓存大小限制,缓存将开始清除最近更新最少的条目。此设置可以自动避免断路器限制,但代价是根据需要重建缓存。

如果达到了断路器限制,进一步增加缓存大小的请求将被阻止。在这种情况下,您应该手动清除缓存

indices.fielddata.cache.size
(静态) 字段数据缓存的最大大小,例如节点堆空间的38%,或绝对值,例如12GB。默认为无限制。如果选择设置它,应小于字段数据断路器限制。

监控字段数据

edit

您可以使用节点统计APIcat fielddata API来监控字段数据的内存使用情况以及字段数据断路器。

Elasticsearch 中的健康诊断设置

edit

以下是用于配置内部诊断服务的专家级设置。 该服务的输出目前通过健康API Health API 暴露。不建议将这些设置从默认值更改。

集群级别设置

edit
health.master_history.has_master_lookup_timeframe
(静态) 节点在继续进行其他检查之前,查看它是否已经观察到主节点的总时间。默认为 30s(30 秒)。
master_history.max_age
(静态) 我们记录主节点历史的时间段,用于诊断集群健康状况。超过此时间的主节点变更将不会在诊断集群健康状况时被考虑。默认为 30m(30 分钟)。
health.master_history.identity_changes_threshold
(静态) 节点见证的主身份变化次数,指示集群不健康。 默认为 4
health.master_history.no_master_transitions_threshold
(静态) 节点见证的无主状态转换次数,表明集群不健康。 默认为 4
health.node.enabled
(动态) 启用健康节点,这使得健康 API 能够提供关于集群范围健康方面的指示,例如磁盘空间。
health.reporting.local.monitor.interval
(动态) 确定集群中每个节点监控其本地健康状况(如磁盘使用情况)的间隔时间。
health.ilm.max_time_on_action
(动态) 索引在索引生命周期管理 (ILM) 操作中必须经过的最短时间,之后才会被视为停滞。默认为 1d(1天)。
health.ilm.max_time_on_step
(动态) 索引在ILM步骤中必须经过的最短时间,之后才会被视为停滞。默认为1d(1天)。
health.ilm.max_retries_per_step
(动态) 一个索引在ILM步骤中重试的最小次数,超过此次数后被视为停滞。默认为 100
health.periodic_logger.enabled
(动态) 启用健康周期记录器,该记录器记录每个健康指示器的健康状态以及由健康API观察到的顶级健康状态。 默认为 false
health.periodic_logger.poll_interval
(动态, 时间单位值) Elasticsearch 记录集群健康状态以及 Health API 观察到的每个健康指标的频率。 默认为 60s(60 秒)。

Elasticsearch 中的索引生命周期管理设置

edit

这些是用于配置索引生命周期管理 (ILM) 的可用设置。

集群级别设置

edit
xpack.ilm.enabled
(静态, 布尔值) [7.8.0] 在7.8.0中已弃用。基础许可证功能始终启用
此已弃用设置无效,并将在Elasticsearch 8.0中移除。
indices.lifecycle.history_index_enabled
(动态, 布尔值) 是否启用 ILM 的历史索引。如果启用,ILM 将记录作为 ILM 策略一部分执行的操作历史到 ilm-history-* 索引中。默认为 true
indices.lifecycle.poll_interval
(动态, 时间单位值) 索引生命周期管理检查符合策略标准的索引的频率。默认为10m
indices.lifecycle.rollover.only_if_has_documents
(动态, 布尔值) 是否仅对非空索引进行ILM滚动更新。如果启用,ILM将仅对包含至少一个文档的索引进行滚动更新。默认为true

索引级别设置

edit

这些索引级别的ILM设置通常通过索引模板进行配置。更多信息,请参见创建生命周期策略

index.lifecycle.indexing_complete
(动态, 布尔值) 指示索引是否已被滚动更新。 当ILM完成滚动更新操作时,自动设置为true。 您可以显式地将其设置为跳过滚动更新。 默认为false
index.lifecycle.name
(动态, 字符串) 用于管理索引的策略名称。有关 Elasticsearch 如何应用策略更改的信息,请参阅 策略更新。 如果您正在从快照恢复之前由索引生命周期管理管理的索引, 您可以在恢复操作期间将此设置覆盖为 null,以禁用对索引的进一步管理。另请参阅 索引级别设置
index.lifecycle.origination_date
(动态, 长整型) 如果指定,这是用于计算索引阶段转换的时间戳。 如果您创建了一个包含旧数据的新索引,并且 希望使用原始创建日期来计算索引年龄,请使用此设置。 以毫秒为单位的 Unix 时间戳值指定。
index.lifecycle.parse_origination_date
(动态, 布尔值) 设置为 true 以从索引名称中解析原始日期。 此原始日期用于计算索引年龄以进行其阶段转换。 索引名称必须匹配模式 ^.*-{date_format}-\\d+, 其中 date_formatyyyy.MM.dd,后面的数字是可选的。 通常,被滚动的索引会匹配完整格式, 例如 logs-2016.10.31-000002)。 如果索引名称不匹配该模式,索引创建将失败。
index.lifecycle.step.wait_time_threshold
(动态, 时间值) 等待集群在执行 ILM shrink 操作期间解决分配问题的时间。必须大于 1h(1 小时)。默认为 12h(12 小时)。请参阅 收缩的分片分配
index.lifecycle.rollover_alias
(动态, 字符串) 当索引滚动时更新的索引别名。在使用包含滚动操作的策略时指定。当索引滚动时,别名会更新以反映该索引不再是写入索引。有关滚动索引的更多信息,请参阅滚动。 如果您正在从快照恢复一个之前由索引生命周期管理管理的索引,您可以在恢复操作期间将此设置覆盖为null,以禁用对未来索引的进一步管理。另请参阅索引级别设置

Elasticsearch 中的数据流生命周期设置

edit

这些是用于配置数据流生命周期的可用设置。

集群级别设置

edit
data_streams.lifecycle.retention.max
(动态, 时间单位值) 应用于由数据流生命周期管理的所有用户数据流的最大保留期。最大保留期还将覆盖配置的保留期超过最大保留期的数据流的保留期。它应大于10s
data_streams.lifecycle.retention.default
(动态, 时间单位值) 将应用于由数据流生命周期管理的所有用户数据流(未配置保留期的数据流)的保留期。 它应大于 10s 且小于或等于 data_streams.lifecycle.retention.max
data_streams.lifecycle.poll_interval
(动态, 时间单位值) Elasticsearch检查所有具有内置生命周期的数据流的下一个操作的频率。默认为 5m
cluster.lifecycle.default.rollover

(动态, 字符串) 此属性接受一个键值对格式的字符串,并配置触发数据流在配置了生命周期时进行滚动更新的条件。此属性是一个实现细节,可能会发生变化。目前,它默认设置为max_age=auto,max_primary_shard_size=50gb,min_docs=1,max_primary_shard_docs=200000000,这意味着如果满足以下任一条件,您的数据流将进行滚动更新:

  • 任何一个主分片达到50GB的大小,
  • 或者任何一个主分片包含200,000,000个文档,
  • 或者索引达到一个取决于您的数据流保留时间的特定年龄,
  • 并且至少有一个文档。
data_streams.lifecycle.target.merge.policy.merge_factor
(动态, 整数) 数据流生命周期通过更新目标后备索引的Lucene合并策略因子来实现尾部合并。合并因子 既是应该合并在一起的段数,也是我们在给定层级上期望找到的最大段数。 此设置控制数据流生命周期在目标索引上配置的值。它默认为16。 该值将在目标索引的index.merge.policy.merge_factor索引设置下可见。
data_streams.lifecycle.target.merge.policy.floor_segment
(动态) 数据流生命周期通过更新目标后备索引的Lucene合并策略基础段来实现尾部合并。这个基础段大小是一种防止索引具有大量非常小段的方法。此设置控制数据流生命周期在目标索引上配置的值。它默认为100MB
data_streams.lifecycle.signalling.error_retry_interval
(动态, 整数) 表示数据流生命周期在错误步骤中对索引执行的重试次数,以发出信号表明索引未在进展(即它卡在错误步骤中)。 当前的信号机制是在错误级别记录日志,然而,未来的信号机制可能会扩展。 默认值为10次重试。

索引级别设置

edit

以下索引级别设置通常配置在数据流的备份索引上。

index.lifecycle.prefer_ilm
(动态, 布尔值) 此设置确定在以下情况下哪个功能正在管理数据流的备份索引:仅当备份索引具有索引生命周期管理 (ILM) 策略且数据流也具有内置生命周期时。当 true 时,此索引由 ILM 管理,当 false 时,备份索引由数据流生命周期管理。 默认为 true
index.lifecycle.origination_date
(动态, 长整型) 如果指定,这是用于计算此后备索引在滚动更新后生成年龄的时间戳。生成年龄用于确定数据保留,因此,如果您创建包含旧数据的后备索引,并希望确保保留期或其他生命周期部分基于数据的原始时间戳而不是它们被索引的时间戳来应用,您可以使用此设置。以毫秒为单位的Unix纪元值指定。

索引管理设置

edit

您可以使用以下集群设置来启用或禁用索引管理功能。

action.auto_create_index logo cloud
(动态) 如果索引尚不存在,则自动创建索引 并应用任何配置的索引模板。默认为 true
action.destructive_requires_name logo cloud
(动态) 当设置为true时,您必须指定索引名称以删除索引。无法使用_all或通配符删除所有索引。默认为true
cluster.indices.close.enable logo cloud

(动态) 启用 Elasticsearch 中 关闭已打开的索引。如果设置为 false,则无法关闭已打开的索引。默认为 true

已关闭的索引仍然占用大量磁盘空间。

reindex.remote.whitelist logo cloud
(静态) 指定可以从远程重新索引的主机。期望一个包含host:port字符串的YAML数组。由逗号分隔的host:port条目组成。默认为["\*.io:*", "\*.com:*"]
stack.templates.enabled

(动态) 如果true,启用内置的索引和组件模板。 Elastic Agent使用这些模板来创建数据流。如果false,Elasticsearch将禁用这些索引和组件模板。默认为true

此设置影响以下内置索引模板:

  • logs-*-*
  • metrics-*-*
  • synthetics-*-*
  • profiling-*
  • security_solution-*-*

此设置还会影响以下内置组件模板:

  • logs@mappings
  • logs@settings
  • metrics@mappings
  • metrics@settings
  • metrics@tsdb-settings
  • synthetics@mapping
  • synthetics@settings

索引恢复设置

edit

对等恢复将数据从主分片同步到一个新的或现有的分片副本。

当 Elasticsearch 发生以下情况时,节点恢复会自动进行:

  • 在节点故障期间重新创建丢失的分片
  • 由于集群重新平衡或对 分片分配设置的更改,将分片重新定位到另一个节点

您可以使用cat recovery API查看正在进行和已完成恢复的列表。

恢复设置

edit
indices.recovery.max_bytes_per_sec

(动态) 限制每个节点的总入站和出站恢复流量。适用于对等恢复以及快照恢复(即从快照恢复)。默认值为 40mb,除非节点是专用 冻结 节点,在这种情况下,默认值与节点可用的总内存相关:

总内存 冷和冻结节点上的默认恢复速率

≤ 4 GB

40 MB/秒

> 4 GB 且 ≤ 8 GB

60 MB/秒

> 8 GB 且 ≤ 16 GB

90 MB/秒

> 16 GB 且 ≤ 32 GB

125 MB/秒

> 32 GB

250 MB/秒

此限制适用于每个节点单独计算。如果集群中的多个节点同时执行恢复操作,集群的总恢复流量可能会超过此限制。

如果此限制过高,持续的恢复操作可能会消耗过多的带宽和其他资源,这可能会对您的集群性能产生影响,甚至在极端情况下可能导致集群不稳定。

这是一个动态设置,这意味着您可以在每个节点的 elasticsearch.yml 配置文件中设置它,并且可以使用 集群更新设置 API 动态更新它。如果您动态设置它,那么集群中的每个节点都适用相同的限制。如果您不动态设置它,那么您可以在每个节点上设置不同的限制,这在某些节点的带宽比其他节点更好的情况下非常有用。例如,如果您正在使用 索引生命周期管理,那么您可能能够为您的“热”节点设置比“温”节点更高的恢复带宽限制。

专家对等恢复设置

edit

您可以使用以下专家设置来管理对等恢复的资源。

indices.recovery.max_concurrent_file_chunks

(动态, 专家) 每个恢复中并行发送的文件块数量。默认为 2

当单个分片的恢复未达到由 indices.recovery.max_bytes_per_sec 设置的流量限制时,您可以增加此设置的值,最大可增加到 8

indices.recovery.max_concurrent_operations

(动态, 专家) 每个恢复并行发送的操作数量。默认为 1

在恢复期间并发重放操作可能会非常消耗资源,并且可能会干扰索引、搜索以及集群中的其他活动。在未仔细验证集群是否有足够的资源来处理由此产生的额外负载之前,请勿增加此设置。

indices.recovery.use_snapshots

(动态, 专家) 启用基于快照的对等恢复。

Elasticsearch 使用 对等恢复 过程来恢复副本并重新定位主分片,该过程涉及在目标节点上构建分片的新副本。 当 indices.recovery.use_snapshotsfalse 时,Elasticsearch 将通过从当前主分片传输索引数据来构建这个新副本。当此设置为 true 时,Elasticsearch 将首先尝试从最近的快照复制索引数据,并且只有在无法识别合适的快照时才会从主分片复制数据。默认为 true

将此选项设置为true可以降低您的运营成本,如果您的集群运行在节点间数据传输成本高于从快照恢复数据成本的环境中。它还可以减少主节点在恢复期间必须完成的工作量。

此外,具有设置 use_for_peer_recovery=true 的存储库将在恢复分片时被咨询以找到一个好的快照。如果所有已注册的存储库都没有定义此设置,索引文件将从源节点恢复。

indices.recovery.max_concurrent_snapshot_file_downloads

(动态, 专家) 每个恢复过程中并发发送到目标节点的快照文件下载请求的数量。默认为 5

在未仔细验证您的集群是否具备处理由此产生的额外负载的资源之前,请不要增加此设置。

indices.recovery.max_concurrent_snapshot_file_downloads_per_node

(动态, 专家) 在目标节点上并行执行的所有恢复操作中的快照文件下载请求数量。默认为 25

在未仔细验证您的集群是否具备处理由此产生的额外负载的资源之前,请不要增加此设置。

托管服务的恢复设置

edit

此功能旨在供 Elasticsearch ServiceElastic Cloud EnterpriseElastic Cloud on Kubernetes 间接使用。不支持直接使用。

当将 Elasticsearch 作为托管服务运行时,以下设置允许服务为每个节点的磁盘读取、磁盘写入和网络流量指定绝对最大带宽,并允许您根据这些绝对最大值控制每个节点的最大恢复带宽。它们有两个效果:

  1. 如果未设置indices.recovery.max_bytes_per_sec,它们将确定用于恢复的带宽,覆盖上述默认行为。
  2. 它们对恢复带宽施加了一个节点范围的限制,该限制独立于indices.recovery.max_bytes_per_sec的值。

如果您没有设置 indices.recovery.max_bytes_per_sec,那么最大恢复带宽将根据绝对最大带宽的比例来计算。该计算分别针对读取和写入流量进行。服务使用 node.bandwidth.recovery.disk.readnode.bandwidth.recovery.disk.writenode.bandwidth.recovery.network 分别定义磁盘读取、磁盘写入和网络传输的绝对最大带宽,您可以通过调整 node.bandwidth.recovery.factor.readnode.bandwidth.recovery.factor.write 来设置用于恢复的绝对最大带宽的比例。如果启用了操作员权限功能,则服务还可以使用这些设置的操作员专用变体来设置默认比例。

如果你设置了indices.recovery.max_bytes_per_sec,那么Elasticsearch将使用它的值作为最大恢复带宽,只要这不超过节点范围的限制。Elasticsearch通过将绝对最大带宽乘以node.bandwidth.recovery.operator.factor.max_overcommit因子来计算节点范围的限制。如果你设置的indices.recovery.max_bytes_per_sec超过了节点范围的限制,那么节点范围的限制将优先。

该服务应通过实验确定绝对最大带宽设置的值,使用类似于恢复的工作负载,其中多个并发工作线程分别按顺序处理512kiB大小的文件块。

node.bandwidth.recovery.disk.read
(每秒字节值)节点在类似恢复工作负载下的绝对最大磁盘读取速度。如果设置, node.bandwidth.recovery.disk.writenode.bandwidth.recovery.network 也必须设置。
node.bandwidth.recovery.disk.write
(每秒字节值)节点上类似恢复工作负载的绝对最大磁盘写入速度。如果设置, node.bandwidth.recovery.disk.readnode.bandwidth.recovery.network 也必须设置。
node.bandwidth.recovery.network
(每秒字节值)节点上类似恢复工作负载的绝对最大网络吞吐量,适用于读取和写入。如果设置,node.bandwidth.recovery.disk.readnode.bandwidth.recovery.disk.write也必须设置。
node.bandwidth.recovery.factor.read
(浮点数, 动态) 如果未设置 indices.recovery.max_bytes_per_sec,则可用于恢复的最大读取带宽的比例。必须大于 0 且 不大于 1。如果未设置,则使用 node.bandwidth.recovery.operator.factor.read 的值。如果没有设置因子,则使用值 0.4
node.bandwidth.recovery.factor.write
(浮点数, 动态) 如果未设置 indices.recovery.max_bytes_per_sec,则可用于恢复的最大写入带宽的比例。必须大于 0 且 不大于 1。如果未设置,则使用 node.bandwidth.recovery.operator.factor.write 的值。如果没有设置因子,则使用值 0.4
node.bandwidth.recovery.operator.factor.read
(浮点数, 动态) 如果没有设置 indices.recovery.max_bytes_per_secnode.bandwidth.recovery.factor.read, 则用于恢复的最大读取带宽的比例。必须大于 0 且不大于 1。如果未设置,则使用 node.bandwidth.recovery.operator.factor 的值。如果没有设置因子,则使用值 0.4。 当启用操作员权限功能时,此设置只能由操作员用户更新。
node.bandwidth.recovery.operator.factor.write
(浮点数, 动态) 如果没有设置 indices.recovery.max_bytes_per_secnode.bandwidth.recovery.factor.write, 则用于恢复的最大写入带宽的比例。必须大于 0 且不大于 1。如果未设置,则使用 node.bandwidth.recovery.operator.factor 的值。如果没有设置因子,则使用值 0.4。 当启用操作员权限功能时,此设置只能由操作员用户更新。
node.bandwidth.recovery.operator.factor
(浮点数, 动态) 如果没有设置 indices.recovery.max_bytes_per_sec 或其他因素设置,则可能用于恢复的最大带宽比例。 必须大于 0 且不大于 1。默认值为 0.4。当启用操作员权限功能时,此设置只能由操作员用户更新。
node.bandwidth.recovery.operator.factor.max_overcommit
(浮点数, 动态) 无论其他任何设置,可用于恢复的绝对最大带宽的比例。必须大于 0。默认值为 100。当启用操作员权限功能时,此设置只能由操作员用户更新。

索引缓冲区设置

edit

索引缓冲区用于存储新索引的文档。当它填满时,缓冲区中的文档会被写入磁盘上的一个段。它在该节点上的所有分片之间分配。

以下设置是静态的,必须在集群中的每个数据节点上进行配置:

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 被指定为百分比,那么可以使用此设置来指定一个绝对最大值。默认为无限制。

许可证设置

edit

您可以在 elasticsearch.yml 文件中配置此许可证设置。 更多信息,请参阅 许可证管理

xpack.license.self_generated.type

(静态) 设置为 basic(默认)以启用基本 X-Pack 功能。

如果设置为 trial,自生成的许可证仅允许访问 x-pack 的所有功能 30 天。如果需要,您可以稍后将集群降级为基本许可证。

本地网关设置

edit

本地网关在集群完全重启时存储集群状态和分片数据。

以下静态设置必须在每个主节点上设置,控制新当选的主节点在尝试恢复集群状态和集群数据之前应等待多长时间。

这些设置仅在全集群重启期间生效。

gateway.expected_data_nodes
(静态) 集群中预期的数据节点数量。 当预期的数据节点数量加入集群时,本地分片的恢复开始。默认值为0
gateway.recover_after_time

(静态) 如果预期的节点数量未达到,恢复过程将在尝试恢复之前等待配置的时间。 默认为 5m

一旦 recover_after_time 持续时间超时,只要满足以下条件,恢复就会开始:

gateway.recover_after_data_nodes
(静态) 只要有这么多数据节点加入集群,就会进行恢复。

这些设置可以在 elasticsearch.yml 中如下配置:

gateway.expected_data_nodes: 3
gateway.recover_after_time: 600s
gateway.recover_after_data_nodes: 3

悬挂索引

edit

当一个节点加入集群时,如果它在其本地数据目录中发现任何尚未存在于集群中的分片,它会将这些分片视为属于一个“悬空”索引。您可以使用悬空索引API列出、导入或删除悬空索引。

API无法保证导入的数据是否真正代表了索引仍然是集群一部分时的最新数据状态。

日志记录

edit

您可以使用 Elasticsearch 的应用程序日志来监控您的集群并诊断问题。 如果您将 Elasticsearch 作为服务运行,日志的默认位置会根据您的平台和安装方法而有所不同:

Docker上,日志消息会输出到控制台,并由配置的Docker日志驱动程序处理。要访问日志,请运行docker logs

如果你从命令行运行 Elasticsearch,Elasticsearch 会将日志打印到标准输出(stdout)。

日志配置

edit

Elastic 强烈建议使用默认提供的 Log4j 2 配置。

Elasticsearch 使用 Log4j 2 进行日志记录。Log4j 2 可以通过 log4j2.properties 文件进行配置。Elasticsearch 暴露了三个属性,${sys:es.logs.base_path}${sys:es.logs.cluster_name}${sys:es.logs.node_name},这些属性可以在配置文件中引用以确定日志文件的位置。属性 ${sys:es.logs.base_path} 将解析为日志目录,${sys:es.logs.cluster_name} 将解析为集群名称(在默认配置中用作日志文件名的前缀),而 ${sys:es.logs.node_name} 将解析为节点名称(如果节点名称已明确设置)。

例如,如果你的日志目录(path.logs)是 /var/log/elasticsearch 并且 你的集群名为 production,那么 ${sys:es.logs.base_path} 将解析为 /var/log/elasticsearch,并且 ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log 将解析为 /var/log/elasticsearch/production.log

######## Server JSON ############################
appender.rolling.type = RollingFile 
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json 
appender.rolling.layout.type = ECSJsonLayout 
appender.rolling.layout.dataset = elasticsearch.server 
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz 
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 1 
appender.rolling.policies.time.modulate = true 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 256MB 
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize 
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 
################################################

配置 RollingFile 追加器

日志记录到 /var/log/elasticsearch/production_server.json

使用JSON布局。

dataset 是一个标志,用于填充 event.dataset 字段在 ECSJsonLayout 中。 它可以在解析日志时更容易地区分不同类型的日志。

将日志滚动到 /var/log/elasticsearch/production-yyyy-MM-dd-i.json;每次滚动时日志将被压缩,并且 i 将递增

使用基于时间的滚动策略

每日滚动日志

在日期边界上对齐滚动(而不是每二十四小时滚动一次)

使用基于大小的滚动策略

日志在达到256 MB后滚动

滚动日志时使用删除操作

仅删除匹配文件模式的日志

模式是仅删除主日志

仅在积累了过多压缩日志时删除

压缩日志的大小条件是2 GB

######## Server -  old style pattern ###########
appender.rolling_old.type = RollingFile
appender.rolling_old.name = rolling_old
appender.rolling_old.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log 
appender.rolling_old.layout.type = PatternLayout
appender.rolling_old.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
appender.rolling_old.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.old_log.gz

旧样式模式追加器的配置。这些日志将保存在*.log文件中,如果归档,则会在*.log.gz文件中。请注意,这些应被视为已弃用,并将在未来被移除。

Log4j 的配置解析会被多余的空格所混淆;如果你复制并粘贴此页面上的任何 Log4j 设置,或通常输入任何 Log4j 配置,请确保去除任何前导和尾随的空格。

请注意,您可以在appender.rolling.filePattern中将.gz替换为.zip,以使用zip格式压缩滚动日志。如果您移除.gz扩展名,则日志在滚动时将不会被压缩。

如果您希望保留日志文件指定的时间,可以使用带有删除操作的滚动策略。

appender.rolling.strategy.type = DefaultRolloverStrategy 
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} 
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified 
appender.rolling.strategy.action.condition.nested_condition.age = 7D 

配置 DefaultRolloverStrategy

配置用于处理翻转的删除操作

Elasticsearch 日志的基本路径

处理滚动时的应用条件

从基本路径中删除与全局匹配的文件 ${sys:es.logs.cluster_name}-*;这是日志文件滚动到的全局模式;这是为了仅删除滚动的Elasticsearch日志,而不同时删除弃用和慢日志

应用于匹配全局模式的文件的嵌套条件

保留日志七天

可以加载多个配置文件(在这种情况下它们将被合并),只要它们命名为log4j2.properties并且具有Elasticsearch配置目录作为祖先;这对于公开额外日志记录器的插件很有用。日志记录器部分包含Java包及其对应的日志级别。appender部分包含日志的输出目标。关于如何自定义日志记录以及所有支持的appender的详细信息,可以在Log4j文档中找到。

配置日志级别

edit

Log4J 2 日志消息包括一个 级别 字段,它是以下之一(按详细程度递增的顺序):

  • 致命
  • 错误
  • 警告
  • 信息
  • 调试
  • 跟踪

默认情况下,Elasticsearch 在其日志中包含所有级别的 INFOWARNERRORFATAL 的消息,但过滤掉 DEBUGTRACE 级别的消息。 这是推荐的配置。不要过滤掉 INFO 或更高日志级别的消息,否则您可能无法理解集群的行为或解决常见问题。除非您是按照本手册中其他地方的指示要求更详细的日志记录,或者您是专家用户,将会阅读 Elasticsearch 源代码以确定日志的含义,否则不要启用 DEBUGTRACE 级别的日志记录。

消息由与 Elasticsearch 源代码中的 Java 包和类层次结构相匹配的日志记录器层次结构记录。每个日志记录器都有一个相应的 动态设置,可用于控制其日志的详细程度。设置的名称是包或类的完全限定名称,前缀为 logger.

您可以将每个记录器的详细程度设置为日志级别的名称,例如 DEBUG,这意味着来自该记录器的级别直到指定级别的消息都将包含在日志中。您也可以使用值 OFF 来 抑制该记录器的所有消息。

例如,org.elasticsearch.discovery 包包含与发现过程相关的功能,您可以通过 logger.org.elasticsearch.discovery 设置来控制其日志的详细程度。要为此包启用 DEBUG 日志记录,请使用集群更新设置 API 如下:

PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": "DEBUG"
  }
}

要将此包的日志详细程度重置为其默认级别,请将日志记录设置设置为 null

PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": null
  }
}

其他更改日志级别的方法包括:

  1. elasticsearch.yml:

    logger.org.elasticsearch.discovery: DEBUG

    这在调试单个节点上的问题时最为合适。

  2. log4j2.properties:

    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

    当你已经有其他原因需要更改Log4j 2配置时,这是最合适的。例如,你可能希望将某个特定日志记录器的日志发送到另一个文件。然而,这些用例是很少见的。

Elasticsearch 的应用日志是为人类阅读和解释而设计的。不同版本的 Elasticsearch 可能会以不同的方式在这些日志中报告信息,可能会添加额外的细节,删除不必要的信息,以不同的方式格式化相同的信息,重命名记录器或调整特定消息的日志级别。不要依赖于应用日志的内容在不同版本之间保持完全一致。

为了防止在日志中泄露敏感信息,Elasticsearch 默认情况下即使在最高详细级别也会抑制某些日志消息。要在节点上禁用此保护,请将 Java 系统属性 es.insecure_network_trace_enabled 设置为 true。此功能主要用于不包含任何敏感信息的测试系统。如果您在包含敏感信息的系统上设置此属性,则必须保护您的日志免受未经授权的访问。

弃用日志记录

edit

Elasticsearch 还会将弃用日志写入日志目录。这些日志会在您使用已弃用的 Elasticsearch 功能时记录一条消息。您可以使用弃用日志在升级 Elasticsearch 到新主要版本之前更新您的应用程序。

默认情况下,Elasticsearch 在 1GB 时滚动并压缩弃用日志。默认配置最多保留五个日志文件:四个滚动日志和一个活动日志。

Elasticsearch 在 CRITICAL 级别发出弃用日志消息。这些消息表明使用的弃用功能将在下一个主要版本中被移除。WARN 级别的弃用日志消息表示使用了不太重要的功能,它不会在下一个主要版本中被移除,但可能会在未来被移除。

要停止写入弃用日志消息,请在 log4j2.properties 中将 logger.deprecation.level 设置为 OFF

logger.deprecation.level = OFF

或者,您可以动态更改日志记录级别:

PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.deprecation": "OFF"
  }
}

请参阅配置日志级别

如果使用了 X-Opaque-Id 作为 HTTP 头,您可以识别是什么触发了已弃用的功能。 用户 ID 包含在弃用 JSON 日志的 X-Opaque-Id 字段中。

{
  "type": "deprecation",
  "timestamp": "2019-08-30T12:07:07,126+02:00",
  "level": "WARN",
  "component": "o.e.d.r.a.a.i.RestCreateIndexAction",
  "cluster.name": "distribution_run",
  "node.name": "node-0",
  "message": "[types removal] Using include_type_name in create index requests is deprecated. The parameter will be removed in the next major version.",
  "x-opaque-id": "MY_USER_ID",
  "cluster.uuid": "Aq-c-PAeQiK3tfBYtig9Bw",
  "node.id": "D7fUYfnfTLa2D7y-xw6tZg"
}

弃用日志可以被索引到 .logs-deprecation.elasticsearch-default 数据流中, cluster.deprecation_indexing.enabled 设置为 true。

弃用日志限流

edit

弃用日志根据弃用功能键和x-opaque-id进行去重,以便如果某个功能被反复使用,不会使弃用日志过载。 这适用于索引弃用日志和记录到日志文件的日志。 您可以通过将cluster.deprecation_indexing.x_opaque_id_used.enabled更改为false来禁用在节流中使用x-opaque-id, 更多详情请参阅此类的javadoc

JSON 日志格式

edit

为了使解析Elasticsearch日志更加容易,日志现在以JSON格式打印。 这是通过Log4J布局属性appender.rolling.layout.type = ECSJsonLayout配置的。 此布局需要设置一个dataset属性,该属性用于在解析时区分日志流。

appender.rolling.layout.type = ECSJsonLayout
appender.rolling.layout.dataset = elasticsearch.server

每行包含一个带有在ECSJsonLayout中配置的属性的单一JSON文档。 有关更多详细信息,请参阅此类的javadoc。 然而,如果一个JSON文档包含异常,它将被打印在多行上。 第一行将包含常规属性,后续行将包含格式化为JSON数组的堆栈跟踪。

您仍然可以使用自己的自定义布局。为此,请将行 appender.rolling.layout.type 替换为不同的布局。请参见下面的示例:

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz

Elasticsearch 中的机器学习设置

edit

您无需配置任何设置即可使用机器学习。它是默认启用的。

机器学习在x86_64机器上使用SSE4.2指令,因此它只能在支持SSE4.2的x86_64机器上运行。(此限制不适用于aarch64机器。)如果您在较旧的x86_64硬件上运行Elasticsearch,则必须禁用机器学习(通过将xpack.ml.enabled设置为false)。在这种情况下,您根本不应该尝试在集群中使用机器学习功能。

通用机器学习设置

edit
node.roles: [ ml ]

(静态) 将 node.roles 设置为包含 ml 以标识 该节点为 机器学习节点。如果您想运行机器学习作业,您的集群中必须至少有一个机器学习节点。

如果你设置了node.roles,你必须明确指定节点所需的所有角色。要了解更多信息,请参阅Nodes

  • 在专用协调节点或专用主节点上,不要设置 ml 角色。
  • 强烈建议专用机器学习节点也具有 remote_cluster_client 角色;否则,在使用机器学习作业或 数据馈送时,跨集群搜索将失败。请参阅 远程节点
xpack.ml.enabled

(静态) 默认值 (true) 启用节点上的机器学习 API。

如果您想在集群中使用机器学习功能,建议您在所有节点上使用此设置的默认值。

如果设置为false,则该节点上的机器学习API将被禁用。例如,该节点无法打开作业、启动数据馈送、接收传输(内部)通信请求或与机器学习API相关的客户端(包括Kibana)请求。如果xpack.ml.enabled在集群中的所有节点上未统一设置,则可能会遇到机器学习功能无法完全正常工作的问题。

如果在任何节点上xpack.ml.enabled设置为false,则不得使用摄取管道中的任何机器学习功能。在将xpack.ml.enabled设置为false之前,请考虑您是否真的只想从node.roles中排除ml。从node.roles中排除ml将阻止节点运行机器学习作业和NLP模型,但它仍然会意识到机器学习功能的存在。将xpack.ml.enabled设置为false应保留用于由于硬件限制而无法在集群中使用机器学习功能的情况,如上文所述。

xpack.ml.inference_model.cache_size
(静态) 允许的最大推理缓存大小。 推理缓存存在于每个摄取节点的JVM堆中。该缓存 为推理处理器提供了更快的处理时间。该值可以是 静态的字节大小值(例如2gb)或总分配堆的百分比。默认为40%。另请参阅机器学习断路器设置
xpack.ml.inference_model.time_to_live logo cloud
(静态) 推理模型缓存中训练模型的生存时间 (TTL)。TTL 从上次访问开始计算。缓存的用户(如推理处理器或推理聚合器)在首次使用时缓存模型,并在每次使用时重置 TTL。如果缓存的模型在 TTL 持续时间内未被访问,则会被标记为从缓存中逐出。如果稍后处理文档,模型将再次加载到缓存中。要在 Elasticsearch Service 中更新此设置,请参阅 添加 Elasticsearch 用户设置。默认为 5m
xpack.ml.max_inference_processors
(动态) 所有摄取管道中允许的推理类型处理器的总数。一旦达到限制,将推理处理器添加到管道中将被禁止。默认值为50
xpack.ml.max_machine_memory_percent

(动态) 机器学习在运行分析过程时可能使用的机器内存的最大百分比。这些过程与Elasticsearch JVM是分开的。限制是基于机器的总内存,而不是当前的可用内存。如果分配作业会导致机器学习作业的估计内存使用量超过限制,则不会将作业分配给节点。当启用操作员权限功能时,只有操作员用户可以更新此设置。最小值为5;最大值为200。默认值为30

不要将此设置配置为高于运行 Elasticsearch JVM 后剩余内存的值,除非你有足够的交换空间来容纳它,并且已经确定这对于专业用例是合适的配置。最大设置值适用于特殊情况,即已经确定使用交换空间进行机器学习作业是可以接受的。通常的最佳实践是不要在 Elasticsearch 节点上使用交换空间。

xpack.ml.max_model_memory_limit
(动态) 在此集群中,任何机器学习作业可以设置的最大model_memory_limit属性值。如果您尝试创建一个model_memory_limit属性值大于此设置值的作业,将会发生错误。现有作业在更新此设置时不会受到影响。如果此设置为0或未设置,则没有最大model_memory_limit值。如果没有满足作业内存要求的节点,这种没有最大内存限制的情况意味着可能创建无法分配给任何可用节点的作业。有关model_memory_limit属性的更多信息,请参阅创建异常检测作业创建数据框分析作业。如果xpack.ml.use_auto_machine_memory_percentfalse,则默认为0。如果xpack.ml.use_auto_machine_memory_percenttrue且未明确设置xpack.ml.max_model_memory_limit,则它将默认为集群中可以分配的最大model_memory_limit
xpack.ml.max_open_jobs
(动态) 节点上可以同时运行的最大作业数量。在此上下文中,作业包括异常检测作业和数据框分析作业。最大作业数量也受内存使用限制。因此,如果作业的估计内存使用量超过允许值,则节点上运行的作业数量将减少。在7.1版本之前,此设置是每个节点的非动态设置。它在7.1版本中变为集群范围的动态设置。因此,节点启动后对其值的更改仅在集群中的每个节点都运行7.1或更高版本后才会生效。最小值为1;最大值为512。默认值为512
xpack.ml.nightly_maintenance_requests_per_second
(动态) 夜间维护任务删除过期模型快照和结果的速率。该设置是用于控制删除请求的requests_per_second参数的代理,并控制节流。当启用操作员权限功能时,此设置只能由操作员用户更新。有效值必须大于0.0或等于-1.0,其中-1.0表示使用默认值。默认为-1.0
xpack.ml.node_concurrent_job_allocations
(动态) 每个节点上可以同时处于opening状态的最大作业数量。通常,作业在此状态下花费的时间很短,之后它们会进入open状态。当作业在打开时需要恢复大型模型时,它们会在opening状态下花费更多时间。当启用操作员权限功能时,只有操作员用户可以更新此设置。默认为2

高级机器学习设置

edit

这些设置适用于高级使用场景;默认值通常已经足够:

xpack.ml.enable_config_migration
(动态) 保留。当启用操作员权限功能时,此设置只能由操作员用户更新。
xpack.ml.max_anomaly_records
(动态) 每个桶输出的最大记录数。默认为 500
xpack.ml.max_lazy_ml_nodes

(动态) 懒启动的机器学习节点的数量。 在不需要机器学习节点直到第一个机器学习任务启动的情况下非常有用。如果当前机器学习节点的数量大于或等于此设置,则假设没有更多的懒节点可用,因为所需的节点数量已经配置。如果任务启动并且此设置的值大于零且没有节点可以接受任务,则任务保持在OPENING状态,直到新的机器学习节点被添加到集群并且任务被分配到该节点上运行。当操作员权限功能启用时,此设置只能由操作员用户更新。默认为0

此设置假设某个外部进程能够向集群添加机器学习节点。此设置仅在与这样的外部进程结合使用时才有用。

xpack.ml.max_ml_node_size
(动态) 在支持自动集群扩展的部署中,机器学习节点的最大节点大小。如果您将其设置为未来机器学习节点的最大可能大小, 当机器学习作业被分配到一个懒节点时,它可以检查(并快速失败)当扩展无法支持作业的大小时。当操作员权限功能启用时, 此设置只能由操作员用户更新。默认为 0b,这意味着将假设自动集群扩展可以向集群中添加任意大小的节点。
xpack.ml.model_repository

(动态) 机器学习模型仓库的位置,在受限或封闭网络中安装模型时,模型构件文件可用的位置。 xpack.ml.model_repository 可以是一个文件位置或HTTP/HTTPS服务器的字符串。示例值为:

xpack.ml.model_repository: file://${path.home}/config/models/

xpack.ml.model_repository: https://my-custom-backend

如果 xpack.ml.model_repository 是一个文件位置,它必须指向 Elasticsearch 的 config 目录的子目录。

xpack.ml.persist_results_max_retries
(动态) 在处理机器学习结果时,重试批量索引请求失败的最大次数。如果达到限制,机器学习作业将停止处理数据,并且其状态为失败。当启用操作员权限功能时,此设置只能由操作员用户更新。最小值为0;最大值为50。默认值为20
xpack.ml.process_connect_timeout
(动态) 机器学习进程的连接超时时间,这些进程独立于Elasticsearch JVM运行。当这些进程启动时,它们必须连接到Elasticsearch JVM。如果在指定的时间段内进程未能连接,则认为该进程已失败。当启用操作员权限功能时,只有操作员用户可以更新此设置。最小值为5s。默认值为10s
xpack.ml.use_auto_machine_memory_percent

(动态) 如果此设置为true,则忽略xpack.ml.max_machine_memory_percent设置。相反,用于运行机器学习分析过程的机器内存的最大百分比将自动计算,并考虑节点的总大小和节点上JVM的大小。当启用操作员权限功能时,此设置只能由操作员用户更新。默认值为false

  • 如果你没有专用的机器学习节点(也就是说,节点具有多个角色),请不要启用此设置。它的计算假设机器学习分析是节点的主要目的。
  • 该计算假设专用机器学习节点至少有256MB的内存保留在JVM之外。如果你的集群中有非常小的机器学习节点,你不应该使用此设置。

如果此设置为true,它还会影响xpack.ml.max_model_memory_limit的默认值。在这种情况下,xpack.ml.max_model_memory_limit默认为当前集群中可以分配的最大大小。

机器学习断路器设置

edit

相关的断路器设置可以在断路器页面中找到。

Elasticsearch 中的推理 API 设置

edit

您无需配置任何设置即可使用推理API。每个设置都有一个默认值。

推理 API 日志设置

edit

当某些故障发生时,会发出一条日志消息。在重复故障的情况下,日志限流器会限制重复消息的记录。

xpack.inference.logging.reset_interval
(动态) 指定清理线程清除先前记录的消息的内部缓存的时间间隔。默认为一天 (1d)。
xpack.inference.logging.wait_duration
(动态) 指定在记录一条消息后,再次记录该消息之前需要等待的时间。默认值为一小时 (1h)。

推理 API HTTP 设置

edit
xpack.inference.http.max_response_size
(动态) 指定HTTP响应允许的最大大小(以字节为单位), 默认为50mb,可配置的最大值为100mb
xpack.inference.http.max_total_connections
(动态) 指定内部连接池可以租用的最大连接数。默认为 50
xpack.inference.http.max_route_connections
(动态) 指定单个路由可以从内部连接池租用的最大连接数。如果此设置设置为等于或大于 xpack.inference.http.max_total_connections,则单个第三方服务可能会租用所有可用连接,而其他第三方服务将无法租用连接。默认为 20
xpack.inference.http.connection_eviction_interval
(动态) 指定驱逐线程运行以从内部连接池中移除过期和陈旧连接的时间间隔。减少此时间值可以帮助提高吞吐量,如果多个第三方服务在争夺池中可用连接的话。默认值为一分钟 (1m)。
xpack.inference.http.connection_eviction_max_idle_time
(动态) 指定连接在未使用的情况下可以保持的最大时长,超过该时长后连接将被标记为空闲并可以关闭并从共享连接池中移除。默认为一分钟 (1m)。
xpack.inference.http.request_executor.queue_capacity
(动态) 指定等待发送的请求的内部队列的大小。如果队列已满并且向推理API发送请求,则该请求将被拒绝。默认为 2000

推理 API HTTP 重试设置

edit

当第三方服务返回瞬态失败代码(例如,429)时,推理API会重试请求。这些设置管理重试行为。当请求被重试时,使用指数退避。

xpack.inference.http.retry.initial_delay
(动态) 指定重试请求前的初始延迟。默认为一秒 (1s)。
xpack.inference.http.retry.max_delay_bound
(动态) 指定请求的最大延迟。默认为五秒 (5s)。
xpack.inference.http.retry.timeout
(动态) 指定请求可以重试的最大时间。 一旦请求超过这个时间,请求将不再重试并返回失败。 默认为30秒 (30s)。

推理 API 输入文本

edit

对于某些第三方服务集成,当服务返回错误指示请求输入过大时,输入将被截断并重试请求。这些设置规定了如何执行截断。

xpack.inference.truncator.reduction_percentage
(动态) 如果第三方服务返回错误提示文本过长,则指定减少输入文本的百分比。默认为50% (0.5)。

Elasticsearch 中的监控设置

edit

在7.16版本中已弃用。

使用 Elasticsearch Monitoring 插件收集和发送监控数据已被弃用。推荐使用 Elastic Agent 和 Metricbeat 来收集和发送监控数据到监控集群。如果您之前配置了传统的收集方法,您应该迁移到使用 Elastic AgentMetricbeat 收集方法。

默认情况下,Elasticsearch 监控功能已启用,但数据收集被禁用。 要启用数据收集,请使用 xpack.monitoring.collection.enabled 设置。

除非另有说明,否则可以使用集群更新设置 API 在实时集群上动态更新这些设置。

要调整监控数据在监控UI中的显示方式,请在kibana.yml中配置xpack.monitoring设置。要控制从Logstash收集监控数据的方式,请在logstash.yml中配置监控设置。

更多信息,请参阅监控集群

通用监控设置

edit
xpack.monitoring.enabled
[7.8.0] 在7.8.0中已弃用。基本许可证功能应始终启用 (静态) 此已弃用设置无效。

监控收集设置

edit

The xpack.monitoring.collection 设置控制如何从您的 Elasticsearch 节点收集数据。

xpack.monitoring.collection.enabled
(动态) [7.16.0] 在7.16.0中已弃用。 设置为true以启用监控数据的收集。当此设置为false(默认值)时,Elasticsearch监控数据不会被收集,并且来自其他来源(如Kibana、Beats和Logstash)的所有监控数据都将被忽略。
xpack.monitoring.collection.interval logo cloud

[6.3.0] 在6.3.0中已弃用。请改用xpack.monitoring.collection.enabled设置为false (动态) 将设置设为-1以禁用数据收集的功能从7.0.0开始不再支持。

控制数据样本的收集频率。默认为 10s。如果修改了收集间隔,请在 kibana.yml 中将 xpack.monitoring.min_interval_seconds 选项设置为相同的值。

xpack.monitoring.elasticsearch.collection.enabled
(动态) [7.16.0] 在7.16.0中已弃用。 控制是否应收集有关您的 Elasticsearch集群的统计信息。默认为true。这与 xpack.monitoring.collection.enabled不同,后者允许您启用或禁用所有 监控收集。然而,此设置仅禁用 Elasticsearch数据的收集,同时仍允许其他数据(例如,Kibana、Logstash、Beats或APM Server监控数据)通过此集群传递。
xpack.monitoring.collection.cluster.stats.timeout
(动态) [7.16.0] 在7.16.0中已弃用。 收集集群统计信息的超时时间,以时间单位表示。默认为10s
xpack.monitoring.collection.node.stats.timeout
(动态) [7.16.0] 在7.16.0中已弃用。 收集节点统计信息的超时时间, 以时间单位表示。默认为10s
xpack.monitoring.collection.indices
(动态) [7.16.0] 在7.16.0中已弃用。 控制监控功能从哪些索引收集数据。默认为所有索引。将索引名称指定为逗号分隔的列表,例如 test1,test2,test3。名称可以包含通配符,例如 test*。您可以通过在前面加上 - 来明确排除索引。例如 test*,-test3 将监控所有以 test 开头的索引,但不包括 test3。系统索引如 .security* 或 .kibana* 总是以 . 开头,通常应该被监控。考虑添加 .* 到索引列表中以确保监控系统索引。例如: .*,test*,-test3
xpack.monitoring.collection.index.stats.timeout
(动态) [7.16.0] 在7.16.0中已弃用。 收集索引统计信息的超时时间, 以时间单位表示。默认为10s
xpack.monitoring.collection.index.recovery.active_only
(动态) [7.16.0] 在7.16.0中已弃用。 控制是否收集所有恢复。设置为true以仅收集活动恢复。默认为false
xpack.monitoring.collection.index.recovery.timeout
(动态) [7.16.0] 在7.16.0中已弃用。 收集恢复信息的超时时间,以时间单位表示。默认为10s
xpack.monitoring.history.duration logo cloud

(动态) [7.16.0] 在7.16.0中已弃用。 监控导出器创建的索引在超过保留期限后会自动删除,单位为 时间单位。默认值为 7d(7天)。

此设置的最小值为 1d(1天),以确保正在监控某些内容,并且无法禁用它。

此设置目前仅影响local类型的导出器。使用http导出器创建的索引不会自动删除。

xpack.monitoring.exporters
(静态) 配置代理存储监控数据的位置。默认情况下,代理使用本地导出器在安装它的集群上索引监控数据。使用HTTP导出器将数据发送到单独的监控集群。有关更多信息,请参阅 本地导出器设置HTTP导出器设置工作原理

本地导出器设置

edit

The local exporter 是监控功能使用的默认导出器。正如名称所暗示的那样,它将数据导出到本地集群,这意味着不需要进行太多配置。

如果你没有提供任何导出器,那么监控功能会自动为你创建一个。如果提供了任何导出器,则不会添加默认导出器。

xpack.monitoring.exporters.my_local:
  type: local
type
[7.16.0] 在7.16.0中已弃用。 本地导出器的值必须始终为local,并且是必需的。
use_ingest
是否为集群提供占位符管道和每个批量请求的管道处理器。默认值是true。如果禁用,则意味着不会使用管道,这意味着未来的版本无法自动升级批量请求以确保其未来兼容性。
cluster_alerts.management.enabled
[7.16.0] 在7.16.0中已弃用。 是否为此集群创建集群警报。默认值为true。 要使用此功能,必须启用Watcher。如果您使用的是基础许可证, 则不会显示集群警报。
wait_master.timeout
[7.16.0] 在7.16.0中已弃用。 等待主节点设置用于监控的local导出器的时间,以 时间单位表示。在此等待期之后,非主节点会警告用户可能缺少配置。默认为30s

HTTP 导出器设置

edit

以下列出了可以与 http 导出器一起提供的设置。 所有设置均显示为您为导出器选择的名称后面的内容:

xpack.monitoring.exporters.my_remote:
  type: http
  host: ["host:port", ...]
type
[7.16.0] 在7.16.0中已弃用。 HTTP导出器的值必须始终为http,并且是必需的。
host

[7.16.0] 在7.16.0中已弃用。 主机支持多种格式,既可以作为数组,也可以作为单个值。支持的格式包括hostnamehostname:porthttp://hostnamehttp://hostname:porthttps://hostnamehttps://hostname:port。不能假设主机。默认方案始终是 http,如果未在host字符串中提供,则默认端口始终是9200

xpack.monitoring.exporters:
  example1:
    type: http
    host: "10.1.2.3"
  example2:
    type: http
    host: ["http://10.1.2.4"]
  example3:
    type: http
    host: ["10.1.2.5", "10.1.2.6"]
  example4:
    type: http
    host: ["https://10.1.2.3:9200"]
auth.username
[7.16.0] 在7.16.0中已弃用。 如果提供了auth.secure_password,则需要用户名。
auth.secure_password
(安全, 可重新加载) [7.16.0] 在7.16.0中已弃用。 用于auth.username的密码。
connection.timeout
[7.16.0] 在7.16.0中已弃用。 HTTP连接在请求时应该等待套接字打开的时间量,以时间单位表示。默认值为6s
connection.read_timeout
[7.16.0] 在7.16.0中已弃用。 HTTP连接预计等待套接字返回响应的时间量,以时间单位表示。默认值为 10 * connection.timeout(如果两者都未设置,则为60s)。
ssl
[7.16.0] 在7.16.0中已弃用。 每个HTTP导出器可以定义自己的TLS/SSL设置或继承它们。请参阅 X-Pack监控TLS/SSL设置
proxy.base_path
[7.16.0] 在7.16.0中已弃用。 用于前缀任何传出请求的基本路径,例如 /base/path(例如,批量请求将发送为 /base/path/_bulk)。没有默认值。
headers

[7.16.0] 在7.16.0中已弃用。 添加到每个请求的可选头信息,这些头信息可以帮助通过代理路由请求。

xpack.monitoring.exporters.my_remote:
  headers:
    X-My-Array: [abc, def, xyz]
    X-My-Header: abc123

基于数组的头信息会被发送n次,其中n是数组的大小。 Content-TypeContent-Length不能被设置。监控代理创建的任何头信息都将覆盖这里定义的内容。

index.name.time_format
[7.16.0] 在7.16.0中已弃用。 用于更改每日监控索引默认日期后缀的机制。 默认格式为yyyy.MM.dd。例如,.monitoring-es-7-2021.08.26
use_ingest
是否向监控集群提供占位符管道,并在每个批量请求中提供管道处理器。默认值是true。如果禁用,则意味着不会使用管道,这意味着未来的版本无法自动升级批量请求以确保其未来兼容性。
cluster_alerts.management.enabled
[7.16.0] 在7.16.0中已弃用。 是否为此集群创建集群警报。默认值为true。 要使用此功能,必须启用Watcher。如果您使用的是基础许可证, 则不会显示集群警报。
cluster_alerts.management.blacklist

[7.16.0] 在7.16.0中已弃用。 防止创建特定的集群警报。它还会删除当前集群中已存在的任何适用的监视。

您可以将以下任何监视标识符添加到阻止的警报列表中:

  • elasticsearch_cluster_status
  • elasticsearch_version_mismatch
  • elasticsearch_nodes
  • kibana_version_mismatch
  • logstash_version_mismatch
  • xpack_license_expiration

例如:["elasticsearch_version_mismatch","xpack_license_expiration"]

X-Pack 监控 TLS/SSL 设置

edit

您可以配置以下TLS/SSL设置。

xpack.monitoring.exporters.$NAME.ssl.supported_protocols

(静态) [7.16.0] 在7.16.0中已弃用。 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.monitoring.exporters.$NAME.ssl.verification_mode

(静态) [7.16.0] 在7.16.0中已弃用。 控制证书的验证。

有效值
full
验证提供的证书:具有在not_beforenot_after日期之间的签发日期;链接到受信任的证书颁发机构(CA);具有与证书中的名称匹配的hostname或IP地址。
certificate
验证提供的证书并验证它由受信任的机构(CA)签名,但不检查证书的hostname
none

不执行证书验证。

将证书验证设置为none会禁用SSL/TLS的许多安全优势,这是非常危险的。只有在Elastic支持的指导下,作为尝试解决TLS错误时的临时诊断机制,才应设置此值。

默认为full

xpack.monitoring.exporters.$NAME.ssl.cipher_suites

(静态) [7.16.0] 在7.16.0中已弃用。 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java加密体系结构文档

X-Pack 监控 TLS/SSL 密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。私钥和证书是可选的,如果服务器要求PKI身份验证的客户端身份验证,则会使用它们。

PEM 编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.monitoring.exporters.$NAME.ssl.key

(静态) [7.16.0] 在7.16.0中已弃用。 指向包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.monitoring.exporters.$NAME.ssl.key_passphrase

(静态) [7.16.0] 在7.16.0中已弃用。 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

xpack.monitoring.exporters.$NAME.ssl.secure_key_passphrase
(安全) [7.16.0] 在7.16.0中已弃用。 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.monitoring.exporters.$NAME.ssl.certificate

(静态) [7.16.0] 在7.16.0中已弃用。 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.monitoring.exporters.$NAME.ssl.certificate_authorities

(静态) [7.16.0] 在7.16.0中已弃用。 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java 密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.monitoring.exporters.$NAME.ssl.keystore.path

(静态) [7.16.0] 在7.16.0中已弃用。 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.monitoring.exporters.$NAME.ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.monitoring.exporters.$NAME.ssl.keystore.secure_password
(安全) [7.16.0] 在7.16.0中已弃用。 密钥库的密码。
xpack.monitoring.exporters.$NAME.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.monitoring.exporters.$NAME.ssl.keystore.secure_key_password
(安全) [7.16.0] 在7.16.0中已弃用。 密钥库中密钥的密码。默认值是密钥库密码。
xpack.monitoring.exporters.$NAME.ssl.truststore.path

(静态) [7.16.0] 在7.16.0中已弃用。 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.monitoring.exporters.$NAME.ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.monitoring.exporters.$NAME.ssl.truststore.secure_password
(安全) [7.16.0] 在7.16.0中已弃用。 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.monitoring.exporters.$NAME.ssl.keystore.path

(静态) [7.16.0] 在7.16.0中已弃用。 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.monitoring.exporters.$NAME.ssl.keystore.type
(静态) [7.16.0] 在7.16.0中已弃用。 密钥库文件的格式。它必须是jksPKCS12。如果密钥库路径以".p12"、".pfx"或".pkcs12"结尾,此设置默认为PKCS12。否则,它默认为jks
xpack.monitoring.exporters.$NAME.ssl.keystore.password
(静态) [7.16.0] 在7.16.0中已弃用。 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.monitoring.exporters.$NAME.ssl.keystore.secure_password
(安全) [7.16.0] 在7.16.0中已弃用。 密钥库的密码。
xpack.monitoring.exporters.$NAME.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.monitoring.exporters.$NAME.ssl.keystore.secure_key_password
(安全) [7.16.0] 在7.16.0中已弃用。 密钥库中密钥的密码。默认是密钥库密码。
xpack.monitoring.exporters.$NAME.ssl.truststore.path

(静态) [7.16.0] 在7.16.0中已弃用。 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.monitoring.exporters.$NAME.ssl.truststore.type
(静态) [7.16.0] 在7.16.0中已弃用。 将其设置为PKCS12,以指示信任库是一个PKCS#12文件。
xpack.monitoring.exporters.$NAME.ssl.truststore.password

(静态) [7.16.0] 在7.16.0中已弃用。 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.monitoring.exporters.$NAME.ssl.truststore.secure_password
(安全) [7.16.0] 在7.16.0中已弃用。 信任库的密码。

节点

edit

任何时候你启动一个Elasticsearch实例,你都是在启动一个节点。一个由连接的节点组成的集合被称为一个集群。如果你运行的是单个Elasticsearch节点,那么你有一个单节点的集群。

集群中的每个节点默认都可以处理HTTP和传输流量。传输层专门用于节点之间的通信;HTTP层由REST客户端使用。

所有节点都知道集群中所有其他节点的信息,并且可以将客户端请求转发到适当的节点。

Elasticsearch 节点的性能通常受限于底层存储的性能。 请查看我们关于优化存储以提高索引搜索速度的建议。

节点角色

edit

您可以通过在 elasticsearch.yml 中设置 node.roles 来定义节点的角色。如果您设置了 node.roles,则该节点仅被分配您指定的角色。如果您没有设置 node.roles,则该节点将被分配以下角色:

  • master
  • data
  • data_content
  • data_hot
  • data_warm
  • data_cold
  • data_frozen
  • ingest
  • ml
  • remote_cluster_client
  • transform

如果你设置了node.roles,请确保你指定了集群所需的所有节点角色。 每个集群都需要以下节点角色:

  • master
  • data_contentdata_hot

    data

一些Elastic Stack功能还需要特定的节点角色:

  • 跨集群搜索和跨集群复制需要remote_cluster_client角色。
  • 堆栈监控和摄取管道需要ingest角色。
  • Fleet、Elastic Security应用和转换需要transform角色。 使用这些功能进行跨集群搜索还需要remote_cluster_client角色。
  • 机器学习功能,如异常检测,需要ml角色。

随着集群的增长,特别是如果你有大型机器学习作业或连续转换,考虑将专用主节点与专用数据节点、机器学习节点和转换节点分开。

Master-eligible node
一个具有master角色的节点,使其有资格被 选举为主节点,该节点控制集群。
Data node
具有几种数据角色之一的节点。数据节点保存数据并执行与数据相关的操作,如CRUD、搜索和聚合。具有通用data角色的节点可以填充任何专门的数据节点角色。
Ingest node
具有ingest角色的节点。Ingest节点能够将ingest管道应用于文档,以便在索引之前转换和丰富文档。在处理大量ingest负载时,使用专用的ingest节点是有意义的,并且不要在具有masterdata角色的节点中包含ingest角色。
Remote-eligible node
具有remote_cluster_client角色的节点,使其有资格作为远程客户端。
Machine learning node
具有 ml 角色的节点。如果您想使用机器学习功能,您的集群中必须至少有一个机器学习节点。有关更多信息,请参阅 Elasticsearch 中的机器学习设置Elastic Stack 中的机器学习
Transform node
具有 transform 角色的节点。如果您想使用转换功能,您的集群中必须至少有一个转换节点。更多信息请参见 转换设置转换数据

协调节点

像搜索请求或批量索引请求这样的请求可能涉及存储在不同数据节点上的数据。例如,搜索请求在两个阶段中执行,这两个阶段由接收客户端请求的节点协调——即协调节点

分散阶段,协调节点将请求转发给持有数据的数据节点。每个数据节点在本地执行请求,并将结果返回给协调节点。在收集阶段,协调节点将每个数据节点的结果汇总为一个全局结果集。

每个节点默认情况下都是协调节点。这意味着一个节点如果通过node.roles显式地设置了一个空的角色列表,那么它将仅作为协调节点,这是无法禁用的。因此,这样的节点需要有足够的内存和CPU来处理收集阶段。

有资格成为主节点的节点

edit

主节点负责轻量级的集群范围操作,例如创建或删除索引、跟踪哪些节点是集群的一部分,以及决定将哪些分片分配到哪些节点。对于集群的健康来说,拥有一个稳定的主节点是非常重要的。

任何不是仅投票节点的主节点都有可能被主节点选举过程选举为master节点。

主节点必须有一个path.data目录,其内容在重启后仍然存在,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果丢失了,存储在数据节点上的数据将无法读取。

专用主节点

edit

为了集群的健康,当选的主节点必须拥有履行其职责所需的资源。如果当选的主节点因其他任务而过载,集群将无法正常运行。避免主节点因其他任务过载的最可靠方法是配置所有符合主节点资格的节点为专用主节点,这些节点仅具有master角色,使它们能够专注于管理集群。符合主节点资格的节点仍将作为协调节点,将客户端的请求路由到集群中的其他节点,但您不应将专用主节点用于此目的。

一个小型或轻负载的集群在主节点候选节点具有其他角色和职责的情况下可能运行良好,但一旦您的集群包含多个节点,通常使用专用主节点候选节点是有意义的。

要创建一个专用的主节点,请设置:

node.roles: [ master ]

仅投票的主节点

edit

仅投票的主节点是一个参与主节点选举但不会作为集群选出的主节点的节点。特别是,仅投票节点可以在选举中充当平局决胜者。

使用“主节点资格”这一术语来描述仅投票节点可能会让人感到困惑,因为这样的节点实际上根本没有资格成为主节点。这一术语是历史遗留的不幸后果:主节点资格节点是那些参与选举并在集群状态发布期间执行某些任务的节点,而仅投票节点即使永远无法成为选举的主节点,也承担着相同的职责。

要将一个有资格成为主节点的节点配置为仅投票节点,请在角色列表中包含 mastervoting_only。例如,要创建一个仅投票的数据节点:

node.roles: [ data, master, voting_only ]

只有具有 master 角色的节点才能被标记为具有 voting_only 角色。

高可用性(HA)集群至少需要三个符合主节点资格的节点,其中至少两个不是仅投票节点。这样的集群即使在其中一个节点发生故障时,也能够选举出一个主节点。

仅投票的主节点也可能在集群中担任其他角色。例如,一个节点可以是数据节点和仅投票的主节点。一个专用的仅投票的主节点是一个仅投票的主节点,它在集群中不担任其他角色。要创建一个专用的仅投票的主节点,请设置:

node.roles: [ master, voting_only ]

由于仅用于投票的节点从不充当集群的选举主节点,因此它们可能需要的堆内存和CPU性能比真正的主节点要少。然而,所有有资格成为主节点的节点,包括仅用于投票的节点,都是发布集群状态更新的关键路径。集群状态更新通常与索引或搜索等性能关键型工作负载无关,但它们涉及管理活动,如索引创建和滚动更新、映射更新以及故障后的恢复。这些活动的性能特征取决于每个有资格成为主节点的存储速度,以及选举主节点与其他节点之间网络互连的可靠性和延迟。因此,您必须确保集群中节点的存储和网络足够好,以满足您的性能目标。

数据节点

edit

数据节点保存包含您已索引文档的分片。数据节点处理与数据相关的操作,如CRUD、搜索和聚合。这些操作是I/O、内存和CPU密集型的。监控这些资源并在它们过载时添加更多数据节点是很重要的。

拥有专用数据节点的主要好处是主节点和数据角色的分离。

在多层部署架构中,您使用专门的数据角色将数据节点分配到特定的层级:data_contentdata_hotdata_warmdata_colddata_frozen。一个节点可以属于多个层级。

如果你想在所有层级中包含一个节点,或者如果你的集群不使用多层级,那么你可以使用通用的data角色。

集群分片限制防止在每个节点上创建超过1000个非冻结分片,以及在每个专用冻结节点上创建超过3000个冻结分片。确保您的集群中有足够数量的每种类型节点来处理您所需的分片数量。

如果你使用专门的数据角色将节点分配到特定层级,那么你不应该同时分配它通用data角色。通用data角色优先于专门的数据角色。

通用数据节点

edit

通用数据节点包含在所有内容层级中。

要创建一个专用的通用数据节点,请设置:

node.roles: [ data ]

内容数据节点

edit

内容数据节点是内容层的一部分。 存储在内容层中的数据通常是项目集合,例如产品目录或文章存档。 与时间序列数据不同,内容的值在时间上保持相对恒定, 因此随着时间的推移将其移动到具有不同性能特征的层中是没有意义的。 内容数据通常具有较长的数据保留要求,并且您希望能够快速检索 项目,无论它们的年龄如何。

内容层节点通常针对查询性能进行了优化——它们优先考虑处理能力而非IO吞吐量,以便能够快速处理复杂搜索和聚合并返回结果。虽然它们也负责索引,但内容数据通常不会以与日志和指标等时间序列数据相同的高速率摄取。从弹性的角度来看,此层中的索引应配置为使用一个或多个副本。

内容层是必需的,通常与热层部署在相同的节点分组中。系统索引和其他不属于数据流的索引会自动分配到内容层。

要创建一个专用的内容节点,请设置:

node.roles: [ data_content ]

热数据节点

edit

热数据节点是热层的一部分。 热层是Elasticsearch时间序列数据的入口点,并保存您最近、最常搜索的时间序列数据。 热层中的节点需要快速进行读写操作, 这需要更多的硬件资源和更快的存储(SSD)。 为了弹性,热层中的索引应配置为使用一个或多个副本。

热层是必需的。作为数据流一部分的新索引会自动分配到热层。

要创建一个专用热节点,请设置:

node.roles: [ data_hot ]

温数据节点

edit

温数据节点是温层的一部分。 时间序列数据一旦查询频率低于热层中的最近索引数据,就可以移动到温层。 温层通常保存最近几周的数据。 更新仍然允许,但可能不频繁。 温层中的节点通常不需要像热层中的节点那样快。 为了弹性,温层中的索引应配置为使用一个或多个副本。

要创建一个专用的温节点,请设置:

node.roles: [ data_warm ]

冷数据节点

edit

冷数据节点是冷层的一部分。 当你不再需要定期搜索时间序列数据时,它可以从温层移动到冷层。虽然仍然可以搜索,但这一层通常优化为较低的存储成本,而不是搜索速度。

为了更好地节省存储空间,您可以将完全挂载的索引 存储在冷层中的可搜索快照上。与常规索引不同,这些完全挂载的索引不需要副本以确保可靠性。 在发生故障时,它们可以从底层快照中恢复数据。这可能会将数据所需的本地存储量减少一半。 在冷层中使用完全挂载的索引需要一个快照仓库。完全挂载的索引是只读的。

或者,您可以使用冷层来存储带有副本的常规索引,而不是使用可搜索的快照。这使您可以将较旧的数据存储在成本较低的硬件上,但与暖层相比,不会减少所需的磁盘空间。

要创建一个专用的冷节点,请设置:

node.roles: [ data_cold ]

冻结数据节点

edit

冻结的数据节点是冻结层的一部分。 一旦数据不再被查询,或者很少被查询,它可能会从冷层移动到冻结层,并在其生命周期内一直保留在那里。

冻结层需要一个快照仓库。 冻结层使用部分挂载的索引来存储 并从快照仓库加载数据。这减少了本地存储和 运营成本,同时仍然允许您搜索冻结的数据。由于Elasticsearch有时必须 从快照仓库获取冻结的数据,因此冻结层上的搜索通常比冷层上的搜索要慢。

要创建一个专用的冻结节点,请设置:

node.roles: [ data_frozen ]

摄取节点

edit

摄取节点可以执行由一个或多个摄取处理器组成的预处理管道。根据摄取处理器执行的操作类型和所需的资源,拥有专门执行此特定任务的专用摄取节点可能是有意义的。

要创建一个专用的摄取节点,请设置:

node.roles: [ ingest ]

仅协调节点

edit

如果你剥夺了处理主节点职责、存储数据和预处理文档的能力,那么你将只剩下一个协调节点,它只能路由请求、处理搜索归约阶段和分发批量索引。本质上,协调节点仅作为智能负载均衡器。

仅协调节点可以通过将协调节点角色从数据节点和主节点中卸载出来,从而使大型集群受益。它们加入集群并接收完整的集群状态,就像其他每个节点一样,并且它们使用集群状态来直接将请求路由到适当的位置。

向集群中添加过多的仅协调节点会增加整个集群的负担,因为选举出的主节点必须等待来自每个节点的集群状态更新确认!不应过分强调仅协调节点的好处——数据节点可以很好地完成相同的任务。

要创建一个专用的协调节点,请设置:

node.roles: [ ]

符合远程条件的节点

edit

一个符合远程条件的节点充当跨集群客户端,并连接到 远程集群。一旦连接,您可以使用 跨集群搜索搜索远程集群。您还可以使用 跨集群复制在集群之间同步数据。

node.roles: [ remote_cluster_client ]

机器学习节点

edit

机器学习节点运行作业并处理机器学习API请求。更多信息,请参阅 机器学习设置

要创建一个专用的机器学习节点,请设置:

node.roles: [ ml, remote_cluster_client]

可选但强烈推荐使用remote_cluster_client角色。否则,在使用机器学习作业或数据馈送时,跨集群搜索将失败。如果您在异常检测作业中使用跨集群搜索,则所有符合主节点资格的节点上也必须具备remote_cluster_client角色。否则,数据馈送将无法启动。请参阅符合远程资格的节点

转换节点

edit

转换节点运行转换并处理转换API请求。更多信息,请参阅转换设置

要创建一个专用的变换节点,请设置:

node.roles: [ transform, remote_cluster_client ]

The remote_cluster_client role is optional but strongly recommended. 否则,在使用转换时,跨集群搜索将失败。请参阅Remote-eligible node

更改节点的角色

edit

每个数据节点在磁盘上维护以下数据:

  • 分配给该节点的每个分片的分片数据,
  • 与分配给该节点的每个分片对应的索引元数据,以及
  • 集群范围的元数据,例如设置和索引模板。

同样,每个符合主节点资格的节点在磁盘上维护以下数据:

  • 集群中每个索引的索引元数据,以及
  • 集群范围的元数据,例如设置和索引模板。

每个节点在启动时都会检查其数据路径的内容。如果发现意外数据,它将拒绝启动。这是为了避免导入不需要的悬空索引,这可能导致集群健康状态变为红色。更准确地说,没有data角色的节点在启动时如果发现磁盘上有任何分片数据,将拒绝启动,而没有masterdata角色的节点在启动时如果发现磁盘上有任何索引元数据,将拒绝启动。

可以通过调整节点的elasticsearch.yml文件并重新启动它来更改节点的角色。这被称为重新利用节点。为了满足上述意外数据的检查,在启动没有datamaster角色的节点时,必须执行一些额外的步骤来准备节点以进行重新利用。

  • 如果你想通过移除data角色来重新利用一个数据节点,那么你应该首先使用一个分配过滤器,以安全地将所有分片数据迁移到集群中的其他节点上。
  • 如果你想重新利用一个节点,使其既没有data角色也没有master角色,那么最简单的方法是启动一个全新的节点,使用空的数据路径和所需的角色。你可能会发现,首先使用一个分配过滤器将分片数据迁移到集群中的其他地方是最安全的。

如果无法执行这些额外步骤,您可能可以使用elasticsearch-node repurpose工具来删除阻止节点启动的任何多余数据。

节点数据路径设置

edit

path.data

edit

每个数据节点和主节点都需要访问一个数据目录,用于存储分片、索引和集群元数据。path.data 默认值为 $ES_HOME/data,但可以在 elasticsearch.yml 配置文件中配置为绝对路径或相对于 $ES_HOME 的路径,如下所示:

path.data:  /var/elasticsearch/data

与所有节点设置一样,它也可以在命令行中指定为:

./bin/elasticsearch -Epath.data=/var/elasticsearch/data

必须确保 path.data 目录在重启后仍然存在,因为这是存储数据的地方。Elasticsearch 要求文件系统的行为类似于由本地磁盘支持,但这意味着只要远程存储的行为与本地存储没有区别,它就可以在正确配置的远程块设备(例如 SAN)和远程文件系统(例如 NFS)上正常工作。您可以在同一文件系统上运行多个 Elasticsearch 节点,但每个 Elasticsearch 节点必须有自己的数据路径。

使用 .zip.tar.gz 分发包时,应将 path.data 设置配置为在 Elasticsearch 主目录之外定位数据目录,以便在删除主目录时不会删除您的数据!RPM 和 Debian 分发包已经为您完成了此操作。

不要修改数据目录中的任何内容,也不要运行可能干扰其内容的进程。如果除了 Elasticsearch 之外的其他程序修改了数据目录的内容,那么 Elasticsearch 可能会失败,报告损坏或其他数据不一致的情况,或者可能在静默中丢失部分数据的情况下看似正常工作。不要尝试对数据目录进行文件系统备份;没有支持的方法来恢复这样的备份。相反,使用 快照和恢复 来安全地进行备份。不要在数据目录上运行病毒扫描程序。病毒扫描程序可能会阻止 Elasticsearch 正常工作,并且可能会修改数据目录的内容。数据目录不包含可执行文件,因此病毒扫描只会发现误报。

其他节点设置

edit

更多节点设置可以在 配置 Elasticsearch重要的 Elasticsearch 配置 中找到,包括:

网络

edit

每个Elasticsearch节点都有两种不同的网络接口。客户端通过其HTTP接口发送请求到Elasticsearch的REST API,但节点之间使用传输接口进行通信。传输接口也用于与远程集群的通信。传输接口使用通过长时TCP通道发送的自定义二进制协议。这两个接口都可以配置为使用TLS进行安全通信

您可以使用network.*设置同时配置这两个接口。如果您有一个更复杂的网络,您可能需要使用http.*transport.*设置独立配置接口。在可能的情况下,使用适用于两个接口的network.*设置来简化您的配置并减少重复。

默认情况下,Elasticsearch仅绑定到localhost,这意味着它无法远程访问。此配置对于在同一主机上运行的单节点或多节点本地开发集群是足够的。要跨多个主机形成集群,或者使集群可被远程客户端访问,您必须调整一些网络设置,例如network.host

请注意网络配置!

切勿将未受保护的节点暴露在公共互联网上。如果你这样做,你将允许世界上任何人下载、修改或删除集群中的任何数据。

将Elasticsearch配置为绑定到非本地地址将把一些警告转换为致命异常。如果在配置其网络设置后节点拒绝启动,则必须在继续之前解决记录的异常。

常用的网络设置

edit

大多数用户只需要配置以下网络设置。

network.host

(静态, 字符串) 设置此节点用于HTTP和传输流量的地址。节点将绑定到此地址,并将其用作其发布地址。接受IP地址、主机名或特殊值

默认为 _local_。然而,请注意 安全自动配置 会将 http.host: 0.0.0.0 添加到您的 elasticsearch.yml 配置文件中,这将覆盖此默认设置以用于 HTTP 流量。

http.port

(静态, 整数) 用于HTTP客户端通信的绑定端口。接受单个值或范围。如果指定了范围,节点将绑定到该范围内的第一个可用端口。

默认为 9200-9300

transport.port

(静态, 整数) 用于节点间通信的绑定端口。接受单个值或范围。如果指定了范围,节点将绑定到该范围内的第一个可用端口。在每个主节点上,将此设置设置为单个端口,而不是范围。

默认为 9300-9400

remote_cluster.port

(静态, 整数) 用于远程集群客户端通信的绑定端口。接受单个值。

默认为 9443

网络地址的特殊值

edit

您可以配置 Elasticsearch 以自动确定其地址,使用以下特殊值。在配置 network.hostnetwork.bind_hostnetwork.publish_host 以及 HTTP 和传输接口的相应设置时,使用这些值。

_local_
系统上的任何环回地址,例如 127.0.0.1
_site_
系统上的任何站点本地地址,例如 192.168.0.1
_global_
系统中任何全局作用域的地址,例如 8.8.8.8
_[networkInterface]_
使用名为 [networkInterface] 的网络接口的地址。例如,如果您希望使用名为 en0 的接口的地址,则设置 network.host: _en0_
0.0.0.0
所有可用网络接口的地址。

在某些系统中,这些特殊值解析为多个地址。如果是这样,Elasticsearch 将选择其中一个作为其发布地址,并且可能在每次节点重启时更改其选择。确保您的节点在每个可能的地址上都是可访问的。

任何包含 : 的值(例如 IPv6 地址或某些 特殊值)都必须加引号,因为 : 在 YAML 中是特殊字符。

IPv4 对比 IPv6

edit

这些特殊值默认生成IPv4和IPv6地址,但您也可以添加:ipv4:ipv6后缀,以分别限制为仅IPv4或IPv6地址。例如,network.host: "_en0:ipv4_"会将此节点的地址设置为接口en0的IPv4地址。

云中的发现

在使用EC2发现插件Google Compute Engine发现插件安装的情况下,在云中运行时可以使用更多特殊设置。

绑定和发布

edit

Elasticsearch 使用网络地址用于两个不同的目的,称为绑定和发布。大多数节点会为所有用途使用相同的地址,但更复杂的设置可能需要为不同的用途配置不同的地址。

当应用程序(如 Elasticsearch)希望接收网络通信时,它必须向操作系统指示应接收其流量的地址或地址。这被称为绑定到这些地址。如果需要,Elasticsearch 可以绑定到多个地址,但大多数节点只绑定到一个地址。Elasticsearch 只能在运行它的主机具有该地址的网络接口时绑定到该地址。如果需要,您可以配置传输和 HTTP 接口以绑定到不同的地址。

每个Elasticsearch节点都有一个地址,客户端和其他节点可以通过该地址联系它,这个地址被称为发布地址。每个节点都有一个用于HTTP接口的发布地址和一个用于传输接口的发布地址。这两个地址可以是任何地址,不需要是主机网络接口的地址。唯一的要求是每个节点必须:

  • 可通过其HTTP发布地址被所有使用嗅探发现它的客户端访问。
  • 可通过其传输发布地址被其集群中的所有其他节点访问,并且可被任何使用 嗅探模式发现它的远程集群访问。

每个节点必须拥有自己独特的发布地址。

如果你使用主机名指定传输发布地址,Elasticsearch 将在启动时将此主机名解析为 IP 地址一次,其他节点将使用解析后的 IP 地址,而不是再次解析名称。你必须使用一个主机名,使得它解析的所有地址都是该节点可以从所有其他节点访问的地址。为了避免混淆,最简单的方法是使用解析为单个地址的主机名。

如果你使用一个特殊值来指定传输发布地址,那么Elasticsearch将在启动时将此值解析为单个IP地址,其他节点将使用解析后的IP地址,而不是再次解析该值。你必须使用一个值,使得它解析的所有地址都是该节点可以从所有其他节点访问的地址。为了避免混淆,最简单的方法是使用一个解析为单个地址的值。在具有多个网络接口的主机上使用0.0.0.0作为发布地址通常是一个错误。

使用单个地址

edit

最常见的配置是让Elasticsearch绑定到一个地址,该地址可供客户端和其他节点访问。要使用此配置,只需将network.host设置为所需的地址。不要单独设置任何绑定或发布地址。不要单独指定HTTP或传输接口的地址。

使用多个地址

edit

如果您希望将Elasticsearch绑定到多个地址,或者希望发布与绑定地址不同的地址,请使用高级网络设置。将network.bind_host设置为绑定地址,并将network.publish_host设置为此节点暴露的地址。在复杂的配置中,您可以为HTTP和传输接口配置不同的地址。

高级网络设置

edit

这些高级设置允许您绑定到多个地址,或者为绑定和发布使用不同的地址。在大多数情况下,这些设置不是必需的,如果您可以使用常用设置,则不应使用它们。

network.bind_host
(静态, 字符串) 节点应绑定的网络地址,以便监听传入的连接。接受IP地址、主机名和 特殊值的列表。默认为由 network.host指定的地址。仅在绑定到多个地址或使用不同的地址进行发布和绑定时使用此设置。
network.publish_host
(静态, 字符串) 客户端和其他节点可以用来联系此节点的网络地址。 接受IP地址、主机名或特殊值。默认为network.host给出的地址。仅在绑定到多个地址或使用不同的发布和绑定地址时使用此设置。

您可以为 network.hostnetwork.publish_host 指定一个地址列表。您还可以指定一个或多个主机名或 特殊值,这些值会解析为多个地址。如果这样做,Elasticsearch 会选择其中一个地址作为其发布地址。此选择基于 IPv4/IPv6 堆栈偏好和可达性的启发式方法,并且在节点重新启动时可能会发生变化。请确保每个节点在所有可能的发布地址上均可访问。

高级 TCP 设置

edit

使用以下设置来控制由HTTP和传输接口使用的TCP连接的底层参数。

network.tcp.keep_alive
(静态, 布尔值) 配置网络套接字的 SO_KEEPALIVE 选项,该选项决定是否为每个连接发送 TCP 保持活动探测。默认为 true
network.tcp.keep_idle
(静态, 整数) 配置网络套接字的 TCP_KEEPIDLE 选项,该选项决定了在发送 TCP 保活探测之前,连接必须处于空闲状态的时间(以秒为单位)。默认为 -1,表示使用系统默认值。此值不能超过 300 秒。仅适用于 Linux 和 macOS。
network.tcp.keep_interval
(静态, 整数) 配置网络套接字的TCP_KEEPINTVL选项,该选项决定了发送TCP保活探测之间的时间间隔(以秒为单位)。默认为-1,表示使用系统默认值。该值不能超过300秒。仅适用于Linux和macOS。
network.tcp.keep_count
(静态, 整数) 配置网络套接字的 TCP_KEEPCNT 选项,该选项决定了在连接被丢弃之前可以发送的未确认的 TCP 保活探测的数量。默认为 -1,表示使用系统默认值。仅适用于 Linux 和 macOS。
network.tcp.no_delay
(静态, 布尔值) 配置网络套接字上的TCP_NODELAY选项,该选项确定是否启用TCP无延迟。默认为 true
network.tcp.reuse_address
(静态, 布尔值) 配置网络套接字的 SO_REUSEADDR 选项,该选项决定地址是否可以重用。在 Windows 上默认为 false,其他情况下默认为 true
network.tcp.send_buffer_size
(静态, 字节值) 配置网络套接字的TCP发送缓冲区大小。默认为 -1,表示使用系统默认值。
network.tcp.receive_buffer_size
(静态, 字节值) 配置TCP接收缓冲区的大小。默认为-1,表示使用系统默认值。

高级 HTTP 设置

edit

使用以下高级设置来独立配置HTTP接口,而不依赖于传输接口。您还可以使用网络设置来同时配置这两个接口。

http.host

(静态, 字符串) 设置此节点用于HTTP流量的地址。节点将绑定到此地址,并将其用作HTTP发布地址。接受IP地址、主机名或特殊值。 仅在需要为传输和HTTP接口配置不同设置时使用此设置。

默认为由 network.host 提供的地址。然而,请注意 安全自动配置 将会在您的 elasticsearch.yml 配置文件中添加 http.host: 0.0.0.0,这将覆盖此默认设置。

http.bind_host
(静态, 字符串) 节点应绑定的网络地址,以便监听传入的HTTP连接。接受IP地址、主机名和 特殊值的列表。默认值为 http.hostnetwork.bind_host 给出的地址。仅当你需要绑定到多个地址或为发布和绑定使用不同的地址,并且还需要为传输和HTTP接口使用不同的绑定配置时,才使用此设置。
http.publish_host
(静态, 字符串) HTTP客户端用于通过嗅探联系节点的网络地址。 接受IP地址、主机名或特殊值。默认为http.hostnetwork.publish_host给出的地址。仅在需要绑定到多个地址或为发布和绑定使用不同地址,并且还需要为传输和HTTP接口使用不同的绑定配置时,才使用此设置。
http.publish_port
(静态, 整数) HTTP发布地址的端口。 仅当您需要发布端口与http.port不同时,才配置此设置。默认值为通过http.port分配的端口。
http.max_content_length
(静态, 字节值) HTTP 请求体的最大大小。如果请求体被压缩,限制适用于压缩前的 HTTP 请求体大小。默认值为 100mb。将此设置配置为大于 100mb 可能会导致集群不稳定,不推荐这样做。如果您在向 批量 API 发送请求时达到此限制,请配置您的客户端以在每个批量请求中发送更少的文档。如果您希望索引单个超过 100mb 的文档,请在将其发送到 Elasticsearch 之前将其预处理为较小的文档。例如,将原始数据存储在 Elasticsearch 之外的系统中,并在 Elasticsearch 索引的文档中包含指向原始数据的链接。
http.max_initial_line_length
(静态, 字节值) HTTP URL 的最大大小。默认为 4kb
http.max_header_size
(静态, 字节值) 允许的标头的最大大小。默认为 16kb
http.compression logo cloud

(静态, 布尔值) 在可能的情况下支持压缩(使用Accept-Encoding)。如果启用了HTTPS,则默认为false。否则,默认为true

禁用HTTPS的压缩可以减轻潜在的安全风险,例如BREACH攻击。要压缩HTTPS流量,您必须显式地将http.compression设置为true

http.compression_level
(静态, 整数) 定义用于HTTP响应的压缩级别。有效值在1(最小压缩)和9(最大压缩)之间。默认值为3
http.cors.enabled logo cloud

(静态, 布尔值) 启用或禁用跨域资源共享,这决定了另一个来源的浏览器是否可以对Elasticsearch执行请求。设置为true以启用Elasticsearch处理预检 CORS请求。 如果请求中发送的Originhttp.cors.allow-origin列表允许,Elasticsearch将使用Access-Control-Allow-Origin头响应这些请求。设置为false(默认值)以使Elasticsearch忽略Origin请求头,从而有效地禁用CORS请求,因为Elasticsearch永远不会使用Access-Control-Allow-Origin响应头进行响应。

如果客户端没有发送带有Origin头部的预检请求,或者它没有检查来自服务器的响应头以验证Access-Control-Allow-Origin响应头,那么跨域安全就会受到威胁。如果Elasticsearch上没有启用CORS,客户端唯一能知道的方法就是发送一个预检请求,并意识到所需的响应头缺失。

http.cors.allow-origin logo cloud

(静态, 字符串) 允许哪些来源。如果你在值的前后加上正斜杠(/),这将作为正则表达式处理,允许你支持HTTP和HTTPS。例如,使用 /https?:\/\/localhost(:[0-9]+)?/ 将在两种情况下适当地返回请求头。默认情况下不允许任何来源。

通配符 (*) 是一个有效值,但被视为安全风险,因为您的 Elasticsearch 实例对来自 任何地方 的跨源请求开放。

http.cors.max-age logo cloud
(静态, 整数) 浏览器发送一个“预检” OPTIONS 请求以确定 CORS 设置。 max-age 定义结果应缓存的时间长度,以秒为单位。 默认为 1728000(20 天)。
http.cors.allow-methods logo cloud
(静态, 字符串) 允许的方法。默认为 OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers logo cloud
(静态, 字符串) 允许的头部。默认为 X-Requested-With, Content-Type, Content-Length, Authorization, Accept, User-Agent, X-Elastic-Client-Meta
http.cors.expose-headers logo cloud
(静态) 在客户端中暴露哪些响应头。默认为 X-elastic-product
http.cors.allow-credentials logo cloud

(静态, 布尔值) 是否应返回Access-Control-Allow-Credentials头。默认为false

此标头仅在设置为true时返回。

http.detailed_errors.enabled
(静态, 布尔值) 配置是否启用HTTP响应中的详细错误报告。 默认为true,这意味着包含 ?error_trace参数的HTTP请求将在遇到异常时返回详细的错误消息,包括堆栈跟踪。 如果设置为false,则带有?error_trace参数的请求将被拒绝。
http.pipelining.max_events
(静态, 整数) 在HTTP连接关闭之前,内存中可以排队的最大事件数量,默认为10000
http.max_warning_header_count
(静态, 整数) 客户端HTTP响应中的最大警告头数量。默认为 -1,表示警告头的数量没有限制。
http.max_warning_header_size
(静态, 字节值) 客户端HTTP响应中警告头的最大总大小。默认为 -1,表示警告头的大小不受限制。
http.tcp.keep_alive
(静态, 布尔值) 配置此套接字的 SO_KEEPALIVE 选项,该选项确定是否发送 TCP 保持活动探测。默认为 network.tcp.keep_alive
http.tcp.keep_idle
(静态, 整数) 配置HTTP套接字的TCP_KEEPIDLE选项,该选项确定在发送TCP保活探测之前连接必须空闲的时间(以秒为单位)。默认为network.tcp.keep_idle,使用系统默认值。此值不能超过300秒。仅适用于Linux和macOS。
http.tcp.keep_interval
(静态, 整数) 配置HTTP套接字的TCP_KEEPINTVL选项,该选项决定了发送TCP保活探测之间的时间间隔(以秒为单位)。默认为network.tcp.keep_interval,使用系统默认值。此值不能超过300秒。仅适用于Linux和macOS。
http.tcp.keep_count
(静态, 整数) 配置HTTP套接字的TCP_KEEPCNT选项,该选项确定在连接被丢弃之前可以发送的未确认TCP保持活动探测的数量。默认为network.tcp.keep_count,使用系统默认值。仅适用于Linux和macOS。
http.tcp.no_delay
(静态, 布尔值) 配置HTTP套接字上的TCP_NODELAY选项,该选项确定是否启用 TCP无延迟。默认为true
http.tcp.reuse_address
(静态, 布尔值) 配置HTTP套接字的SO_REUSEADDR选项,该选项决定地址是否可以重用。在Windows上默认为false,其他情况下默认为true
http.tcp.send_buffer_size
(静态, 字节值) HTTP 流量的 TCP 发送缓冲区大小。默认为 network.tcp.send_buffer_size
http.tcp.receive_buffer_size
(静态, 字节值) HTTP 流量的 TCP 接收缓冲区大小。默认为 network.tcp.receive_buffer_size
http.client_stats.enabled
(动态, 布尔值) 启用或禁用HTTP客户端统计信息的收集。默认为true
http.client_stats.closed_channels.max_count
(静态, 整数) 当 http.client_stats.enabledtrue 时,设置 Elasticsearch 报告统计信息的已关闭 HTTP 通道的最大数量。默认为 10000
http.client_stats.closed_channels.max_age
(静态, 时间值) 当 http.client_stats.enabledtrue 时,设置在关闭HTTP通道后,Elasticsearch报告该通道统计信息的最大时间长度。 默认为 5m

HTTP 客户端配置

edit

许多HTTP客户端和代理被配置为类似于浏览器的响应延迟,并且默认情况下会施加一个相当短的超时时间,如果在Elasticsearch完成请求处理之前超过了这个超时时间,就会报告失败。Elasticsearch总是最终会对每个请求做出响应,但某些请求可能需要数分钟的处理时间才能完成。请仔细考虑您的客户端的默认响应超时是否适合您的需求。在许多情况下,等待更长的响应时间比失败更好,这意味着您应该禁用任何响应超时:

  • 如果你在超时后重试请求,重试通常会被放到与原始请求相同的队列的末尾。因此,如果你超时并重试,而不是更有耐心地等待,请求的处理时间会更长。重试还会给Elasticsearch带来额外的负载。
  • 如果一个请求不是幂等的且不能重试,那么失败请求是你最后的手段。更有耐心地等待响应通常会使整个操作成功。

如果你在客户端禁用了响应超时,请确保配置TCP保活。TCP保活是防止客户端在网络中断时无限期等待的推荐方法。

高级传输设置

edit

使用以下高级设置来独立配置传输接口,而不依赖于HTTP 接口。使用网络设置来同时配置这两个接口。

transport.host

(静态, 字符串) 设置此节点用于传输流量的地址。节点将绑定到此地址,并将其用作传输发布地址。接受IP地址、主机名或特殊值。 仅在需要为传输和HTTP接口配置不同设置时使用此设置。

默认为由network.host提供的地址。

transport.bind_host
(静态, 字符串) 节点应绑定的网络地址,以便监听传入的传输连接。接受IP地址、主机名和 特殊值的列表。默认为由 transport.hostnetwork.bind_host 给出的地址。仅当你需要绑定到多个地址或为发布和绑定使用不同的地址,并且还需要为传输和HTTP接口使用不同的绑定配置时,才使用此设置。
transport.publish_host
(静态, 字符串) 节点可以被其他节点联系的网络地址。接受IP地址、主机名或特殊值。 默认为transport.hostnetwork.publish_host给出的地址。 仅在需要绑定到多个地址或为发布和绑定使用不同地址,并且还需要为传输和HTTP接口使用不同的绑定配置时,才使用此设置。
transport.publish_port
(静态, 整数) 传输发布地址的端口。仅当你需要发布端口与transport.port不同的时候才设置此参数。默认值为通过transport.port分配的端口。
transport.connect_timeout
(静态, 时间值) 用于建立新连接的连接超时时间(以时间设置格式表示)。默认值为 30s
transport.compress

(静态, 字符串) 确定在将传输请求发送到另一个节点之前压缩哪些传输请求。如果且仅当相应的请求被压缩时,Elasticsearch 才会压缩传输响应。另请参阅 transport.compression_scheme,它指定了所使用的压缩方案。接受以下值:

false
不压缩任何传输请求。此选项使用最多的网络带宽,但避免了压缩和解压缩的CPU开销。
indexing_data
仅压缩在摄取、CCR跟随(不包括引导)和基于操作的分片恢复期间在节点之间发送的原始索引数据(不包括基于文件的恢复,后者复制原始Lucene数据)。此选项是在节省网络带宽和所需的额外CPU之间的一个很好的折衷。此选项是默认值。
true
压缩所有传输请求。此选项在网络带宽方面可能比indexing_data表现更好,但将需要最多的CPU来进行压缩和解压缩工作。
transport.compression_scheme
(静态, 字符串) 配置由transport.compress设置选择的请求的压缩方案。接受deflatelz4,它们在压缩比和CPU使用率之间提供不同的权衡。Elasticsearch将使用与相应请求相同的压缩方案进行响应。默认为lz4
transport.tcp.keep_alive
(静态, 布尔值) 配置传输套接字的SO_KEEPALIVE选项,该选项确定是否发送TCP保持活动探测。默认为network.tcp.keep_alive
transport.tcp.keep_idle
(静态, 整数) 配置传输套接字的TCP_KEEPIDLE选项,该选项确定在发送TCP保活探测之前,连接必须处于空闲状态的时间(以秒为单位)。默认为network.tcp.keep_idle(如果已设置),否则为系统默认值。此值不能超过300秒。在系统默认值高于300的情况下,该值会自动降低到300。仅适用于Linux和macOS。
transport.tcp.keep_interval
(静态, 整数) 配置传输套接字的TCP_KEEPINTVL选项,该选项决定了发送TCP保活探测之间的时间间隔(以秒为单位)。默认情况下,如果设置了network.tcp.keep_interval,则使用该值,否则使用系统默认值。此值不能超过300秒。在系统默认值高于300的情况下,该值会自动降低到300。仅适用于Linux和macOS。
transport.tcp.keep_count
(静态, 整数) 配置传输套接字的TCP_KEEPCNT选项,该选项确定在连接被丢弃之前可以发送的未确认的TCP保活探测次数。默认为network.tcp.keep_count(如果已设置),否则为系统默认值。仅适用于Linux和macOS。
transport.tcp.no_delay
(静态, 布尔值) 配置传输套接字上的TCP_NODELAY选项,该选项确定是否启用TCP无延迟。默认为 true
transport.tcp.reuse_address
(静态, 布尔值) 配置网络套接字的 SO_REUSEADDR 选项,该选项决定地址是否可以重用。默认为 network.tcp.reuse_address
transport.tcp.send_buffer_size
(静态, 字节值) 传输流量的TCP发送缓冲区大小。默认为 network.tcp.send_buffer_size
transport.tcp.receive_buffer_size
(静态, 字节值) 用于传输流量的TCP接收缓冲区的大小。默认为 network.tcp.receive_buffer_size
transport.ping_schedule
(静态, 时间值) 配置在所有传输连接上发送应用层ping的时间间隔,以便及时检测传输连接是否失败。默认值为-1,表示不发送应用层ping。在可能的情况下,您应该使用TCP保活(参见transport.tcp.keep_alive)而不是应用层ping。

传输配置文件

edit

Elasticsearch 允许你通过使用传输配置文件绑定到不同接口上的多个端口。请参阅此示例配置

transport.profiles.default.port: 9300-9400
transport.profiles.default.bind_host: 10.0.0.1
transport.profiles.client.port: 9500-9600
transport.profiles.client.bind_host: 192.168.0.1
transport.profiles.dmz.port: 9700-9800
transport.profiles.dmz.bind_host: 172.16.1.2

默认配置文件是特殊的。它被用作任何其他配置文件的回退,如果这些配置文件没有设置特定的配置设置,并且是该节点如何连接到集群中的其他节点。 其他配置文件可以有任何名称,并且可以用于设置特定端点以进行传入连接。

以下参数可以在每个传输配置文件上进行配置,如上例所示:

  • port: 要绑定的端口。
  • bind_host: 要绑定的主机。
  • publish_host: 在信息性API中发布的主机。

配置文件还支持在传输设置部分中指定的所有其他传输设置,并将这些设置作为默认值使用。例如,可以显式配置transport.profiles.client.tcp.reuse_address,否则默认为transport.tcp.reuse_address

长时间空闲连接

edit

两个节点之间的传输连接由多个长期存在的TCP连接组成,其中一些连接可能会在很长一段时间内处于空闲状态。尽管如此,Elasticsearch要求这些连接保持打开状态,如果任何节点间连接被外部因素(如防火墙)关闭,可能会中断集群的运行。因此,配置网络以保持Elasticsearch节点之间的长期空闲连接非常重要,例如通过启用*.tcp.keep_alive并确保保持活动间隔短于可能导致空闲连接关闭的任何超时,或者在无法配置保持活动的情况下设置transport.ping_schedule。当连接达到一定年龄时会断开连接的设备是Elasticsearch集群常见的问题来源,因此不得使用。

有关解决意外网络断开连接的信息,请参阅 诊断其他网络断开连接

请求压缩

edit

默认的 transport.compress 配置选项 indexing_data 只会压缩与节点之间传输原始索引源数据相关的请求。此选项主要压缩在摄取、ccr 和分片恢复期间发送的数据。对于本地集群通信,此默认设置通常是有意义的,因为压缩原始文档会显著减少节点间网络使用量,同时对 CPU 的影响最小。

transport.compress 设置始终配置本地集群请求压缩,并且是远程集群请求压缩的回退设置。 如果您希望以不同于本地请求压缩的方式配置远程请求压缩,可以使用 cluster.remote.${cluster_alias}.transport.compress 设置 在每个远程集群的基础上进行设置。

响应压缩

edit

压缩设置不会配置响应的压缩。如果传入的请求是压缩的,Elasticsearch 将会压缩响应——即使压缩未启用。同样,如果传入的请求未压缩,Elasticsearch 将不会压缩响应——即使压缩已启用。用于压缩响应的压缩方案将与远程节点用于压缩请求的方案相同。

高级远程集群(基于API密钥的模型)设置

edit

使用以下高级设置来独立配置远程集群接口(基于API密钥的模型),而不依赖于传输接口。您还可以使用网络设置同时配置这两个接口。

remote_cluster_server.enabled
(静态, 布尔值) 确定是否应启用远程集群服务器。此设置必须为true,才能使remote_cluster.port及所有后续远程集群设置生效。启用它允许集群使用基于API密钥的模型来处理跨集群请求。默认为false
remote_cluster.host

(静态, 字符串) 设置此节点用于远程集群服务器流量的地址。节点将绑定到此地址,并将其用作远程集群服务器的发布地址。接受IP地址、主机名或特殊值。 仅在需要为远程集群服务器和传输接口配置不同设置时使用此设置。

默认为由 transport.bind_host 提供的地址。

remote_cluster.bind_host
(静态, 字符串) 节点应绑定的网络地址,以便监听传入的远程集群连接。接受IP地址、主机名和 特殊值的列表。默认为由 remote_cluster.host指定的地址。仅在需要绑定到多个地址或为发布和绑定使用不同地址,并且还需要为远程集群服务器和传输接口使用不同的绑定配置时,才使用此设置。
remote_cluster.publish_host
(静态, 字符串) 节点可以被其他节点联系的网络地址。接受IP地址、主机名或特殊值。 默认为remote_cluster.host给出的地址。 仅在需要绑定到多个地址或为发布和绑定使用不同地址,并且还需要为远程集群服务器和传输接口使用不同的绑定配置时,才使用此设置。
remote_cluster.publish_port
(静态, 整数) 远程集群服务器发布地址的端口。仅在需要发布端口与remote_cluster.port不同时设置此参数。默认值为通过remote_cluster.port分配的端口。
remote_cluster.tcp.keep_alive
(静态, 布尔值) 配置远程集群套接字的 SO_KEEPALIVE 选项,该选项确定是否发送 TCP 保持活动探测。默认为 transport.tcp.keep_alive
remote_cluster.tcp.keep_idle
(静态, 整数) 配置传输套接字的TCP_KEEPIDLE选项,该选项确定在发送TCP保活探测之前,连接必须处于空闲状态的时间(以秒为单位)。默认为transport.tcp.keep_idle(如果已设置),否则为系统默认值。此值不能超过300秒。在系统默认值高于300的情况下,该值会自动降低到300。仅适用于Linux和macOS。
remote_cluster.tcp.keep_interval
(静态, 整数) 配置传输套接字的TCP_KEEPINTVL选项,该选项决定了发送TCP保活探测之间的时间间隔(以秒为单位)。默认值为transport.tcp.keep_interval(如果已设置),否则为系统默认值。此值不能超过300秒。在系统默认值高于300的情况下,该值会自动降低到300。仅适用于Linux和macOS。
remote_cluster.tcp.keep_count
(静态, 整数) 配置传输套接字的TCP_KEEPCNT选项,该选项确定在连接被丢弃之前可以发送的未确认的TCP保活探测次数。默认为transport.tcp.keep_count(如果已设置),否则为系统默认值。仅适用于Linux和macOS。
remote_cluster.tcp.no_delay
(静态, 布尔值) 配置传输套接字上的TCP_NODELAY选项,该选项确定是否启用TCP无延迟。默认为 transport.tcp.no_delay
remote_cluster.tcp.reuse_address
(静态, 布尔值) 配置网络套接字的 SO_REUSEADDR 选项,该选项决定地址是否可以重用。默认为 transport.tcp.reuse_address
remote_cluster.tcp.send_buffer_size
(静态, 字节值) 传输流量的TCP发送缓冲区大小。默认为 transport.tcp.send_buffer_size
remote_cluster.tcp.receive_buffer_size
(静态, 字节值) 传输流量的TCP接收缓冲区大小。默认为 transport.tcp.receive_buffer_size

请求追踪

edit

您可以跟踪在HTTP和传输层上进行的单个请求。

跟踪可能会生成极高日志量,从而导致集群不稳定。请勿在繁忙或重要的集群上启用请求跟踪。

REST请求跟踪器

edit

HTTP层有一个专门的跟踪器,用于记录传入的请求和相应的传出响应。通过将org.elasticsearch.http.HttpTracer日志记录器的级别设置为TRACE来激活跟踪器:

PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.http.HttpTracer" : "TRACE"
   }
}

您还可以使用一组包含和排除通配符模式来控制哪些URI将被跟踪。默认情况下,每个请求都将被跟踪。

PUT _cluster/settings
{
   "persistent" : {
      "http.tracer.include" : "*",
      "http.tracer.exclude" : ""
   }
}

默认情况下,跟踪器会记录与这些过滤器匹配的每个请求和响应的摘要。要记录每个请求和响应的主体,请将系统属性 es.insecure_network_trace_enabled 设置为 true,然后将 org.elasticsearch.http.HttpTracerorg.elasticsearch.http.HttpBodyTracer 日志记录器的级别设置为 TRACE

PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.http.HttpTracer" : "TRACE",
      "logger.org.elasticsearch.http.HttpBodyTracer" : "TRACE"
   }
}

每个消息体都被压缩、编码并分割成多个块,以避免截断:

[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body [part 1]: H4sIAAAAAAAA/9...
[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body [part 2]: 2oJ93QyYLWWhcD...
[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body (gzip compressed, base64-encoded, and split into 2 parts on preceding log lines)

每个块都带有一个内部请求ID(在此示例中为[276]),您应使用它将这些块与相应的摘要行关联起来。要重建输出,请对数据进行base64解码并使用gzip进行解压缩。例如,在类Unix系统上:

cat httptrace.log | sed -e 's/.*://' | base64 --decode | gzip --decompress

HTTP请求和响应体可能包含敏感信息,如凭证和密钥,因此默认情况下禁用HTTP体跟踪。您必须在每个节点上通过将系统属性es.insecure_network_trace_enabled设置为true来显式启用它。此功能主要用于不包含任何敏感信息的测试系统。如果您在包含敏感信息的系统上设置此属性,您必须保护您的日志免受未经授权的访问。

传输跟踪器

edit

传输层有一个专门的跟踪器,用于记录传入和传出的请求和响应。通过将org.elasticsearch.transport.TransportService.tracer日志记录器的级别设置为TRACE来激活跟踪器:

PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.transport.TransportService.tracer" : "TRACE"
   }
}

您还可以使用一组包含和排除通配符模式来控制哪些操作将被跟踪。默认情况下,除了故障检测ping之外,每个请求都将被跟踪:

PUT _cluster/settings
{
   "persistent" : {
      "transport.tracer.include" : "*",
      "transport.tracer.exclude" : "internal:coordination/fault_detection/*"
   }
}

网络线程模型

edit

本节描述了Elasticsearch网络子系统中使用的线程模型。这些信息对于使用Elasticsearch并不是必需的,但对于诊断集群中网络问题的高级用户可能会有所帮助。

Elasticsearch节点通过一组TCP通道进行通信,这些通道共同构成了传输连接。Elasticsearch客户端通过HTTP与集群通信,HTTP也使用一个或多个TCP通道。这些TCP通道中的每一个都由节点中的一个transport_worker线程拥有。当通道打开时,选择拥有该通道的线程,并且在通道的生命周期内保持不变。

每个transport_worker线程单独负责通过其拥有的通道发送和接收数据。此外,每个http和transport服务器套接字都被分配给其中一个transport_worker线程。该工作线程负责接受其拥有的服务器套接字的新传入连接。

如果Elasticsearch中的一个线程想要通过特定通道发送数据,它会将数据传递给拥有该通道的transport_worker线程进行实际传输。

通常情况下,transport_worker 线程不会完全处理它们接收到的消息。相反,它们会进行少量的初步处理,然后将消息分派(转交)给不同的 线程池 以完成其余的处理。例如,批量消息会被分派到 write 线程池,搜索会被分派到其中一个 search 线程池,而统计请求和其他管理任务大多会被分派到 management 线程池。然而,在某些情况下,消息的处理预计会非常快,以至于 Elasticsearch 会在 transport_worker 线程上完成所有处理,而不是承担将其分派到其他地方的开销。

默认情况下,每个CPU有一个transport_worker线程。相比之下,有时可能会有数万个TCP通道。如果数据到达一个TCP通道,而其拥有的transport_worker线程正忙,则数据不会被处理,直到该线程完成它正在做的任何事情。同样,出站数据不会通过通道发送,直到拥有的transport_worker线程空闲。这意味着我们需要每个transport_worker线程经常处于空闲状态。一个空闲的transport_worker在堆栈转储中看起来像这样:

"elasticsearch[instance-0000000004][transport_worker][T#1]" #32 daemon prio=5 os_prio=0 cpu=9645.94ms elapsed=501.63s tid=0x00007fb83b6307f0 nid=0x1c4 runnable  [0x00007fb7b8ffe000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.EPoll.wait(java.base@17.0.2/Native Method)
	at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@17.0.2/EPollSelectorImpl.java:118)
	at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@17.0.2/SelectorImpl.java:129)
	- locked <0x00000000c443c518> (a sun.nio.ch.Util$2)
	- locked <0x00000000c38f7700> (a sun.nio.ch.EPollSelectorImpl)
	at sun.nio.ch.SelectorImpl.select(java.base@17.0.2/SelectorImpl.java:146)
	at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.lang.Thread.run(java.base@17.0.2/Thread.java:833)

Nodes hot threads API中,空闲的transport_worker线程会这样报告:

   0.0% [cpu=0.0%, idle=100.0%] (500ms out of 500ms) cpu usage by thread 'elasticsearch[instance-0000000004][transport_worker][T#1]'
     10/10 snapshots sharing following 9 elements
       java.base@17.0.2/sun.nio.ch.EPoll.wait(Native Method)
       java.base@17.0.2/sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:118)
       java.base@17.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:129)
       java.base@17.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:146)
       io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:813)
       io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
       io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
       io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
       java.base@17.0.2/java.lang.Thread.run(Thread.java:833)

请注意,transport_worker 线程应始终处于 RUNNABLE 状态,即使在等待输入时也是如此,因为它们在本地 EPoll#wait 方法中阻塞。idle= 时间报告线程等待输入所花费的时间比例,而 cpu= 时间报告线程处理已接收输入所花费的时间比例。

如果一个transport_worker线程不经常空闲,它可能会积累工作积压。这可能导致在其拥有的通道上处理消息的延迟。很难准确预测哪些工作会被延迟:

  • 通道数量远多于线程数量。如果与一个通道相关的工作导致其工作线程延迟,该线程拥有的所有其他通道也会遭受延迟。
  • TCP通道到工作线程的映射是固定的但任意的。每个通道在打开时以轮询方式分配一个拥有线程。每个工作线程负责许多不同类型的通道。
  • 每对节点之间有许多通道打开。对于每个请求,Elasticsearch将以轮询方式从适当的通道中选择。一些请求可能会最终在一个延迟的工作线程拥有的通道上,而其他相同的请求将被发送到一个工作顺畅的通道上。

如果积压过多,某些消息可能会被延迟数秒。节点甚至可能无法通过健康检查并从集群中移除。有时,您可以通过节点热点线程 API 找到繁忙的 transport_worker 线程的证据。然而,此 API 本身会发送网络消息,因此如果 transport_worker 线程过于繁忙,可能无法正常工作。使用 jstack 获取堆栈转储或使用 Java Flight Recorder 获取分析跟踪更为可靠。这些工具独立于 JVM 正在执行的任何工作。

从服务器日志中也可能识别出一些延迟的原因。例如,请参见以下日志记录器:

org.elasticsearch.transport.InboundHandler
如果处理入站消息占用网络线程的时间过长,此日志记录器会报告警告,这几乎肯定是一个错误。警告中包含一些信息,可用于识别处理时间过长的消息。
org.elasticsearch.transport.OutboundHandler
如果发送出站消息的时间比预期长,此记录器会报告警告。这个持续时间包括等待网络拥塞清除的时间,以及在同一网络线程上处理其他工作的时间,因此并不总是表明与日志条目中指定的出站消息相关的错误存在。
org.elasticsearch.common.network.ThreadWatchdog

此记录器在注意到网络线程在两次连续检查之间没有进展时,会报告一个警告和一个线程转储,这几乎肯定是一个错误:

[警告][o.e.c.n.ThreadWatchdog   ] 以下线程处于活动状态但在前[5秒]内未取得进展:[elasticsearch[instance-0000000004][transport_worker][T#1]]]
[警告][o.e.c.n.ThreadWatchdog   ] 由于活动线程未取得进展,生成热点线程转储[第1部分]:H4sIAAAAAAAA/+1aa2/bOBb93l8hYLUYFWgYvWw5AQbYpEkn6STZbJyiwAwGA1qiY8US6ZJUHvPr90qk/JJky41TtDMuUIci...
[警告][o.e.c.n.ThreadWatchdog   ] 由于活动线程未取得进展,生成热点线程转储[第2部分]:LfXL/x70a3eL8ve6Ral74ZBrp5x7HmUD9KXQz1MaXUNfFC6SeEysxSw1cNXL9JXYl3AigAE7ywbm/AZ+ll3Ox4qXJHNjVr6h...
[警告][o.e.c.n.ThreadWatchdog   ] 由于活动线程未取得进展,生成热点线程转储(gzip压缩,base64编码,并在前面的日志行中分成两部分;...

要重建线程转储,请对数据进行base64解码并使用gzip进行解压缩。例如,在类Unix系统上:

cat watchdog.log | sed -e 's/.*://' | base64 --decode | gzip --decompress

此机制可以通过以下设置进行控制:

network.thread.watchdog.interval
(静态, 时间值) 定义看门狗检查之间的间隔。默认为5s。设置为0以禁用网络线程看门狗。
network.thread.watchdog.quiet_time
(静态, 时间值) 定义看门狗警告之间的间隔。默认为10m

节点查询缓存设置

edit

在过滤器上下文中使用的查询结果会被缓存在节点查询缓存中,以便快速查找。每个节点都有一个查询缓存,由所有分片共享。缓存使用LRU(最近最少使用)逐出策略:当缓存满时,最近最少使用的查询结果会被逐出,以便为新数据腾出空间。您无法检查查询缓存的内容。

术语查询和在过滤器上下文之外使用的查询不符合缓存条件。

默认情况下,缓存最多保存10000个查询,占用总堆空间的最多10%。为了确定查询是否有资格进行缓存,Elasticsearch维护了一个查询历史记录来跟踪查询的出现情况。

如果一个段落包含至少10000个文档,并且该段落至少占分片总文档数的3%,则按段落进行缓存。由于缓存是按段落进行的,合并段落可能会使缓存的查询失效。

以下设置是静态的,必须在集群中的每个数据节点上进行配置:

indices.queries.cache.size
(静态) 控制过滤器缓存的内存大小。接受百分比值,如5%,或精确值,如512mb。默认值为10%

查询缓存索引设置

edit

以下设置是一个可以在每个索引基础上配置的索引设置。只能在索引创建时或在一个关闭的索引上设置:

index.queries.cache.enabled
(静态) 控制是否启用查询缓存。接受 true(默认)或 false

搜索设置

edit

以下专家设置可以设置为管理全局搜索和聚合限制。

indices.query.bool.max_clause_count

[8.0.0] 在8.0.0中已弃用。 (Static, 整数) 此已弃用设置无效。

Elasticsearch 现在将根据搜索线程池的大小和分配给 JVM 的堆大小,使用一种启发式方法动态设置查询中允许的最大子句数。此限制的最小值为 1024,并且在大多数情况下会更大(例如,具有 30GB RAM 和 48 个 CPU 的节点将具有大约 27,000 的最大子句数)。较大的堆会导致更高的值,而较大的线程池会导致更低的值。

应尽可能避免使用包含许多子句的查询。如果您之前为了适应繁重的查询而调整了这个设置,您可能需要增加Elasticsearch可用的内存,或者减少搜索线程池的大小,以便为每个并发搜索提供更多内存。

在Lucene的早期版本中,您可以通过将布尔查询相互嵌套来绕过此限制,但现在限制是基于整个查询中的叶查询总数,这种解决方法将不再有效。

search.max_buckets

(动态, 整数) 单个响应中允许的最大聚合桶数量。默认为 65,536。

尝试返回超过此限制的请求将会返回一个错误。

search.aggs.only_allowed_metric_scripts

(动态, 布尔值) 配置是否仅允许在 脚本化指标聚合中使用显式允许的脚本。 默认为 false

使用未包含在 search.aggs.allowed_inline_metric_scriptssearch.aggs.allowed_stored_metric_scripts 中的脚本的请求将返回错误。

search.aggs.allowed_inline_metric_scripts

(动态, 字符串列表) 当 search.aggs.only_allowed_metric_scripts 设置为 true 时,可以在脚本化指标聚合中使用的内联脚本列表。 默认为空列表。

使用其他内联脚本的请求将返回错误。

search.aggs.allowed_stored_metric_scripts

(动态, 字符串列表) 当 search.aggs.only_allowed_metric_scripts 设置为 true 时,可以在脚本化指标聚合中使用的存储脚本的ID列表。 默认为空列表。

使用其他存储脚本的请求将返回错误。

indices.query.bool.max_nested_depth

(静态, 整数) 查询的最大嵌套深度。默认为 30

此设置限制查询的嵌套深度。查询的深度嵌套可能导致堆栈溢出错误。

Elasticsearch 中的安全设置

edit

您配置 xpack.security 设置以 启用匿名访问 并执行消息 认证, 设置文档和字段级别安全配置领域使用 SSL 加密通信,以及 审计安全事件

所有这些设置都可以添加到 elasticsearch.yml 配置文件中, 除了安全设置,这些设置需要添加到 Elasticsearch 密钥库中。 有关创建和更新 Elasticsearch 密钥库的更多信息,请参阅 安全设置

通用安全设置

edit
xpack.security.enabled

(静态) 默认为 true,启用节点上的 Elasticsearch 安全功能。 必须启用此设置才能使用 Elasticsearch 的认证、授权和审计功能。

如果设置为 false,安全功能将被禁用,这是不推荐的。 这也会影响所有连接到此 Elasticsearch 实例的 Kibana 实例;您不需要在这些 kibana.yml 文件中禁用安全功能。有关在特定 Kibana 实例中禁用安全功能的更多信息,请参阅 Kibana 安全设置

xpack.security.autoconfiguration.enabled

(静态) 默认为 true,启用 安全自动配置

如果设置为 false,则禁用安全自动配置,这是不推荐的。禁用后,在首次启动 Elasticsearch 时不会自动配置安全功能,这意味着您必须手动配置安全

xpack.security.enrollment.enabled

(静态) 默认为 false。控制节点和 Kibana 注册到已为安全自动配置的本地节点。 当设置为 true 时,本地节点可以生成新的注册令牌。如果现有令牌仍然有效,则可以使用它们进行注册。

安全自动配置过程将设置此项为true,除非管理员在启动Elasticsearch之前将其设置为false

xpack.security.hide_settings
(静态) 一个逗号分隔的设置列表,这些设置将从 集群节点信息API的结果中省略。您可以使用通配符在列表中包含多个设置。例如,以下值隐藏了ad1 active_directory领域的所有设置: xpack.security.authc.realms.active_directory.ad1.*。 由于信息的敏感性,API已经省略了所有ssl设置、bind_dnbind_password
xpack.security.fips_mode.enabled
(静态) 启用FIPS模式操作。如果您在启用了FIPS 140-2的JVM中运行此Elasticsearch实例,请将其设置为true。有关更多信息,请参阅FIPS 140-2。默认值为false
xpack.security.fips_mode.required_providers
(静态) 可选地强制使用特定的Java JCE/JSSE安全提供程序。例如,将其设置为["BCFIPS", "BCJSSE"](不区分大小写)以要求Bouncy Castle FIPS JCE和JSSE安全提供程序。仅在xpack.security.fips_mode.enabled设置为true时适用。

密码哈希设置

edit
xpack.security.authc.password_hashing.algorithm
(静态) 指定用于安全用户凭证存储的哈希算法。 参见 表2,“密码哈希算法”。 如果 xpack.security.fips_mode.enabled 为 true(参见 FIPS 140-2),则默认为 pbkdf2_stretch。 在所有其他情况下,默认为 bcrypt

匿名访问设置

edit

您可以在elasticsearch.yml中配置以下匿名访问设置。有关更多信息,请参阅启用匿名访问

xpack.security.authc.anonymous.username
(静态) 匿名用户的用户名(主体)。默认为 _es_anonymous_user
xpack.security.authc.anonymous.roles
(静态) 与匿名用户关联的角色。必需。
xpack.security.authc.anonymous.authz_exception
(静态) 当true时,如果匿名用户没有请求操作的相应权限,则返回HTTP 403响应。用户不会被提示提供凭据以访问请求的资源。当设置为false时,返回HTTP 401响应,用户可以提供具有相应权限的凭据以获得访问权限。默认为true

自动机设置

edit

在安全功能接受通配符模式的地方(例如角色中的索引模式、角色映射 API 中的组匹配),每个模式都会被编译成一个 Automaton。以下设置可用于控制此行为。

xpack.security.automata.max_determinized_states
(静态) 单个模式可能创建的自动机状态的上限。 这防止了过于困难(例如指数级难度)的模式。 默认为 100,000
xpack.security.automata.cache.enabled
(静态) 是否缓存已编译的自动机。编译自动机可能会占用大量CPU资源,并可能减慢某些操作的速度。缓存减少了需要编译自动机的频率。 默认为 true
xpack.security.automata.cache.size
(静态) 自动机缓存中保留的最大项目数。 默认为 10,000
xpack.security.automata.cache.ttl
(静态) 自动机缓存中项目保留的时间长度(基于最近的使用情况)。 默认为 48h(48小时)。

文档和字段级别的安全设置

edit

您可以在 elasticsearch.yml 中设置以下文档和字段级别的安全设置。更多信息,请参阅 设置字段和文档级别的安全性

xpack.security.dls_fls.enabled
(静态) 设置为false以防止文档和字段级别的安全性被配置。默认为true
xpack.security.dls.bitset.cache.ttl
(静态) 文档级安全性的缓存BitSet条目的生存时间。 文档级安全查询可能依赖于Lucene BitSet对象,这些对象会自动缓存以提高性能。默认情况下,未使用的条目会在2h(2小时)后过期。
xpack.security.dls.bitset.cache.size
(静态) 文档级安全性的缓存 BitSet 条目的最大内存使用量。文档级安全查询可能依赖于 Lucene BitSet 对象,这些对象会自动缓存以提高性能。可以配置为字节数的原始数字(例如 200mb1g)或节点 JVM 堆内存的百分比(例如 5%)。当超过默认值时,最近最少使用的条目将被驱逐。默认值为分配给节点的堆的 10%

令牌服务设置

edit

您可以在 elasticsearch.yml中设置以下令牌服务设置。

xpack.security.authc.token.enabled
(静态) 设置为 false 以禁用内置的令牌服务。默认值为 true,除非 xpack.security.http.ssl.enabledfalse。这可以防止通过纯 HTTP 连接嗅探令牌。
xpack.security.authc.token.timeout
(静态) 令牌的有效时长。默认情况下,此值为 20m 或 20 分钟。最大值为 1 小时。

API 密钥服务设置

edit

您可以在 elasticsearch.yml中设置以下API密钥服务设置。

xpack.security.authc.api_key.enabled
(静态) 设置为 false 以禁用内置的 API 密钥服务。默认为 true
xpack.security.authc.api_key.cache.ttl
(静态) 缓存的API密钥条目的生存时间。API密钥ID及其API密钥的哈希值在此时间段内被缓存。使用标准的Elasticsearch 时间单位指定时间段。默认为1d
xpack.security.authc.api_key.cache.max_keys
(静态) 在任何给定时间内,缓存中可以存在的API密钥条目的最大数量。默认为10,000。
xpack.security.authc.api_key.cache.hash_algo
(静态, 专家) 用于内存中缓存的API密钥凭据的哈希算法。有关可能的值,请参阅表1,“缓存哈希算法”。 默认为ssha256
xpack.security.authc.api_key.delete.retention_period
(动态) 无效或过期的API密钥超过保留期的将被删除。 默认为 7d

集群节点间存在较大的实时时钟不一致可能会导致评估API密钥保留期时出现问题。也就是说,如果使API密钥失效的节点上的时钟与执行删除操作的节点上的时钟显著不同,密钥可能会被保留的时间比配置的保留期更长或更短。

xpack.security.authc.api_key.delete.interval

(动态, 专家) 集群节点会自动删除超过保留期的无效或过期的API密钥。 此设置控制两次此类删除作业之间的最小时间间隔。 默认为 24h

这是一个低级设置,目前控制每个节点触发的删除作业之间的间隔,而不是整个集群。

xpack.security.authc.api_key.delete.timeout
(静态, 专家) 设置内部搜索和删除调用的超时时间。
xpack.security.authc.api_key.hashing.algorithm
(静态) 指定用于保护API密钥凭据的哈希算法。 请参阅表2,“密码哈希算法”。默认值为pbkdf2

安全域设置

edit

您在 elasticsearch.yml 文件的 xpack.security.authc.domains 命名空间中配置安全域设置。

例如:

xpack:
  security:
    authc:
      domains:
        my_domain: 
          realms: [ 'default_native', 'saml1' ] 

指定安全域的名称

指定属于该域的领域

领域设置

edit

您在 elasticsearch.yml 文件的 xpack.security.authc.realms 命名空间中配置领域设置。

例如:

xpack.security.authc.realms:

    native.realm1: 
        order: 0 
        ...

    ldap.realm2:
        order: 1
        ...

    active_directory.realm3:
        order: 2
        ...
    ...

指定领域类型(例如,nativeldapactive_directorypkifilekerberossaml)和领域名称。此信息是必需的。

指定领域链中领域的优先级。此信息是必需的。

有效的设置因领域类型而异。更多信息,请参阅用户认证

适用于所有领域的设置
edit
order
(静态) 领域在领域链中的优先级。优先级较低的领域会首先被咨询。每个领域的值必须唯一。此设置是必需的。
enabled
(静态) 指示领域是否启用。您可以使用此设置在不删除其配置信息的情况下禁用领域。默认为 true
本地领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下可选设置:

cache.ttl
(静态) 缓存用户条目的生存时间。用户及其凭据的哈希值会缓存这段时间。使用标准的Elasticsearch 时间单位指定时间周期。默认为20m
cache.max_users
(静态) 在任何给定时间内,缓存中可以存在的用户条目的最大数量。默认为 100,000。
cache.hash_algo
(静态, 专家) 用于内存中缓存用户凭据的哈希算法。有关可能的值,请参阅表1,“缓存哈希算法”。 默认为ssha256
authentication.enabled
(静态) 如果设置为 false,将禁用此领域中的身份验证支持,使其仅支持用户查找。 (参见 run as授权领域 功能)。 默认为 true
文件领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置:

cache.ttl
(静态) 缓存用户条目的生存时间。用户及其凭据的哈希值会缓存此配置的时间段。默认为 20m。使用标准的 Elasticsearch 时间单位 指定值。默认为 20m
cache.max_users
(静态) 在给定时间内可以存在于缓存中的用户条目的最大数量。 默认为 100,000。
cache.hash_algo
(静态, 专家) 用于内存中缓存用户凭据的哈希算法。请参阅表1,“缓存哈希算法”。默认为ssha256
authentication.enabled
(静态) 如果设置为 false,则在此领域中禁用身份验证支持,使其仅支持用户查找。 (参见 run as授权领域 功能)。 默认为 true
LDAP 领域设置
edit

除了适用于所有领域的设置,您还可以指定以下设置:

url

(静态) 一个或多个 LDAP URL,格式为 ldap[s]://:。必填。

要提供多个URL,请使用YAML数组(["ldap://server1:636", "ldap://server2:636"])或逗号分隔的字符串("ldap://server1:636, ldap://server2:636")。

虽然两者都支持,但不能混合使用ldapldaps协议。

load_balance.type
(静态) 当定义了多个LDAP URL时的行为。有关支持的值,请参阅负载均衡和故障转移类型。 默认为failover
load_balance.cache_ttl
(静态) 当使用 dns_failoverdns_round_robin 作为负载均衡类型时, 此设置控制缓存 DNS 查找的时间量。默认为 1h
bind_dn
(静态) 用于绑定到 LDAP 并执行搜索的用户 DN。 仅适用于用户搜索模式。 如果未指定,则尝试匿名绑定。 默认为空。由于其潜在的安全影响,bind_dn 不会通过 节点信息 API 公开。
bind_password
(静态) [6.3] 在6.3中已弃用。 请改用secure_bind_password。用于绑定到LDAP目录的用户的密码。 默认为空。由于其潜在的安全影响,bind_password不会通过节点信息API暴露。
secure_bind_password
(安全, 可重新加载) 用于绑定到 LDAP 目录的用户的密码。 默认为空。
user_dn_templates
(静态) 替换用户名为字符串 {0} 的 DN 模板。 此设置是多值的;您可以指定多个用户上下文。 在用户模板模式下操作时需要。如果指定了 user_search.base_dn, 则此设置无效。有关不同模式的更多信息,请参阅 LDAP 用户认证
authorization_realms

(静态) 应咨询以进行委托授权的领域名称。 如果使用此设置,则LDAP领域不执行角色映射,而是从列出的领域加载用户。引用的领域按照它们在此列表中定义的顺序进行咨询。 参见 将授权委托给另一个领域

如果指定了任何以 user_search 开头的设置,则 user_dn_templates 设置将被忽略。

user_group_attribute
(静态) 指定用于检查用户组成员关系的属性。 如果指定了任何 group_search 设置,则此设置将被忽略。默认值为 memberOf
user_full_name_attribute
(静态) 指定用于检查用户全名的属性。 默认为 cn
user_email_attribute
(静态) 指定用于检查用户电子邮件地址的用户属性。 默认为 mail
user_search.base_dn
(静态) 指定用于搜索用户的容器DN。在用户搜索模式下操作时必需。如果指定了user_dn_templates,则此设置无效。有关不同模式的更多信息,请参阅LDAP用户认证
user_search.scope
(静态) 用户搜索的范围。有效值为 sub_treeone_levelbaseone_level 仅搜索直接包含在 base_dn 中的对象。sub_tree 搜索包含在 base_dn 下的所有对象。 base 指定 base_dn 是用户对象,并且它是 唯一考虑的用户。默认为 sub_tree
user_search.filter
(静态) 指定用于在尝试匹配用户提供的用户名的目录中搜索的过滤器。默认为 (uid={0}){0} 在搜索时会被提供的用户名替换。
user_search.attribute
(静态) [5.6] 在5.6中已弃用。 请改用 user_search.filter。 与请求中发送的用户名匹配的属性。默认为 uid
user_search.pool.enabled
(静态) 启用或禁用用户搜索的连接池。如果设置为false,则为每次搜索创建一个新的连接。当bind_dn设置时,默认值为true
user_search.pool.size
(静态) 连接池中允许的最大连接数到LDAP服务器。默认为20
user_search.pool.initial_size
(静态) 在启动时创建到LDAP服务器的初始连接数。 默认为 0。如果LDAP服务器关闭,大于 0 的值可能会导致启动失败。
user_search.pool.health_check.enabled
(静态) 启用或禁用在连接池中对LDAP连接的健康检查。连接会在后台以指定的间隔进行检查。 默认为 true
user_search.pool.health_check.dn
(静态) 作为健康检查的一部分检索到的专有名称。 默认值为bind_dn的值(如果存在);如果不存在,则回退到user_search.base_dn
user_search.pool.health_check.interval
(静态) 在池中执行连接后台检查的时间间隔。 默认为 60s
group_search.base_dn
(静态) 用于搜索用户所属组的容器DN。当此元素不存在时,Elasticsearch会搜索用户上设置的user_group_attribute属性,以确定组成员身份。
group_search.scope
(静态) 指定组搜索应该是sub_treeone_level还是 baseone_level仅搜索直接包含在 base_dn中的对象。sub_tree搜索所有包含在base_dn下的对象。 base指定base_dn是一个组对象,并且它是 唯一考虑的组。默认为sub_tree
group_search.filter
(静态) 指定用于查找组的过滤器。 当未设置时,领域会搜索具有属性membermemberOfmemberUidgroupgroupOfNamesgroupOfUniqueNamesposixGroup。过滤器中的任何{0}实例都将替换为在group_search.user_attribute中定义的用户属性。
group_search.user_attribute
(静态) 指定要获取并作为参数传递给过滤器的用户属性。如果未设置,则将用户DN传递到过滤器中。默认为空。
unmapped_groups_as_roles
(静态) 如果设置为true,任何未映射的LDAP组的名称将用作角色名称并分配给用户。如果一个组未在角色映射文件中引用,则该组被视为未映射。基于API的角色映射不被考虑。默认为false
files.role_mapping
(静态) 位置YAML角色映射配置文件。默认为 ES_PATH_CONF/role_mapping.yml
follow_referrals
(静态) 指定 Elasticsearch 是否应遵循 LDAP 服务器返回的转介。转介是由服务器返回的 URL,用于继续 LDAP 操作(例如,搜索)。默认为 true
metadata
(静态) 应从LDAP服务器加载并存储在已验证用户元数据字段中的一组附加LDAP属性。
timeout.tcp_connect
(静态) 用于建立LDAP连接的TCP连接超时时间。 末尾的s表示秒,或ms表示毫秒。 默认为5s(5秒)。
timeout.tcp_read
(静态) [7.7] 在7.7中已弃用。 建立LDAP连接后的TCP读取超时时间。这相当于并且已被弃用,取而代之的是 timeout.response,它们不能同时使用。末尾的s表示秒,或ms表示毫秒。
timeout.response
(静态) 等待LDAP服务器响应的时间间隔。末尾的s表示秒,或ms表示毫秒。默认值为timeout.ldap_search的值。
timeout.ldap_search
(静态) LDAP搜索的超时时间。该值在请求中指定,并由接收的LDAP服务器强制执行。 末尾的s表示秒,或ms表示毫秒。 默认为5s(5秒)。
ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

如果LDAP服务器需要客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

ssl.key_passphrase

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

当客户端连接时,此证书将颁发给他们。

ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

您不能同时使用此设置和ssl.truststore.path

ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

您不能同时使用此设置和ssl.key

ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
ssl.keystore.secure_password
(安全) 密钥库的密码。
ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

ssl.keystore.secure_key_password
(静态) 密钥库中密钥的密码。默认值是密钥库密码。
ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

您不能同时使用此设置和ssl.certificate_authorities

ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

ssl.truststore.secure_password
(安全) 信任库的密码。
ssl.truststore.type
(静态) 信任库文件的格式。它必须是 jksPKCS12。如果文件名以 ".p12"、".pfx" 或 "pkcs12" 结尾,默认值为 PKCS12。 否则,默认值为 jks
ssl.verification_mode

(静态) 指示在使用 ldaps 时用于防止中间人攻击和证书伪造的验证类型。

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期内的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它是否由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

ssl.cipher_suites

(静态) 指定在与LDAP服务器通信时应支持的密码套件。 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

cache.ttl
(静态) 指定缓存用户条目的生存时间。用户及其凭据的哈希值会缓存这段时间。使用标准的 Elasticsearch 时间单位。默认为 20m
cache.max_users
(静态) 指定缓存可以包含的最大用户条目数。 默认为 100000
cache.hash_algo
(静态, 专家) 指定用于内存中缓存用户凭证的哈希算法。请参阅表1,“缓存哈希算法”。默认为ssha256
authentication.enabled
(静态) 如果设置为 false,则在此领域中禁用身份验证支持,使其仅支持用户查找。 (参见 run as授权领域 功能)。 默认为 true
Active Directory 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置:

url

(静态) 一个或多个LDAP URL,格式为ldap[s]://:。默认为 ldap://:389。当使用SSL/TLS或自定义端口连接时,此设置是必需的。

要提供多个URL,请使用YAML数组(["ldap://server1:636", "ldap://server2:636"])或逗号分隔的字符串("ldap://server1:636, ldap://server2:636")。

虽然两者都支持,但不能混合使用ldapldaps协议。

如果没有提供URL,Elasticsearch使用默认的 ldap://:389。这个默认值使用 domain_name 设置值,并假设与端口389的未加密连接。

load_balance.type
(静态) 当定义了多个LDAP URL时的行为。有关支持的值,请参阅负载均衡和故障转移类型。 默认为failover
load_balance.cache_ttl
(静态) 当使用 dns_failoverdns_round_robin 作为负载均衡类型时, 此设置控制缓存 DNS 查找的时间量。默认为 1h
domain_name
(静态) Active Directory 的域名。如果未指定 urluser_search.base_dn 设置,集群可以从该设置中推导出这些值。必需。
bind_dn
(静态) 用于绑定到Active Directory并执行搜索的用户的DN。 默认为空。由于其潜在的安全影响,bind_dn不会通过节点信息API暴露。
bind_password
(静态) [6.3] 在6.3中已弃用。 请改用secure_bind_password。用于绑定到Active Directory的用户的密码。默认为空。由于其潜在的安全影响,bind_password不会通过节点信息API暴露。
secure_bind_password
(安全, 可重新加载) 用于绑定到Active Directory的用户的密码。 默认为空。
unmapped_groups_as_roles
(静态) 如果设置为true,任何未映射的Active Directory组的名称将用作角色名称并分配给用户。当组在任何角色映射文件中未被引用时,该组被视为未映射。基于API的角色映射不被考虑。默认为false
files.role_mapping
(静态) 位置 用于 YAML 角色映射配置文件。默认为 ES_PATH_CONF/role_mapping.yml
user_search.base_dn
(静态) 搜索用户的上下文。默认为Active Directory域的根目录。
user_search.scope
(静态) 指定用户搜索应该是sub_treeone_level还是baseone_level仅搜索直接包含在base_dn中的用户。 sub_tree搜索base_dn下包含的所有对象。base 指定base_dn是一个用户对象,并且它是唯一考虑的用户。默认为sub_tree
user_search.filter
(静态) 指定一个过滤器,用于根据用户名查找用户。默认过滤器查找具有sAMAccountNameuserPrincipalNameuser对象。如果指定,这必须是一个有效的LDAP用户搜索过滤器。 例如(&(objectClass=user)(sAMAccountName={0}))。更多信息,请参阅 搜索过滤器语法
user_search.upn_filter
(静态) 指定一个过滤器,用于根据用户主体名称查找用户。默认过滤器查找具有匹配的userPrincipalNameuser对象。如果指定,这必须是一个有效的LDAP用户搜索过滤器。例如,(&(objectClass=user)(userPrincipalName={1})){1}是用户提供的完整用户主体名称。有关更多信息,请参阅搜索过滤器语法
user_search.down_level_filter
(静态) 指定一个过滤器,用于根据下层登录名(DOMAIN\user)查找用户。默认过滤器在提供的域中查找具有匹配的 sAMAccountNameuser 对象。如果指定,这 必须是一个有效的 LDAP 用户搜索过滤器。例如, (&(objectClass=user)(sAMAccountName={0}))。有关更多信息,请参阅 搜索过滤器语法
user_search.pool.enabled
(静态) 启用或禁用用户搜索的连接池。当禁用时,每次搜索都会创建一个新的连接。默认情况下,当提供了bind_dn时,默认为true
user_search.pool.size
(静态) 连接池中允许的最大连接数到Active Directory服务器。默认为20
user_search.pool.initial_size
(静态) 启动时创建到Active Directory服务器的初始连接数。 默认为0。如果LDAP服务器关闭,大于0的值可能会导致启动失败。
user_search.pool.health_check.enabled
(静态) 启用或禁用在连接池中对Active Directory连接的健康检查。连接会在后台以指定的间隔进行检查。 默认为 true
user_search.pool.health_check.dn
(静态) 作为健康检查的一部分要检索的专有名称。 如果存在 bind_dn 设置,则默认为该值。否则,它默认为 user_search.base_dn 设置的值。
user_search.pool.health_check.interval
(静态) 在池中执行连接后台检查的时间间隔。 默认为 60s
group_search.base_dn
(静态) 用于搜索用户所属组的上下文。默认为Active Directory域的根目录。
group_search.scope
(静态) 指定组搜索应该是sub_treeone_level还是 baseone_level搜索直接包含在 base_dn中的组。sub_tree搜索包含在base_dn下的所有对象。 base指定base_dn是一个组对象,并且它是 唯一考虑的组。默认为sub_tree
metadata
(静态) 应从LDAP服务器加载并存储在已验证用户元数据字段中的一组附加LDAP属性。
timeout.tcp_connect
(静态) 用于建立LDAP连接的TCP连接超时时间。 末尾的s表示秒,或ms表示毫秒。 默认为5s(5秒)。
timeout.tcp_read
(静态) [7.7] 在7.7版本中已弃用。 建立LDAP连接后的TCP读取超时时间。这等同于并已被弃用,取而代之的是 timeout.response,它们不能同时使用。末尾的s表示秒,或ms表示毫秒。默认值为 timeout.ldap_search的值。
timeout.response
(静态) 等待AD服务器响应的时间间隔。末尾的s表示秒,或ms表示毫秒。默认值为timeout.ldap_search的值。
timeout.ldap_search
(静态) LDAP搜索的超时时间。该值在请求中指定,并由接收的LDAP服务器强制执行。 末尾的s表示秒,或ms表示毫秒。 默认为5s(5秒)。
ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

此证书在客户端连接时提供给他们。

ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

您不能同时使用此设置和ssl.truststore.path

ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

如果 Active Directory 服务器需要客户端身份验证,它将使用此文件。 您不能同时使用此设置和 ssl.keystore.path

ssl.key_passphrase

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
ssl.secure_keystore.password
(安全) 密钥库的密码。
ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

您不能同时使用此设置和ssl.key

ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

ssl.truststore.secure_password
(安全) 信任库的密码。
ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

您不能同时使用此设置和ssl.certificate_authorities

ssl.truststore.type
(静态) 信任库文件的格式。它必须是 jksPKCS12。如果文件名以 ".p12"、".pfx" 或 "pkcs12" 结尾,默认值为 PKCS12。 否则,默认值为 jks
ssl.verification_mode

(静态) 指示在使用 ldaps 时,用于防止中间人攻击和证书伪造的验证类型。

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期内的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

ssl.cipher_suites

(静态) 指定在与Active Directory服务器通信时应支持的密码套件。 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

cache.ttl
(静态) 指定缓存用户条目的生存时间。用户及其凭据的哈希值将在此配置的时间段内被缓存。使用标准的Elasticsearch 时间单位。 默认为 20m
cache.max_users
(静态) 指定缓存可以包含的最大用户条目数。 默认为 100000
cache.hash_algo
(静态, 专家) 指定用于内存中缓存用户凭据的哈希算法。请参阅表1,“缓存哈希算法”。默认为ssha256
authentication.enabled
(静态) 如果设置为 false,则在此领域中禁用身份验证支持,使其仅支持用户查找。 (参见 run as授权领域 功能)。 默认为 true
follow_referrals
(静态) 如果设置为true,Elasticsearch将遵循LDAP服务器返回的转介。 转介是由服务器返回的URL,用于继续进行LDAP操作(例如搜索)。默认为true
PKI 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置:

username_pattern
(静态) 用于从证书DN中提取用户名的正则表达式模式。用户名用于审计和日志记录。用户名还可以与角色映射API授权委托一起使用。 第一个匹配组用作用户名。 默认值为CN=(.*?)(?:,|$)
certificate_authorities
(静态) 应使用的PEM证书文件路径列表,用于验证用户的证书是否可信。默认为为SSL配置的受信任证书。此设置不能与truststore.path一起使用。
truststore.algorithm
(静态) 信任库的算法。默认为 SunX509
truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

如果设置了truststore.path,则此设置是必需的。

truststore.secure_password
(安全) 信任库的密码。
truststore.path
(静态) 要使用的信任库的路径。默认为为SSL配置的受信任证书。此设置不能与certificate_authorities一起使用。
files.role_mapping
(静态) 指定位置YAML角色映射配置文件。 默认为ES_PATH_CONF/role_mapping.yml
authorization_realms
(静态) 应咨询的领域名称以进行委托授权。 如果使用此设置,则PKI领域不执行角色映射, 而是从列出的领域加载用户。 参见将授权委托给另一个领域
cache.ttl
(静态) 指定缓存用户条目的生存时间。用户及其凭据的哈希值会缓存这段时间。使用标准的Elasticsearch 时间单位。默认值为20m
cache.max_users
(静态) 指定缓存可以包含的最大用户条目数。 默认为 100000
delegation.enabled
(静态) 通常,为了使客户端能够通过PKI领域进行身份验证,他们必须直接连接到Elasticsearch。也就是说,他们不能通过终止TLS连接的代理。为了允许可信智能代理(如Kibana)位于Elasticsearch之前并终止TLS连接,但仍然允许客户端通过此领域在Elasticsearch上进行身份验证,您需要将此设置为true。默认为false。如果启用了委托,则必须定义truststore.pathcertificate_authorities设置。有关更多详细信息,请参阅为PKI领域配置身份验证委托
SAML 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置。

idp.entity_id logo cloud
(静态) SAML身份提供者的实体ID。实体ID是一个最大长度为1024个字符的URI。它可以是一个URL (https://idp.example.com/) 或者一个URN (urn:example.com:idp),并且可以在身份提供者的配置或SAML元数据中找到。
idp.metadata.path logo cloud

(静态) 指向描述身份提供者功能和配置的SAML 2.0元数据文件的(推荐)路径或URL。 如果提供了路径,则它相对于Elasticsearch配置目录解析。 如果提供了URL,则它必须是file URL或https URL。

Elasticsearch 会自动轮询此元数据资源,并在检测到更改时重新加载 IdP 配置。 基于文件的资源会以由全局 Elasticsearch resource.reload.interval.high 设置决定的频率进行轮询,默认值为 5 秒。 HTTPS 资源会以由 realm 的 idp.metadata.http.refreshidp.metadata.http.minimum_refresh 设置决定的频率进行轮询。

如果元数据资源是从文件加载的,那么该文件必须在节点启动时存在,如果不存在,节点将无法启动。 如果资源是通过HTTPS加载的,那么(默认情况下)节点将对加载资源的失败保持宽容 - 节点将启动并继续轮询URL以获取更新。受影响的SAML领域将无法验证用户身份,直到问题解决。要强制节点在元数据不可用时失败,请将idp.metadata.http.fail_on_error设置为true

idp.metadata.http.fail_on_error
(静态) 如果设置为true,当领域尝试通过HTTPS加载元数据且该元数据不可用时,领域将在启动时失败(并阻止节点启动)。 如果设置为false(默认值),节点将启动,但受影响的SAML领域将不支持用户身份验证,直到元数据能够成功加载。 如果从文件加载元数据,则忽略此设置。
idp.metadata.http.refresh logo cloud

(静态) 控制检查https元数据更改的频率。 默认为1h(1小时)。

在某些情况下,Elasticsearch 可能会决定需要更频繁地检查元数据。如果之前的尝试加载元数据时遇到错误,或者元数据指示其将在少于配置的刷新间隔内到期,则可能会发生这种情况。在这些情况下,Elasticsearch 会进行更频繁的轮询,但不会比 idp.metadata.http.minimum_refresh 更频繁。如果尝试对尚未成功加载元数据的领域进行身份验证,该领域可能会尝试在配置的轮询频率之外加载元数据。

idp.metadata.http.minimum_refresh
(静态) 控制检查 https 元数据更改的最小频率。在正常操作中,Elasticsearch 将使用 idp.metadata.http.refresh 的值作为轮询间隔。然而,在某些情况下,Elasticsearch 可能会确定需要更频繁地轮询。在这些情况下,minimum_refresh 将设置检查元数据的最小频率。 默认值为 5m(5 分钟),且不得设置为大于 idp.metadata.http.refresh 的值。
idp.use_single_logout logo cloud
(静态) 指示是否使用身份提供者的单点注销服务(如果IdP元数据文件中存在)。 默认为 true
sp.entity_id logo cloud
(静态) 用于此SAML服务提供商的实体ID。这应该作为一个URI输入。我们建议您使用Kibana实例的基本URL。例如, https://kibana.example.com/
sp.acs logo cloud
(静态) Kibana中Assertion Consumer Service的URL。通常这是Kibana服务器的"api/security/saml/callback"端点。例如, https://kibana.example.com/api/security/saml/callback
sp.logout logo cloud
(静态) Kibana中的单点注销服务的URL。通常这是Kibana服务器的“注销”端点。例如, https://kibana.example.com/logout
attributes.principal logo cloud
(静态) 包含用户主体(用户名)的SAML属性的名称。
attributes.groups logo cloud
(静态) 包含用户组的SAML属性的名称。
attributes.name logo cloud
(静态) 包含用户全名的SAML属性的名称。
attributes.mail logo cloud
(静态) 包含用户电子邮件地址的SAML属性的名称。
attributes.dn logo cloud
(静态) 包含用户X.50 专有名称的SAML属性的名称。
attribute_patterns.principal logo cloud
(静态) 一个Java正则表达式,用于匹配由attributes.principal指定的SAML属性,然后将其应用于用户的主体属性。 属性值必须匹配该模式,并且第一个捕获组的值将用作主体。例如,^([^@]+)@example\\.com$ 匹配来自“example.com”域的电子邮件地址,并使用本地部分作为主体。
attribute_patterns.groups logo cloud
(静态) 根据attribute_patterns.principal,但对于属性。
attribute_patterns.name logo cloud
(静态) 根据attribute_patterns.principal,但对于名称属性。
attribute_patterns.mail logo cloud
(静态) 根据attribute_patterns.principal,但对于邮件属性。
attribute_patterns.dn logo cloud
(静态) 根据attribute_patterns.principal,但对于dn属性。
attribute_delimiters.groups logo cloud
(静态) 一个简单的字符串,用作分隔符,用于在将单值SAML属性(由attributes.groups指定)应用于用户的groups属性之前对其进行拆分。例如,将SAML属性值engineering,elasticsearch-admins,employees,作为分隔符进行拆分,将得到engineeringelasticsearch-adminsemployees作为用户的组列表。无论输入字符串中的转义如何,分隔符总是会被拆分。此设置不支持多值SAML属性。它不能与attribute_patterns设置一起使用。您只能为组属性配置此设置。
nameid_format logo cloud
(静态) 在请求身份提供者(IdP)对当前用户进行身份验证时应请求的NameID格式。默认情况下不包含nameid_format属性。
nameid.allow_create logo cloud
(静态) 认证请求中NameIdPolicy元素的AllowCreate属性的值。默认值为false。
nameid.sp_qualifier logo cloud
(静态) 认证请求中NameIdPolicy元素的SPNameQualifier属性的值。默认情况下不包含SPNameQualifier属性。
force_authn logo cloud
(静态) 指定在请求IdP验证当前用户时是否设置ForceAuthn属性。如果设置为true,IdP需要验证用户的身份,无论他们是否已有会话。 默认为false
populate_user_metadata logo cloud
(静态) 指定是否使用SAML属性提供的值填充Elasticsearch用户的元数据。默认为true
authorization_realms
(静态) 应咨询的领域名称以进行委托授权。 如果使用此设置,则SAML领域不执行角色映射,而是从列出的领域加载用户。 参见将授权委托给另一个领域
allowed_clock_skew logo cloud
(静态) IdP 的时钟与 Elasticsearch 节点时钟之间可以容忍的最大偏差量。 默认为 3m(3 分钟)。
req_authn_context_class_ref logo cloud

(静态) 一个以逗号分隔的认证上下文类引用值列表,用于在请求身份提供者(IdP)对当前用户进行身份验证时,包含在请求的认证上下文中。相应的认证响应的认证上下文应包含至少一个请求的值。

有关更多信息,请参阅 请求特定的认证方法

SAML 领域签名设置
edit

如果配置了签名密钥(即设置了signing.keysigning.keystore.path),则Elasticsearch会对发出的SAML消息进行签名。可以使用以下设置来配置签名:

signing.saml_messages logo cloud
(静态) 应签名的SAML消息类型的列表,或使用*来签名所有消息。 列表中的每个元素应为SAML XML元素的本地名称。 支持的元素类型有AuthnRequestLogoutRequestLogoutResponse。 仅在同时指定了signing.keysigning.keystore.path时有效。 默认为*
signing.key logo cloud
(静态) 指定用于SAML消息签名的PEM编码私钥的路径。 signing.keysigning.keystore.path 不能同时使用。
signing.secure_key_passphrase logo cloud
(安全) 指定用于解密PEM编码的私钥(signing.key)的密码短语,如果它是加密的。
signing.certificate logo cloud
(静态) 指定与signing.key对应的PEM编码证书(或证书链)的路径。此证书还必须包含在服务提供商元数据中或手动配置在身份提供程序(IdP)内,以允许进行签名验证。仅当设置了signing.key时,才能使用此设置。
signing.keystore.path logo cloud
(静态) 包含私钥和证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和 signing.key
signing.keystore.type logo cloud
(静态) signing.keystore.path 中密钥库的类型。 必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 "pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
signing.keystore.alias logo cloud
(静态) 指定密钥库中用于SAML消息签名的密钥的别名。如果密钥库包含多个私钥,则必须指定此设置。
signing.keystore.secure_password logo cloud
(安全) signing.keystore.path 中密钥库的密码。
signing.keystore.secure_key_password logo cloud
(安全) 密钥库中密钥的密码(signing.keystore.path)。 默认为密钥库密码。
SAML 领域加密设置
edit

如果配置了加密密钥(即设置了encryption.keyencryption.keystore.path),那么Elasticsearch在生成元数据时会发布一个加密证书,并尝试解密传入的SAML内容。可以使用以下设置来配置加密:

encryption.key logo cloud
(静态) 指定用于SAML消息解密的PEM编码私钥的路径。 encryption.keyencryption.keystore.path 不能同时使用。
encryption.secure_key_passphrase
(安全) 指定用于解密PEM编码的私钥的密码短语(如果它是加密的)。 (encryption.key)
encryption.certificate logo cloud
(静态) 指定与encryption.key关联的PEM编码证书(或证书链)的路径。此证书还必须包含在服务提供商元数据中,或在IdP中手动配置,以启用消息加密。仅当设置了encryption.key时,才能使用此设置。
encryption.keystore.path logo cloud
(静态) 包含私钥和证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和 encryption.key
encryption.keystore.type logo cloud
(静态) 密钥库的类型(encryption.keystore.path)。 必须是jksPKCS12。如果密钥库路径以".p12"、".pfx"或"pkcs12"结尾,此设置默认为PKCS12。否则,它默认为jks
encryption.keystore.alias logo cloud
(静态) 指定密钥库中用于SAML消息解密的密钥别名(encryption.keystore.path)。如果未指定,密钥库中所有兼容的密钥对都将被视为解密的候选密钥。
encryption.keystore.secure_password
(安全) 密钥库的密码(encryption.keystore.path)。
encryption.keystore.secure_key_password
(安全) 密钥库中密钥的密码(encryption.keystore.path)。仅支持单个密码。如果您使用多个解密密钥,它们不能有单独的密码。
SAML 领域 SSL 设置
edit

如果您通过SSL/TLS加载IdP元数据(即,idp.metadata.path 使用https协议的URL),可以使用以下设置来配置SSL。

这些设置仅用于通过https加载元数据,不用于其他任何目的。

ssl.key logo cloud

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

ssl.key_passphrase logo cloud

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

ssl.secure_key_passphrase

(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。

您不能同时使用此设置和ssl.key_passphrase

ssl.certificate logo cloud

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

ssl.certificate_authorities logo cloud

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

ssl.keystore.path logo cloud

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

ssl.keystore.type logo cloud
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
ssl.keystore.password logo cloud
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
ssl.keystore.secure_password

(安全) 密钥库的密码。

您不能同时使用此设置和ssl.keystore.password

ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

您不能同时使用此设置和ssl.keystore.secure_key_password

ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。

您不能同时使用此设置和ssl.keystore.key_password

ssl.truststore.path logo cloud

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

ssl.truststore.type logo cloud
(静态) 信任库文件的格式。它必须是 jksPKCS12。如果文件名以 ".p12"、".pfx" 或 "pkcs12" 结尾,默认值为 PKCS12。 否则,默认值为 jks
ssl.truststore.password logo cloud

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

ssl.truststore.secure_password

(安全) 信任库的密码。

此设置不能与ssl.truststore.password一起使用。

ssl.verification_mode logo cloud

(静态) 控制证书的验证。

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期之间的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

ssl.supported_protocols logo cloud

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

ssl.cipher_suites logo cloud

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

Kerberos 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置:

keytab.path logo cloud
(静态) 指定包含此Elasticsearch节点使用的服务主体的Kerberos密钥表文件的路径。这必须是Elasticsearch配置目录内的位置,并且文件必须具有读取权限。必需。
remove_realm_name logo cloud
(静态) 设置为 true 以移除主体名称中的领域部分。 Kerberos 中的主体名称具有 user/instance@REALM 的形式。如果此选项为 true,则领域部分 (@REALM) 将不会包含在用户名中。 默认为 false
krb.debug
(静态) 设置为 true 以启用Java登录模块的调试日志,该模块提供对Kerberos身份验证的支持。默认为 false
cache.ttl logo cloud
(静态) 缓存用户条目的生存时间。用户会被缓存这段时间。使用标准的Elasticsearch 时间单位来指定时间周期。默认为20m
cache.max_users logo cloud
(静态) 在任何给定时间内,缓存中可以存在的用户条目的最大数量。默认为 100,000。
authorization_realms logo cloud
(静态) 应咨询的领域名称以进行委托授权。 如果使用此设置,则Kerberos领域不执行角色映射,而是从列出的领域加载用户。 参见将授权委托给另一个领域
OpenID Connect 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置。

op.issuer logo cloud
(静态) OpenID Connect 提供者的可验证标识符。颁发者标识符通常是一个使用 https 方案的区分大小写的 URL,包含方案、主机,以及可选的端口号和路径组件,但不包含查询或片段组件。此设置的值应由您的 OpenID Connect 提供者提供。
op.authorization_endpoint logo cloud
(静态) OpenID Connect Provider 的授权端点的 URL。此设置的值应由您的 OpenID Connect Provider 提供。
op.token_endpoint logo cloud
(静态) OpenID Connect Provider的Token Endpoint的URL。 此设置的值应由您的OpenID Connect Provider提供。
op.userinfo_endpoint logo cloud
(静态) OpenID Connect Provider的用户信息端点的URL。 此设置的值应由您的OpenID Connect Provider提供。
op.endsession_endpoint logo cloud
(静态) OpenID Connect 提供者的结束会话端点的URL。此设置的值应由您的OpenID Connect提供者提供。
op.jwkset_path logo cloud
(静态)

用于验证由 OpenID Connect Provider 签名的令牌和声明响应的 JSON Web Key Set (JWKS) 的文件名或 URL。如果值不以 httpshttp 开头,则认为它是文件名。文件名相对于 Elasticsearch 配置目录解析。文件的更改会以由全局 Elasticsearch resource.reload.interval.high 设置决定的频率进行轮询,默认值为 5 秒。

+ 如果提供了URL,则必须以https://http://开头。 Elasticsearch会自动缓存获取的JWK,并在签名验证失败时尝试刷新JWK,因为这可能表明OpenID Connect Provider已经轮换了签名密钥。

authorization_realms
(静态) 应咨询委托授权的领域的名称。 如果使用此设置,则OpenID Connect领域不执行角色映射,而是从列出的领域加载用户。 参见将授权委托给另一个领域
rp.client_id logo cloud
(静态) 在OpenID Connect提供商处注册时分配给Elasticsearch的OAuth 2.0客户端标识符。
rp.client_secret
(安全) 在OpenID Connect Provider注册期间分配给Elasticsearch的OAuth 2.0客户端密钥。
rp.client_auth_method logo cloud
(静态) Elasticsearch用于向OpenID Connect Provider进行身份验证的客户端身份验证方法。可以是client_secret_basicclient_secret_post, 或client_secret_jwt。默认为client_secret_basic
rp.client_auth_jwt_signature_algorithm logo cloud
(静态) Elasticsearch用于签署JWT的签名算法,该JWT用于在选择client_secret_jwt作为rp.client_auth_method时向OpenID Connect Provider进行客户端身份验证。可以是HS256HS384HS512。默认为HS384
rp.redirect_uri logo cloud
(静态) Kibana中的重定向URI。如果您想使用授权代码流程,这是您的Kibana服务器的api/security/oidc/callback端点。如果您想使用隐式流程,它是api/security/oidc/implicit端点。 例如,https://kibana.example.com/api/security/oidc/callback
rp.response_type logo cloud
(静态) OAuth 2.0 响应类型值,用于确定要使用的授权处理流程。可以是 code 用于授权码授予流程, 或者是 id_tokenid_token token 用于隐式流程。
rp.signature_algorithm logo cloud
(静态) Elasticsearch将用于验证从OpenID Connect Provider接收到的id令牌签名的签名算法。 允许的值为HS256HS384HS512ES256ES384ES512RS256RS384RS512PS256PS384PS512。 默认为RS256
rp.requested_scopes logo cloud
(静态) 作为身份验证请求的一部分,OpenID Connect 提供者将请求的范围值。可选,默认为 openid
rp.post_logout_redirect_uri logo cloud
(静态) OpenID Connect 提供者在成功完成单点注销后应重定向浏览器的重定向 URI(通常在 Kibana 内)。
claims.principal
(静态) 包含用户主体(用户名)的OpenID Connect声明的名称。
claims.groups logo cloud
(静态) 包含用户组的OpenID Connect声明的名称。
claims.name logo cloud
(静态) 包含用户全名的OpenID Connect声明的名称。
claims.mail logo cloud
(静态) 包含用户电子邮件地址的OpenID Connect声明的名称。
claims.dn logo cloud
(静态) 包含用户X.509 专有名称的OpenID Connect声明的名称。
claim_patterns.principal logo cloud
(静态) 一个Java正则表达式,用于匹配由claims.principal指定的OpenID Connect声明,在将其应用于用户的主体属性之前。属性值必须匹配该模式,并且第一个捕获组的值将用作主体。例如,^([^@]+)@example\\.com$匹配来自“example.com”域的电子邮件地址,并使用本地部分作为主体。
claim_patterns.groups logo cloud
(静态) 根据claim_patterns.principal,但适用于属性。
claim_patterns.name logo cloud
(静态) 根据claim_patterns.principal,但对于名称属性。
claim_patterns.mail logo cloud
(静态) 根据claim_patterns.principal,但对于邮件属性。
claim_patterns.dn logo cloud
(静态) 根据claim_patterns.principal,但对于dn属性。
allowed_clock_skew logo cloud
(静态) 在验证ID令牌的创建和过期时间时,所考虑的最大允许时钟偏差。 默认为 60s
populate_user_metadata logo cloud
(静态) 指定是否使用OpenID Connect声明提供的值填充Elasticsearch用户的元数据。默认为true
http.proxy.host
(静态) 指定内部http客户端用于与OpenID Connect Provider端点进行所有后通道通信的代理服务器地址。这包括向令牌端点、用户信息端点和从OP获取JSON Web密钥集的请求(如果op.jwkset_path设置为URL)。
http.proxy.scheme
(静态) 指定用于连接代理服务器的协议,该代理服务器将由http客户端用于与OpenID Connect Provider端点进行所有后通道通信。默认为http。允许的值为httphttps
http.proxy.port
(静态) 指定代理服务器的端口,该端口将由http客户端用于与OpenID Connect Provider端点进行所有后端通信。默认为80
http.connect_timeout logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定建立连接的超时时间。值为零表示不使用超时。默认值为5s
http.connection_read_timeout logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定从连接管理器请求连接时使用的超时时间。默认为5s
http.socket_timeout logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定套接字超时(SO_TIMEOUT),单位为毫秒,即等待数据的超时时间,或者换句话说,两个连续数据包之间的最大不活动时间。默认为 5s
http.max_connections logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定所有端点允许的最大连接数。 默认为 200
http.max_endpoint_connections logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定每个端点允许的最大连接数。 默认为 200
http.tcp.keep_alive logo cloud
(静态) 是否在用于与OpenID Connect Provider端点进行反向通道通信的HTTP连接上启用TCP保持活动。默认为true
http.connection_pool_ttl logo cloud
(静态) 控制用于与OpenID Connect Provider端点进行后通道通信的http客户端的行为。指定连接池中连接的生存时间(默认为3分钟)。如果连接空闲时间超过指定的超时时间,则该连接将被关闭。

服务器还可以设置 Keep-Alive HTTP 响应头。有效的时间存活值是此设置和 Keep-Alive 响应头之间的较小值。将此设置配置为 -1 以让服务器决定该值。如果服务器未设置该头且设置的值为 -1,则时间存活是无限的,连接永远不会过期。

OpenID Connect 领域 SSL 设置
edit

以下设置可用于配置所有发往 OpenID Connect Provider 端点的出站 http 连接的 SSL。

这些设置用于Elasticsearch与OpenID Connect Provider之间的后通道通信

ssl.key logo cloud

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

ssl.key_passphrase logo cloud

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

ssl.secure_key_passphrase

(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。

您不能同时使用此设置和ssl.key_passphrase

ssl.certificate logo cloud

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

ssl.certificate_authorities logo cloud

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

ssl.keystore.path logo cloud

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

ssl.keystore.type logo cloud
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
ssl.keystore.password logo cloud
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
ssl.keystore.secure_password

(安全) 密钥库的密码。

您不能同时使用此设置和ssl.keystore.password

ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

您不能同时使用此设置和ssl.keystore.secure_key_password

ssl.keystore.secure_key_password

(安全) 密钥库中密钥的密码。默认值是密钥库密码。

您不能同时使用此设置和ssl.keystore.key_password

ssl.truststore.path logo cloud

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

ssl.truststore.type logo cloud
(静态) 信任库文件的格式。它必须是 jksPKCS12。如果文件名以 ".p12"、".pfx" 或 "pkcs12" 结尾,默认值为 PKCS12。 否则,默认值为 jks
ssl.truststore.password logo cloud

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

ssl.truststore.secure_password

(安全) 信任库的密码。

您不能同时使用此设置和ssl.truststore.password

ssl.verification_mode logo cloud

(静态) 控制证书的验证。

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期之间的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

ssl.supported_protocols logo cloud

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

ssl.cipher_suites logo cloud

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

JWT 领域设置
edit

除了适用于所有领域的设置之外,您还可以指定以下设置。

token_type logo cloud
(静态) 令牌类型,id_tokenaccess_token,JWT 领域用于验证传入 JWT 的类型。默认为 id_token
allowed_audiences logo cloud
(静态) Elasticsearch应验证的允许的JWT受众列表。Elasticsearch只会消费那些意图针对这些受众之一的JWT,如JWT中的aud声明所表示。 受众通过完全字符串匹配进行比较,不支持通配符或正则表达式。 aud声明的示例包括https://example.com/client1other_service,elasticsearch。当token_typeaccess_token时,如果aud不存在,受众可以选择性地由JWT中的不同声明表示。 另请参阅fallback_claims.aud
allowed_clock_skew logo cloud
(静态) 在验证JWT关于其创建、不早于和过期时间时,要考虑的最大允许时钟偏差。
allowed_issuer logo cloud
(静态) 您的JWT发行者的可验证标识符。发行者标识符通常是一个使用https方案的区分大小写的URL,包含方案、主机,以及可选的端口号和路径组件,没有查询或片段组件。然而,它可以是任何字符串。此设置的值应由您的JWT发行者提供。 发行者与完全字符串匹配进行比较,不支持通配符或正则表达式。 iss声明的示例有https://example.com:8443/jwtissuer123
allowed_subjects logo cloud
(静态) Elasticsearch 应验证的允许的 JWT 主题列表。Elasticsearch 只会消费为这些主题之一颁发的 JWT,如 JWT 中的 sub 声明所表示。 主题通过完全字符串匹配进行比较,不支持通配符或正则表达式。 sub 声明的示例包括 https://example.com/user1user_1,user2。 当 token_typeaccess_token 时,此设置是强制性的,如果 sub 不存在,主题可以选择性地由 JWT 中的不同声明表示。 另请参阅 fallback_claims.sub
fallback_claims.sub logo cloud
(静态) 如果sub声明不存在,则查找主题信息的替代声明。仅当token_typeaccess_token时可配置。 回退适用于所有使用sub声明的地方。
fallback_claims.aud logo cloud
(静态) 如果在aud声明不存在时,寻找受众信息的替代声明。它仅在token_typeaccess_token时可配置。 回退适用于所有使用aud声明的地方。
required_claims logo cloud
(静态) Elasticsearch 应验证的附加声明及其关联值。 这是一个组设置,采用键/值对,其中键是一个字符串,值必须是字符串或字符串数组。 这些值通过完全字符串匹配进行比较,不支持通配符或正则表达式。

例如:

xpack.security.authc.realms.jwt.jwt1:
  required_claims:
    token_use: "id"
    versions: ["1.0", "2.0"]
allowed_signature_algorithms logo cloud
(静态) Elasticsearch 用于验证从 JWT 颁发者接收到的 JWT 签名的签名算法列表。 默认为 RS256。示例包括 HS512,RS512,ES512ES384。 允许的值包括 HS256HS384HS512ES256ES384ES512RS256RS384RS512PS256PS384PS512
authorization_realms
(静态) 应咨询以进行委托授权的领域的名称。 如果使用此设置,则JWT领域不执行角色映射,而是从列出的领域加载用户。 参见将授权委托给另一个领域
claims.dn logo cloud
(静态) 包含用户专有名称(DN)的JWT声明的名称,该名称唯一标识用户或组。
claim_patterns.dn logo cloud
(静态) 接受与 claim_patterns.principal相同的Java正则表达式,但用于dn属性。
claims.groups logo cloud
(静态) 包含用户组的JWT声明的名称,例如 groupsroles
claim_patterns.group logo cloud
(静态) 接受与 claim_patterns.principal相同的Java正则表达式,但用于group属性。
claims.mail logo cloud
(静态) 包含用户电子邮件地址的JWT声明的名称。
claim_patterns.mail logo cloud
(静态) 接受与 claim_patterns.principal相同的Java正则表达式,但用于mail属性。
claims.name logo cloud
(静态) 包含用户用户名的JWT声明的名称。
claim_patterns.name logo cloud
(静态) 接受与 claim_patterns.principal相同的Java正则表达式,但用于name属性。
claims.principal
(静态) 包含用户主体(用户名)的JWT声明的名称,例如 sub, name, email, 和 dn
claim_patterns.principal logo cloud
(静态) 一个可选的Java正则表达式,它与由claims.principal指定的JWT声明进行匹配,然后将其应用于用户的principal属性。 该值必须匹配模式,并且第一个捕获组的值用作主体。例如,^([^@]+)@example\\.com$ 匹配来自example.com域的电子邮件地址,并使用本地部分作为主体。另一个例子是sub,它可能不需要模式设置。
client_authentication.type logo cloud

(静态) 指定是否使用shared_secretnone来验证传入的客户端请求。如果此值为shared_secret,则客户端使用必须与预配置的秘密值匹配的HTTP请求头进行身份验证。客户端必须在ES-Client-Authentication头中为每个请求提供此共享密钥。如果此值为none,则忽略请求头ES-Client-Authentication。默认为shared_secret

启用客户端认证是推荐的。如果JWT承载令牌与其他客户端或服务共享,客户端认证限制哪些客户端可以将这些JWT提交到Elasticsearch。

client_authentication.shared_secret logo cloud
(安全, 可重新加载) 用于客户端认证的密钥值字符串。 如果 client_authentication.typeshared_secret,则此项为必填。
client_authentication.rotation_grace_period
(静态) 设置在轮换client_authentication.shared_secret后,其有效的宽限期。client_authentication.shared_secret可以通过更新密钥库然后调用reload API来轮换。默认值为1m
http.connect_timeout logo cloud
(静态) 设置用于从远程URL获取JSON Web密钥集的HTTP客户端的超时时间。值为零表示不使用超时。默认值为5s
http.connection_read_timeout logo cloud
(静态) 指定从连接管理器请求连接时使用的HTTP超时时间。默认为 5s
http.socket_timeout logo cloud
(静态) 指定HTTP客户端在两个连续数据包之间等待不活动的最大套接字超时(SO_TIMEOUT)。默认为5s
http.max_connections logo cloud
(静态) 指定所有端点允许的最大连接数。
http.max_endpoint_connections logo cloud
(静态) 指定每个端点允许的最大连接数。
jwt.cache.size
(静态) 指定JWT缓存条目的最大数量。如果客户端为每个请求使用不同的JWT,请设置为0以禁用JWT缓存。默认值为100000
jwt.cache.ttl
(静态) 指定缓存JWT条目的生存时间。 只有在客户端认证成功(或禁用)的情况下,JWT才能被缓存。 使用标准的Elasticsearch 时间单位。如果客户端为每个请求使用不同的JWT,请设置为0以禁用JWT缓存。默认值为20m
pkc_jwkset_path logo cloud
(静态) JSON Web Key Set (JWKS) 的文件名或 URL,包含 JWT Realm 用于验证令牌签名的公钥材料。如果值不以 https 开头,则视为文件名。文件名相对于 Elasticsearch 配置目录解析。如果提供了 URL,则必须以 https:// 开头(不支持 http://)。Elasticsearch 会自动缓存 JWK 集,并在签名验证失败时尝试刷新 JWK 集,因为这可能表明 JWT 提供者已轮换签名密钥。
hmac_jwkset logo cloud
(安全) JSON Web Key Set (JWKS) 的内容,包括 JWT 领域用于验证令牌签名的密钥。此格式支持多个密钥和可选属性,并且优于 hmac_key 设置。不能与 hmac_key 设置一起使用。请参阅 配置 Elasticsearch 以使用 JWT 领域
hmac_key logo cloud
(安全) 单个JSON Web Key (JWK)的内容,包括JWT领域用于验证令牌签名的密钥。此格式仅支持不带属性的单个密钥,并且不能与hmac_jwkset设置一起使用。此格式与OIDC兼容。HMAC密钥必须是UNICODE字符串,其中密钥字节是UNICODE字符串的UTF-8编码。 建议使用hmac_jwkset设置。请参阅 配置Elasticsearch以使用JWT领域
populate_user_metadata logo cloud
(静态) 指定是否使用JWT声明提供的值填充Elasticsearch用户的元数据。默认为true
JWT 领域 SSL 设置
edit

以下设置可用于配置从远程URL获取JSON Web密钥集的SSL。

这些设置用于Elasticsearch和JWT颁发者之间的后通道通信。

ssl.key logo cloud

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

ssl.key_passphrase logo cloud

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

ssl.secure_key_passphrase

(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。

您不能同时使用此设置和ssl.key_passphrase

ssl.certificate logo cloud

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

ssl.certificate_authorities logo cloud

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

ssl.keystore.path logo cloud

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

ssl.keystore.type logo cloud
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
ssl.keystore.password logo cloud
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
ssl.keystore.secure_password

(安全) 密钥库的密码。

您不能同时使用此设置和ssl.keystore.password

ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

您不能同时使用此设置和ssl.keystore.secure_key_password

ssl.keystore.secure_key_password

(安全) 密钥库中密钥的密码。默认是密钥库密码。

您不能同时使用此设置和ssl.keystore.key_password

ssl.truststore.path logo cloud

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

ssl.truststore.type logo cloud
(静态) 信任库文件的格式。它必须是 jksPKCS12。如果文件名以 ".p12"、".pfx" 或 "pkcs12" 结尾,默认值为 PKCS12。 否则,默认值为 jks
ssl.truststore.password logo cloud

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

ssl.truststore.secure_password

(安全) 信任库的密码。

您不能同时使用此设置和ssl.truststore.password

ssl.verification_mode logo cloud

(静态) 控制证书的验证。

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期之间的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

ssl.supported_protocols logo cloud

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

ssl.cipher_suites logo cloud

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

负载均衡和故障转移
edit

The 静态 load_balance.type 设置可以有以下值:

  • failover: 指定的URL按指定的顺序使用。 首先可以连接到的服务器将用于所有后续连接。如果与该服务器的连接失败,则将使用可以建立连接的下一个服务器进行后续连接。
  • dns_failover: 在这种操作模式下,只能指定一个URL。 此URL必须包含一个DNS名称。系统将查询与此DNS名称对应的所有IP地址。与Active Directory或LDAP服务器的连接将始终按照检索到的顺序尝试。 这与failover不同之处在于列表不会重新排序,如果列表开头的服务器失败,它仍将尝试用于每个后续连接。
  • round_robin: 连接将不断迭代提供的URL列表。如果服务器不可用,将迭代URL列表,直到建立成功的连接。
  • dns_round_robin: 在这种操作模式下,只能指定一个URL。 此URL必须包含一个DNS名称。系统将查询与此DNS名称对应的所有IP地址。连接将不断迭代地址列表。如果服务器不可用,将迭代URL列表,直到建立成功的连接。

通用 TLS 设置

edit
xpack.security.ssl.diagnose.trust
(静态) 控制是否输出SSL/TLS信任失败的诊断消息。 如果此项为true(默认值),每当由于无法建立信任而导致SSL连接(传入或传出)被拒绝时,都会将消息打印到Elasticsearch日志中。 此诊断消息包含可用于确定失败原因并协助解决问题的信息。 设置为false以禁用这些消息。
TLS/SSL 密钥和受信任证书设置
edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。如果没有配置受信任的证书,将信任JVM默认信任的证书以及与同一上下文中的密钥关联的证书。对于需要客户端身份验证或作为启用SSL的服务器时,必须配置密钥和证书。

在实践中,尽管支持将受信任的证书存储在PKCS#12文件中,但这并不常见。elasticsearch-certutil工具以及Java的keytool,都是设计用来生成可以同时用作密钥库和信任库的PKCS#12文件,但使用其他工具创建的容器文件可能并非如此。通常,PKCS#12文件只包含秘密和私有条目。要确认PKCS#12容器是否包含受信任的证书(“锚点”)条目,请在openssl pkcs12 -info输出中查找2.16.840.1.113894.746875.1.1: ,或在keytool -list输出中查找trustedCertEntry

HTTP TLS/SSL 设置

edit

您可以配置以下TLS/SSL设置。

xpack.security.http.ssl.enabled
(静态) 用于启用或禁用HTTP网络层上的TLS/SSL,Elasticsearch使用该网络层与其他客户端通信。 默认值为false
xpack.security.http.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.security.http.ssl.client_authentication
(静态) 控制服务器在请求客户端连接的证书时的行为。有效值为requiredoptionalnonerequired强制客户端提供证书,而optional请求客户端证书,但客户端不需要提供。 默认为none
xpack.security.http.ssl.verification_mode

(静态) xpack.security.http.ssl 中的 SSL 设置控制一个用于 TLS 的 服务器上下文,它定义了 TLS 连接的设置。不建议在 TLS 服务器 中使用 verification_mode。 定义如何在 TLS 连接中验证另一方提供的证书:

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期内的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书内名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.security.http.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

HTTP TLS/SSL 密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。必须配置私钥和证书。

PEM编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.security.http.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.security.http.ssl.key_passphrase

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

xpack.security.http.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.security.http.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.security.http.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.security.http.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.http.ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.security.http.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.http.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.security.http.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.http.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.http.ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.security.http.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.security.http.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.http.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.security.http.ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.security.http.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.http.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.security.http.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.http.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.http.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.security.http.ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.security.http.ssl.truststore.secure_password
(安全) 信任库的密码。

传输 TLS/SSL 设置

edit

您可以配置以下TLS/SSL设置。

xpack.security.transport.ssl.enabled
(静态) 用于在传输网络层启用或禁用TLS/SSL,节点之间使用该层进行通信。 默认值为false
xpack.security.transport.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.security.transport.ssl.client_authentication
(静态) 控制服务器在请求客户端连接的证书时的行为。有效值为requiredoptionalnonerequired强制客户端提供证书,而optional请求客户端证书,但客户端不需要提供。 默认为required
xpack.security.transport.ssl.verification_mode

(静态) 定义如何在TLS连接中验证另一方提供的证书:

有效值
full
验证提供的证书:具有在not_beforenot_after日期之间的签发日期;链接到受信任的证书颁发机构(CA);具有与证书内名称匹配的主机名或IP地址。
certificate
验证提供的证书并验证它由受信任的机构(CA)签名,但不检查证书的主机名
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.security.transport.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

传输层安全/安全套接层密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。必须配置私钥和证书。

PEM编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.security.transport.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.security.transport.ssl.key_passphrase

(静态) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.secure_key_passphrase代替。

您不能同时使用此设置和ssl.secure_key_passphrase

xpack.security.transport.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.security.transport.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.security.transport.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.security.transport.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.transport.ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.security.transport.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.transport.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.security.transport.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.transport.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.transport.ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.security.transport.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.security.transport.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.transport.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.security.transport.ssl.keystore.password
(静态) 密钥库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_password代替。
xpack.security.transport.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.transport.ssl.keystore.key_password

(静态) 密钥库中密钥的密码。默认值是密钥库密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.keystore.secure_key_password代替。

您不能同时使用此设置和ssl.keystore.secure_password

xpack.security.transport.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.transport.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.transport.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.security.transport.ssl.truststore.password

(静态) 信任库的密码。 [7.17.0] 在7.17.0中已弃用。 建议使用ssl.truststore.secure_password代替。

您不能同时使用此设置和ssl.truststore.secure_password

xpack.security.transport.ssl.truststore.secure_password
(安全) 信任库的密码。

远程集群服务器(基于API密钥的模型)TLS/SSL设置

edit

您可以配置以下TLS/SSL设置。

xpack.security.remote_cluster_server.ssl.enabled
(静态) 用于在远程集群服务器网络层启用或禁用TLS/SSL,Elasticsearch使用该网络层与远程集群客户端通信。 默认值为true
xpack.security.remote_cluster_server.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.security.remote_cluster_server.ssl.client_authentication
(静态) 控制服务器在请求客户端连接的证书时的行为。有效值为requiredoptionalnonerequired强制客户端提供证书,而optional请求客户端证书,但客户端不需要提供。 默认为none
xpack.security.remote_cluster_server.ssl.verification_mode

(静态) xpack.security.remote_cluster_server.ssl 中的 SSL 设置控制 TLS 的 服务器上下文, 该上下文定义了 TLS 连接的设置。不建议在 TLS 服务器 中使用 verification_mode。 定义如何验证 TLS 连接中另一方提供的证书:

有效值
full
验证提供的证书:具有在 not_beforenot_after 日期之间的签发日期;链接到受信任的证书颁发机构 (CA);具有与证书中的名称匹配的 hostname 或 IP 地址。
certificate
验证提供的证书并验证它是否由受信任的机构 (CA) 签名,但不检查证书的 hostname
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.security.remote_cluster_server.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

远程集群服务器(基于API密钥模型)TLS/SSL密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。必须配置私钥和证书。

PEM 编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.security.remote_cluster_server.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.security.remote_cluster_server.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.security.remote_cluster_server.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.security.remote_cluster_server.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.security.remote_cluster_server.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.remote_cluster_server.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.remote_cluster_server.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.remote_cluster_server.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.remote_cluster_server.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.security.remote_cluster_server.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.remote_cluster_server.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.security.remote_cluster_server.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.remote_cluster_server.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.remote_cluster_server.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.remote_cluster_server.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.security.remote_cluster_server.ssl.truststore.secure_password
(安全) 信任库的密码。

远程集群客户端(基于API密钥的模型)TLS/SSL设置

edit

您可以配置以下TLS/SSL设置。

xpack.security.remote_cluster_client.ssl.enabled
(静态) 用于启用或禁用远程集群客户端网络层上的TLS/SSL,Elasticsearch使用该网络层与远程集群服务器通信。 默认值为 true
xpack.security.remote_cluster_client.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.security.remote_cluster_client.ssl.verification_mode

(静态) 定义如何在TLS连接中验证另一方提供的证书:

有效值
full
验证提供的证书:颁发日期在not_beforenot_after日期之间;链接到受信任的证书颁发机构(CA);具有与证书内名称匹配的主机名或IP地址。
certificate
验证提供的证书并验证它由受信任的机构(CA)签名,但不检查证书的主机名
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.security.remote_cluster_client.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值是TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

远程集群客户端(基于API密钥模型)TLS/SSL密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。私钥和证书是可选的,如果服务器要求PKI身份验证的客户端身份验证,则会使用它们。

PEM 编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.security.remote_cluster_client.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.security.remote_cluster_client.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.security.remote_cluster_client.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.security.remote_cluster_client.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java 密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.security.remote_cluster_client.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.remote_cluster_client.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.remote_cluster_client.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.remote_cluster_client.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.remote_cluster_client.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.security.remote_cluster_client.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.security.remote_cluster_client.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.security.remote_cluster_client.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.security.remote_cluster_client.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.security.remote_cluster_client.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.security.remote_cluster_client.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.security.remote_cluster_client.ssl.truststore.secure_password
(安全) 信任库的密码。
传输配置 TLS/SSL 设置
edit

对于每个传输配置文件,同样可用的设置与默认传输的设置相同。默认情况下,传输配置文件的设置将与默认传输的设置相同,除非另有指定。

作为一个例子,让我们看看关键设置。对于默认传输,这是xpack.security.transport.ssl.key。为了在传输配置文件中使用此设置,请使用前缀transport.profiles.$PROFILE.xpack.security.并在xpack.security.transport.之后附加设置的部分。对于关键设置,这将是transport.profiles.$PROFILE.xpack.security.ssl.key

IP过滤设置

edit

您可以为IP过滤配置以下设置。

xpack.security.transport.filter.allow
(动态) 允许的IP地址列表。
xpack.security.transport.filter.deny
(动态) 拒绝的IP地址列表。
xpack.security.http.filter.allow
(动态) 仅允许HTTP的IP地址列表。
xpack.security.http.filter.deny
(动态) 仅针对HTTP拒绝的IP地址列表。
transport.profiles.$PROFILE.xpack.security.filter.allow
(动态) 此配置文件允许的IP地址列表。
transport.profiles.$PROFILE.xpack.security.filter.deny
(动态) 此配置文件要拒绝的IP地址列表。
xpack.security.remote_cluster.filter.allow
(动态) 允许仅用于通过API密钥模型配置的 远程集群服务器的IP地址列表
xpack.security.remote_cluster.filter.deny
(动态) 用于拒绝远程集群服务器配置的IP地址列表,该服务器使用 基于API密钥的模型

用户缓存和密码哈希算法

edit

某些领域在内存中存储用户凭证。为了限制凭证盗窃的风险并减轻凭证泄露的影响,缓存仅在内存中存储用户凭证的哈希版本。默认情况下,用户缓存使用加盐的 sha-256 哈希算法进行哈希处理。您可以通过将 静态 设置 cache.hash_algo 领域设置为以下任意值来使用不同的哈希算法:

表1. 缓存哈希算法

算法

描述

ssha256

使用加盐的 sha-256 算法(默认)。

md5

使用MD5算法。

sha1

使用SHA1算法。

bcrypt

使用bcrypt算法,盐值通过1024轮生成。

bcrypt4

使用 bcrypt 算法,盐值通过16轮生成。

bcrypt5

使用 bcrypt 算法,盐值通过32轮生成。

bcrypt6

使用bcrypt算法,盐值通过64轮生成。

bcrypt7

使用 bcrypt 算法,盐值通过128轮生成。

bcrypt8

使用bcrypt算法,盐值通过256轮生成。

bcrypt9

使用bcrypt算法,盐值通过512轮生成。

pbkdf2

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代。

pbkdf2_1000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 1000 次迭代。

pbkdf2_10000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代。

pbkdf2_50000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 50000 次迭代。

pbkdf2_100000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 100000 次迭代。

pbkdf2_500000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 500000 次迭代。

pbkdf2_1000000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 1000000 次迭代。

pbkdf2_stretch

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_1000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 1000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_10000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_50000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 50000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_100000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行 100000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_500000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 500000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_1000000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行 1000000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

noop,clear_text

不对凭证进行哈希处理,并将其以明文形式保存在内存中。警告:保持明文被认为是不安全的,可能会在操作系统级别被泄露(例如通过内存转储和使用ptrace)。

同样,存储密码的领域使用加密强度高且特定于密码的盐值对它们进行哈希处理。您可以通过将静态 xpack.security.authc.password_hashing.algorithm设置为以下之一来配置密码哈希算法:

表2. 密码哈希算法

Algorithm Description

bcrypt

使用 bcrypt 算法,盐值通过1024轮生成。(默认)

bcrypt4

使用 bcrypt 算法,盐值通过16轮生成。

bcrypt5

使用bcrypt算法,盐值通过32轮生成。

bcrypt6

使用 bcrypt 算法,盐值通过64轮生成。

bcrypt7

使用 bcrypt 算法,盐值通过128轮生成。

bcrypt8

使用bcrypt算法,盐值通过256轮生成。

bcrypt9

使用bcrypt算法,盐值通过512轮生成。

bcrypt10

使用bcrypt算法,盐值通过1024轮生成。

bcrypt11

使用 bcrypt 算法,盐值通过2048轮生成。

bcrypt12

使用 bcrypt 算法,盐值通过4096轮生成。

bcrypt13

使用bcrypt算法,盐值通过8192轮生成。

bcrypt14

使用 bcrypt 算法,盐值通过16384轮生成。

pbkdf2

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代。

pbkdf2_1000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 1000 次迭代。

pbkdf2_10000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代。

pbkdf2_50000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 50000 次迭代。

pbkdf2_100000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 100000 次迭代。

pbkdf2_500000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 500000 次迭代。

pbkdf2_1000000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 1000000 次迭代。

pbkdf2_stretch

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_1000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行 1000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_10000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 10000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_50000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,使用 50000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_100000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行 100000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

pbkdf2_stretch_500000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行500000次迭代,在首先使用SHA512对初始输入进行哈希处理之后。

pbkdf2_stretch_1000000

使用 PBKDF2 密钥派生函数,以 HMAC-SHA512 作为伪随机函数,进行 1000000 次迭代,在首先使用 SHA512 对初始输入进行哈希处理之后。

分片分配、迁移和恢复

edit

每个 索引 在 Elasticsearch 中被划分为一个或多个 分片。 每个索引中的文档属于一个单独的分片。

一个集群可以包含一个分片的多个副本。每个分片有一个称为主分片的特殊副本,以及零个或多个称为副本的非主副本。主分片副本作为所有索引操作的主要入口点。主分片副本上的操作随后会被转发到其副本。

副本在集群中的节点之间维护数据的冗余副本,防止硬件故障并增加服务读取请求(如搜索或检索文档)的能力。如果主分片副本失败,则副本将被提升为主分片并接管主分片的职责。

在正常操作过程中,Elasticsearch 会将分片副本分配给节点,跨节点重新定位分片副本以平衡集群或满足新的分配约束,并恢复分片以初始化新的副本。在本主题中,您将了解这些操作的工作原理以及如何控制它们。

要了解如何优化集群中的分片数量和大小,请参阅分片大小。要了解读写操作如何在分片和分片副本之间复制,请参阅读写文档

分片分配

edit

分片分配是将分片副本分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡、当节点被添加到集群或从集群中移除时,或者当影响分配的集群或索引设置被更新时。

默认情况下,索引的主分片和副本分片的副本可以分配到集群中的任何节点,并且可能会被重新定位以重新平衡集群。

调整分片分配设置

edit

您可以使用以下设置来控制分片副本的分配:

  • 集群级别的分片分配设置:使用这些设置来控制分片副本在整个集群中的分配和平衡方式。例如,您可能希望根据节点可用区进行分配,或者防止某些节点被使用以便进行维护。
  • 索引级别的分片分配设置:使用这些设置来控制特定索引的分片副本的分配方式。例如,您可能希望将索引分配到特定数据层的节点,或者分配到具有特定属性的节点。

监控分片分配

edit

如果一个分片副本未分配,这意味着该分片副本未分配到集群中的任何节点。这可能发生在集群中没有足够的节点来分配该分片副本,或者该分片副本无法分配到满足分片分配过滤规则的任何节点时。当一个分片副本未分配时,您的集群被认为是不健康的,并返回黄色或红色的集群健康状态。

您可以使用以下API来监控分片分配:

了解更多关于排查未分配的分片副本和恢复集群健康状态的信息.

分片恢复

edit

分片恢复是指初始化一个分片副本的过程,例如从快照中恢复主分片或从主分片创建副本分片。当分片恢复完成时,恢复的分片可用于搜索和索引。

恢复会在以下过程中自动进行:

  • 首次创建索引时。
  • 当一个节点重新加入集群并使用其数据路径中保存的数据启动任何缺失的主分片副本时。
  • 从主分片创建新的副本分片副本。
  • 将分片副本重新定位到同一集群中的不同节点。
  • 一个快照恢复操作。
  • 一个克隆收缩拆分操作。

您可以使用recoverycat recovery API来确定分片恢复的原因。

调整分片恢复设置

edit

要控制分片的恢复方式,例如恢复操作可以使用的资源,以及应优先恢复哪些索引,您可以调整以下设置:

分片恢复操作也会遵循一般的分片分配设置。

监控分片恢复

edit

您可以使用以下API来监控分片分配:

分片重定位

edit

分片重定位是将分片副本从一个节点移动到另一个节点的过程。这可能发生在一个节点加入或离开集群时,或者当集群正在进行重新平衡时。

当一个分片副本被重新定位时,它会在目标节点上创建为一个新分片副本。当分片副本完全分配并恢复后,旧的分片副本会被删除。如果被重新定位的分片副本是主分片,那么在旧的分片副本被删除之前,新分片副本会被标记为主分片。

调整分片重定位设置

edit

您可以控制分片副本的重新定位方式和时间。例如,您可以调整控制分片副本何时重新定位以平衡集群的再平衡设置,或基于磁盘的分片分配的高水位线设置,这些设置可以触发重新定位。这些设置是集群级分片分配设置的一部分。

分片重定位操作也会遵循分片分配和恢复设置。

分片请求缓存设置

edit

当对索引或多个索引运行搜索请求时,每个涉及的分片在本地执行搜索,并将本地结果返回给协调节点,协调节点将这些分片级别的结果合并为“全局”结果集。

分片级别的请求缓存模块在每个分片上缓存本地结果。 这使得频繁使用(且可能较重)的搜索请求能够几乎立即返回结果。请求缓存在日志记录用例中非常适用,其中只有最近的索引正在被积极更新——来自较旧索引的结果将直接从缓存中提供。

默认情况下,请求缓存只会缓存搜索请求的结果,其中size=0,因此它不会缓存hits,但会缓存hits.total聚合建议

大多数使用 now 的查询(参见 日期数学)无法被缓存。

使用非确定性API调用的脚本查询,例如Math.random()new Date(),不会被缓存。

缓存失效

edit

缓存是智能的——它保持与未缓存搜索相同的近实时承诺。

缓存的结果会在分片刷新以获取文档更改或更新映射时自动失效。换句话说,您从缓存中获得的结果将与未缓存的搜索请求结果相同。

刷新间隔越长,即使文档有变化,缓存的条目也会保持有效的时间越长。如果缓存已满,最近最少使用的缓存键将被淘汰。

可以通过清除缓存 API手动使缓存过期:

POST /my-index-000001,my-index-000002/_cache/clear?request=true

启用和禁用缓存

edit

缓存默认是启用的,但在创建新索引时可以按如下方式禁用:

PUT /my-index-000001
{
  "settings": {
    "index.requests.cache.enable": false
  }
}

它也可以通过更新设置 API 在现有索引上动态启用或禁用:

PUT /my-index-000001/_settings
{ "index.requests.cache.enable": true }

按请求启用和禁用缓存

edit

查询字符串参数 request_cache 可以用于在每个请求的基础上启用或禁用缓存。如果设置,它将覆盖索引级别的设置:

GET /my-index-000001/_search?request_cache=true
{
  "size": 0,
  "aggs": {
    "popular_colors": {
      "terms": {
        "field": "colors"
      }
    }
  }
}

请求中size大于0的将不会被缓存,即使索引设置中启用了请求缓存。要缓存这些请求,您需要使用此处详述的查询字符串参数。

缓存键

edit

整个JSON主体的哈希值用作缓存键。这意味着如果JSON发生变化——例如如果键以不同的顺序输出——那么缓存键将不会被识别。

大多数JSON库支持一种规范模式,该模式确保JSON键始终以相同的顺序输出。应用程序中可以使用这种规范模式,以确保请求始终以相同的方式序列化。

缓存设置

edit

缓存是在节点级别管理的,默认最大大小为堆内存的1%。这可以在config/elasticsearch.yml文件中更改:

indices.requests.cache.size: 2%

此外,您可以使用 indices.requests.cache.expire 设置来指定缓存结果的 TTL,但这样做应该没有理由。请记住,当索引刷新时,过期的结果会自动失效。此设置仅出于完整性考虑而提供。

监控缓存使用情况

edit

缓存的大小(以字节为单位)和驱逐次数可以通过索引查看,使用indices-stats API:

GET /_stats/request_cache?human

或通过节点使用节点统计信息 API:

GET /_nodes/stats/indices/request_cache?human

快照和恢复设置

edit

以下集群设置配置了快照和恢复

snapshot.max_concurrent_operations

(动态, 整数) 最大并发快照操作数量。默认为 1000

此限制适用于所有正在进行的快照创建、克隆和删除操作的总和。Elasticsearch 将拒绝任何超出此限制的操作。

SLM 设置

edit

以下集群设置配置了快照生命周期管理(SLM)

slm.history_index_enabled
(动态, 布尔值) 控制SLM是否将作为SLM策略一部分采取的操作的历史记录到slm-history-*索引中。默认为true
slm.retention_schedule
(动态, cron调度器值) 控制保留任务的运行时间。 可以是周期性或绝对时间调度。 支持cron调度器支持的所有值。 默认为UTC时间每天1:30am: 0 30 1 * * ?
slm.retention_duration
(动态, 时间值) 限制SLM删除旧快照应花费的时间。 默认值为一小时:1h
slm.health.failed_snapshot_warn_threshold
(动态, 长整型) 自上次成功快照以来失败的调用次数,表明健康API中的策略存在问题。 默认在五次重复失败后发出健康API警告:5L
repositories.url.allowed_urls logo cloud
(静态) 指定快照可以从中恢复的只读 URL 仓库

Elasticsearch 中的转换设置

edit

您不需要配置任何设置即可使用转换。它是默认启用的。

通用转换设置

edit
node.roles: [ transform ]

(静态) 将 node.roles 设置为包含 transform,以将节点标识为转换节点。如果您想要运行转换,您的集群中必须至少有一个转换节点。

如果你设置了node.roles,你必须明确指定节点所需的所有角色。要了解更多信息,请参阅Nodes

强烈建议专用转换节点也具有remote_cluster_client角色;否则,在使用转换时,跨集群搜索将失败。请参阅远程节点

xpack.transform.enabled
[7.8.0] 在7.8.0中已弃用。基本许可证功能应始终启用 (静态) 此已弃用设置不再有任何效果。
xpack.transform.num_transform_failure_retries
(动态) 当转换遇到非致命错误时重试的次数。一旦重试次数耗尽,转换任务将被标记为失败。默认值为10,有效最小值为0,最大值为100。如果转换已经在运行,则需要重新启动以使用更改后的设置。 num_failure_retries设置也可以在单个转换级别指定。建议为每个转换单独指定此设置。

线程池

edit

节点使用多个线程池来管理内存消耗。 许多线程池关联的队列使得待处理请求可以被保留而不是被丢弃。

有多个线程池,但重要的包括:

generic
对于通用操作(例如,后台节点发现)。 线程池类型是 scaling
search
用于分片级别的计数/搜索操作。也用于获取和其他搜索相关操作。线程池类型为fixed,大小为int((# of allocated processors * 3) / 2) + 1,队列大小为1000
search_throttled
对于search_throttled 索引的计数/搜索/建议/获取操作。 线程池类型为固定,大小为1,队列大小为100
search_coordination
用于轻量级的搜索相关协调操作。线程池类型为 fixed,大小为 (# 已分配的处理器) / 2, 队列大小为 1000
get
对于获取操作。线程池类型为 fixed,大小为 int((# of allocated processors * 3) / 2) + 1,队列大小为 1000
analyze
用于分析请求。线程池类型为fixed,大小为1,队列大小为16
write
对于单文档索引/删除/更新、数据处理器和批量请求。线程池类型为固定,大小为# 已分配的处理器,队列大小为10000。此池的最大大小为 1 + # 已分配的处理器
snapshot
用于快照/恢复操作。线程池类型为scaling,保持时间为5m。在堆内存至少为750MB的节点上,该池的最大大小默认为10。在堆内存小于750MB的节点上,该池的最大大小默认为min(5, (# of allocated processors) / 2)
snapshot_meta
用于快照仓库元数据读取操作。线程池类型为scaling,保持活动时间为5m,最大值为min(50, (# of allocated processors* 3))
warmer
用于分段预热操作。线程池类型为scaling,保持活动时间为5m,最大值为min(5, (# of allocated processors) / 2)
refresh
用于刷新操作。线程池类型为 scaling,保持活动时间为 5m,最大值为 min(10, (# of allocated processors) / 2)
fetch_shard_started
用于列出分片状态。 线程池类型为scaling,保持活动时间为5m,默认最大大小为2 * # of allocated processors
fetch_shard_store
用于列出分片存储。 线程池类型为scaling,保持活动时间为5m,默认最大大小为2 * # of allocated processors
flush
对于刷新事务日志 fsync 操作。线程池类型为scaling,保持活动时间为5m,默认最大大小为min(5, (# 分配的处理器数量) / 2)
force_merge
对于强制合并操作。 线程池类型为固定,大小为max(1, (# 分配的处理器数量) / 8),队列大小无限制。
management
用于集群管理。 线程池类型为 scaling,保持活动时间为 5m,默认最大大小为 5
system_read
对于系统索引的读操作。 线程池类型为fixed,默认最大大小为 min(5, (# of allocated processors) / 2)
system_write
对于系统索引的写操作。 线程池类型为 fixed,默认最大大小为 min(5, (# of allocated processors) / 2)
system_critical_read
对于系统索引的关键读取操作。 线程池类型为fixed,默认最大大小为 min(5, (# of allocated processors) / 2)
system_critical_write
对于系统索引的关键写操作。 线程池类型为fixed,默认最大大小为 min(5, (# of allocated processors) / 2)
watcher
对于监视执行。 线程池类型为固定,默认最大大小为 min(5 * (# 分配的处理器), 50) 队列大小为1000
esql_worker
执行 ES|QL 操作。线程池类型为 fixed,大小为 int((# of allocated processors * 3) / 2) + 1,队列大小为 1000

线程池设置是静态的,可以通过编辑elasticsearch.yml来更改。可以通过设置其特定类型的参数来更改特定的线程池;例如,更改write线程池中的线程数量:

thread_pool:
    write:
        size: 30

线程池类型

edit

以下是线程池的类型及其各自的参数:

固定

edit

固定线程池持有固定大小的线程来处理请求,并使用一个队列(可选的有界队列)来存储那些没有线程服务的待处理请求。

参数 size 控制线程的数量。

The queue_size 允许控制待处理请求队列的大小,这些请求没有线程来执行它们。默认情况下,它被设置为 -1,这意味着它是无界的。当一个请求进来并且队列已满时,它将中止该请求。

thread_pool:
    write:
        size: 30
        queue_size: 1000

扩展

edit

The scaling thread pool holds a dynamic number of threads. This number is proportional to the workload and varies between the value of the core and max parameters.

参数 keep_alive 决定了线程在没有执行任何任务的情况下,应该在线程池中保留多长时间。

thread_pool:
    warmer:
        core: 1
        max: 8
        keep_alive: 2m

分配的处理器设置

edit

处理器数量是自动检测的,并且线程池设置是根据它自动设置的。在某些情况下,覆盖检测到的处理器数量可能会有用。这可以通过显式设置node.processors设置来完成。此设置受可用处理器数量的限制,并接受浮点数,这在Elasticsearch节点配置为在CPU限制下运行的情况下非常有用,例如在Cgroups下的CPU份额或配额。

node.processors: 2

有几种情况需要显式覆盖node.processors设置:

  1. 如果你在同一主机上运行多个Elasticsearch实例,但希望Elasticsearch将其线程池大小调整为仅占用CPU的一部分,你应该将node.processors设置覆盖为所需的分数,例如,如果你在16核机器上运行两个Elasticsearch实例,请将node.processors设置为8。请注意,这是一个专家级用例,除了设置node.processors设置外,还有许多其他考虑因素,如更改垃圾收集器线程的数量、将进程固定到核心等。
  2. 有时处理器的数量会被错误检测,在这种情况下,显式设置node.processors设置将解决此类问题。

为了检查检测到的处理器数量,请使用带有os标志的节点信息API。

Elasticsearch中的Watcher设置

edit

您配置 Watcher 设置以设置 Watcher 并通过 电子邮件SlackPagerDuty 发送通知。

所有这些设置都可以添加到 elasticsearch.yml 配置文件中,但安全设置除外,您需要将安全设置添加到 Elasticsearch 密钥库中。有关创建和更新 Elasticsearch 密钥库的更多信息,请参阅 安全设置。动态设置也可以通过 集群更新设置 API 在整个集群中进行更新。

通用观察者设置

edit
xpack.watcher.enabled
(静态) 设置为false以禁用节点上的Watcher。
xpack.watcher.encrypt_sensitive_data logo cloud
(静态) 设置为true以加密敏感数据。如果启用此设置,您还必须指定xpack.watcher.encryption_key设置。有关更多信息,请参阅在 Watcher 中加密敏感数据
xpack.watcher.encryption_key
(安全) 指定包含用于加密敏感数据的密钥的文件路径。 如果 xpack.watcher.encrypt_sensitive_data 设置为 true,则此设置是必需的。有关更多信息,请参阅 在 Watcher 中加密敏感数据
xpack.watcher.max.history.record.size
(静态) 可以写入观察器历史索引的最大观察器历史记录大小。任何更大的历史记录将删除其部分较大的字段。默认为 10mb。
xpack.http.proxy.host
(静态) 指定用于连接到HTTP服务的代理服务器的地址。
xpack.http.proxy.port
(静态) 指定用于连接代理服务器的端口号。
xpack.http.proxy.scheme
(静态) 用于与代理服务器通信的协议。有效值为httphttps。默认使用请求中的协议。
xpack.http.default_connection_timeout
(静态) 在建立连接时,等待请求中止的最大时间。
xpack.http.default_read_timeout
(静态) 在请求被中止之前,两个数据包之间最大的无活动时间。
xpack.http.tcp.keep_alive
(静态) 是否在HTTP连接上启用TCP保持活动。默认为true
xpack.http.connection_pool_ttl
(静态) 连接池中连接的生存时间。如果一个连接在此超时时间内未被重新使用,它将被关闭。默认情况下,生存时间是无限的,意味着连接永不过期。
xpack.http.max_response_size
(静态) 指定HTTP响应允许的最大大小,默认为 10mb,最大可配置值为50mb
xpack.http.whitelist
(动态) 内部 HTTP 客户端允许连接的 URL 列表。此客户端用于 HTTP 输入、webhook、slack、pagerduty 和 jira 操作。此设置可以动态更新。它默认设置为 *,允许所有内容。注意:如果您配置此设置并且正在使用 slack/pagerduty 操作之一,您必须确保相应的端点也被明确允许。

观察器 HTTP TLS/SSL 设置

edit

您可以配置以下TLS/SSL设置。

xpack.http.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.http.ssl.verification_mode

(静态) 定义如何在TLS连接中验证另一方提供的证书:

有效值
full
验证提供的证书:颁发日期在not_beforenot_after日期之间;链接到受信任的证书颁发机构(CA);具有与证书内名称匹配的主机名或IP地址。
certificate
验证提供的证书并验证它由受信任的机构(CA)签名,但不检查证书的主机名
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.http.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

Watcher HTTP TLS/SSL 密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。私钥和证书是可选的,如果服务器要求PKI身份验证的客户端身份验证,则会使用它们。

PEM 编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.http.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.http.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.http.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.http.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java 密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.http.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.http.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.http.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.http.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.http.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.http.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.http.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.http.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.http.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.http.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.http.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.http.ssl.truststore.secure_password
(安全) 信任库的密码。

电子邮件通知设置

edit

您可以在 elasticsearch.yml 中配置以下电子邮件通知设置。有关通过电子邮件发送通知的更多信息,请参阅 配置电子邮件操作

xpack.notification.email.default_account

(动态) 默认使用的电子邮件账户。

如果您配置了多个电子邮件账户,您必须配置此设置或在email操作中指定要使用的电子邮件账户。请参阅配置电子邮件账户

xpack.notification.email.account
指定通过电子邮件发送通知的账户信息。您可以指定以下电子邮件账户属性:
xpack.notification.email.account.domain_allowlist
(动态) 指定允许发送电子邮件的域名。收件人(To:Cc:Bcc:)在这些域名之外的电子邮件将被拒绝,并抛出错误。此设置默认为 ["*"],表示允许所有域名。支持简单的通配符,例如在允许的域名列表中使用 *.company.com
profile
(动态) 用于构建从账户发送的MIME消息的电子邮件配置文件。有效值:standardgmailoutlook。默认值为 standard
email_defaults.*
(动态) 一组可选的电子邮件属性,用作从账户发送的电子邮件的默认值。请参阅 电子邮件操作属性以了解支持的属性。
smtp.auth
(动态) 设置为 true 以尝试使用 AUTH 命令对用户进行身份验证。默认为 false
smtp.host
(动态) 要连接的SMTP服务器。必填。
smtp.port
(动态) 连接到的SMTP服务器端口。默认为25。
smtp.user
(动态) SMTP 的用户名。必填。
smtp.secure_password
(安全, 可重新加载) 指定SMTP用户的密码。
smtp.starttls.enable
(动态) 设置为 true 以启用使用 STARTTLS 命令(如果服务器支持)在发出任何登录命令之前切换连接到TLS保护的连接。请注意,必须配置适当的信任库,以便客户端信任服务器的证书。默认为 false
smtp.starttls.required
(动态) 如果true,则需要STARTTLS。如果该命令失败,连接将失败。默认为false
smtp.ssl.trust
(动态) 一个SMTP服务器主机的列表,这些主机被认为是可信的,并且证书验证被禁用。如果设置为"*",则所有主机都被信任。如果设置为以空格分隔的主机列表,则这些主机被信任。否则,信任取决于服务器提供的证书。
smtp.timeout
(动态) 套接字读取超时。默认是两分钟。
smtp.connection_timeout
(动态) 套接字连接超时。默认是两分钟。
smtp.write_timeout
(动态) 套接字写入超时。默认是两分钟。
smtp.local_address
(动态) 发送电子邮件时可配置的本地地址。默认情况下未配置。
smtp.local_port
(动态) 发送电子邮件时可配置的本地端口。默认情况下未配置。
smtp.send_partial
(动态) 尽管其中一个收件人地址无效,仍然发送电子邮件。
smtp.wait_on_quit
(动态) 如果设置为false,则发送QUIT命令并关闭连接。如果设置为true,则发送QUIT命令并等待回复。默认为true。
xpack.notification.email.html.sanitization.allow

指定允许在电子邮件通知中使用的HTML元素。有关更多信息,请参阅 配置HTML清理选项。您可以 指定单个HTML元素以及以下HTML功能组:

_tables
(Static) All table related elements: <table>, <th>, <tr>, <td>, <caption>, <col>, <colgroup>, <thead>, <tbody>, and <tfoot>.
_blocks
(Static) The following block elements: <p>, <div>, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>, <ul>, <ol>, <li>, and <blockquote>.
_formatting
(Static) The following inline formatting elements: <b>, <i>, <s>, <u>, <o>, <sup>, <sub>, <ins>, <del>, <strong>, <strike>, <tt>, <code>, <big>, <small>, <hr>, <br>, <span>, and <em>.
_links
(Static) The <a> element with an href attribute that points to a URL using the following protocols: http, https and mailto.
_styles
(Static) The style attribute on all elements. Note that CSS attributes are also sanitized to prevent XSS attacks.
img
img:all
(Static) All images (external and embedded).
img:embedded
(Static) Only embedded images. Embedded images can only use the cid: URL protocol in their src attribute.
xpack.notification.email.html.sanitization.disallow
(静态) 指定在电子邮件通知中不允许使用的HTML元素。 您可以指定单独的HTML元素和HTML功能组
xpack.notification.email.html.sanitization.enabled
(静态) 设置为 false 以完全禁用HTML清理。不推荐。 默认为 true
xpack.notification.reporting.warning.kbn-csv-contains-formulas.text
(动态) 指定一个自定义消息,如果来自Kibana的xpack.reporting.csv.checkForFormulas的CSV文件的公式验证标准为true,则会发送该消息。 在消息中使用%s作为文件名的占位符。 默认值为警告:附件[%s]包含电子表格应用程序可能解释为公式的字符。请在打开附件之前确保其安全。

观察者电子邮件TLS/SSL设置

edit

您可以配置以下TLS/SSL设置。

xpack.notification.email.ssl.supported_protocols

(静态) 支持的协议及其版本。有效协议:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3, 默认值为TLSv1.3,TLSv1.2,TLSv1.1。否则,默认值为 TLSv1.2,TLSv1.1

Elasticsearch依赖于您的JDK的SSL和TLS实现。 查看支持的SSL/TLS版本按JDK版本了解更多信息。

如果 xpack.security.fips_mode.enabled 设置为 true,则不能使用 SSLv2HelloSSLv3。请参阅 FIPS 140-2

xpack.notification.email.ssl.verification_mode

(静态) 定义如何在TLS连接中验证另一方提供的证书:

有效值
full
验证提供的证书:颁发日期在not_beforenot_after日期之间;链接到受信任的证书颁发机构(CA);具有与证书内名称匹配的主机名或IP地址。
certificate
验证提供的证书并验证它由受信任的机构(CA)签名,但不检查证书的主机名
none

不执行证书验证。

将证书验证设置为 none 会禁用 SSL/TLS 的许多安全优势,这是非常危险的。只有在 Elastic 支持的指导下,作为尝试解决 TLS 错误时的临时诊断机制,才应设置此值。

默认为 full

xpack.notification.email.ssl.cipher_suites

(静态) 支持的密码套件因您使用的Java版本而异。例如,对于版本12,默认值为TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA.

更多信息,请参阅Oracle的 Java Cryptography Architecture文档

Watcher 电子邮件 TLS/SSL 密钥和受信任证书设置

edit

以下设置用于指定在通过SSL/TLS连接进行通信时应使用的私钥、证书和受信任的证书。私钥和证书是可选的,如果服务器要求PKI身份验证的客户端身份验证,则会使用它们。

PEM 编码文件

edit

当使用PEM编码文件时,请使用以下设置:

xpack.notification.email.ssl.key

(静态) 包含私钥的PEM编码文件的路径。

如果需要HTTP客户端认证,它使用此文件。您不能同时使用此设置和ssl.keystore.path

xpack.notification.email.ssl.secure_key_passphrase
(安全) 用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
xpack.notification.email.ssl.certificate

(静态) 指定与密钥关联的PEM编码证书(或证书链)的路径。

此设置仅在设置了 ssl.key 时可用。

xpack.notification.email.ssl.certificate_authorities

(静态) 应信任的PEM编码证书文件路径列表。

此设置和ssl.truststore.path不能同时使用。

Java密钥库文件

edit

当使用包含私钥、证书和应信任的证书的Java密钥库文件(JKS)时,请使用以下设置:

xpack.notification.email.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.notification.email.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.notification.email.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.notification.email.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.notification.email.ssl.truststore.secure_password
(安全) 信任库的密码。

PKCS#12 文件

edit

Elasticsearch 可以配置为使用 PKCS#12 容器文件(.p12.pfx 文件),这些文件包含私钥、证书和应信任的证书。

PKCS#12 文件的配置方式与 Java 密钥库文件相同:

xpack.notification.email.ssl.keystore.path

(静态) 包含私钥和证书的密钥库文件的路径。

它必须是Java密钥库(jks)或PKCS#12文件。您不能同时使用此设置和ssl.key

xpack.notification.email.ssl.keystore.type
(静态) 密钥库文件的格式。它必须是 jksPKCS12。如果密钥库路径以 ".p12"、".pfx" 或 ".pkcs12" 结尾,此设置默认为 PKCS12。否则,它默认为 jks
xpack.notification.email.ssl.keystore.secure_password
(安全) 密钥库的密码。
xpack.notification.email.ssl.keystore.secure_key_password
(安全) 密钥库中密钥的密码。默认值是密钥库密码。
xpack.notification.email.ssl.truststore.path

(静态) 包含受信任证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。

您不能同时使用此设置和ssl.certificate_authorities

xpack.notification.email.ssl.truststore.type
(静态) 将此设置为 PKCS12 以指示信任库是一个 PKCS#12 文件。
xpack.notification.email.ssl.truststore.secure_password
(安全) 信任库的密码。

Slack通知设置

edit

您可以在 elasticsearch.yml 中配置以下 Slack 通知设置。有关通过 Slack 发送通知的更多信息,请参阅 配置 Slack 操作

xpack.notification.slack.default_account

(动态) 默认的Slack账户。

如果您配置了多个 Slack 账户,您必须配置此设置或在 slack 操作中指定要使用的 Slack 账户。请参阅 配置 Slack 账户

xpack.notification.slack.account

指定通过 Slack 发送通知的账户信息。您可以指定以下 Slack 账户属性:

secure_url
(安全, 可重新加载) 用于向 Slack 发布消息的 Incoming Webhook URL。必需。
message_defaults

Slack消息属性的默认值。

from
(动态) 在 Slack 消息中显示的发送者名称。默认为监视 ID。
to
(动态) 您希望发送消息的默认 Slack 频道或群组。
icon
(动态) 在 Slack 消息中显示的图标。覆盖传入 webhook 的配置图标。接受图像的公共 URL。
text
(动态) 默认消息内容。
attachment
(动态) 默认消息附件。Slack 消息附件使您能够创建格式更丰富的消息。 在 Slack attachments documentation 中定义的数组形式指定。

Jira 通知设置

edit

您可以在 elasticsearch.yml 中配置以下 Jira 通知设置。有关使用通知在 Jira 中创建问题的更多信息,请参阅 配置 Jira 操作

xpack.notification.jira.default_account

(动态) 默认的Jira账户。

如果你配置了多个 Jira 账户,你必须配置此设置或在 jira 操作中指定要使用的 Jira 账户。请参阅 配置 Jira 账户

xpack.notification.jira.account

指定使用通知在Jira中创建问题的账户信息。您可以指定以下Jira账户属性:

allow_http
(动态) 如果为false,Watcher将拒绝使用HTTP协议的URL设置。默认为false
secure_url
(安全, 可重新加载) Jira软件服务器的URL。必需。
secure_user
(安全, 可重新加载) 连接到Jira软件服务器的用户名。必需。
secure_password
(安全, 可重新加载) 连接到Jira软件服务器的用户密码。必需。
issue_defaults
(动态) 在Jira中创建的问题的默认字段值。有关更多信息,请参阅Jira操作属性。可选。

PagerDuty 通知设置

edit

您可以在 elasticsearch.yml 中配置以下 PagerDuty 通知设置。有关通过 PagerDuty 发送通知的更多信息,请参阅 配置 PagerDuty 操作

xpack.notification.pagerduty.default_account

(动态) 默认使用的PagerDuty账户。

如果您配置了多个PagerDuty账户,您必须配置此设置或在pagerduty操作中指定要使用的PagerDuty账户。请参阅配置PagerDuty账户

xpack.notification.pagerduty.account

指定通过PagerDuty发送通知的账户信息。您可以指定以下PagerDuty账户属性:

name
(静态) 与您使用的API密钥关联的PagerDuty账户的名称。必填。
secure_service_api_key
(安全, 可重新加载) 用于访问PagerDuty的PagerDuty API密钥。必填。
event_defaults

默认值为 PagerDuty 事件属性。 可选。

description
(动态) 一个包含 PagerDuty 事件默认描述的字符串。 如果没有配置默认值,每个 PagerDuty 操作必须指定一个 description
incident_key
(动态) 一个包含发送 PagerDuty 事件时使用的默认事件键的字符串。
client
(动态) 一个指定默认监控客户端的字符串。
client_url
(动态) 默认监控客户端的 URL。
event_type
(动态) 默认事件类型。有效值:triggerresolveacknowledge
attach_payload
(动态) 是否默认提供 watch 负载作为事件的上下文。有效值:truefalse

高级配置

edit

修改高级设置通常不推荐,可能会对性能和稳定性产生负面影响。在大多数情况下,建议使用Elasticsearch提供的默认设置。

设置JVM选项

edit

如果需要,您可以通过添加自定义选项文件(首选)或设置ES_JAVA_OPTS环境变量来覆盖默认的JVM选项。

JVM选项文件必须具有后缀.options,并且包含以行分隔的JVM参数列表。JVM进程按字典顺序处理选项文件。

JVM选项文件的放置位置取决于安装类型:

  • tar.gz 或 .zip: 将自定义 JVM 选项文件添加到 config/jvm.options.d/
  • Debian 或 RPM: 将自定义 JVM 选项文件添加到 /etc/elasticsearch/jvm.options.d/
  • Docker: 将自定义 JVM 选项文件绑定挂载到 /usr/share/elasticsearch/config/jvm.options.d/

不要修改根目录下的 jvm.options 文件。请改用 jvm.options.d/ 目录中的文件。

JVM 选项语法

edit

JVM 选项文件包含以行分隔的 JVM 参数列表。 参数前带有破折号(-)。 要将设置应用于特定版本,请在版本或版本范围前加上冒号。

  • 应用于所有版本:

    -Xmx2g
  • 将设置应用于特定版本:

    17:-Xmx2g
  • 对一系列版本应用设置:

    17-18:-Xmx2g

    要将设置应用于特定版本及任何后续版本,请省略范围的上限。例如,此设置适用于Java 8及更高版本:

    17-:-Xmx2g

空白行将被忽略。以 # 开头的行将被视为注释并忽略。未被注释且未被识别为有效 JVM 参数的行将被拒绝,Elasticsearch 将无法启动。

使用环境变量设置JVM选项

edit

在生产环境中,使用JVM选项文件来覆盖默认设置。在测试和开发环境中,您也可以通过ES_JAVA_OPTS环境变量来设置JVM选项。

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch

如果你使用的是RPM或Debian包,可以在系统配置文件中指定ES_JAVA_OPTS

Elasticsearch 忽略 JAVA_TOOL_OPTIONSJAVA_OPTS 环境变量。

设置JVM堆大小

edit

默认情况下,Elasticsearch 会根据节点的 角色和总内存自动设置 JVM 堆大小。 建议在大多数生产环境中使用默认大小。

要覆盖默认的堆大小,请设置最小和最大堆大小设置,XmsXmx。最小值和最大值必须相同。

堆大小应基于可用内存:

  • XmsXmx 设置为不超过总内存的 50%。Elasticsearch 除了 JVM 堆之外还需要内存。例如,Elasticsearch 使用堆外缓冲区进行高效网络通信,并依赖操作系统的文件系统缓存来实现对文件的高效访问。JVM 本身也需要一些内存。Elasticsearch 使用的内存超过 Xmx 设置的限制是正常的。

    当在容器中运行时,例如在Docker中,总内存被定义为容器可见的内存量,而不是主机上的总系统内存。

  • XmsXmx 设置为不超过压缩普通对象指针(oops)的阈值。确切的阈值因系统而异,但在大多数系统上26GB是安全的,在某些系统上可以达到30GB。要验证是否低于阈值,请检查Elasticsearch日志中是否有类似以下条目:

    堆大小 [1.9gb],压缩普通对象指针 [true]

    或者检查使用节点信息API的节点的jvm.using_compressed_ordinary_object_pointers值:

    GET _nodes/_all/jvm

Elasticsearch可用的堆内存越多,它就可以为内部缓存使用更多的内存。这使得操作系统可用于文件系统缓存的内存减少。较大的堆内存还可能导致更长的垃圾收集暂停。

要配置堆大小,请将 XmsXmx JVM 参数添加到扩展名为 .options 的自定义 JVM 选项文件中,并将其存储在 jvm.options.d/ 目录中。例如,要将最大堆大小设置为 2GB,请将 XmsXmx 都设置为 2g

-Xms2g
-Xmx2g

对于测试,您还可以使用环境变量 ES_JAVA_OPTS 来设置堆大小:

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

变量 ES_JAVA_OPTS 会覆盖所有其他 JVM 选项。我们不建议在生产环境中使用 ES_JAVA_OPTS

如果您正在将 Elasticsearch 作为 Windows 服务运行,您可以使用服务管理器更改堆大小。请参阅 在 Windows 上安装并运行 Elasticsearch 作为服务

启用 Elasticsearch TCP 就绪端口

edit

此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。

如果配置了,当节点处于就绪状态时,可以打开一个TCP端口。当节点成功加入集群时,该节点被认为是就绪的。在单节点配置中,当节点能够接受请求时,该节点被认为是就绪的。

要启用就绪TCP端口,请使用readiness.port设置。就绪服务将绑定到所有主机地址。

如果节点离开集群,或者使用Shutdown API标记节点进行关闭,准备端口将立即关闭。

成功连接到就绪TCP端口表示Elasticsearch节点已准备就绪。当客户端连接到就绪端口时,服务器仅终止套接字连接。不会向客户端返回任何数据。如果客户端无法连接到就绪端口,则节点未准备就绪。