Elasticsearch 部署教程:从入门到精通 – wiki基地


Elasticsearch 部署教程:从入门到精通

引言:Elasticsearch 是什么?为何需要部署?

在当今大数据时代,快速、灵活地搜索、分析和存储海量数据是许多应用的核心需求。Elasticsearch 应运而生,它是一个高度可伸缩、开源的全文搜索和分析引擎。基于 Apache Lucene 构建,但隐藏了 Lucene 的复杂性,提供了一个简单的 RESTful API 接口,使得开发者能够轻松地处理各种数据。

Elasticsearch 不仅仅是一个搜索引擎,它还是 Elastic Stack(以前称为 ELK Stack)的核心组件。ELK Stack 包括 Elasticsearch、Kibana、Logstash 和 Beats。Logstash 和 Beats 用于数据采集和处理,Elasticsearch 用于存储和分析,Kibana 用于数据可视化和探索。这使得 Elasticsearch 成为日志分析、度量监控、安全分析、业务智能以及当然,全文搜索等场景的强大基石。

部署 Elasticsearch 是使用它的第一步。无论是用于开发测试、搭建日志分析平台,还是构建高可用、可伸缩的生产环境,掌握 Elasticsearch 的部署技巧都至关重要。本篇文章将带你从零开始,逐步深入,了解 Elasticsearch 的基本部署、集群搭建、核心配置、安全加固及常见优化,助你从入门走向精通。

第一部分:入门部署 – 单节点快速搭建

1. 准备工作

在开始部署之前,需要确保你的系统满足以下基本要求:

  • 操作系统: Elasticsearch 可以在多种操作系统上运行,包括 Linux、Windows、macOS。推荐在 Linux 服务器环境(如 Ubuntu, CentOS, RHEL)上进行生产部署。
  • Java 环境: Elasticsearch 需要 Java 运行环境。不同版本的 Elasticsearch 对 Java 版本有要求,通常需要安装官方支持的 OpenJDK 或 Oracle JDK。请查阅你计划安装的 Elasticsearch 版本的官方文档以确认兼容的 Java 版本。建议使用 OpenJDK。

    • Linux (Ubuntu/Debian):
      bash
      sudo apt update
      sudo apt install openjdk-11-jdk # 或其他兼容版本
    • Linux (CentOS/RHEL):
      bash
      sudo yum update
      sudo yum install java-11-openjdk-devel # 或其他兼容版本
    • 验证 Java 安装:
      bash
      java -version
  • 硬件要求: 对于开发或测试,较低配置即可。对于生产环境,建议至少分配 2 核 CPU、8GB 内存,并配备 SSD 存储。内存和存储是 Elasticsearch 性能的关键因素。

2. 获取 Elasticsearch

你可以从官方网站下载 Elasticsearch。有多种安装包格式可供选择:

  • Tarball (.tar.gz) / Zip (.zip): 适用于 Linux/macOS 和 Windows,直接解压即可运行,配置灵活,常用于测试或自定义安装。
  • APT/YUM 仓库: 适用于基于 Debian (Ubuntu) 和 RHEL (CentOS) 的 Linux 发行版,通过包管理器安装,方便管理和升级,推荐用于生产环境。
  • Docker 镜像: 适用于容器化部署,方便集成到 Kubernetes 等容器编排平台。

本教程将主要演示 Tarball 和 APT/YUM 方式。

