2024-03-13
原文作者:吴声子夜歌 原文地址:https://blog.csdn.net/cold___play/article/details/133949993

Elasticsearch配置

1、配置文件的位置

Elasticsearch 有三个配置文件:

  • elasticsearch.yml: Elasticsearch 配置文件
  • jvm.options: Elasticsearch JVM 配置文件
  • log4j2.properties: Elasticsearch 日志配置文件

这些配置文件位于配置目录,这个目录的默认位置取决于安装来源是 归档的发行版(tar.gz 或 zip) 还是 安装包的发行版(Debian or RPM packages)。

对于 归档的发行版,配置目录默认位于 $ES_HOME/config。 配置目录可以通过环境变量 ES_PATH_CONF 来修改,比如:

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

对于 安装包的发行版,配置目录默认位于 /etc/elasticsearch

2、JVM配置

可以使用 jvm.options 文件 或 环境变量 ES_JAVA_OPTS 来设置选项。自定义的 JVM 选项文件可以添加到 config/jvm.options.d/

应该永远也不需要修改 jvm.options 根文件,而应该使用自定义的 JVM 选项文件。 自定义 JVM 选项的处理顺序是按字母顺序排列。

JVM 选项文件必须有后缀.options,并包含一个按特殊语法以行分隔的 JVM 参数列表:

  • 仅包含空白的行会被忽略
  • 以#开头的行被视为注释并被忽略
    # JVM heap size
    -Xms4g
    -Xmx4g
    
    # GC configuration 
    # jdk8-13采用cms
    8-13:-XX:+UseConcMarkSweepGC
    8-13:-XX:CMSInitiatingOccupancyFraction=75
    8-13:-XX:+UseCMSInitiatingOccupancyOnly
    # jdk14以上使用 G1
    14-:-XX:+UseG1GC
    
    # JVM temporary directory
    -Djava.io.tmpdir=${ES_TMPDIR}
    
    # heap dumps
    -XX:+HeapDumpOnOutOfMemoryError
    9-:-XX:+ExitOnOutOfMemoryError
    -XX:HeapDumpPath=data
    -XX:ErrorFile=logs/hs_err_pid%p.log
    
    # JDK 8 GC logging
    8:-XX:+PrintGCDetails
    8:-XX:+PrintGCDateStamps
    8:-XX:+PrintTenuringDistribution
    8:-XX:+PrintGCApplicationStoppedTime
    8:-Xloggc:logs/gc.log
    8:-XX:+UseGCLogFileRotation
    8:-XX:NumberOfGCLogFiles=32
    8:-XX:GCLogFileSize=64m
    
    # JDK 9+ GC logging
    9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m

3、日志配置

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

4、服务配置

4.1、重要配置

    path:
      data: /var/data/elasticsearch  #数据路径
      logs: /var/log/elasticsearch   #日志路径
    cluster.name: logging-prod       #集群名称
    node.name: prod-data-2           #节点名称
    network.host: 192.168.1.10       #环回地址,单节点配置为本机地址,集群环境配置成0.0.0.0
    discovery.seed_hosts:            #集群中其他节点
       - 192.168.1.10:9300           #可配置ip:prot 
       - 192.168.1.11                #端口是可选的,默认为9300
       - seeds.mydomain.com          #可配置域名,如果主机名解析为多个IP地址,则节点将尝试在所有解析地址上发现其他节点
       - [0:0:0:0:0:ffff:c0a8:10c]:9301  #IPv6地址必须用方括号括起来
    cluster.initial_master_nodes:    #参与选举为主节点的节点列表
       - master-node-a
       - master-node-b
       - master-node-c

4.2、审计安全配置

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

    #(静态)是否启用审计,默认为false。
    xpack.security.audit.enabled  
    #(动态)指定要在审核输出中打印的事件的类型。_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.include  
    #(动态)从包含列表中排除指定类型的事件。
    xpack.security.audit.logfile.events.exclude
    #(动态)是否将来自REST请求的完整请求正文作为某种审核事件的属性包含在内,此设置可用于审核搜索查询,默认为false。
    xpack.security.audit.logfile.events.emit_request_body
    #(动态)指定是否将节点名称作为字段包含在每个审核事件中。默认值为false。
    xpack.security.audit.logfile.emit_node_name
    #(动态)指定是否将节点的IP地址作为字段包含在每个审核事件中。默认值为false。
    xpack.security.audit.logfile.emit_node_host_address
    #(动态)指定是否将节点的主机名作为字段包含在每个审核事件中。默认值为false。
    xpack.security.audit.logfile.emit_node_host_name
    #(动态)指定是否将节点id作为字段包含在每个审核事件中。与节点名不同,如果管理员更改配置文件中的设置,节点名的值可能会更改,节点id将在群集重新启动期间保持不变,管理员无法更改它。默认值为true。
    xpack.security.audit.logfile.emit_node_id
    #(动态)用户名或通配符的列表。指定的策略不会为匹配这些值的用户打印审核事件。
    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
    #(动态)角色名称或通配符的列表。指定的策略不会为具有这些角色的用户打印审核事件。如果用户有多个角色,其中一些角色未包含在策略中,则策略将不包含此事件。
    xpack.security.audit.logfile.events.ignore_filters.<policy_name>.roles
    #(动态)索引名称或通配符的列表。当事件中的所有索引都与这些值匹配时,指定的策略将不会打印审核事件。如果该事件涉及多个指数,其中一些指数不在保单范围内,保单将不涵盖该事件。
    xpack.security.audit.logfile.events.ignore_filters.<policy_name>.indices

4.3、断路器设置

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

    #(静态)确定父断路器是应考虑实际内存使用情况(true)还是仅考虑子断路器保留的内存量(false)。默认为true。
    indices.breaker.total.use_real_memory
    #(动态)父断路器启动限制。如果indices.breaker.total.use_real_memory设置为false,则默认值为JVM堆内存的70%,如果indices.breaker.total.use_real_memory设置为true,则默认值为JVM堆内存的95%。
    indices.breaker.total.limit
    #(动态)fielddata断路器的限制。默认为JVM堆内存的40%。
    indices.breaker.fielddata.limit
    #(动态)与所有字段数据估计值相乘以确定最终估计值的常数。默认为1.03。
    indices.breaker.fielddata.overhead
    #(动态)请求断路器的限制,默认为JVM堆内存的60%。
    indices.breaker.request.limit
    #(动态)所有请求估计值都将与该常数相乘以确定最终估计值。默认为1。
    indices.breaker.request.overhead
    #(动态)运行中请求断路器的限制,默认为JVM堆的100%。这意味着它受到为主断路器配置的限制的约束。
    network.breaker.inflight_requests.limit
    #(动态)一个常数,所有进行中请求估计值都将与该常数相乘以确定最终估计值。默认为2。
    network.breaker.inflight_requests.overhead
    #(动态)记帐断路器的限制,默认为JVM堆的100%。这意味着它受到为主断路器配置的限制的约束。
    indices.breaker.accounting.limit
    #(动态)与所有计费估计值相乘以确定最终估计值的常数。默认为1。
    indices.breaker.accounting.overhead
    #(动态)限制在特定间隔内允许编译的唯一动态脚本的数量。默认为150/5m,即每5分钟150次。
    script.max_compilations_rate
    #(静态)在脚本中启用regex,默认值为limited。编写不好的正则表达式会降低集群的稳定性和性能。
    script.painless.regex.enabled
    #(静态)限制脚本中正则表达式可以考虑的字符数。Elasticsearch通过将设置值乘以脚本输入的字符长度来计算此限制。
    script.painless.regex.limit-factor

4.4、分片分配和路由配置

