搭建高可用性Elasticsearch集群指南

通过这份详尽的指南,您可以搭建高可用性Elasticsearch集群,从而实现持续运行和容错能力。学习如何配置多个Elasticsearch节点,理解节点角色和分片复制等关键概念,并实现发现设置,以构建健壮的生产环境。本文提供了分步说明、实用示例以及必要的最佳实践,以确保您的分布式搜索和分析引擎具有弹性、安全且始终可用。通过掌握高可用Elasticsearch配置,可有效避免数据丢失和停机。

58 浏览量

高可用性 Elasticsearch 集群设置指南

Elasticsearch 是一个功能强大的分布式搜索和分析引擎,专为可扩展性和弹性而设计。在生产环境中,确保持续运行和容错能力至关重要。本指南将引导您完成配置多个 Elasticsearch 节点以创建健壮的高可用性 (HA) 集群的关键步骤。遵循这些说明,您将学会如何设置集群,使其能够抵御节点故障并保持数据的可访问性,从而确保您的应用程序保持响应迅速,数据保持安全。

设置高可用性 Elasticsearch 集群涉及仔细规划节点角色、网络配置和数据复制策略。目标是将工作负载和数据冗余地分布到多台机器上,从而消除单点故障。本文将涵盖核心概念、实际配置步骤和最佳实践,帮助您构建适合严苛生产用例的弹性 Elasticsearch 基础设施。

理解 Elasticsearch 中的高可用性

Elasticsearch 中的高可用性是通过以下几个关键机制实现的:

  • 分布式架构:Elasticsearch 固有地将数据和操作分布在多个节点上。
  • 节点角色:不同的节点可以服务于不同的目的,从而实现专门的资源分配和故障隔离。
  • 分片复制:每个索引都被划分为分片(shards),每个主分片(primary shard)可以有一个或多个副本分片(replica shards),存储在不同的节点上。
  • 主节点选举:一个可靠的选举过程确保始终有主节点可用,以管理集群状态。
  • Zen 发现机制 (Zen2):该模块处理节点发现和主节点选举,确保节点能够可靠地相互找到并形成集群。

基本节点角色

在 HA 设置中,理解节点角色至关重要。HA 的主要角色包括:

  • 符合主节点资格的节点(Master-eligible nodes):这些节点负责管理集群状态,包括索引创建/删除、节点跟踪和分片分配。除非它们也具有 data 角色,否则它们不直接存储数据或处理搜索/索引请求。对于 HA,您应该拥有奇数个(通常是 3 个)专用且符合主节点资格的节点来组成仲裁(quorum)。
  • 数据节点(Data nodes):这些节点在分片中存储您的索引数据,并执行与数据相关的操作,如搜索、聚合和索引。它们是集群的“主力军”。
  • 仅协调节点(Coordinating-only nodes):(可选)这些节点可用于路由请求、处理搜索归约阶段(search reduce phases)和管理批量索引。它们不保存数据或集群状态,但可以减轻数据节点和主节点的工作负载。

分片和副本

Elasticsearch 将您的数据存储在分片(shards)中。每个索引包含一个或多个主分片(primary shards)。为实现高可用性,您应该为每个主分片配置一个或多个副本分片(replica shards)。副本分片是主分片的副本。如果承载主分片的节点发生故障,另一节点上的副本分片可以被提升为新的主分片,从而确保数据不丢失并持续运行。

设置 HA 集群的先决条件

在深入配置之前,请确保您的环境满足以下基本要求:

  • Java 开发工具包 (JDK):Elasticsearch 需要兼容的 JDK(通常是 OpenJDK)。确保它已安装在所有节点上。
  • 系统资源:为每个节点,特别是数据节点,分配足够的 RAM(例如 8-32GB)、CPU 内核和快速 I/O 磁盘空间(建议使用 SSD)。
  • 网络配置:所有节点必须能够通过特定端口相互通信(默认 9300 用于节点间通信,9200 用于 HTTP API)。确保防火墙配置正确。
  • 操作系统:对于生产部署,通常首选稳定的 Linux 发行版(例如 Ubuntu、CentOS、RHEL)。

HA 集群设置分步指南

本节概述了安装和配置多节点 Elasticsearch 集群的过程。

步骤 1:在所有节点上安装 Elasticsearch

在将成为集群一部分的每台服务器上安装 Elasticsearch。您可以使用包管理器(Debian/Ubuntu 使用 APT,RHEL/CentOS 使用 YUM)或直接下载归档文件。

示例(通过 APT 在 Debian/Ubuntu 上安装):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch

安装完成后,启用并启动服务(尽管我们先进行配置)。

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch

步骤 2:在每个节点上配置 elasticsearch.yml

elasticsearch.yml 文件通常位于 /etc/elasticsearch/,是您定义集群设置的地方。在每个节点上使用适当的配置编辑此文件。

