MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

ElasticSearch集群配置的最佳实践

2023-07-253.8k 阅读

一、ElasticSearch 集群概述

ElasticSearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,被广泛应用于全文搜索、结构化搜索、分析以及这三个功能的组合。在实际生产环境中,为了提高数据的可用性、性能和处理能力,通常会搭建 ElasticSearch 集群。

一个 ElasticSearch 集群由一个或多个节点组成,这些节点共同持有整个集群的数据,并协同工作以提供索引和搜索功能。每个节点都有自己的角色,如主节点负责集群的管理工作,数据节点负责存储和处理数据,协调节点负责接收客户端请求并将其分发到合适的数据节点。

二、环境准备

在配置 ElasticSearch 集群之前,需要确保服务器满足一定的条件:

  1. 操作系统:ElasticSearch 支持多种操作系统,如 Linux、Windows、MacOS 等。在生产环境中,通常推荐使用 Linux 系统,如 CentOS 或 Ubuntu。
  2. Java 环境:ElasticSearch 基于 Java 开发,需要安装 Java 8 或更高版本。可以通过以下命令检查 Java 版本:
java -version
  1. 服务器资源:根据数据量和业务需求合理分配服务器资源。一般来说,每个节点至少需要 2GB 的内存,同时确保有足够的磁盘空间用于存储数据。

三、集群配置文件详解

ElasticSearch 的配置主要通过 elasticsearch.yml 文件进行。下面详细介绍一些关键配置项:

  1. 集群名称
cluster.name: my - elastic - cluster

cluster.name 定义了集群的名称。同一集群中的所有节点必须使用相同的集群名称,这样它们才能自动发现并加入到同一个集群中。建议使用一个有意义的名称,方便在多集群环境中进行区分。 2. 节点名称

node.name: node - 1

node.name 定义了节点的名称。每个节点在集群中必须有唯一的名称。如果不指定,ElasticSearch 会自动生成一个随机名称。为了便于管理和识别,建议为每个节点指定一个有意义的名称。 3. 节点角色

node.master: true
node.data: true
node.ingest: true
  • node.master:设置该节点是否有资格成为主节点。主节点负责管理集群状态、索引创建和删除等重要操作。一般建议将 node.master 设置为 true 的节点数量为奇数个,以防止脑裂问题。
  • node.data:设置该节点是否存储数据。数据节点负责存储和处理数据,是集群中最消耗资源的节点类型。
  • node.ingest:设置该节点是否作为摄入节点。摄入节点可以在文档索引之前对其进行预处理,如添加字段、修改字段值等。
  1. 网络配置
network.host: 0.0.0.0
http.port: 9200
  • network.host:指定节点绑定的 IP 地址。0.0.0.0 表示绑定到所有可用的网络接口。在生产环境中,建议指定具体的 IP 地址,以提高安全性。
  • http.port:指定 HTTP 协议监听的端口号。默认端口为 9200,用于与客户端进行通信。
  1. 发现机制
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
  • discovery.seed_hosts:指定初始种子节点的地址列表。新节点启动时,会通过这些种子节点来发现集群中的其他节点。
  • cluster.initial_master_nodes:在首次启动集群时,指定有资格成为主节点的节点列表。这有助于避免脑裂问题,确保集群的稳定性。

四、单节点集群配置实践

  1. 下载安装 ElasticSearch:从 ElasticSearch 官方网站下载适合你操作系统的安装包,并解压到指定目录。
  2. 配置 elasticsearch.yml:在解压后的 config 目录下找到 elasticsearch.yml 文件,进行如下配置:
cluster.name: my - single - node - cluster
node.name: single - node
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
  1. 启动 ElasticSearch:在解压后的 bin 目录下执行以下命令启动 ElasticSearch:
./elasticsearch
  1. 验证集群状态:打开浏览器,访问 http://localhost:9200,如果看到类似以下的 JSON 响应,表示单节点集群启动成功:
{
  "name" : "single - node",
  "cluster_name" : "my - single - node - cluster",
  "cluster_uuid" : "Yf33fGJqR66Jg6 - u4z - 13g",
  "version" : {
    "number" : "7.14.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "6f1e7a11098c99f036b86c17f096e786f1f8c8e3",
    "build_date" : "2021 - 09 - 28T21:40:44.035404Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0 - beta1"
  },
  "tagline" : "You Know, for Search"
}

