elasticsearch 配置

环境信息

  • elasticsearch 8.8.2

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene [1] 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库 — 无论是开源还是私有。

但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。 [1]

Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。

然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储, 每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。

Elasticsearch 官方安装文档

Elasticsearch 官方安装包下载路径

Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档 。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。 [2]

Elasticsearch 使用 JSON 作为文档的序列化格式 [2]

Elasticsearch 集群内的原理

端口说明

elasticsearch 主要使用以下端口

  • 9200 - elasticsearch 服务的监听端口,客户端访问 9200 和 Elasticsearch 进行通信。
  • 9300 - 集群中的节点通过 9300 端口彼此通信,如果这个端口没有开,节点将无法形成一个集群

Elasticsearch 配置文件说明

Elasticsearch 的主要配置文件为,配置文件路径可以用环境变量 ES_PATH_CONF 指定。 [8]

  • elasticsearch.yml
  • jvm.options
  • log4j2.properties

Elasticsearch 已经有了 很好 的默认值,特别是涉及到性能相关的配置或者选项。 如果你有疑问,最好就不要动它。我们已经目睹了数十个因为错误的设置而导致毁灭的集群, 因为它的管理者总认为改动一个配置或者选项就可以带来 100 倍的提升。 [8]

配置文件格式支持 YAML扁平 格式 [8]

YAML 格式示例

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

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

扁平 格式示例

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

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

集群及节点名称

Elasticsearch 默认启动的集群名字叫 elasticsearch生产环境中建议修改集群名称,防止其他使用默认集群名称的节点意外加入集群 [8]

同样,最好也修改你的节点名字。就像你现在可能发现的那样, Elasticsearch 会在节点启动的时候随机给它指定一个名字 。你可能会觉得这很有趣,但是当凌晨 3 点钟的时候, 你还在尝试回忆哪台物理机是 Tagak the Leopard Lord 的时候,你就不觉得有趣了。

更重要的是, 这些名字是在启动的时候产生的,每次启动节点, 它都会得到一个新的名字 。这会使日志变得很混乱,因为 所有节点的名称都是不断变化的[8]

elasticsearch.yml
cluster.name: elasticsearch
node.name: elasticsearch_005_data

网络配置

监听接口相关配置

elasticsearch.yml
# 多网卡情况下,建议指定 IP 地址,以防止集群使用网络不通的 IP。#
# 如果需要监听多个 IP 地址,使用以下配置
# network.host: ["127.0.0.1", "192.168.1.1"]
network.host: 0.0.0.0
http.port: 9200

存储路径

默认情况下,Elasticsearch 会把插件、日志以及你最重要的数据放在安装目录下。这会带来不幸的事故, 如果你重新安装 Elasticsearch 的时候不小心把安装目录覆盖了。如果你不小心,你就可能把你的全部数据删掉了。 [8]

最好的选择就是把你的数据目录配置到安装目录以外的地方, 同样你也可以选择转移你的插件和日志目录。

elasticsearch.yml
path.data: /path/to/data1

# Path to log files:
path.logs: /path/to/logs

# Path to where plugins are installed:
path.plugins: /path/to/plugins

数据可以保存到多个不同的目录, 如果将每个目录分别挂载不同的硬盘,这可是一个简单且高效实现一个软磁盘阵列, 这个特性将会被移除 [8]

集群发现机制

当一个 Elasticsearch 节点启动时,它将使用 discovery.seed_hosts 中列出的主机地址来发现集群中的其他节点。它会依次尝试与这些节点建立连接,直到找到一个可用节点,一旦成功连接到一个主机,节点将从它获取集群的状态信息,了解集群的拓扑结构,并加入到正确的集群中。

