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 官网介绍

脚注