所有节点的通用配置

  1. cluster.name:对于所有要加入同一集群的节点,此名称必须相同。
    yaml cluster.name: my-ha-cluster

  2. node.name:每个节点的唯一名称,有助于识别。
    yaml node.name: node-1

  3. network.host:将 Elasticsearch 绑定到特定的网络接口。使用 0.0.0.0 绑定到所有可用接口,或使用特定的 IP 地址。
    yaml network.host: 0.0.0.0 # 或者针对安全/多网卡设置使用特定的 IP 地址 # network.host: 192.168.1.101

  4. http.port:用于 HTTP 客户端通信的端口(默认 9200)。
    yaml http.port: 9200

  5. transport.port:用于节点间通信的端口(默认 9300)。应保持一致。
    yaml transport.port: 9300

发现设置(对 HA 至关重要)

这些设置告诉节点如何相互发现并形成集群。

  1. discovery.seed_hosts:集群中符合主节点资格的节点的地址列表。这是节点发现初始主节点的方式。请提供所有符合主节点资格的节点的 IP 地址或主机名。
    yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

  2. cluster.initial_master_nodes在首次引导全新的集群时使用。此列表应包含将参与第一次主节点选举的符合主节点资格的节点的 node.name。一旦集群形成,此设置将被忽略。
    yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

    • 重要提示:在集群成功形成后,请删除或注释掉 cluster.initial_master_nodes,以防止节点重启时尝试形成新的集群,从而导致意外行为。

节点角色配置

指定每个节点的角色。常见的 HA 设置涉及 3 个专用的主节点和若干个数据节点。

  • 符合主节点资格的节点(例如 node-1, node-2, node-3)
    yaml node.roles: [master]
  • 数据节点(例如 node-4, node-5, node-6)
    yaml node.roles: [data]
  • 混合角色节点(不推荐用于大型生产 HA)
    yaml node.roles: [master, data]
    • 最佳实践:为了在生产环境中实现真正的高可用性和稳定性,请为 master 和 data 角色分配专用节点。这可以将关键的主节点进程与资源密集型的数据操作隔离开来。

步骤 3:配置 JVM 堆大小

编辑 /etc/elasticsearch/jvm.options 以设置 JVM 堆大小。一个好的经验法则是分配可用 RAM 的 50%,但绝不超过 30-32GB。例如,如果服务器有 16GB RAM,则分配 8GB:

-Xms8g
-Xmx8g

步骤 4:系统设置

对于生产环境,请增加所有节点上打开文件的 vm.max_map_countulimit 限制。将这些行添加到 /etc/sysctl.conf 并应用 (sudo sysctl -p)。

vm.max_map_count=262144

并在 /etc/security/limits.conf(或 /etc/security/limits.d/99-elasticsearch.conf)中添加:

elasticsearch - nofile 65536
elasticsearch - memlock unlimited

步骤 5:启动 Elasticsearch 服务

所有配置好的节点上启动 Elasticsearch 服务。通常建议首先启动符合主节点资格的节点,但由于现代发现机制,只要 discovery.seed_hosts 配置正确,启动顺序就不那么重要了。

sudo systemctl start elasticsearch

检查服务状态和日志是否有任何错误:

sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch

步骤 6:验证集群健康状况

一旦所有节点都在运行,请使用 Elasticsearch API 验证集群的健康状况。您可以查询集群中的任何节点。

curl -X GET "localhost:9200/_cat/health?v&pretty"

预期输出:

epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00  my-ha-cluster  green      6          3       0    0    0    0        0             0                  -                 100.0%
  • status:应为 green(所有主分片和副本分片均已分配)或 yellow(所有主分片均已分配,但某些副本分片尚未分配)。red 表示存在严重问题。
  • node.total:应与您启动的节点总数匹配。
  • node.data:应与数据节点的数量匹配。

检查节点以确保它们都已加入集群:

curl -X GET "localhost:9200/_cat/nodes?v&pretty"

预期输出(3 个主节点,3 个数据节点示例):

ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.1.101          21          87   0    0.00    0.01     0.05 m           *      node-1
192.168.1.102          20          88   0    0.00    0.01     0.05 m           -      node-2
192.168.1.103          22          86   0    0.00    0.01     0.05 m           -      node-3
192.168.1.104          35          90   1    0.10    0.12     0.11 d           -      node-4
192.168.1.105          32          89   1    0.11    0.13     0.10 d           -      node-5
192.168.1.106          30          91   1    0.12    0.10     0.09 d           -      node-6

这表明 node-1 是被选举出的主节点(master 列下的 *),并且其他节点是集群的一部分。

步骤 7:配置索引分片和复制

对于新创建的索引,Elasticsearch 默认设置一个主分片和一个副本(index.number_of_shards: 1index.number_of_replicas: 1)。对于 HA,您通常希望至少有一个副本,这意味着您的数据至少存在于两个不同的节点上。这确保了一个节点发生故障时,副本可以在其他地方可用。

创建索引时,指定这些设置:

```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3