cluster.initial_master_nodes 是 Elasticsearch 配置中的一个重要选项,用于设置初始的主节点列表。这个选项在集群初始化过程中起到关键作用。其值是 初始主节点的节点名称或者 Node ID 组成的列表 。在集群初始化过程中,Elasticsearch 使用 主节点选举算法来选择集群中的初始主节点 。主节点选举算法基于 cluster.initial_master_nodes 中指定的节点列表,并通过投票和协商来决定哪个节点将成为集群的初始主节点。

  • 如果集群中的所有节点都具有相同的 cluster.initial_master_nodes 配置,它们将争夺主节点的地位
  • 如果集群中的节点具有不同的 cluster.initial_master_nodes 配置,Elasticsearch 将根据 Node ID 的哈希值来选择主节点。

cluster.initial_master_nodes 只在集群初始化过程中起作用。一旦集群初始化完成,集群的状态将由选举出的主节点负责管理和维护

elasticsearch.yml
# 默认端口(省略端口)为 9300
discovery.seed_hosts: ["host1", "host2:9300"]
cluster.initial_master_nodes: ["node-1", "node-2"]

安全相关配置

安全相关配置,主要包括认证和传输层加密(TLS/SSl), 安全相关配置在所有节点上必须都相同 [10]

elasticsearch.yml
# 启用安全认证,启用后客户端请求需要身份验证
xpack.security.enabled: true
xpack.security.enrollment.enabled: true

# SSL 相关功能,启用后客户端需要使用 HTTPS 请求
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12

# 节点间 tls/ssl 通信配置,如果 xpack.security.enabled: true,必须启用
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
配置项 说明 示例
xpack.security.enabled 是否启用安全特性,默认为 true
xpack.security.autoconfiguration.enabled 默认为 true 。安全相关配置( security autoconfiguration process )会自动配置,如果关闭,在启用安全特性的情况下,需要手动配置安全相关的配置
xpack.security.enrollment.enabled 默认为 falsesecurity autoconfiguration process 会自动将其配置为 true 。新节点加入集群需要 enrollment token
认证 相关配置
xpack.security.audit.enabled 默认为 false 。配置为 true 启用认证功能。配置为 true 后会将认证相关日志写入单独的文件 <clustername>_audit.json如果启用,那么所有节点认证相关配置都要相同 [11]
xpack.security.audit.logfile.events.include 定义哪些类型的事件被写入认证日志文件, _all 包含所有类型, 不建议使用 _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 排除指定类型的认证时间。默认为空,这个在使用 _all 包含了所有事件类型时很有用,可以用它排除某些类型的认证事件记录。
xpack.security.audit.logfile.events.emit_request_body 认证事件日志中是否包含 HTTP 请求体,默认为 false
xpack.security.audit.logfile.emit_node_name 认证事件日志中是否包含 node.name 中配置的节点名。默认为 false
xpack.security.audit.logfile.emit_node_host_address 认证事件日志中是否包含 节点 IP
xpack.security.audit.logfile.emit_node_host_name 认证事件日志中是否包含 节点的主机名
xpack.security.audit.logfile.emit_node_id 认证事件日志中是否包含 node id 。默认为 truenode id 是不可变的
xpack.security.authc.anonymous.username 匿名用户的用户名,默认为 _es_anonymous_user
xpack.security.authc.anonymous.roles 匿名用户关联的 角色
xpack.security.ssl.diagnose.trust 默认为 true 。是否将 SSL/TLS 相关的错误信息记录到 Elasticsearch 日志里面。
HTTP TLS/SSL 相关配置
xpack.security.http.ssl.enabled 默认为 false 。是否启用 HTTPS 通信
xpack.security.http.ssl.supported_protocols 支持的 SSL 版本,默认 TLSv1.2 , TLSv1.1 。可用: SSLv2Hello , SSLv3 , TLSv1 , TLSv1.1 , TLSv1.2 , TLSv1.3
xpack.security.http.ssl.client_authentication 默认为 none 。控制是否要求客户端提供证书。可用值: none , required , optional
xpack.security.http.ssl.verification_mode 默认为 full 。控制如何验证客户端提供的证书
- full 验证证书未过期,验证 CA,验证 hostname 或者 IP
- certificate 验证 CA,不检查 hostname
- none 不进行证书验证。
xpack.security.http.ssl.key PEM 格式的私钥
xpack.security.http.ssl.certificate PEM 格式的证书
xpack.security.transport.ssl.enabled 定义节点之间通信是否启用 TLS/SSl,默认为 false
xpack.security.enabledtrue 时,必须启用
可以使用位于 /etc/elasticsearch/certs/ 的默认证书
xpack.security.transport.filter.allow 允许节点通信的 IP 列表
xpack.security.transport.filter.deny 拒绝节点通信的 IP 列表