碎片分配是将碎片分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡期间,或者在添加或删除节点时。主服务器的主要角色之一是决定将哪些碎片分配给哪些节点,以及何时在节点之间移动碎片以重新平衡集群。

    #(动态)设置来控制碎片分配和恢复。重新启动节点时,此设置不会影响本地主碎片的恢复。具有未分配主碎片副本的重新启动节点将立即恢复该主碎片,前提是其分配id与集群状态中的活动分配id之一匹配。
    #all-(默认)允许为所有类型的碎片分配碎片。
    #primaries-仅允许为主碎片分配碎片。
    #new_primaries-仅允许为新索引的主碎片分配碎片。
    #none-任何索引都不允许任何类型的碎片分配。
    cluster.routing.allocation.enable
    #(动态)一个节点上允许进行多少并发传入碎片恢复。传入恢复是在节点上分配目标碎片(很可能是副本,除非碎片正在重新定位)的恢复。默认为2。
    cluster.routing.allocation.node_concurrent_incoming_recoveries
    #(动态)一个节点上允许进行多少并发传出碎片恢复。传出恢复是在节点上分配源碎片(除非碎片正在重新定位,否则很可能是主碎片)的恢复。默认为2。
    cluster.routing.allocation.node_concurrent_outgoing_recoveries
    #(动态)设置cluster.routing.allocation.node_concurrent_incoming_recoveries和cluster.routing.allocation.node_concurrent_outgoing_recoveries的快捷方式,也就是会把上面两个参数设置为一样的
    cluster.routing.allocation.node_concurrent_recoveries
    #(动态)当通过网络恢复副本时,在节点重新启动后恢复未分配的主节点使用本地磁盘中的数据。这些恢复应该很快,以便可以在同一节点上并行执行更多初始主恢复。默认为4。
    cluster.routing.allocation.node_initial_primaries_recoveries
    #(动态)如果为true,则禁止将碎片的多个副本分配给同一主机上的不同节点,即具有相同网络地址的节点。默认值为false,这意味着有时可以将碎片的副本分配给同一主机上的节点。只有在每个主机上运行多个节点时,此设置才相关。
    cluster.routing.allocation.same_shard.host
    #(动态)启用或禁用特定类型碎片的重新平衡:
    #all-(默认)允许对所有类型的碎片进行碎片平衡。
    #primaries-仅允许对主碎片进行碎片平衡。
    #replications—仅允许对副本碎片进行碎片平衡。
    #none-任何索引都不允许任何类型的碎片平衡。
    cluster.routing.rebalance.enable
    #(动态)指定何时允许碎片重新平衡:
    #always-始终允许重新平衡。
    #indices_primaries_active-仅当集群中的所有主映像都已分配时。
    #indices_all_active-(默认)仅当集群中的所有碎片(主碎片和副本)都已分配时。
    cluster.routing.allocation.allow_rebalance
    #(动态)允许控制集群范围内允许多少并发碎片重新平衡。默认值为2。请注意,此设置仅控制由于集群中的不平衡而导致的并发碎片重定位数。此设置不限制由于分配筛选或强制感知而导致的碎片重定位。
    cluster.routing.allocation.cluster_concurrent_rebalance
    #(动态)定义节点上分配的碎片总数的权重因子(浮点)。默认为0.45f。提高这一级别会使集群中所有节点的碎片数量趋于均衡。
    cluster.routing.allocation.balance.shard
    #(动态)定义在特定节点上分配的每个索引的碎片数的权重因子(float)。默认为0.55f。提高这一级别会增加在集群中所有节点上均衡每个索引的碎片数的趋势。
    cluster.routing.allocation.balance.index
    #(动态)应执行的操作的最小优化值(非负浮点)。默认为1.0f。提高此值将导致集群在优化碎片平衡方面不那么积极。
    cluster.routing.allocation.balance.threshold
    #(动态)默认为true。设置为false可禁用磁盘分配决策器。禁用后,它还将删除任何现有的index.blocks.read_only_allow_delete索引块。
    cluster.routing.allocation.disk.threshold_enabled
    #(动态)控制磁盘使用的低水位线。默认为85%,这意味着Elasticsearch不会将碎片分配给磁盘使用率超过85%的节点。也可以将其设置为比率值,例如0.85。也可以将它设置为绝对字节值(如500mb),以防止Elasticsearch在可用空间少于指定数量时分配碎片。此设置不会影响新创建索引的主碎片,但会阻止分配其副本。
    cluster.routing.allocation.disk.watermark.low
    #(动态)控制高水位线。默认为90%,这意味着Elasticsearch将尝试将碎片从磁盘使用率高于90%的节点移出。也可以将其设置为比率值,例如0.9。如果碎片的可用空间小于指定的数量,也可以将它设置为绝对字节值(类似于低水位线),以将碎片从节点移开。此设置影响所有碎片的分配,无论以前是否分配。
    cluster.routing.allocation.disk.watermark.high
    #(静态)在早期版本中,默认行为是在做出分配决策时忽略单个数据节点集群的磁盘水印。自7.14以来,这是不推荐使用的行为,已在8.0中删除。此设置的唯一有效值现在为true。该设置将在未来版本中删除
    cluster.routing.allocation.disk.watermark.enable_for_single_data_node
    #(动态)控制洪水水位线,默认为95%。Elasticsearch对节点上分配了一个或多个碎片且至少有一个磁盘超过泛洪阶段的每个索引强制执行只读索引块(index.blocks.read_only_allow_delete)。此设置是防止节点耗尽磁盘空间的最后手段。当磁盘利用率低于高水位线时,索引块将自动释放。与低水位线值和高水位线值类似,也可以将其设置为比率值,例如0.95或绝对字节值。
    cluster.routing.allocation.disk.watermark.flood_stage
    #(动态)控制专用冻结节点的洪水水位线,默认为95%
    cluster.routing.allocation.disk.watermark.flood_stage.frozen
    #(动态)控制专用冻结节点的洪水水位线的最大净空。当cluster.routing.allocation.disk.watermark.flood_stage时,默认为20GB。未显式设置冻结。这将限制专用冻结节点上所需的可用空间量。
    cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom
    #(动态)Elasticsearch应该多久检查集群中每个节点的磁盘使用情况。默认为30秒。
    cluster.info.update.interval
    #(动态)将碎片分配给{attribute}至少有一个逗号分隔值的节点。
    cluster.routing.allocation.include.{attribute}
    #(动态)只将碎片分配给{attribute}包含所有逗号分隔值的节点。
    cluster.routing.allocation.require.{attribute}
    #(动态)不要将碎片分配给{attribute}具有任何逗号分隔值的节点。
    cluster.routing.allocation.exclude.{attribute}

4.5、索引配置

    #(动态)如果索引尚不存在,则自动创建索引,并应用任何配置的索引模板。默认为true。
    action.auto_create_index
    #(动态)设置为true时,必须指定索引名称才能删除索引。不能使用_all或通配符删除所有索引。默认为true。
    action.destructive_requires_name
    #(动态)允许在Elasticsearch中关闭打开的索引。如果为false,则无法关闭打开的索引。默认为true。
    cluster.indices.close.enable
    #(静态)指定可以从远程重新索引的主机。应为主机:端口字符串的YAML数组。由逗号分隔的主机:端口条目列表组成。默认为[“\*.io:*”,“\*.com:*”]。
    reindex.remote.whitelist
    #(动态)如果为true,则启用内置索引和组件模板。Elastic Agent使用这些模板创建数据流。如果为false,则Elasticsearch将禁用这些索引和组件模板。默认为true。
    stack.templates.enabled

4.6、索引恢复配置

    #限制每个节点的总入站和出站恢复流量。适用于对等恢复和快照恢复(即从快照恢复)。除非节点是专用的冷节点或冻结节点,否则默认值为40mb,在这种情况下,默认值与节点可用的总内存有关。
    indices.recovery.max_bytes_per_sec
    #(动态,专家)每次恢复并行发送的文件块数。默认为2。当单个碎片的恢复未达到indices.recovery.max_bytes_per_sec设置的流量限制时,可以将此设置的值增加到最多8。
    indices.recovery.max_concurrent_file_chunks
    #(动态,专家)每次恢复并行发送的操作数。默认为1。恢复期间并发重播操作可能会占用大量资源,可能会干扰集群中的索引、搜索和其他活动。在未仔细验证集群是否有可用资源来处理将导致的额外负载之前,请不要增加此设置。
    indices.recovery.max_concurrent_operations
    #(动态,专家)支持基于快照的对等恢复。Elasticsearch使用对等恢复过程恢复副本并重新定位主碎片,这涉及在目标节点上构建碎片的新副本。当指示恢复时。use_snapshots为false,Elasticsearch将通过从当前主目录传输索引数据来构建此新副本。如果此设置为true,则Elasticsearch将首先尝试从最近的快照中复制索引数据,如果无法识别合适的快照,则仅从主快照中复制数据。默认为true。
    indices.recovery.use_snapshots
    #(动态,专家级)每次恢复并行发送到目标节点的快照文件下载请求数。默认为5。在未仔细验证集群是否有可用资源来处理将导致的额外负载之前,请不要增加此设置。
    indices.recovery.max_concurrent_snapshot_file_downloads
    #(动态,专家级)在目标节点中为所有恢复并行执行的快照文件下载请求数。默认为25。在未仔细验证集群是否有可用资源来处理将导致的额外负载之前,请不要增加此设置。
    indices.recovery.max_concurrent_snapshot_file_downloads_per_node
    #节点上类似恢复的工作负载的绝对最大磁盘读取速度。如果已设置,则为node.bandwidth.recovery.disk。写入并节点.bandwidth.recovery。还必须设置网络。
    node.bandwidth.recovery.disk.read

