Elasticsearch集群搭建教程及生产环境配置
Elasticsearch 是一个极其强大的搜索和分析引擎,其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性。
本教程将提供有关如何设置 Elasticsearch 集群的一些信息,并将添加一些操作技巧和最佳实践来帮助您入门。但应该强调的是,每个 Elasticsearch 设置可能会因多种因素而异,包括服务器上的工作负载、索引数据量、硬件规格,甚至操作员的经验。
什么是 Elasticsearch 集群?
顾名思义,Elasticsearch 集群是一组连接在一起的一个或多个 Elasticsearch 节点实例。Elasticsearch 集群的强大之处在于在集群中的所有节点之间分配任务、搜索和索引。
Elasticsearch 集群中的节点可以分配不同的工作或职责:
- Data nodes — 存储数据并执行与数据相关的操作,例如搜索和聚合
- Master nodes — 负责集群范围的管理和配置操作,例如添加和删除节点
- Client nodes — 将集群请求转发给主节点,将数据相关的请求转发给数据节点
- Ingest nodes — 用于在索引之前预处理文档
默认情况下,每个节点都会自动分配一个唯一标识符或名称,用于管理目的,并且在多节点或集群环境中变得更加重要。
安装后,单个 Elasticsearch 节点将形成一个名为“elasticsearch”的新单节点集群,但正如我们将在本文后面看到的,它也可以配置为使用集群名称加入现有集群。不用说,这些节点需要能够相互识别才能连接。
安装 Elasticsearch 集群
下面我将向您展示如何手动设置由一个主节点和两个数据节点组成的集群。
安装java
Elasticsearch 基于 Java 构建,至少需要 Java 8(1.8.0_131 或更高版本)才能运行。因此,我们的第一步是在集群中的所有节点上安装 Java 8。请注意,集群中的所有 Elasticsearch 节点都应安装相同的版本。
安装 Elasticsearch 节点
首先,从官网下载Elasticsearch程序包,并解压为三份
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.0-windows-x86_64.zip
本教程使用的Elasticsearch 版本问7.14.0
配置 Elasticsearch 集群
我们的下一步是设置集群,以便节点可以相互连接和通信。
对于每个节点,打开 Elasticsearch 配置文件:
vim elasticsearch-7.14.0-2\config\elasticsearch.yml
这个文件很长,包含不同部分的多个设置。浏览文件,然后输入以下配置:
节点1:
#集群名称
cluster.name: my-cluster
#节点名称
node.name: "es-node-1"
#定义1为主节点
node.master: true
#定义节点2节点3为数据节点
node.data: true
#访问的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#访问端口号
http.port: 9200
#集群通讯端口号
transport.tcp.port: 9300
#所有节点的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
节点2:
#集群名称
cluster.name: my-cluster
#节点名称
node.name: "es-node-2"
#定义1为主节点
node.master: false
#定义节点2节点3为数据节点
node.data: true
#访问的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#访问端口号
http.port: 9201
#集群通讯端口号
transport.tcp.port: 9301
#所有节点的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
节点3:
#集群名称
cluster.name: my-cluster
#节点名称
node.name: "es-node-3"
#定义1为主节点
node.master: false
#定义节点2节点3为数据节点
node.data: true
#访问的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#访问端口号
http.port: 9202
#集群通讯端口号
transport.tcp.port: 9302
#所有节点的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
运行 Elasticsearch 集群
您现在已准备好启动 Elasticsearch 节点并验证它们作为集群相互通信。
对于每个实例,运行以下命令:
#linux
elasticsearch-7.14.0-2\bin\elasticsearch
#windows
elasticsearch-7.14.0-2\bin\elasticsearch.bat
如果一切配置正确,您的 Elasticsearch 集群应该已启动并正在运行。要验证一切是否按预期工作,请从任何集群节点查询 Elasticsearch:
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
响应应详细说明集群及其节点:
{
"cluster_name": "my-cluster",
"cluster_uuid": "QU6x1C3iRk-gps6PgQsE5g",
"version": 478,
"state_uuid": "DZyMU0KKQlmUZ9h_WyM8aQ",
"master_node": "OjKnMr1tTZ2cJyA5BZm1fg",
"blocks": {},
"nodes": {
"__bdouL_Q7anCPj1-3Tmxw": {
"name": "es-node-2",
"ephemeral_id": "7GjSuyqBQya8yWdWvXGKjQ",
"transport_address": "192.168.73.66:9301",
"attributes": {},
"roles": [
"data",
"data_cold",
"data_content",
"data_frozen",
"data_hot",
"data_warm",
"ingest",
"ml",
"remote_cluster_client",
"transform"
]
},
"OjKnMr1tTZ2cJyA5BZm1fg": {
"name": "es-node-1",
"ephemeral_id": "OhJ0gZu6RBWsA2ZX6lmx5g",
"transport_address": "192.168.73.66:9300",
"attributes": {},
"roles": [
"data",
"data_cold",
"data_content",
"data_frozen",
"data_hot",
"data_warm",
"ingest",
"master",
"ml",
"remote_cluster_client",
"transform"
]
}
},
"metadata": {},
"routing_table": {},
"routing_nodes": {}
}
生产环境Elasticsearch 集群配置
我们已经为集群中的节点定义了不同的角色,但是对于在生产环境中运行的集群还有一些额外的推荐设置。
避免“裂脑”
“裂脑”情况是集群中节点之间的通信由于网络故障或其中一个节点的内部故障而失败。在这种情况下,可能会有多个节点认为自己是主节点,从而导致数据不一致的状态。
为了避免这种情况,我们可以对 Elasticsearch 配置文件中的discovery.zen.minimum_master_nodes指令进行更改,该指令确定需要通信(投票)多少节点来选举主节点。
确定此数量的最佳做法是使用以下公式来确定此数量:N/2 + 1。N 是集群中符合条件的主节点的数量。然后将结果四舍五入到最接近的整数。
对于具有三个节点的集群,则:
discovery.zen.minimum_master_nodes: 2
调整JVM堆大小
为了确保 Elasticsearch 有足够的操作余地,应该调整默认的 JVM 堆大小(最小/最大 1 GB)。
根据经验,最大堆大小应设置为 RAM 的 50%,但不超过 32GB(由于 Java 指针在较大堆中效率低下)。Elastic 还建议最大和最小堆大小的值相同。
这些值可以使用jvm.options文件中的 Xmx 和 Xms 设置进行配置。
vim elasticsearch-7.14.0-2\config\jvm.options
-Xms2g
-Xmx2g
禁用交换
换出未使用的内存是一种通用行为,但在 Elasticsearch 的上下文中可能会导致断开连接、性能不佳以及一般情况下 — 不稳定的集群。
为了避免交换,您可以禁用所有交换(如果 Elasticsearch 是服务器上运行的唯一服务,则建议使用),或者您可以使用mlockall将 Elasticsearch 进程锁定到 RAM。
为此,请打开集群中所有节点上的 Elasticsearch 配置文件:
vim elasticsearch-7.14.0-2\config\elasticsearch.yml
添加以下内容:
bootstrap.mlockall: true
完成后重新启动 Elasticsearch。
调整虚拟内存
为避免耗尽虚拟内存,请增加对 mmap 计数的限制:
sudo vim /etc/sysctl.conf
修改为以下配置
vm.max_map_count=262144
增加打开的文件描述符限制
另一个重要的配置是打开文件描述符的限制。由于 Elasticsearch 使用了大量的文件描述符,您必须确保定义的限制足够,否则最终可能会丢失数据。
此设置的常见建议是 65,536 或更高
vim /etc/security/limits.conf
设置限制:
- nofile 65536
Elasticsearch 集群 API(参考)
Elasticsearch 支持大量特定于集群的 API 操作,让您可以管理和监控您的 Elasticsearch 集群。大多数 API 允许您使用内部节点 ID、名称或地址来定义要调用的 Elasticsearch 节点。
下面列出了一些您可以使用的更基本的 API 操作。
集群健康
此 API 可用于查看集群的一般信息并衡量其健康状况:
curl -XGET 'localhost:9200/_cluster/health?pretty'
集群状态
可以使用此 API 查看整个集群的详细状态报告。您可以通过在调用 URL 中指定参数来过滤结果。
curl -XGET 'localhost:9200/_cluster/state?pretty'
集群统计
对于监控整个集群的性能指标非常有用:
curl -XGET 'localhost:9200/_cluster/stats?human&pretty'
节点统计
如果要检查集群中特定节点的指标,请使用此 API。您可以查看所有节点、特定节点的信息,或者要求仅查看索引或操作系统/进程特定的统计信息。
所有节点:
curl -XGET 'localhost:9200/_nodes/stats?pretty'
复制
特定节点:
curl -XGET 'localhost:9200/_nodes/node-1/stats?pretty'
复制
仅索引统计:
curl -XGET 'localhost:9200/_nodes/stats/indices?pretty'
复制
您可以获得具有以下结构的任何单个节点的任何特定指标:
curl -XGET 'localhost:9200/_nodes/stats/ingest?pretty'
复制
或具有以下结构的多个节点:
curl -XGET 'localhost:9200/_nodes/stats/ingest,fs?pretty'
复制
或具有以下两种格式之一的所有指标:
curl -XGET 'localhost:9200/_nodes/stats/_all?pretty'
curl -XGET 'localhost:9200/_nodes/stats?metric=_all?pretty'
节点信息
如果要收集有关任何或所有集群节点的信息,请使用此 API。
检索单个节点:
curl -XGET 'localhost:9200/_nodes/?pretty'
复制
或多个节点:
curl -XGET 'localhost:9200/_nodes/node1,node2?pretty'
复制
检索有关插件或摄取的数据:
curl -XGET 'localhost:9200/_nodes/plugins
复制
curl -XGET 'localhost:9200/_nodes/ingest
待处理的集群任务
此 API 跟踪集群级别的更改,包括但不限于更新的映射、失败的分片和索引创建。
以下 GET 应返回任务列表:
curl -XGET 'localhost:9200/_cluster/pending_tasks?pretty'
任务管理
与 Pending Cluster Tasks API 类似,Task Management API 将获取有关各个节点上当前正在运行的任务的数据。
要获取所有当前正在执行的任务的信息,请输入:
curl -XGET "localhost:9200/_tasks
要按特定节点获取当前任务,以及其他与集群相关的任务,请输入节点名称,然后将 &actions 附加到 GET:
curl -XGET 'localhost:9200/_tasks?nodes=node1,node2&actions=cluster:*&pretty'
通过输入 _tasks/ 然后输入任务的个人 ID 来检索有关特定任务(或其子任务)的信息:
curl -XGET '本地主机:9200/_tasks/43r315an3xamp13'
对于子任务:
curl -XGET 'localhost:9200/_tasks?parent_task_id=43r315an3xamp13'
该 API 还支持重新索引、搜索、任务分组和任务取消。
远程集群信息
获取远程集群信息:
curl -XGET 'localhost:9200/_remote/info?pretty'
投票配置排除
这将删除符合 master 资格的节点。
通过以下方式删除所有排除项:
curl -X DELETE 'localhost:9200/_cluster/voting_config_exclusions?pretty'
或者在排除列表中添加一个节点:
curl -X POST 'localhost:9200/_cluster/voting_config_exclusions/node1?pretty'