默认初次启动的 Elasticsearch 启用了安全特性 。初次启动后,Elasticsearch 会自动配置安全选项(写入安全相关配置到配置文件、生成 TLS/SSL 使用的证书和私钥),启动后 Elasticsearch 会为 elastic 用户生成初始密码、并为 Kibana 生成一个 enrollment token (有效期 30 分钟) [12]

要重置用户密码,可以使用 elasticsearch-reset-password 工具。要生成一个新的 enrollment tokens ,可以使用 elasticsearch-create-enrollment-token 工具。

配置示例

以下配置启用 用户认证 、配置 节点间 tls/ssl 通信xpack.security.enabledtrue 时必须配置)

elasticsearch.yml
xpack.security.enabled: true
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false

xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12

使用以上配置后,请求必须进行认证才能请求 Elasticsearch,否则默认返回 401。未启用 HTTPS,可以使用 HTTP 请求。

$ curl localhost:9200/?pretty
{
"error" : {
"root_cause" : [
{
"type" : "security_exception",
"reason" : "missing authentication credentials for REST request [/?pretty]",
"header" : {
"WWW-Authenticate" : [
"ApiKey",
"Basic realm=\"security\" charset=\"UTF-8\""
]
}
}
],
"type" : "security_exception",
"reason" : "missing authentication credentials for REST request [/?pretty]",
"header" : {
"WWW-Authenticate" : [
"ApiKey",
"Basic realm=\"security\" charset=\"UTF-8\""
]
}
},
"status" : 401
}

配置节点属性及类型

在 Elasticsearch 8 中,可以使用节点属性(node attributes)来指定节点的角色。节点属性是一组键值对,用于描述节点的特性和功能。通过为节点设置适当的属性,可以将其标记为特定的角色。

elasticsearch.yml
node.attr.<attribute_name>: <attribute_value>

例如要配置节点为 master ,可以使用以下配置

elasticsearch.yml
node.attr.master: true

另一种方式是使用节点类型(node type)进行配置。节点类型是 Elasticsearch 8 中引入的一种更高级别的概念,用于自动分配节点的角色。

在 Elasticsearch 8 中,可以使用以下配置项将节点配置为特定的类型:

elasticsearch.yml
node.roles: ["<role_1>", "<role_2>", ...]

例如,要将节点配置为主节点( master )角色或者 data 角色,可以使用以下配置:

node.roles: ["master"]

node.roles: ["data"]

JVM 配置

默认情况下,Elasticsearch 根据主机的 roles 和总内存大小自动设置 JVM heap size,如果要更改此值,修改 JVM 配置中的 XmsXmx这 2 个值必须一样

jvm.options
-Xms2g
-Xmx2g

heap size 需要根据可用的 RAM 来配置 [9]

  • XmsXmx 不要超过可用内存的 50%

JVM heap dump path

默认情况下,Elasticsearch 配置 JVM 在发生 out of memory 异常时 dump 内存栈信息到数据目录( path.data )。如果要更改此配置,可以修改以下 JVM 配置

jvm.options
-XX:HeapDumpPath=/tmp/

GC logging settings

默认情况下,Elasticsearch 启用了 GC ( garbage collection ) 日志,此配置位于 JVM 并配置为输出日志到 Elasticsearch 日志路径中( path.logs )

要修改此路径,首先需要禁用日志,使用配置 -Xlog:disable ,并指定自定义路径

jvm.options
-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

参考链接

elastic 官网介绍

脚注