4.7、监控配置

    #是否开启监控。
    xpack.monitoring.enabled
    #是否开启监控数据的收集。
    xpack.monitoring.collection.enabled
    #控制采集数据样本的频率。默认为10秒。
    xpack.monitoring.collection.interval
    #控制是否应收集有关Elasticsearch群集的统计信息。默认为true。
    xpack.monitoring.elasticsearch.collection.enabled
    #收集群集统计信息的超时时间(以时间单位为单位)。默认为10秒。
    xpack.monitoring.collection.cluster.stats.timeout
    #收集节点统计信息的超时时间(以时间单位为单位)。默认为10秒。
    xpack.monitoring.collection.node.stats.timeout
    #控制监视功能从中收集数据的索引。默认为所有索引。将索引名称指定为逗号分隔的列表,例如test1、test2、test3。名称可以包含通配符,例如test*。可以通过在前面加上-来明确排除索引。例如,test*、-test3将监视以test开头的所有索引,test3除外。像.security*或.kibana*这样的系统索引总是以.开头,通常应该进行监视。考虑在索引列表中添加.*,以确保对系统索引进行监控。例如:.*、test*、-test3。
    xpack.monitoring.collection.indices
    #收集索引统计信息的超时,以时间单位表示。默认为10秒。
    xpack.monitoring.collection.index.stats.timeout
    #控制是否收集所有回收。设置为true以仅收集活动恢复。默认为false。
    xpack.monitoring.collection.index.recovery.active_only
    #收集恢复信息的超时,以时间单位表示。默认为10秒。
    xpack.monitoring.collection.index.recovery.timeout
    #以时间单位表示的保留时间,超过该时间后,监控导出器创建的索引将自动删除。默认为7d(7天)。此设置的最小值为1d(1天),以确保正在监视某些内容,并且不能将其禁用。
    xpack.monitoring.history.duration
    #支持带有版本的协议。有效协议:SSLv2Hello、SSLv3、TLSv1、TLSv1.1、TLSV2.2、TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3,则默认值为TLSv13、TLSv 1.2、TLSv-1.1。否则,默认值为TSSv1.2、TLSv1.1。
    xpack.monitoring.exporters.$NAME.ssl.supported_protocols
    #控制证书的验证,默认值为full。
    #full-它验证所提供的证书是否由可信机构(CA)签名,并验证服务器的主机名(或IP地址)是否与证书中标识的名称匹配。
    #certificate-它验证所提供的证书是否由可信机构(CA)签名,但不执行任何主机名验证。
    #none-它不执行服务器证书的验证。此模式禁用了SSL/TLS的许多安全优势,只有在仔细考虑后才能使用。它主要用作尝试解决TLS错误时的临时诊断机制;强烈反对将其用于生产集群。
    xpack.monitoring.exporters.$NAME.ssl.verification_mode
    #支持的密码套件因您使用的Java版本而异。
    xpack.monitoring.exporters.$NAME.ssl.cipher_suites
     
    ##使用PEM编码的文件时,请使用以下设置。
    #包含私钥的PEM编码文件的路径。如果需要HTTP客户端身份验证,则使用此文件。不能同时使用此设置和ssl.keystore.path。
    xpack.monitoring.exporters.$NAME.ssl.key
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。不能同时使用此设置和ssl.secure_key_passphrase。
    xpack.monitoring.exporters.$NAME.ssl.key_passphrase
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
    xpack.monitoring.exporters.$NAME.ssl.secure_key_passphrase
    #指定与密钥关联的PEM编码证书(或证书链)的路径。仅当ssl时才能使用此设置。键已设置。
    xpack.monitoring.exporters.$NAME.ssl.certificate
    #应信任的PEM编码证书文件的路径列表。不能同时使用此设置和ssl.truststore.path。
    xpack.monitoring.exporters.$NAME.ssl.certificate_authorities
     
    ##使用Java密钥库文件(JKS)时,其中包含应信任的私钥、证书和证书,请使用以下设置。
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能使用此设置和ssl.key。
    xpack.monitoring.exporters.$NAME.ssl.keystore.path
    #密钥库的密码。
    xpack.monitoring.exporters.$NAME.ssl.keystore.password
    #密钥库的密码。
    xpack.monitoring.exporters.$NAME.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能使用此设置和ssl.certificate_authorities。
    xpack.monitoring.exporters.$NAME.ssl.keystore.key_password
    #信任库的密码。不能使用此设置和ssl.truststore.secure_password。
    xpack.monitoring.exporters.$NAME.ssl.truststore.password
    #信任库的密码。
    xpack.monitoring.exporters.$NAME.ssl.truststore.secure_password
     
    ##Elasticsearch可以配置为使用PKCS#12容器文件(.p12或.pfx文件),这些文件包含应该信任的私钥、证书和证书。PKCS#12文件的配置方式与Java密钥库文件相同。
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能使用此设置和ssl.key。
    xpack.monitoring.exporters.$NAME.ssl.keystore.path
    #密钥库文件的格式。它必须是jks或PKCS12。如果密钥库路径以“.p12”、“.pfx”或“.PKCS12”结尾,则此设置默认为PKCS12,否则默认为jks。
    xpack.monitoring.exporters.$NAME.ssl.keystore.type
    #密钥库的密码。
    xpack.monitoring.exporters.$NAME.ssl.keystore.password
    #密钥库的密码。
    xpack.monitoring.exporters.$NAME.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能使用此设置和ssl.certificate_authorities。
    xpack.monitoring.exporters.$NAME.ssl.keystore.key_password
    #将其设置为PKCS12,以指示信任库是PKCS#12文件。
    xpack.monitoring.exporters.$NAME.ssl.truststore.type
    #信任库的密码。不能使用此设置和ssl.truststore.secure_password。
    xpack.monitoring.exporters.$NAME.ssl.truststore.password
    #信任库的密码。
    xpack.monitoring.exporters.$NAME.ssl.truststore.secure_password

4.8、快照和还原配置

    #并发快照操作的最大数目。默认为1000。此限制总共适用于所有正在进行的快照创建、克隆和删除操作。Elasticsearch将拒绝任何超过此限制的操作。
    snapshot.max_concurrent_operations
    #控制SLM是否将作为SLM策略一部分采取的操作的历史记录记录到SLM history-*索引中。默认为true。
    slm.history_index_enabled
    #控制保留任务的运行时间。可以是定期时间表或绝对时间表。支持cron调度程序支持的所有值。默认为每天凌晨1:30 UTC:0 30 1**?。
    slm.retention_schedule
    #限制SLM删除旧快照的时间。默认为1小时:1小时。
    slm.retention_duration
    #自上次成功快照以来,指示健康api中的策略存在问题的失败调用数。在五次重复失败后默认为健康api警告:5L。
    slm.health.failed_snapshot_warn_threshold
    #指定可以从中还原快照的只读URL存储库。
    repositories.url.allowed_urls