五、多节点集群配置实践

  1. 准备服务器:假设有三台服务器,IP 地址分别为 192.168.1.100192.168.1.101192.168.1.102
  2. 下载安装 ElasticSearch:在每台服务器上下载并解压 ElasticSearch 安装包。
  3. 配置 elasticsearch.yml
    • 192.168.1.100 服务器上的 elasticsearch.yml 配置如下:
cluster.name: my - multi - node - cluster
node.name: node - 1
node.master: true
node.data: true
network.host: 192.168.1.100
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
- 在 `192.168.1.101` 服务器上的 `elasticsearch.yml` 配置如下:
cluster.name: my - multi - node - cluster
node.name: node - 2
node.master: true
node.data: true
network.host: 192.168.1.101
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
- 在 `192.168.1.102` 服务器上的 `elasticsearch.yml` 配置如下:
cluster.name: my - multi - node - cluster
node.name: node - 3
node.master: false
node.data: true
network.host: 192.168.1.102
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
  1. 启动 ElasticSearch:在每台服务器的 bin 目录下分别执行以下命令启动 ElasticSearch:
./elasticsearch
  1. 验证集群状态:可以使用 _cluster/health API 来查看集群状态。在任意一台服务器上执行以下命令:
curl -X GET "http://192.168.1.100:9200/_cluster/health?pretty"

如果集群状态正常,会看到类似以下的 JSON 响应:

{
  "cluster_name" : "my - multi - node - cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "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
}

其中,statusgreen 表示集群状态良好,所有分片都已分配。yellow 表示所有主分片都已分配,但有一些副本分片未分配。red 表示有主分片未分配,集群不可用。

六、高可用性配置

  1. 副本设置:在创建索引时,可以通过 settings 参数设置副本数量。例如,使用以下命令创建一个具有 1 个副本的索引:
curl -X PUT "http://192.168.1.100:9200/my_index?pretty" -H 'Content - Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}'

这样,每个主分片都会有一个副本分片,分布在不同的节点上。当某个节点故障时,副本分片可以自动提升为主分片,保证数据的可用性。 2. 自动恢复:ElasticSearch 具有自动恢复机制。当节点故障恢复后,它会自动重新加入集群,并从其他节点同步缺失的数据,恢复到故障前的状态。 3. 监控与报警:可以使用 Elasticsearch Head、Kibana 等工具对集群进行监控。通过设置监控指标的阈值,如磁盘使用率、CPU 使用率、集群状态等,当指标超出阈值时,及时发送报警通知,以便管理员及时处理。

七、性能优化配置

  1. 索引设置
    • 分片数量:根据数据量和查询负载合理设置分片数量。一般来说,每个分片的大小控制在 10GB - 50GB 之间比较合适。如果数据量较小,可以适当减少分片数量,以降低管理成本。例如:
curl -X PUT "http://192.168.1.100:9200/my_index?pretty" -H 'Content - Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}'
- **刷新间隔**:`index.refresh_interval` 参数控制索引的刷新频率。默认情况下,ElasticSearch 每秒自动刷新一次索引,这会影响写入性能。如果写入操作较多,可以适当增大刷新间隔,如设置为 30 秒:
curl -X PUT "http://192.168.1.100:9200/my_index/_settings?pretty" -H 'Content - Type: application/json' -d'
{
  "index": {
    "refresh_interval": "30s"
  }
}'
  1. 节点资源优化
    • 内存设置:ElasticSearch 使用堆内存来存储索引数据和缓存查询结果。可以通过 ES_HEAP_SIZE 环境变量来设置堆内存大小。一般建议将堆内存设置为物理内存的一半,且不超过 32GB。例如,在启动脚本中添加以下行:
export ES_HEAP_SIZE=4g
- **磁盘 I/O 优化**:使用高性能的磁盘,如 SSD,以提高数据读写速度。同时,确保磁盘 I/O 队列长度不会过高,可以通过调整 `vm.dirty_ratio` 和 `vm.dirty_background_ratio` 等内核参数来优化磁盘 I/O。

3. 查询优化: - 使用过滤器:在查询时,尽量使用过滤器而不是查询语句来缩小结果集。过滤器不会计算文档的相关性得分,因此执行速度更快。例如:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "category": "electronics"
          }
        }
      ]
    }
  }
}
- **批量操作**:对于写入操作,尽量使用批量 API(如 `_bulk`),减少网络开销,提高写入性能。例如:
curl -X POST "http://192.168.1.100:9200/_bulk?pretty" -H 'Content - Type: application/json' -d'
{"index":{"_index":"my_index","_id":"1"}}
{"title":"Product 1","description":"This is a product description."}
{"index":{"_index":"my_index","_id":"2"}}
{"title":"Product 2","description":"Another product description."}
'

八、安全配置

  1. 身份验证
    • 内置用户:ElasticSearch 提供了内置的用户管理功能。可以使用 elasticsearch - useradd 命令创建新用户,并设置密码。例如:
./bin/elasticsearch - useradd myuser
- **LDAP 集成**:对于企业环境,可以将 ElasticSearch 与 LDAP 进行集成,使用 LDAP 服务器进行用户身份验证。需要在 `elasticsearch.yml` 中配置 LDAP 相关参数,如:
xpack.security.authc:
  realms:
    ldap1:
      type: ldap
      order: 0
      url: ldap://ldap.example.com:389
      bind_dn: CN=admin,DC=example,DC=com
      bind_password: password
      user_search:
        base_dn: DC=example,DC=com
        filter: "(sAMAccountName={0})"
  1. 加密通信
    • HTTPS:可以为 ElasticSearch 配置 HTTPS 协议,加密客户端与服务器之间的通信。需要生成 SSL 证书,并在 elasticsearch.yml 中配置相关参数,如:
xpack.security.http.ssl:
  enabled: true
  key: /path/to/your/key.pem
  certificate: /path/to/your/cert.pem
  certificate_authorities: ["/path/to/your/ca.pem"]
- **传输层加密**:ElasticSearch 节点之间的通信也可以进行加密。同样需要配置 SSL 证书,如:
xpack.security.transport.ssl:
  enabled: true
  key: /path/to/your/key.pem
  certificate: /path/to/your/cert.pem
  certificate_authorities: ["/path/to/your/ca.pem"]

九、故障排查与维护

  1. 日志分析:ElasticSearch 的日志文件位于 logs 目录下。通过分析日志文件,可以了解集群的运行状态、节点故障原因等信息。常见的日志文件有 elasticsearch.loggc.log 等。
  2. 集群状态检查:使用 _cluster/health_cluster/stats 等 API 可以获取集群的状态信息。例如,通过 _cluster/health API 可以查看集群状态、节点数量、分片分配情况等。
  3. 节点故障处理:当节点发生故障时,首先检查节点的日志文件,确定故障原因。如果是硬件故障,需要及时更换硬件设备。如果是软件问题,可以尝试重启节点或调整配置参数。
  4. 数据备份与恢复:可以使用 Elasticsearch Snapshot 和 Restore API 对数据进行备份和恢复。例如,创建一个快照仓库:
curl -X PUT "http://192.168.1.100:9200/_snapshot/my_backup_repo?pretty" -H 'Content - Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/path/to/backup/directory"
  }
}'

然后创建一个快照:

curl -X PUT "http://192.168.1.100:9200/_snapshot/my_backup_repo/my_snapshot?pretty"

在需要恢复数据时,可以使用以下命令:

curl -X POST "http://192.168.1.100:9200/_snapshot/my_backup_repo/my_snapshot/_restore?pretty"

通过以上配置和实践,可以搭建一个高效、稳定、安全的 ElasticSearch 集群,满足不同业务场景的需求。在实际应用中,还需要根据具体的业务需求和数据特点,不断优化集群配置,以提高集群的性能和可用性。