方式一:使用 Tarball/Zip 安装 (Linux)

  1. 下载: 访问 Elastic 官网下载页面 (https://www.elastic.co/cn/downloads/elasticsearch),选择合适的版本下载 .tar.gz 包。
    bash
    # 示例:下载 7.17.0 版本
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gz

    (请根据实际需求替换版本号和下载链接)

  2. 解压:
    bash
    tar -xzf elasticsearch-7.17.0-linux-x86_64.tar.gz

  3. 进入目录:
    bash
    cd elasticsearch-7.17.0

  4. 配置(基础): 进入 config 目录,编辑 elasticsearch.yml 文件。对于单节点快速启动,可以保持大部分默认设置,但至少需要关注网络配置。
    bash
    # 打开配置文件
    vim config/elasticsearch.yml

    找到或添加以下行:
    “`yaml
    # ———————————- Network ———————————–
    # Set the bind address to a specific IP (used by network.host)
    #
    # By default Elasticsearch is only accessible on localhost. Set this in order
    # to allow external access.
    #
    # network.host: 192.168.1.1
    network.host: localhost # 开发测试用,只允许本地访问
    # 或 network.host: 0.0.0.0 # 允许所有网络接口访问,慎用于非安全环境
    # 或 network.host: <你的服务器IP> # 绑定到特定IP

    Set a custom port for HTTP:

    http.port: 9200

    For more complex network configurations, see the network module category.

    ``
    对于单节点,通常
    network.host: localhost或不配置(默认为 localhost)即可。如果需要从外部访问,再配置为服务器 IP 或0.0.0.0`。

  5. 运行: 在 Elasticsearch 目录下执行运行脚本。
    bash
    ./bin/elasticsearch

    这将在前台运行 Elasticsearch。你可以看到日志输出。

方式二:使用 APT/YUM 仓库安装 (Linux)

这种方式更适合生产环境,因为它提供了方便的安装、升级和管理服务。

  1. 导入 Elastic PGP Key:
    “`bash
    # For Debian/Ubuntu
    wget -qO – https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –

    For CentOS/RHEL

    sudo rpm –import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    “`

  2. 添加仓库定义:

    • Debian/Ubuntu:
      bash
      echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

      (根据你的 Elasticsearch 版本修改 7.x
    • CentOS/RHEL:
      bash
      cat <<EOF | sudo tee /etc/yum.repos.d/elasticsearch.repo
      [elasticsearch-7.x]
      name=Elasticsearch repository for 7.x packages
      baseurl=https://artifacts.elastic.co/packages/7.x/yum
      gpgcheck=1
      gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
      enabled=1
      autorefresh=1
      type=rpm-md
      EOF

      (根据你的 Elasticsearch 版本修改 7.x
  3. 安装 Elasticsearch:

    • Debian/Ubuntu:
      bash
      sudo apt update
      sudo apt install elasticsearch
    • CentOS/RHEL:
      bash
      sudo yum install elasticsearch
  4. 配置(基础): 配置文件位于 /etc/elasticsearch/elasticsearch.yml。使用你的编辑器打开并修改。
    bash
    sudo vim /etc/elasticsearch/elasticsearch.yml

    同样,对于单节点,主要关注 network.host
    “`yaml
    # … (其他配置)

    By default Elasticsearch is only accessible on localhost. Set this in order

    to allow external access.

    network.host: localhost # 或 0.0.0.0 或 <你的服务器IP>

    … (其他配置)

    “`

  5. 运行(作为服务): 使用 systemd 或 init system 来管理 Elasticsearch 服务。
    bash
    sudo systemctl start elasticsearch # 启动服务
    sudo systemctl enable elasticsearch # 设置开机自启动
    sudo systemctl status elasticsearch # 查看服务状态

3. 验证安装

无论使用哪种方式安装,Elasticsearch 启动后,你可以通过 HTTP 请求来验证它是否正常工作。

使用 curl 命令:

bash
curl http://localhost:9200

如果 Elasticsearch 成功启动,你将看到一个 JSON 响应,其中包含 Elasticsearch 的版本信息、集群名称等。

json
{
"name" : "your_node_name",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "...",
"version" : {
"number" : "7.17.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "...",
"build_date" : "...",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

如果配置了 network.host 为服务器 IP 或 0.0.0.0,你也可以使用服务器的 IP 地址进行访问(请确保防火墙允许 9200 端口的流量)。

至此,你已经成功部署了一个单节点的 Elasticsearch 实例。这足以用于开发测试或学习目的。

第二部分:进阶部署 – 构建多节点集群

单节点 Elasticsearch 存在单点故障风险,且性能和存储容量有限。在生产环境中,通常需要部署一个多节点的 Elasticsearch 集群,以实现高可用性、可伸缩性和更好的性能。

1. 理解集群架构

一个 Elasticsearch 集群由一个或多个节点组成。每个节点都是 Elasticsearch 进程的一个实例。节点在启动时会通过配置发现集群中的其他节点,并尝试加入同一个集群(通过 cluster.name 标识)。

在集群中,节点可以扮演不同的角色:

  • Master-eligible nodes (主节点候选): 可以被选举为集群的主节点。主节点负责管理集群的状态,包括索引的创建/删除、分片的分配、节点的加入/离开等。在高可用集群中至少需要 3 个主节点候选节点,以便在主节点故障时能够进行选举。
  • Data nodes (数据节点): 存储数据(分片),执行数据相关的操作,如搜索、索引、更新、删除。
  • Ingest nodes (ingest 节点): 用于数据预处理,例如解析、转换、丰富文档,然后再将文档索引到数据节点。
  • Coordinating nodes (协调节点): 处理客户端的请求,将请求路由到合适的数据节点,并聚合结果返回给客户端。默认情况下,每个节点都具有协调能力。
  • Remote-eligible nodes (远程节点候选): 用于跨集群搜索 (Cross Cluster Search, CCS)。

一个节点可以同时扮演多种角色。默认情况下,一个节点是 master-eligible, data, ingest, 和 coordinating 节点。在大型集群中,为了提高稳定性,通常会将这些角色分离到不同的节点上。

2. 多节点部署的关键配置

部署多节点集群的关键在于让所有节点能够相互发现,并正确地加入同一个集群。这主要涉及以下几个配置项(位于 elasticsearch.yml):

  • cluster.name 必须。所有要加入同一个集群的节点,其 cluster.name 必须完全一致。默认值为 elasticsearch。建议修改为一个具有辨识度的名称,例如 my-elk-cluster
  • node.name 必须。集群中每个节点的唯一标识符。建议设置为易于识别的名称,例如服务器的主机名或特定编号,如 es-node-1
  • network.host 必须。指定节点绑定和通信的网络接口。设置为 0.0.0.0 允许所有接口,或者设置为节点的特定 IP 地址。不要在集群环境中使用 localhost,除非你只在单机上模拟多节点。
  • discovery.seed_hosts 必须。这是一个主机列表(IP 地址或主机名),用于发现集群中的其他节点。新节点启动时会尝试连接列表中的主机,以发现集群中的其他节点。列表中应该包含集群中当前正在运行或预期会运行的一些节点的地址。建议列出所有主节点候选节点的地址。
    • 例如:discovery.seed_hosts: ["host1", "host2:9300", "192.168.1.10", "192.168.1.11"]。默认端口是 9300 (transport port)。
  • cluster.initial_master_nodes 重要在集群首次启动时,必须设置此项来形成初始的主节点群体。列表中应包含集群中所有主节点候选节点node.name。这是 Elasticsearch 7.x+ 用于集群引导(Bootstrap)的重要配置,替代了旧版本中的脑裂 (split-brain) 问题防护机制。注意:一旦集群形成并稳定运行后,就不需要再修改或保留此配置项了。 它仅用于集群首次启动时的引导。
    • 例如,如果你有三个主节点候选节点,其 node.name 分别是 es-master-1, es-master-2, es-master-3,那么在它们首次启动时,都需要在 elasticsearch.yml 中设置:
      yaml
      cluster.initial_master_nodes: ["es-master-1", "es-master-2", "es-master-3"]

      这三个节点启动后会相互通信,并共同选举出第一个主节点,形成集群。其他数据节点或协调节点则只需设置 discovery.seed_hosts 指向这三个主节点候选节点即可加入集群。

3. 部署步骤 (假设三节点集群)

假设你有三台服务器,IP 地址分别为 192.168.1.101, 192.168.1.102, 192.168.1.103。我们将在每台服务器上安装 Elasticsearch,并组成一个集群。为了简化,这三个节点都将扮演 master-eligible 和 data 角色。

  1. 在每台服务器上安装 Elasticsearch: 按照第一部分介绍的方式(推荐 APT/YUM)在三台服务器上都安装相同版本的 Elasticsearch。确保 Java 环境也已安装。

  2. 配置 elasticsearch.yml 在每台服务器上编辑 /etc/elasticsearch/elasticsearch.yml 文件。

    • 共同配置 (三台服务器都相同):
      “`yaml
      # ———————————- Cluster ———————————–
      # Use a descriptive name for your cluster:
      cluster.name: my-prod-cluster # 必须一致!

      ———————————— Node ————————————

      Use a descriptive name for the node:

      node.name: node-1 # 稍后每台服务器设置不同的名称

      Add custom attributes to the node:

      node.attr.rack: r1

      Role-based configuration (Optional initially, but good practice later)

      node.roles: [ master, data ] # 默认就是 master 和 data

      ———————————– Network ———————————-

      Set the bind address to a specific IP (used by network.host)

      network.host: 0.0.0.0 # 允许所有接口,或者设置为本机的实际IP

      Set a custom port for HTTP:

      http.port: 9200

      Set a custom port for transport (node-to-node communication):

      transport.port: 9300 # 节点间通信端口

      ———————————- Discovery ———————————

      Pass an initial list of hosts to perform discovery against:

      discovery.seed_hosts: [“192.168.1.101:9300”, “192.168.1.102:9300”, “192.168.1.103:9300”] # 列出所有主节点候选的地址和transport端口

      —————————– Cluster initialisation —————————–

      CAUTION: cluster.initial_master_nodes should be configured only when

      the cluster is first formed (when all master-eligible nodes start for the

      very first time). After the cluster has been formed, this setting should

      be removed or commented out from the elasticsearch.yml configuration of

      all master-eligible nodes.

      cluster.initial_master_nodes: [“node-101”, “node-102”, “node-103”] # 列出所有主节点候选的node.name

      ———————————- Memory ———————————-

      Lock the memory into RAM:

      bootstrap.memory_lock: true # 推荐开启,防止交换内存

      ———————————– Paths ————————————

      Path to data files:

      path.data: /var/lib/elasticsearch # 推荐指定一个非系统盘的数据目录

      Path to log files:

      path.logs: /var/log/elasticsearch # 推荐指定一个日志目录

      “`

    • 每台服务器的个性化配置:

      • 192.168.1.101 上,设置:node.name: node-101
      • 192.168.1.102 上,设置:node.name: node-102
      • 192.168.1.103 上,设置:node.name: node-103
  3. 操作系统级别配置: Elasticsearch 推荐进行一些操作系统级别的优化,以确保性能和稳定性。这些修改需要在所有 Elasticsearch 节点上执行。

    • 设置 vm.max_map_count Elasticsearch 默认使用 NIO FS 目录类型,它使用内存映射文件(mmap)。需要确保操作系统允许一个进程拥有足够的内存映射区域。
      bash
      sudo sysctl -w vm.max_map_count=262144
      # 为了永久生效,编辑 /etc/sysctl.conf,添加 vm.max_map_count=262144
      # 然后执行 sudo sysctl -p
    • 增加文件描述符限制: Elasticsearch 需要打开大量文件(索引文件、连接等)。需要增加用户可以打开的最大文件描述符数量。
      bash
      # 编辑 /etc/security/limits.conf 文件,在文件末尾添加或修改:
      # elasticsearch 用户(或运行es的用户)的限制
      elasticsearch hard nofile 65536
      elasticsearch soft nofile 65536
      # 注:你可能需要注销并重新登录才能使这些设置生效
    • 禁用 Swap: Elasticsearch 严重依赖 JVM 的堆内存,如果 JVM 的内存被交换到磁盘,性能会急剧下降甚至导致不稳定。强烈建议禁用节点的交换内存。
      bash
      # 临时禁用
      sudo swapoff -a
      # 永久禁用,编辑 /etc/fstab 文件,注释掉或删除 swap 分区相关的行。
      # 然后重启服务器使永久配置生效,或者再次执行 swapoff -a。
    • 内存锁定 (Memory Locking): 配合禁用 Swap,可以在 elasticsearch.yml 中设置 bootstrap.memory_lock: true 来尝试锁定 JVM 堆内存到 RAM 中,防止被操作系统交换出去。这需要确保运行 Elasticsearch 的用户有锁定内存的权限(设置 memlock 限制)。
      bash
      # 编辑 /etc/security/limits.conf 文件,添加或修改:
      # elasticsearch 用户(或运行es的用户)的限制
      elasticsearch hard memlock unlimited
      elasticsearch soft memlock unlimited
      # 注:同样可能需要重新登录生效。

      修改 elasticsearch.yml
      yaml
      bootstrap.memory_lock: true

      注意: 如果 memory_lock 启动失败(通常是因为权限或系统配置问题),Elasticsearch 将不会启动。你可以在日志中查看原因。
  4. 配置 JVM 堆内存 (Heap Size): 这是 Elasticsearch 最重要的配置项之一。Elasticsearch 使用 JVM,其内存(堆内存)大小直接影响性能和稳定性。

    • 修改 JVM 配置:如果使用 Tarball 安装,修改 config/jvm.options 文件。如果使用 APT/YUM 安装,通常修改 /etc/elasticsearch/jvm.options 文件。
    • 找到 XmsXmx 参数,它们分别设置 JVM 的最小和最大堆内存。
    • 关键原则:
      • XmsXmx 设置为相等的值,以避免 JVM 在运行时调整堆大小带来的开销。
      • 设置的值不应超过节点总内存的一半。这是因为 Elasticsearch 还需要内存用于操作系统缓存(特别是用于 Lucene 索引文件),操作系统缓存对于搜索性能至关重要。如果堆内存设置过大,挤占了操作系统缓存,反而会导致性能下降。
      • 设置的值不应超过 32GB。这是因为 JVM 存在一个压缩指针(Compressed Ordinary Object Pointers, CompressedOops)的优化,在堆大小小于 32GB 时生效,可以节省内存并提高性能。超过 32GB 后,这个优化会失效,导致内存使用效率降低。如果你的节点总内存非常大(如 128GB),也应该将堆内存设置为 31GB 或 32GB,剩余的内存留给操作系统缓存。
    • 示例(假设节点有 64GB 内存):
      “`bash
      # /etc/elasticsearch/jvm.options

      -Xms31g # 设置最小堆内存为 31GB
      -Xmx31g # 设置最大堆内存为 31GB
      “`
      (请根据你的服务器实际内存修改此值)

  5. 启动 Elasticsearch 服务:所有三台服务器上依次启动 Elasticsearch 服务。

    bash
    sudo systemctl start elasticsearch

  6. 验证集群状态: 在任意一台服务器上,使用 curl 命令检查集群健康状态。

    bash
    curl -X GET "localhost:9200/_cluster/health?pretty"

    如果集群正常,你将看到类似以下的输出:

    json
    {
    "cluster_name" : "my-prod-cluster",
    "status" : "green", # ideal state
    "timed_out" : false,
    "number_of_nodes" : 3, # should be 3
    "number_of_data_nodes" : 3,
    "active_primary_shards" : ...,
    "active_shards" : ...,
    "relocating_shards" : 0,
    "initializing_shards" : 0,
    "unassigned_shards" : 0,
    "delayed_unassigned_shards" : 0,
    "number_of_pending_tasks" : 0,
    "number_of_in_flight_fetch" : 0,
    "task_max_waiting_in_queue_millis" : 0,
    "active_shards_percent_as_number" : 100.0
    }

    status 字段表示集群健康状态:
    * green:所有主分片和副本分片都已就绪,集群运行正常。
    * yellow:所有主分片都已就绪,但至少有一个副本分片未就绪。数据仍然可用,但存在副本丢失的风险。
    * red:至少有一个主分片未就绪。部分数据不可用。

    你也可以查看节点列表:

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

    将列出集群中的所有节点及其角色、IP 地址、状态等信息。确保所有三个节点都已显示。

4. 集群引导后的配置修改

非常重要: 一旦你的集群成功形成并达到绿色状态,务必从所有主节点候选节点的 elasticsearch.yml 文件中移除或注释掉 cluster.initial_master_nodes 配置项。这个设置仅用于集群首次启动时的引导过程。如果保留它,将来在某些重启场景下可能会导致问题。

例如,如果节点 node-101 已经成功加入集群,编辑 /etc/elasticsearch/elasticsearch.yml

“`yaml

cluster.initial_master_nodes: [“node-101”, “node-102”, “node-103”] # 注释掉或删除

“`

然后重启该节点的服务:

bash
sudo systemctl restart elasticsearch

在所有最初设置了 cluster.initial_master_nodes 的节点上重复此步骤。

5. 节点角色分离 (可选但推荐)

在大型或对稳定性要求高的集群中,建议将主节点角色与数据节点角色分离。

  • Master-only 节点: 只扮演主节点候选角色,不存储数据,不处理搜索或索引请求。配置:
    yaml
    node.roles: [ master ]
  • Data-only 节点: 只存储数据,处理搜索和索引请求,不参与主节点选举。配置:
    yaml
    node.roles: [ data ]
  • Ingest-only 节点: 只处理数据预处理。配置:
    yaml
    node.roles: [ ingest ]
  • Coordinating-only 节点: 仅用于路由请求和聚合结果,不存储数据,不参与主节点选举,也不执行 ingest 管道。配置:
    yaml
    node.roles: [ ] # 或 node.roles: [ remote_cluster_client ] 如果用于CCS

    客户端通常连接到协调节点(如果没有独立的协调节点,则连接到任一节点)。

分离角色的好处:
* 稳定性: 主节点专注于管理集群状态,不会因数据处理负载过高而变得不稳定。
* 可伸缩性: 可以独立地扩展数据节点数量以增加存储容量和吞吐量,或扩展协调节点以处理更多客户端请求。
* 资源隔离: 不同角色的节点可以使用不同的硬件配置(例如,主节点对 CPU/内存要求相对较低,数据节点对内存/磁盘要求高)。

典型的生产集群配置可能包括:
* 3 个 master-only 节点 (负责选举出 1 个主节点)
* N 个 data-only 节点
* M 个 ingest-only 节点 (如果使用 ingest pipeline)
* (可选)P 个 coordinating-only 节点 (如果客户端请求量非常大)

部署步骤: 与前面类似,只是在每个节点的 elasticsearch.yml 中设置不同的 node.roles,并确保 discovery.seed_hosts 列表包含所有 master-eligible 节点的地址。首次启动时,cluster.initial_master_nodes 仍然列出所有 master-eligible 节点的 node.name

第三部分:核心配置与优化

除了上述基础配置,还有许多配置项可以影响 Elasticsearch 的性能、稳定性和资源使用。

1. 路径配置 (path.data, path.logs)

  • path.data:数据存储路径。默认在 Elasticsearch 目录下的 data 目录。强烈建议将其配置到一个独立的、具有足够空间和高性能(SSD 优先)的磁盘分区上,并且不要与操作系统或日志文件放在同一个分区。多路径配置:path.data: [/mnt/esdata1, /mnt/esdata2]
  • path.logs:日志存储路径。默认在 Elasticsearch 目录下的 logs 目录。建议指定一个独立的日志目录,方便管理和故障排查。

yaml
path.data: /mnt/elasticsearch/data
path.logs: /mnt/elasticsearch/logs

2. 内存配置 (jvm.options, bootstrap.memory_lock)

前面已经详细介绍了 JVM 堆内存 (Xms, Xmx) 和内存锁定 (bootstrap.memory_lock) 的重要性。再次强调:

  • Xms = Xmx
  • Xmx <= 总内存的一半
  • Xmx <= 32GB (通常建议 31GB 或 32GB)
  • 禁用 Swap
  • 开启 bootstrap.memory_lock: true 并设置 memlock 限制

3. 网络配置 (network.host, http.port, transport.port)

  • network.host:决定节点绑定哪些网络接口。0.0.0.0 绑定所有接口;特定 IP 绑定特定接口;_local_ 绑定本地回环地址;_site_ 绑定站点本地地址;_global_ 绑定全局地址。生产环境通常设置为服务器的实际 IP 或 0.0.0.0
  • http.port:客户端与节点通信的端口(RESTful API)。默认 9200。
  • transport.port:节点间通信的端口。默认 9300。

4. 发现配置 (discovery.seed_hosts, cluster.initial_master_nodes)

  • discovery.seed_hosts:新节点发现集群的种子列表。应包含稳定、可靠的节点地址,通常是 master-eligible 节点的地址。
  • cluster.initial_master_nodes:仅用于集群首次启动引导。列出所有 master-eligible 节点的 node.name。集群形成后必须移除。

5. 分片与副本 (index.number_of_shards, index.number_of_replicas)

这些是索引级别的设置,可以在创建索引时指定,也可以在 elasticsearch.yml 中设置为默认值。

  • index.number_of_shards:每个索引的主分片数量。主分片决定了索引可以存储的最大数据量和处理的最大并发请求量。一旦创建,主分片数量不可更改。选择合适的主分片数量非常重要。
  • index.number_of_replicas:每个主分片的副本数量。副本提供了数据的冗余备份,用于提高可用性和并行搜索能力。副本数量可以随时更改。一个副本意味着每个主分片有一个拷贝,集群中总共有 主分片数 * (1 + 副本数) 个分片。副本不能和其对应的主分片分配到同一个节点上。

“`yaml

Example default settings in elasticsearch.yml

index.number_of_shards: 1 # Default, consider increasing for production
index.number_of_replicas: 1 # Default, provides redundancy in a multi-node cluster
“`
生产环境中,应根据数据量、节点数量和可用性需求仔细规划分片和副本数量。

6. 线程池和队列

Elasticsearch 有多种线程池处理不同类型的请求(如 index, search, bulk, get, write 等)。通常默认配置已经优化得很好,但在高负载下可能需要调整。这属于更高级的优化,一般在遇到性能瓶颈时才考虑调整。

7. OS 级别优化总结

再次强调这些重要设置,确保它们在所有生产节点上都已正确配置:

  • vm.max_map_count = 262144
  • nofile 限制 >= 65536
  • 禁用 Swap
  • memlock 限制为 unlimited (如果开启 bootstrap.memory_lock)

这些 OS 级别的配置通常需要以 root 用户身份进行修改,并且可能需要重新启动服务器才能完全生效。

第四部分:安全加固

默认情况下,Elasticsearch 集群是完全开放的,任何能够访问到其 HTTP 端口 (9200) 和 Transport 端口 (9300) 的用户都可以进行读写甚至删除操作,这在生产环境中是极不安全的。Elastic Stack 提供了强大的安全功能(X-Pack Security,基础功能免费)。

1. 启用 Security 功能

elasticsearch.yml 中启用 X-Pack Security:

yaml
xpack.security.enabled: true

这将启用安全功能,包括加密通信、身份验证和授权。

2. 配置 TLS/SSL 加密通信

启用安全后,默认情况下节点间的 Transport 层通信 (9300 端口) 和客户端到节点的 HTTP 层通信 (9200 端口) 都需要使用 TLS 加密。这需要证书。

  • 生成证书: Elastic 提供了 elasticsearch-certutil 工具来生成证书。在一个节点上运行以下命令生成一个 CA 证书和每个节点的证书:
    “`bash
    # 进入 Elasticsearch bin 目录
    cd /usr/share/elasticsearch/bin/ # (APT/YUM 安装路径) 或 <解压目录>/bin/ (Tarball 安装路径)

    生成 CA 证书 (只需一次)

    ./elasticsearch-certutil ca –pem –out elasticsearch-ca.zip
    unzip elasticsearch-ca.zip -d elasticsearch-ca # 解压到指定目录

    为每个节点生成证书 (需要提供节点列表和其 IP/hostname)

    创建一个 instances.yml 文件,例如:

    instances:

    – name: node-101

    dns: [ ‘node-101.yourdomain.com’ ] # 可选,节点域名

    ip: [ ‘192.168.1.101’ ] # 节点IP

    – name: node-102

    dns: [ ‘node-102.yourdomain.com’ ]

    ip: [ ‘192.168.1.102’ ]

    – name: node-103

    dns: [ ‘node-103.yourdomain.com’ ]

    ip: [ ‘192.168.1.103’ ]

    使用 CA 证书为所有节点生成证书包

    ./elasticsearch-certutil cert –pem –ca-cert elasticsearch-ca/ca/ca.crt –ca-key elasticsearch-ca/ca/ca.key –in instances.yml –out elasticsearch-certs.zip
    ``
    * **分发证书:** 将生成的
    elasticsearch-ca/ca/ca.crt(CA 证书) 和elasticsearch-certs.zip(包含每个节点证书) 分发到每个 Elasticsearch 节点的配置目录(例如/etc/elasticsearch/certs//usr/share/elasticsearch/config/certs/)。解压elasticsearch-certs.zip。每个节点只需要 CA 证书和自己对应的节点证书文件(通常是一个.crt文件和一个.key文件)。
    * **配置
    elasticsearch.yml:** 在每个节点的elasticsearch.yml` 中配置 TLS。

    “`yaml

    /etc/elasticsearch/elasticsearch.yml

    xpack.security.enabled: true

    Transport layer security (node to node)

    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate # 或 full, depending on CA/DNS setup
    xpack.security.transport.ssl.keystore.path: certs/node-101/node-101.p12 # 或 .jks, 或 .crt/.key 路径
    xpack.security.transport.ssl.truststore.path: certs/ca/ca.p12 # 或 .jks, 或 .crt 路径

    如果使用 PEM 格式 (.crt/.key), 配置如下:

    xpack.security.transport.ssl.certificate: certs/node-101/node-101.crt

    xpack.security.transport.ssl.key: certs/node-101/node-101.key

    xpack.security.transport.ssl.certificate_authorities: certs/ca/ca.crt

    HTTP layer security (client to node)

    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.keystore.path: certs/node-101/node-101.p12 # 或 .jks, 或 .crt/.key 路径
    xpack.security.http.ssl.truststore.path: certs/ca/ca.p12 # 或 .jks, 或 .crt 路径 (如果需要客户端证书验证)

    如果使用 PEM 格式 (.crt/.key), 配置如下:

    xpack.security.http.ssl.certificate: certs/node-101/node-101.crt

    xpack.security.http.ssl.key: certs/node-101/node-101.key

    xpack.security.http.ssl.certificate_authorities: certs/ca/ca.crt # 如果需要客户端证书验证

    确保路径正确指向你的证书文件

    ``
    如果使用
    elasticsearch-certutil生成的.p12文件,需要设置密码(在生成时指定),并在配置文件中添加xpack.security.transport.ssl.keystore.passwordxpack.security.http.ssl.keystore.password等配置项(可以使用 keystore 工具安全地存储密码)。使用 PEM 格式通常更简单,直接配置.crt.key` 文件路径即可。

3. 创建用户和角色

启用安全后,需要通过身份验证才能访问集群。Elasticsearch 自带了一些内置用户(如 elastic, kibana_system 等)。可以使用 elasticsearch-users 工具或 Kibana 的 Security UI 来创建用户和定义角色。

  • 使用 elasticsearch-users 创建用户 (示例):
    bash
    cd /usr/share/elasticsearch/bin/
    ./elasticsearch-users useradd my_admin -p mypassword123 -r superuser
    ./elasticsearch-users useradd app_user -p app_password -r data_writer

    这会创建一个 my_admin 用户并赋予 superuser 角色,创建一个 app_user 并赋予 data_writer 角色。

  • 使用 Kibana UI: 安装并配置 Kibana 连接到安全的 Elasticsearch 集群后(Kibana 连接 Elasticsearch 也需要配置 TLS 和身份验证),可以在 Kibana 的 “Stack Management” -> “Security” 中管理用户、角色和 API Keys。

4. 防火墙配置

即使启用了安全,仍然建议配置防火墙,只允许必要的机器访问 Elasticsearch 的端口:

  • 9200 (HTTP):仅允许需要访问 Elasticsearch API 的客户端(如 Kibana 服务器、应用程序服务器、开发机器)。
  • 9300 (Transport):仅允许集群内的其他 Elasticsearch 节点。

第五部分:监控、备份与维护

1. 监控

监控 Elasticsearch 集群的健康和性能至关重要。

  • 内置监控 (X-Pack Monitoring): 这是最方便的方式。在 Kibana 中集成 Elasticsearch 和 Kibana 自身的监控数据,提供丰富的仪表板。只需在 elasticsearch.ymlkibana.yml 中启用相关配置即可。
  • 外部监控: 可以使用 Prometheus + Exporter 或其他监控工具(如 Zabbix, Nagios)通过 JMX 或 Elasticsearch 的 _cat API/Monitoring API 拉取指标进行监控。

关注的关键指标包括:
* 集群健康状态 (green, yellow, red)
* 节点数量
* 分片状态 (数量, 分配)
* JVM 内存使用 (heap_percent)
* CPU 使用率
* 磁盘 I/O 和空间使用率
* 网络流量
* 搜索和索引速率/延迟
* 垃圾回收情况

2. 备份 (Snapshot and Restore)

快照 (Snapshot) 是备份 Elasticsearch 集群数据的重要手段。可以将索引数据备份到共享文件系统、S3、HDFS 等仓库中。

  • 配置仓库:elasticsearch.yml 中指定允许的快照仓库路径:
    yaml
    path.repo: ["/mnt/my_snapshots", "/mnt/another_repo"]

    重启节点后,在 Kibana 的快照/恢复界面或使用 API 注册仓库:
    bash
    PUT /_snapshot/my_backup_repo
    {
    "type": "fs",
    "settings": {
    "location": "/mnt/my_snapshots"
    }
    }

    注意: 共享文件系统仓库要求该路径在所有 master-eligible 节点上都可访问且路径一致。
  • 创建快照:
    bash
    PUT /_snapshot/my_backup_repo/snapshot_1?wait_for_completion=true

    可以备份所有索引,或指定特定索引,也可以包含全局集群状态。
  • 恢复快照:
    bash
    POST /_snapshot/my_backup_repo/snapshot_1/_restore
    {
    "indices": "index_to_restore", # 指定要恢复的索引
    "ignore_unavailable": true,
    "include_global_state": false,
    "rename_pattern": "(.+)", # 恢复时重命名索引,例如: restored_$1
    "rename_replacement": "restored_$1"
    }

    注意: 恢复索引时,需要确保集群中有足够的资源(特别是磁盘空间)来存储恢复的数据。

3. 维护与升级

  • 滚动重启 (Rolling Restart): Elasticsearch 支持滚动重启,可以在不中断服务的情况下逐个重启节点,常用于配置更改或小版本升级。
  • 版本升级: 大版本升级通常需要更谨慎的计划和步骤,可能需要停机或使用跨版本协助升级 (Cross Cluster Replication, CCR) 等高级功能。务必仔细阅读官方升级文档。
  • 索引生命周期管理 (Index Lifecycle Management, ILM): ILM 允许定义策略,自动管理索引的生命周期,包括在达到一定时间或大小时自动执行 Rollover(创建新索引)、Shrink(缩小分片)、Force Merge(强制合并段)、Migrate(迁移到热/温/冷节点)甚至 Delete(删除)。这对于日志或时间序列数据非常有用。

第六部分:故障排除常见问题

  • 集群状态为 Red/Yellow:
    • Red: 至少一个主分片丢失。检查节点是否宕机、磁盘是否损坏、日志中是否有分配失败的错误。
    • Yellow: 至少一个副本分片未分配。常见原因包括节点不足(副本无法分配到不同节点)、磁盘空间不足、内存不足、节点间通信问题。检查 _cat/allocation?v 和集群日志。
  • 节点无法加入集群:
    • 检查 cluster.name 是否一致。
    • 检查 network.host 配置是否正确,节点之间网络是否可达(ping 9300 端口)。
    • 检查 discovery.seed_hosts 列表是否正确且包含可达节点。
    • 首次启动集群: 检查 cluster.initial_master_nodes 是否正确列出所有 master-eligible 节点的 node.name
    • 检查防火墙是否阻止了 9300 端口的流量。
    • 检查节点日志 (/var/log/elasticsearch/) 获取详细错误信息。
  • OOM (Out of Memory) 错误: 通常是 JVM 堆内存配置不当或负载过高导致。回顾 JVM 堆内存配置原则 (Xms=Xmx, 小于总内存一半, <= 32GB),检查是否有禁用 Swap。
  • 磁盘空间不足: 检查 path.data 所在分区的磁盘空间。及时删除不再需要的索引,或者增加磁盘容量。考虑使用 ILM 自动删除旧数据。
  • 性能下降: 检查 CPU、内存、磁盘 I/O 使用率,JVM 垃圾回收情况。使用监控工具定位瓶颈。可能需要优化索引设计、查询语句、分片数量,或者增加节点。

总结与展望

从单节点入门到多节点集群,再到安全加固和性能优化,Elasticsearch 的部署和管理是一个循序渐进的过程。掌握了基础的 Tarball 或包管理器安装,理解了多节点集群的核心配置(特别是发现机制和主节点选举),配置了 JVM 堆内存和 OS 级别优化,并启用了安全功能,你就已经具备了搭建和管理一个稳定可靠的 Elasticsearch 集群的基础。

精通 Elasticsearch 部署不仅在于知晓配置项,更在于理解其背后的原理:集群如何发现和选举主节点、分片如何分配和迁移、内存如何影响性能、安全如何保障数据安全等。

未来的学习方向:
* 深入学习 Elasticsearch 集群的各种 API (_cat, _cluster, _nodes, _indices, _snapshot 等)。
* 掌握 Kibana 的使用,特别是监控、安全、索引管理、Dev Tools 等功能。
* 了解 Logstash 和 Beats,构建完整的数据采集和分析管道。
* 学习更高级的优化技巧,如分片策略、节点角色细分、热温冷架构。
* 探索在 Docker 或 Kubernetes 环境中部署和管理 Elasticsearch。
* 学习跨集群复制 (CCR) 和跨集群搜索 (CCS)。
* 深入理解 ILM 的策略配置。

Elasticsearch 是一个功能强大的工具,其部署和优化是一个持续的过程。随着数据量的增长和业务需求的变化,你可能需要不断调整配置和架构。希望本篇文章为你提供了一个坚实的基础,祝你在 Elasticsearch 的世界里越走越远!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部