4.9、安全配置

    ##HTTP TLS/SSL settings
    #用于启用或禁用HTTP网络层上的TLS/SSL,Elasticsearch使用该层与其他客户端通信。默认值为false。
    xpack.security.http.ssl.enabled
    #版本支持的协议。有效协议:SSLv2Hello、SSLv3、TLSv1、TLSv1.1、TLSV2.2、TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3,则默认值为TLSv13、TLSv 1.2、TLSv-1.1。否则,默认值为TSSv1.2、TLSv1.1。
    xpack.security.http.ssl.supported_protocols
    #控制服务器从客户端连接请求证书的行为。有效值为必填、可选和无。required强制客户端提供证书,而optional请求客户端证书,但客户端不需要提供证书。默认为无。
    xpack.security.http.ssl.client_authentication
    #支持的密码套件因您使用的Java版本而异。
    xpack.security.http.ssl.cipher_suites
     
    ###以下设置用于指定通过SSL/TLS连接进行通信时应使用的私钥、证书和可信证书。
     
    ##使用PEM编码的文件时,请使用以下设置。
    #包含私钥的PEM编码文件的路径。不能同时使用此配置和ssl.keystore.path。
    xpack.security.http.ssl.key
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。不能同时使用此配置和ssl.secure_key_passphrase。
    xpack.security.http.ssl.key_passphrase
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
    xpack.security.http.ssl.secure_key_passphrase
    #指定与密钥关联的PEM编码证书(或证书链)的路径。只有设置了ssl.key才能使用此配置。
    xpack.security.http.ssl.certificate
    #应信任的PEM编码证书文件的路径列表。不能同时使用此配置和ssl.truststore.path。
    xpack.security.http.ssl.certificate_authorities
     
    ##使用Java密钥库文件(JKS)时,其中包含应信任的私钥、证书和证书,请使用以下设置:
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.key。
    xpack.security.http.ssl.keystore.path
    #密钥库的密码。
    xpack.security.http.ssl.keystore.password
    #密钥库的密码。
    xpack.security.http.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能同时使用此配置和ssl.keystore.secure_password。
    xpack.security.http.ssl.keystore.key_password
    #密钥库中密钥的密码。默认值为密钥库密码。
    xpack.security.http.ssl.keystore.secure_key_password
    #包含要信任的证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.certificate_authorities。
    xpack.security.http.ssl.truststore.path
    #信任库的密码。不能同时使用此配置和ssl.truststore.secure_password。
    xpack.security.http.ssl.truststore.password
    #信任库的密码。
    xpack.security.http.ssl.truststore.secure_password
     
    ##Elasticsearch可以配置为使用PKCS#12容器文件(.p12或.pfx文件),这些文件包含应该信任的私钥、证书和证书。
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.key。
    xpack.security.http.ssl.keystore.path
    #密钥库文件的格式。它必须是jks或PKCS12。如果密钥库路径以“.p12”、“.pfx”或“.PKCS12”结尾,则此设置默认为PKCS12,否则默认为jks。
    xpack.security.http.ssl.keystore.type
    #密钥库的密码。
    xpack.security.http.ssl.keystore.password
    #密钥库的密码。
    xpack.security.http.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能同时使用此配置和ssl.keystore.secure_password。
    xpack.security.http.ssl.keystore.key_password
    #密钥库中密钥的密码。默认值为密钥库密码。
    xpack.security.http.ssl.keystore.secure_key_password
    #包含要信任的证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.certificate_authorities。
    xpack.security.http.ssl.truststore.path
    #将其设置为PKCS12,以指示信任库是PKCS#12文件。
    xpack.security.http.ssl.truststore.type
    #信任库的密码。不能同时使用此配置和ssl.truststore.secure_password。
    xpack.security.http.ssl.truststore.password
    #信任库的密码。
    xpack.security.http.ssl.truststore.secure_password
     
    ##Transport TLS/SSL settings
    #用于启用或禁用传输网络层上的TLS/SSL,这些节点用于相互通信。默认值为false。
    xpack.security.transport.ssl.enabled
    #版本支持的协议。有效协议:SSLv2Hello、SSLv3、TLSv1、TLSv1.1、TLSV2.2、TLSv1.3。如果JVM的SSL提供程序支持TLSv1.3,则默认值为TLSv13、TLSv 1.2、TLSv-1.1。否则,默认值为TSSv1.2、TLSv1.1。
    xpack.security.transport.ssl.supported_protocols
    #控制服务器从客户端连接请求证书的行为。有效值为必填、可选和无。required强制客户端提供证书,而optional请求客户端证书,但客户端不需要提供证书。默认为必填。
    xpack.security.transport.ssl.client_authentication
    #控制证书的验证。默认值为full。
    xpack.security.transport.ssl.verification_mode、
    #支持的密码套件因您使用的Java版本而异。
    xpack.security.transport.ssl.cipher_suites
     
    ###以下设置用于指定通过SSL/TLS连接进行通信时应使用的私钥、证书和可信证书。必须配置私钥和证书。
     
    ##使用PEM编码的文件时,请使用以下设置。
    #包含私钥的PEM编码文件的路径。不能同时使用此设置和ssl.keystore.path。
    xpack.security.transport.ssl.key
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。不能同时使用此配置和ssl.secure_key_passphrase。
    xpack.security.transport.ssl.key_passphrase
    #用于解密私钥的密码短语。由于密钥可能未加密,因此此值是可选的。
    xpack.security.transport.ssl.secure_key_passphrase
    #指定与密钥关联的PEM编码证书(或证书链)的路径。只有设置了ssl.key才能使用此配置。
    xpack.security.transport.ssl.certificate
    #应信任的PEM编码证书文件的路径列表。不能同时使用此设置和ssl.truststore.path。
    xpack.security.transport.ssl.certificate_authorities
     
    ##使用Java密钥库文件(JKS)时,其中包含应信任的私钥、证书和证书,请使用以下设置。
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.key。
    xpack.security.transport.ssl.keystore.path
    #密钥库的密码。
    xpack.security.transport.ssl.keystore.password
    #密钥库的密码。
    xpack.security.transport.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能同时使用此配置和ssl.keystore.secure_password。
    xpack.security.transport.ssl.keystore.key_password
    #密钥库中密钥的密码。默认值为密钥库密码。
    xpack.security.transport.ssl.keystore.secure_key_password
    #包含要信任的证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.certificate_authorities。
    xpack.security.transport.ssl.truststore.path
    #信任库的密码。不能同时使用此配置和ssl.truststore.secure_password。
    xpack.security.transport.ssl.truststore.password
    #信任库的密码。
    xpack.security.transport.ssl.truststore.secure_password
     
    ##Elasticsearch可以配置为使用PKCS#12容器文件(.p12或.pfx文件),这些文件包含应该信任的私钥、证书和证书。
    #包含私钥和证书的密钥库文件的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.key。
    xpack.security.transport.ssl.keystore.path
    #密钥库文件的格式。它必须是jks或PKCS12。如果密钥库路径以“.p12”、“.pfx”或“.PKCS12”结尾,则此设置默认为PKCS12,否则默认为jks。
    xpack.security.transport.ssl.keystore.type
    #密钥库的密码。
    xpack.security.transport.ssl.keystore.password
    #密钥库的密码。
    xpack.security.transport.ssl.keystore.secure_password
    #密钥库中密钥的密码。默认值为密钥库密码。不能同时使用此配置和ssl.keystore.secure_password。
    xpack.security.transport.ssl.keystore.key_password
    #密钥库中密钥的密码。默认值为密钥库密码。
    xpack.security.transport.ssl.keystore.secure_key_password
    #包含要信任的证书的密钥库的路径。它必须是Java密钥库(jks)或PKCS#12文件。不能同时使用此配置和ssl.certificate_authorities。
    xpack.security.transport.ssl.truststore.path
    #将其设置为PKCS12,以指示信任库是PKCS#12文件。
    xpack.security.transport.ssl.truststore.type
    #信任库的密码。不能同时使用此配置和ssl.truststore.secure_password。
    xpack.security.transport.ssl.truststore.password
    #信任库的密码。
    xpack.security.transport.ssl.truststore.secure_password
     
    ##您可以为IP筛选配置以下设置。
    #要允许的IP地址列表。
    xpack.security.transport.filter.allow
    #要拒绝的IP地址列表。
    xpack.security.transport.filter.deny
    #仅允许HTTP使用的IP地址列表。
    xpack.security.http.filter.allow
    #仅为HTTP拒绝的IP地址列表。
    xpack.security.http.filter.deny
    #允许此配置文件使用的IP地址列表。
    transport.profiles.$PROFILE.xpack.security.filter.allow
    #要拒绝此配置文件的IP地址列表。
    transport.profiles.$PROFILE.xpack.security.filter.deny

4.10、JVM配置

    #最大堆内存
    -Xmx4g
    #初始化堆内存大小
    -Xms4g

