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 能支持复杂全文检索的原因。 [2]
Elasticsearch 使用 JSON 作为文档的序列化格式 [2]
端口说明
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 格式示例
path: |
扁平 格式示例
path.data: /var/lib/elasticsearch |
集群及节点名称
Elasticsearch 默认启动的集群名字叫 elasticsearch
。生产环境中建议修改集群名称,防止其他使用默认集群名称的节点意外加入集群 [8]
同样,最好也修改你的节点名字。就像你现在可能发现的那样, Elasticsearch 会在节点启动的时候随机给它指定一个名字。你可能会觉得这很有趣,但是当凌晨 3 点钟的时候, 你还在尝试回忆哪台物理机是 Tagak the Leopard Lord 的时候,你就不觉得有趣了。
更重要的是,这些名字是在启动的时候产生的,每次启动节点, 它都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的。 [8]
cluster.name: elasticsearch |
网络配置
监听接口相关配置
多网卡情况下,建议指定 IP 地址,以防止集群使用网络不通的 IP。# |
存储路径
默认情况下,Elasticsearch 会把插件、日志以及你最重要的数据放在安装目录下。这会带来不幸的事故, 如果你重新安装 Elasticsearch 的时候不小心把安装目录覆盖了。如果你不小心,你就可能把你的全部数据删掉了。 [8]
最好的选择就是把你的数据目录配置到安装目录以外的地方, 同样你也可以选择转移你的插件和日志目录。
path.data: /path/to/data1 |
数据可以保存到多个不同的目录, 如果将每个目录分别挂载不同的硬盘,这可是一个简单且高效实现一个软磁盘阵列,这个特性将会被移除 [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
只在集群初始化过程中起作用。一旦集群初始化完成,集群的状态将由选举出的主节点负责管理和维护。
默认端口(省略端口)为 9300 |
安全相关配置
安全相关配置,主要包括认证和传输层加密(TLS/SSl),安全相关配置在所有节点上必须都相同 [10]
启用安全认证,启用后客户端请求需要身份验证 |
配置项 | 说明 | 示例 |
---|---|---|
xpack.security.enabled |
是否启用安全特性,默认为 true |
|
xpack.security.autoconfiguration.enabled |
默认为 true 。安全相关配置(security autoconfiguration process )会自动配置,如果关闭,在启用安全特性的情况下,需要手动配置安全相关的配置 |
|
xpack.security.enrollment.enabled |
默认为 false 。security 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。默认为 true 。node 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.enabled 为 true 时,必须启用 可以使用位于 /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.enabled
为 true
时必须配置)
xpack.security.enabled: true |
使用以上配置后,请求必须进行认证才能请求 Elasticsearch,否则默认返回 401。未启用 HTTPS,可以使用 HTTP 请求。
curl localhost:9200/?pretty |
配置节点属性及类型
在 Elasticsearch 8 中,可以使用节点属性(node attributes)来指定节点的角色。节点属性是一组键值对,用于描述节点的特性和功能。通过为节点设置适当的属性,可以将其标记为特定的角色。
node.attr.<attribute_name>: <attribute_value> |
例如要配置节点为 master ,可以使用以下配置
node.attr.master: true |
另一种方式是使用节点类型(node type)进行配置。节点类型是 Elasticsearch 8 中引入的一种更高级别的概念,用于自动分配节点的角色。
在 Elasticsearch 8 中,可以使用以下配置项将节点配置为特定的类型:
node.roles: ["<role_1>", "<role_2>", ...] |
例如,要将节点配置为主节点(master
)角色或者 data
角色,可以使用以下配置:
node.roles: ["master"] |
JVM 配置
默认情况下,Elasticsearch 根据主机的 roles
和总内存大小自动设置 JVM heap size,如果要更改此值,修改 JVM 配置中的 Xms
和 Xmx
,这2个值必须一样
-Xms2g |
heap size
需要根据可用的 RAM 来配置 [9]
Xms
和Xmx
不要超过可用内存的 50%
JVM heap dump path
默认情况下,Elasticsearch 配置 JVM 在发生 out of memory
异常时 dump 内存栈信息到数据目录(path.data
)。如果要更改此配置,可以修改以下 JVM 配置
-XX:HeapDumpPath=/tmp/ |
GC logging settings
默认情况下,Elasticsearch 启用了 GC (garbage collection
) 日志,此配置位于 JVM 并配置为输出日志到 Elasticsearch 日志路径中(path.logs
)
要修改此路径,首先需要禁用日志,使用配置 -Xlog:disable
,并指定自定义路径
-Xlog:disable |