4.11、跨集群复制设置

    # 动态,限制每个节点上远程恢复的入站和出站的总流量。 由于此限制应用于每个节点,但可能有许多节点同时执行远程恢复,因此远程恢复的字节总量可能远远高于此限制。 如果将此限制设置得太高,则存在正在进行中的远程恢复会消耗过多带宽(或其他资源)的风险,这可能会使集群不稳定。 主(leader)集群和从(follower)集群都使用此设置。 例如,如果在主集群上设置为 20mb,即使从集群可以接受 60mb/s并以此为上限发出请求,主集群仍将只向从集群发送 20mb/s。默认为 40mb。
    ccr.indices.recovery.max_bytes_per_sec
    
    # 动态,专家。控制每次恢复时可以并行发送的文件区块请求的数量。 由于多个远程恢复可能已经并行运行,因此增加此专家级设置可能仅在单个分片的远程恢复未达到 ccr.indices.recovery.max_bytes_per_sec 配置的远程恢复的入站和出站的总流量的情况下有所帮助。 默认为 5。允许的最大值为 10。
    ccr.indices.recovery.max_concurrent_file_chunks
    
    # 动态,专家。控制文件传输过程中跟随请求的块大小。默认为 1mb。
    ccr.indices.recovery.chunk_size
    
    # 动态,专家。控制恢复活动的超时时间。 此超时时间主要作用于主集群。 在恢复过程中,主集群必须打开内存中的资源,以便向从集群提供数据。 主集群如果在这段时间内没有收到从集群的恢复请求,则它将关闭资源。 默认为 60 秒。
    ccr.indices.recovery.recovery_activity_timeout
    
    # 动态,专家。制远程恢复过程中各个网络请求的超时时间。 单个操作超时可能会导致恢复失败。 默认为 60 秒。
    ccr.indices.recovery.internal_action_timeout

4.12、字段数据缓存设置

字段数据缓存主要在对字段进行排序或聚合计算时使用。 它将所有字段的值加载到内存中,以便提供对这些值的基于文档的快速访问。 为字段构建字段数据缓存的成本可能很高,因此建议有足够的内存来分配数据缓存,并保持其加载状态。

    # 字段数据缓存的最大值, 比如 节点堆空间的 30%,或者 一个确切的值,比如 12GB。默认为 没有限制
    indices.fielddata.cache.size

4.13、HTTP配置

    #绑定端口范围。默认为 9200-9300。
    http.port
    #HTTP客户端在与此节点通信时应使用的端口。 当集群的节点位于代理或防火墙之后,并且 http.port 不能从外部直接寻址时,此功能非常有用。默认为通过http.port分配的实际端口。
    http.publish_port
    #HTTP 服务要绑定到的主机地址。默认为 http.host (如果设置了) 或者 network.bind_host。
    http.bind_host
    #要发布供 HTTP 客户端连接的主机地址。默认为 http.host (如果设置了) 或者 network.publish_host。
    http.publish_host
    #用于设置 http.bind_host 和 http.publish_host。
    http.host
    #HTTP 请求的最大内容。默认为 100mb。
    http.max_content_length
    #HTTP URL 的最大长度。默认为 4kb。
    http.max_initial_line_length
    #允许的 header 大小的最大值。默认为 8kB
    http.max_header_size
    #	如果可以就支持压缩 (使用 Accept-Encoding)。如果开启了 HTTPS,默认为 false。否则,默认为 true。对 HTTPS 禁用压缩可以降低潜在的安全风险,如 BREACH 攻击。要压缩 HTTPS 流量,必须将 http.compression 设置为 true。
    http.compression
    #定义用于 HTTP 响应的压缩级别。有效值的范围为 1(最小压缩) 到 9 (最大压缩)。默认为 3。
    http.compression_level
    #启用或禁用跨域,默认为false
    http.cors.enabled
    #允许的域
    http.cors.allow-origin
    #浏览器发送带 “预检(preflight)” 选项的请求来确定 CORS 设置。 max-age 定义了结果要缓存的时间。默认为 1728000 (20 天)。
    http.cors.max-age
    #允许哪些方法。默认为 OPTIONS, HEAD, GET, POST, PUT, DELETE。
    http.cors.allow-methods
    #允许那些 header 。默认为 X-Requested-With, Content-Type, Content-Length。
    http.cors.allow-headers
    #是否要返回 Access-Control-Allow-Credentials 头。注意:仅当设置为 true 时才会返回这个值。默认为 false。
    http.cors.allow-credentials
    #启用或禁用响应中详细错误消息和堆栈跟踪的输出。 注意:当设置为 false 且指定了 error_trace 请求参数时,会返回错误;如果未指定 error_trace,则只返回一个简单的信息。默认为 true。
    http.detailed_errors.enabled
    #关闭 HTTP 连接之前,要在内存中排队的最大事件数,默认为 10000。
    http.pipelining.max_events
    #客户端 HTTP 响应中警告头的最大数量,默认为 不限制
    http.max_warning_header_count
    #客户端 HTTP 响应中警告头的最大总大小,默认为 不限制。
    http.max_warning_header_size

4.14、索引生命周期管理设置

集群级别的设置:

    #(boolean) 是启用还是禁用 ILM,设置为 false 会禁用所有的 ILM REST API 终端和功能。默认为 true。
    xpack.ilm.enabled
    #(boolean) 是否启用 ILM 的历史索引。如果启用,ILM 将记录操作历史到索引 ilm-history-* 中,这是 ILM 策略的一部分。默认为 true。
    indices.lifecycle.history_index_enabled
    #(动态的, 时间单位值) 索引生命周期管理检查是否满足策略标准的索引的频率。默认为 10m (10分钟)。
    indices.lifecycle.poll_interval

索引级别的设置:

    #(动态的, boolean) 指示索引是否已被 滚动(rolled over)。当 ILM 完成 滚动(rollover) 时会自动设置为 true。你也可以显式的将它设置为 跳过滚动 (skip rollover)。默认为 false。
    index.lifecycle.indexing_complete
    #(动态的, string) 用于管理索引的策略的名称。
    index.lifecycle.name
    #(动态的, long) 如果指定了,它就是用于计算其 相变(phase transitions) 的索引年龄的时间戳。 如果你要创建一个包含旧数据的新索引,并想使用原始创建日期来计算索引年龄,则使用此设置。 请指定为 Unix epoch 值
    index.lifecycle.origination_date
    #(动态的, boolean) 设置为 true, 会解析索引名称中的起始日期。 此起始日期用于计算索引的 相变(phase transitions) 年龄。 索引名称必须匹配 ^.*-{date_format}-\\d+ 模式,其中 date_format 的格式为 yyyy.MM.dd,后面的数字是可选的。 被滚动的索引通常匹配完整的格式,比如 logs-2016.10.31-000002。 如果索引名称与模式不匹配,则索引创建失败。
    index.lifecycle.parse_origination_date
    #(动态的, string) 索引滚动时要更新的索引别名。 使用包含滚动操作的策略时要指定。 当索引滚动时,别名被更新,以反映那个索引不再是写索引。 更多关于索引滚动的信息,参考 滚动 (Rollover)。
    index.lifecycle.rollover_alias

4.15、索引缓冲区设置

索引缓冲区用于存储新索引的文档。当缓冲区填满时,其中的文档会被写到磁盘上的一个段中。节点的所有分片都使用这个缓冲区。

下面几个设置是动态的,必须在集群的每一个节点上都配置:

    #接受百分比或字节大小值。 默认为 10%,表示分配给一个节点的堆的总大小的 10% 将用于所有分片共享的索引缓冲区大小。
    indices.memory.index_buffer_size
    #如果将 index_buffer_size 指定为一个百分比值,则此设置可用于指定绝对最小值。默认为 48mb。
    indices.memory.min_index_buffer_size
    #如果将 index_buffer_size 指定为一个百分比值,则此设置可用于指定绝对最大值。默认为 不限制。
    indices.memory.max_index_buffer_size

4.16、许可证设置

可以在配置文件 elasticsearch.yml 中配置许可证设置。

    #设置为 basic (默认) 以启用基础的 X-Pack 特性。
    #如果设置为 trial,则自行生成的许可证只能在 30 天内访问 x-pack 的所有功能。 如果需要,可以稍后将集群降级为 basic 许可证。
    xpack.license.self_generated.type

4.17、本地网关设置

本地网关在整个集群重启期间存储集群状态和分片数据。

以下几个静态设置必须在每个主节点上设置,它们控制新选出的主节点在尝试恢复集群状态和集群数据之前应该等待的时间:

    #[7.7.0] 在 7.7.0 中废弃,将在 8.0 中移除。你应该使用 gateway.expected_data_nodes 代替之。预期出现在集群中的(数据或主)节点的数量。预期数量的节点加入集群后,本地分片的恢复将立即开始。默认为 0。
    gateway.expected_nodes
    #[7.7.0] 在 7.7.0 中废弃,将在 8.0 中移除。 你应该使用 gateway.expected_data_nodes 代替之。预期在集群中的主节点的数量。一旦预期数量的主节点加入集群,本地分片的恢复就会开始。默认为 0。
    gateway.expected_master_nodes
    #预期在集群中的数据节点的数量。一旦预期数量的数据节点加入集群,本地分片的恢复就会开始。默认为 0。
    gateway.expected_data_nodes
    #如果没有达到预期的节点数量,恢复过程会等待配置的时间,然后再尝试恢复。 如果配置了expected_nodes设置之一,则默认为5m。
    gateway.recover_after_time
    #[7.7.0] 在 7.7.0 中废弃,将在 8.0 中移除。你应该使用 gateway.recover_after_data_nodes 代替之。只要有这么多数据或主节点加入集群,就可以恢复。
    gateway.recover_after_nodes
    #[7.7.0] 在 7.7.0 中废弃,将在 8.0 中移除。你应该使用 gateway.recover_after_data_nodes 代替之。只要有这么多主节点加入集群,就可以恢复。
    gateway.recover_after_master_nodes
    #只要有这么多数据节点加入集群,就可以恢复。
    gateway.recover_after_data_nodes

4.18、机器学习配置

    #设置为 true (默认) 以指定节点为一个机器学习节点。
    #如果在elasticsearch.yml中设置为false,则该节点不能运行 作业(job)。 如果设置为true,但是xpack.ml.enabled设置为false,则node.ml设置会被忽略且节点不能运行 作业(job)。 如果你想运行 作业,集群中必须至少有一个机器学习节点。
    node.ml
    
    # 等.....

4.19、节点配置

任何时候启动一个 Elasticsearch 实例,都是在启动一个节点 (node)。 连接的节点的集合称为集群 (cluster)。 如果你运行的是 Elasticsearch 的单个节点,那么你有一个包含一个节点的集群。

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

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

默认情况下,节点包含以下所有类型: 符合主节点条件的节点(master-eligible)、数据节点(data)、预处理节点(ingest) 以及 机器学习(machine learning)(如果可用) 和 转换(transform)节点。

    #设置为true(默认值)的节点,这使它有资格 被选为主 (master)节点,主节点可以控制集群。
    node.master
    #设置为true(默认值)的节点。数据节点保存数据并执行与数据相关的操作,如 CRUD、搜索和聚合。
    node.data
    #设置为true(默认值)的节点。 预处理节点能够将 预处理管道 (ingest pipeline) 应用于文档,以便在索引之前转换并丰富文档。 当预处理负载很大时,使用专用的预处理节点并将主节点和数据节点标记为node.ingest: false是有意义的。
    node.ingest
    
    
    # xpack.ml.enabled 和 node.ml 设置为 true 的节点,这是 Elasticsearch 默认发行版中的默认行为。 如果要使用机器学习功能,集群中必须至少有一个机器学习节点。
    
    
    #xpack.transform.enabled 和 node.transform 设置为 true 的节点。 如果要使用转换,集群中必须至少有一个转换节点。

专用的符合主节点条件的节点:
#当选的主节点拥有履行其职责所需的资源,这对集群的健康非常重要。 如果选出的主节点因其他任务而过载,那么集群可能无法正常运行。 特别是,索引和搜索数据会占用大量资源,因此在大型或高吞吐集群中,最好避免使用符合主节点条件的节点来执行索引和搜索等任务。 为此,你可以将三个节点配置为专用的符合主节点条件的节点。 专用的符合主节点条件的节点仅具有master角色,这使得它们可以专注于管理集群。 虽然主节点也可以充当协调节点,并将搜索和索引请求从客户端路由到数据节点,但最好不要为此使用专用主节点。

要在默认发行版中创建专用的符合主节点条件的节点,请设置:

    node.master: true 
    node.voting_only: false 
    node.data: false 
    node.ingest: false 
    node.ml: false 
    xpack.ml.enabled: true 
    node.transform: false 
    xpack.transform.enabled: true 
    node.remote_cluster_client: false

只有投票资格的符合主节点条件的节点:

    node.voting_only: true

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

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

要在默认发行版中创建专用数据节点,请设置:

    node.master: false 
    node.voting_only: false 
    node.data: true 
    node.ingest: false 
    node.ml: false 
    node.transform: false 
    xpack.transform.enabled: true 
    node.remote_cluster_client: false

预处理节点:

预处理节点可以执行 预处理管道(pre-processing pipelines),由一个或多个预处理处理器组成。 根据预处理处理器执行的操作类型和所需的资源,拥有专用预处理节点可能是有意义的,这些节点将只执行此特定任务。

要在默认发行版中创建专用预处理节点,请设置:

    node.master: false 
    node.voting_only: false 
    node.data: false 
    node.ingest: true 
    node.ml: false 
    node.transform: false 
    node.remote_cluster_client: false

只负责协调的节点:
如果失去了处理主任务、保存数据和预处理文档的能力,那么只剩下一个协调 (coordinating)节点,它只能路由请求、处理搜索 reduce 阶段及分发批量索引。 本质上,只负责协调的节点就像智能负载均衡器一样。

通过将协调节点角色从数据和符合主节点条件的节点上卸载下来,只负责协调的节点可以使大型集群受益。 它们加入集群并接收完整的集群状态,就像所有其他节点一样,它们使用集群状态将请求直接路由到适当的位置。

    node.master: false 
    node.voting_only: false 
    node.data: false 
    node.ingest: false 
    node.ml: false 
    xpack.ml.enabled: true 
    node.transform: false 
    xpack.transform.enabled: true 
    node.remote_cluster_client: false

机器学习节点:
机器学习功能提供机器学习节点,这些节点运行作业并处理机器学习API请求。 如果xpack.ml.enabled设置为true,node.ml设置为false,则节点可以为 API 请求提供服务,但不能运行作业。

如果要在集群中使用机器学习功能,必须在所有符合主节点条件的节点上启用机器学习(将xpack.ml.enabled设置为true)。 如果想要在客户端(包括Kibana)中使用机器学习功能,还必须在所有协调节点上启用它。 如果用的是 OSS-only 发行版,请不要使用这些设置。

    node.master: false 
    node.voting_only: false 
    node.data: false 
    node.ingest: false 
    node.ml: true 
    xpack.ml.enabled: true 
    node.transform: false 
    xpack.transform.enabled: true 
    node.remote_cluster_client: false

转换节点:

    node.master: false 
    node.voting_only: false 
    node.data: false 
    node.ingest: false 
    node.ml: false 
    node.transform: true 
    xpack.transform.enabled: true 
    node.remote_cluster_client: false

4.20、网络设置

常用网络设置:

    #该节点将绑定到此主机名或IP地址,并将此主机发布(广告)到集群中的其他节点。 接受IP地址、主机名、特殊值或这些值的任意组合的数组。 请注意,任何包含:的值(例如,IPv 6地址或其中一个特殊值)都必须加引号,因为:是 YAML 中的一个特殊字符。 0.0.0.0是一个可接受的IP地址,并将绑定到所有网络接口。 值0与值0.0.0.0具有相同的效果。默认为 _local_
    
    #network.host的特殊值
    #以下几个特殊值可以传递给 network.host:
    #_[networkInterface]_
    #网络接口的地址,比如 _en0_.
    #_local_
    #系统上的任何 回环(loopback) 地址,比如 127.0.0.1
    #_site_
    #系统上的任何 本地站点(site-local) 地址,比如 #192.168.0.1
    #_global_
    #系统上任何 全局范围(globally-scoped) 的地址,比如 #8.8.8.8
    network.host
    
    #为了加入集群,节点需要知道集群中至少几个其他节点的主机名或IP地址。 此设置提供此节点将尝试联系的地址的初始列表。 接受IP地址或主机名。 如果主机名查找解析到多个IP地址,则每个IP地址都将用于发现。 轮询 DNS--从每次查找的列表中返回不同的IP--可以用于发现;不存在的IP地址将抛出异常,并在下一轮 ping 时导致另一次 DNS 查找(受JVM DNS 缓存影响)。默认为 ["127.0.0.1", "[::1]"]
    discovery.seed_hosts
    
    #传入HTTP请求要绑定到的端口。接受单个值或范围。 如果指定了范围,节点将绑定到范围内的第一个可用的端口。默认为 9200-9300
    http.port
    
    #为节点之间的通信绑定的端口。接受单个值或范围。 如果指定了范围,节点将绑定到范围内的第一个可用的端口。默认为 9300-9400
    transport.port

高级网络设置:

    #指定节点应该绑定到哪个(哪些)网络接口,以便监听传入的请求。 一个节点可以绑定到多个接口,例如两个网卡,或者一个 本地站点(site-local) 地址和一个本地地址。默认为 network.host。
    network.bind_host
    
    #发布主机是节点向集群中的其他节点发布的单一接口,以便这些节点可以连接到它。 目前,一个 Elasticsearch 节点可能会绑定到多个地址,但只发布一个。 如果未指定,则默认为network.host中的“最佳”地址,先按 IPv4/IPv6 堆栈优先级排序,然后按可达性排序。 如果你设置的network.host会产生多个绑定地址,但仍依赖特定地址进行节点到节点的通信,则应该显式设置network.publish_host。
    network.publish_host

高级TCP设置:

    #启用或禁用 TCP no delay 设置。默认为 true
    network.tcp.no_delay
    #启用或禁用 TCP keep alive。默认为 true
    network.tcp.keep_alive
    #一个地址是否应该被重用。在非 windows 机器上默认为true。
    network.tcp.reuse_address
    #TCP 发送缓冲区的大小(用size 单位指定)。默认情况下不显式设置。
    network.tcp.send_buffer_size
    #TCP 接收缓冲区的大小(用size 单位指定)。默认情况下不显式设置。
    network.tcp.receive_buffer_size

4.21、节点查询缓存设置

过滤器上下文中使用的查询结果缓存在节点的查询缓存中,以便快速查找。 每个节点上有一个查询缓存,它被该节点上的所有分片所共享。 缓存使用 LRU 回收策略:当缓存塞满时,最近最少使用的查询结果将被回收,以便为新数据腾出空间。 而我们不能检查查询缓存的内容。

词项(term)查询和在筛选器上下文之外使用的查询不适合缓存。

默认情况下,缓存最多可容纳 10,000 个查询,可以使用的最大内存为总堆空间的 10% 。 为了确定一个查询是否适合缓存,Elasticsearch 维护一个查询历史记录来跟踪发生的事件。

如果一个段包含至少 10,000 个文档,并且该段至少占一个分片的全部文档的3%,则在每个段的基础上进行缓存。 因为缓存是按段进行的,所以段合并会使缓存的查询无效。

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

    #控制过滤器缓存的内存大小,默认为10%。 接受百分比值(如5%)或精确值(如512mb)。
    indices.queries.cache.size
    
    #控制是否启用查询缓存。接受 true (默认值) or false。
    index.queries.cache.enabled

4.22、搜索设置

可以通过下面几个专家级设置来管理全局搜索和聚合限制。

    #(integer) Lucene BooleanQuery 可以包含的最大子句数。默认为1024。
    #这个设置限制了 Lucene BooleanQuery 可以拥有的子句数量。 默认值 1024 已经很大,通常应该足够了。 这个限制不仅影响 Elasticsearchs 的bool查询,很多其他查询都是内部重写到 Lucene 的 BooleanQuery。 这个个限制是为了防止搜索变得太大,占用太多的CPU和内存。 如果你正在考虑增加这个设置,请确保已经用尽了所有其他选项来避免这样做。 较大的值可能会导致性能下降和内存问题,尤其是在负载高或资源少的集群中。
    indices.query.bool.max_clause_count
    
    #(动态的, integer) 单个响应中允许的聚合桶(aggregation bucket)的最大数量。默认为 10000。
    #试图返回超过此限制的请求将返回错误。
    search.max_buckets

4.23、快照的生命周期管理设置

集群级别的设置:

    #(boolean) 控制 SLM 是否将作为 SLM 策略的一部分所采取的动作的历史记录到 SLM -history-*索引。 默认值为 true。
    slm.history_index_enabled
    
    #(动态的, cron scheduler value) 控制 保留任务(retention task) 的何时运行。 可以是周期性的或绝对的时间计划。 支持 cron scheduler 支持的所有值。 默认为 UTC 时间每天凌晨1:30 :0 30 1 * * ?.
    slm.retention_schedule
    
    #(动态的, time value) 限制 SLM 应该花费多长时间删除旧快照。默认为一小时: 1h.
    slm.retention_duration

4.24、SQL访问(SQL Access) 设置

默认开启了对 SQL 访问的支持。你可以在 elasticsearch.yml文件中配置这些 SQL访问 设置。

    #设置为 false,会禁用该节点的 SQL访问。
    xpack.sql.enabled

4.25、转换(transform)设置

使用 转换(transform) 不需要配置任何设置。它是默认开启的。

所有这些设置都可以添加到 elasticsearch.yml 配置文件中。 动态设置也可以使用 集群更新设置 API 来更新整个集群。

动态设置优先于 elasticsearch.yml 文件中的设置。

    #设置为 true 以将节点标识为 转换节点(transform node)。 如果节点的 node.data 或 xpack.transform.enabled 是 false,则该设置默认为 false; 否则,默认值为 true。
    #如果在 elasticsearch.yml 配置文件中设置为 false, 该该节点无法运行 转换。 如果设置为 true,但是 xpack.transform.enabled 被设置为 false,则 node.transform 设置会被忽略,这也意味着该该节点无法运行 转换。 如果要运行转换,集群中必须且至少要有一个转换节点。
    node.transform
    
    #设置为 true (默认值) 以在节点上启用转换。
    #如果在 elasticsearch.yml 中设置为 false ,则该节点上的 转换API 会被禁用。 因此,该节点不能启动或管理转换,也不能接收与 转换API 相关的传输(内部的)通信请求。 如果该节点是 协调节点(coordinating node),来自客户端(包括Kibana)的转换请求也会失败。
    xpack.transform.enabled
    
    #(动态)转换遇到非致命错误时重试的次数。 一旦达到重试次数限制,转换任务将被标记为 failed。 默认值为 10,有效最小值为 0,最大值为 100。 如果转换已经在运行,则必须重新启动才能使用更改后的设置。
    xpack.transform.num_transform_failure_retries

4.26、传输(transport)

传输网络层用于集群内的节点之间的内部通信。 从一个节点到另一个节点的每个调用都使用传输层(例如,当一个 HTTP GET 请求由一个节点处理,而实际上应该由保存相关数据的另一个节点处理时)。 传输模块亦被用于 Elasticsearch Java API 中的 TransportClient 。

传输机制本质上是完全异步的,这意味着没有等待响应的阻塞线程。 使用异步通信的好处,首先就是解决了 C10k 问题,也是分散(广播)/聚集操作(如 Elasticsearch 中的搜索)的理想解决方案。

    #绑定端口的范围,默认为 9300-9400.
    transport.port
    
    #集群中的其他节点在与此节点通信时应使用的端口。 当集群节点位于代理或防火墙之后,并且 transport.port 不能从外部直接访问时,此功能非常有用。 默认为通过 transport.port分配的实际端口。
    transport.publish_port
    
    #传输服务要绑定到的主机地址。 默认值为 transport.host (如果设置了) 或者 network.bind_host。
    transport.bind_host
    
    #	为集群中要连接的节点发布的主机地址。(原文: The host address to publish for nodes in the cluster to connect to. ) 默认值为 transport.host (如果设置了) 或者 network.publish_host。
    transport.publish_host
    
    #用于设置 transport.bind_host 和 transport.publish_host
    transport.host
    
    #启动新连接的连接超时(以时间设置格式)。默认为 30s
    transport.connect_timeout
    
    #设置为 true 以在所有节点之间启用压缩(DEFLATE)。默认为 false
    transport.compress
    
    #安排定期的应用程序级 ping 消息,以确保节点之间的传输连接保持活动状态。 在传输客户端中默认为 5s,在其他地方默认为 -1(表示禁用)。 最好正确配置 TCP keep-alives,而不是使用此功能,因为 TCP keep-alives 适用于所有类型的长连接,而不仅仅是传输连接。
    transport.ping_schedule

4.27、线程池 (thread pools)

一个节点使用若干个线程池来管理内存消耗。 与许多线程池关联的队列允许保留挂起的请求,而不是丢弃。

有若干个线程池,但重要的几个是:

  • generic
    对应 一般操作(例如,后台节点发现)。其线程池类型为 scaling
  • search
    对应 count、search、suggest 操作。 其线程池类型为 fixed_auto_queue_size(自动的固定的队列大小),大小为 int((可用的处理器数 * 3) / 2) + 1,初始队列大小为 1000
  • search_throttled
    对应 搜索节流索引(search_throttled indices) 上的 count、search、suggest、get 操作。 其线程池类型为 fixed_auto_queue_size(自动的固定的队列大小),大小为1,初始队列大小为 100
  • get
    对应 get 操作。 其线程池类型为 fixed(固定的),大小为 可用的处理器数,队列大小为 1000
  • analyze
    对应 分析(analyze) 请求。 其线程池类型为 fixed(固定的),大小为 1,队列大小为 16
  • write
    对应 单个文档的 index/delete/update 及 批量(bulk) 请求。 其线程池类型为 fixed(固定的),大小为 可用的处理器数, 队列大小为 200。 线程池最大数量为 1 + 可用的处理器数。
  • snapshot
    对应 snapshot/restore 操作。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,最大值为 min(5, (可用的处理器数)/2)。
  • warmer
    对应 段(segment)的 预热(warm-up) 操作。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,最大值为 min(5, (可用的处理器数)/2)。
  • refresh
    对应 刷新(refhresh) 操作。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,最大值为 min(10, (可用的处理器数)/2)。
  • listener
    主要用于java客户端在监听器线程设置为true时执行操作。 其线程池类型为 scaling(可扩展的),默认最大值为 min(10, (可用的处理器数)/2)。
    fetch_shard_started
    对应 列出分片状态。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,默认最大值为 2 * 可用的处理器数。
  • fetch_shard_store
    对应 列出分片存储。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,默认最大值为 2 * 可用的处理器数。
  • flush
    对应 flush(冲洗)、synced flush(同步冲洗) 及 translog(事务日志) fsync 操作。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,默认最大值为 min(5, 可用的处理器数/2)。
  • force_merge
    对应 强制合并(force merge) 操作。 其线程池类型为 fixed(固定的),大小为 1,队列大小无限制。
  • management
    对应 集群管理。 其线程池类型为 scaling(可扩展的),保持活动状态 5m,默认最大值为 5。

可以通过设置特定类型的参数来更改特定的线程池;例如,更改write线程池中的线程数量:

    thread_pool:
        write:
            size: 30

线程池类型:

  • fixed
    fixed类型的线程池 拥有一个固定大小的线程来处理带有队列(可选有界)的请求,用于处理没有线程为其服务的等待请求。

    • 参数 size 控制线程的数量。
    • 参数 queue_size 允许控制没有线程执行请求的队列大小。 默认情况下,它被设置为-1,这意味着它是无限制的。 当队列已满时,进来的请求将被终止。
    thread_pool:
        write:
            size: 30
            queue_size: 1000
  • scaling
    scaling 类型的线程池 持有一个动态数量的线程。 这个数字与工作负载成正比,并且在core和max参数的值之间变化。

    • 参数 keep_alive 决定了一个线程在不做任何工作的情况下应该在线程池中保留多长时间。
    thread_pool:
        warmer:
            core: 1
            max: 8
            keep_alive: 2m

5、重要的配置

5.1、路径设置(Path settings)

配置数据和日志文件夹的位置,位于elasticsearch.ym中。

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

path.data可以设置为多个路径,在这种情况下,所有路径都将用于存储数据(尽管属于单个分片的文件都将存储在同一数据路径上):

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

5.2、集群名称(cluster.name)

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

    cluster.name: logging-prod

5.3、节点名称(node.name)

Elasticsearch 使用 node.name 作为 Elasticsearch 的特定实例的可读标识符,因此它包含在许多 API 的响应中。 它默认为 Elasticsearch 启动时机器的主机名,但可以在 elasticsearch.yml 中明确配置,如下所示:

    node.name: prod-data-2

5.4、网络绑定(network.host)

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

为了与其他服务器上的节点组成一个集群,你的节点需要绑定到一个非回环地址。 虽然 网络设置 有很多,但通常你需要配置的只是 network.host:

    network.host: 192.168.1.10

network.host 设置还支持一些特殊值,比如_local_, _site_,_global_ 以及 :ip4 和 :ip6 这样的修饰语。

一旦你为 network.host 提供了自定义设置,Elasticsearch 就会认为你正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级为异常。

5.5、发现和集群

discovery.seed_hosts:

在没有任何网络配置的情况下,Elasticsearch 将绑定到可用的回环地址,并扫描本地端口 9300 至9305,尝试连接到同一服务器上运行的其他节点。 这提供了一种自动集群体验,而无需进行任何配置。

当你想要在其他主机上形成一个有多个节点的集群时,你应该使用 discovery.seed_hosts 设置来提供一个集群中其他(符合主节点的条件的)节点的列表,并且可能是活动的和可连接的,以便启动 发现过程(discovery process)。 此设置应是集群中所有合格主节点的节点的地址列表。 每个地址可以是 IP 地址,也可以是主机名(可以通过 DNS 解析为一个或多个 IP 地址)。

cluster.initial_master_nodes:
当你第一次启动一个全新的 ElasticSearch 集群时,就会有一个 集群引导步骤,它确定第一次选举中计算选票的一组符合主节点条件的节点。 在开发模式中,没有配置任何 发现(discovery) 设置,此步骤将由节点自己自动执行。 由于这种自动引导本质上是不安全的,所以当你在生产模式中启动一个全新的集群时,必须显式地列出在第一次选举中应该计算选票的符合主节点条件的节点。 这个列表是使用 cluster.initial_master_nodes 设置来设置的。 当重新启动集群或向现有集群添加新节点时,不应使用此设置。

    discovery.seed_hosts:
       - 192.168.1.10:9300
       - 192.168.1.11 #端口可选,默认9300
       - seeds.mydomain.com # 如果一个主机名解析到多个 IP 地址,则该节点将尝试在所有已解析的地址上发现其他节点。
       - [0:0:0:0:0:ffff:c0a8:10c]:9301 # IPv6 地址必须用方括号括起来。
    # 初始主节点应该通过它们的 node.name来标识,默认为它们的主机名。
    # 确保 cluster.initial_master_nodes 的值与 node.name 完全匹配。 如果你使用一个绝对域名,如 master-node-a.example.com,那么你必须在此列表中使用完整的名称; 相反,如果 node.name 是一个没有 后限定符(trailing qualifier) 的裸主机名,那么还必须省略 cluster.initial_master_nodes 中的后限定符。
    cluster.initial_master_nodes: 
       - master-node-a
       - master-node-b
       - master-node-c

5.6、设置堆大小

Elasticsearch 将根据 jvm.options 中设置的 Xms(最小堆大小) 和 Xmx(最大堆大小) 来分配整个堆。 你应该将这两个设置设置为彼此相等。

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

    -Xms2g 
    -Xmx2g

也可以通过环境变量来设置堆大小。 这可以通过 ES_JAVA_OPTS 设置这些值来实现:

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

5.7、JVM堆的转储路径 (JVM heap dump path)

默认情况下,Elasticsearch 配置 JVM 将内存不足异常的堆转储到默认数据目录(RPM 和 Debian 包发行版下是 /var/lib/elasticsearch,而 tar 和 zip 归档发行版下是elasticsearch安装根目录下的data目录)。

如果这个路径不适合接收堆转储,应该修改jvm.options 中的-XX:HeapDumpPath=...条目。 如果指定一个目录,JVM 将根据正在运行的实例的 PID 为堆转储生成一个文件名。 如果指定的是固定的文件名而不是目录,当 JVM 需要对内存不足异常执行堆转储时,该文件不能存在,否则堆转储将失败。

5.8、垃圾回收日志 (GC logging)

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

5.9、临时目录 (Temp directory)

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

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

如果你使用 .deb 或 .rpm 包并在 systemd 下运行,那么 Elasticsearch 使用的私有临时目录将被排除在定期清理之外。

但是,如果你打算在 Linux 上长时间运行 .tar.gz 发行版,那么你应该考虑为 Elasticsearch 创建一个专用的临时目录,该目录不在会清除旧文件和目录的路径下。 这个目录应该有权限设置,这样只有运行 Elasticsearch 的用户才能访问它。 然后在启动 Elasticsearch 之前设置 $ES_TMPDIR 环境变量指向它。

5.10、JVM 致命错误日志

默认情况下,Elasticsearch 配置 JVM 将致命错误日志写入默认日志目录(RPM 和 Debian 包发行版 下是 /var/log/elasticsearch,而 tar 和 zip 归档发行版 则是在 Elasticsearch 安装根目录下的 logs 目录)。

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

阅读全文