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

ElasticSearch确立Master或加入集群的性能监控指标

2022-01-293.5k 阅读

ElasticSearch 确立 Master 或加入集群的性能监控指标概述

在 ElasticSearch 集群环境中,Master 节点的选举和新节点加入集群的过程对于整个集群的稳定性和性能至关重要。监控这些过程中的性能指标,有助于及时发现潜在问题,确保集群高效运行。

1. 确立 Master 相关指标

  • 选举时间:从触发 Master 选举开始到选举出 Master 节点所花费的时间。这一指标反映了选举过程的效率。过长的选举时间可能暗示网络延迟、节点负载过重等问题。
    • 监控方法:在 ElasticSearch 日志中,可以找到与选举相关的记录。通过分析日志中的时间戳来计算选举时间。例如,在 elasticsearch.log 日志文件中,查找类似以下记录:
[2024-01-01T12:00:00,000][INFO ][o.e.c.m.MasterService   ] [node-1] election of a new master started
[2024-01-01T12:01:00,000][INFO ][o.e.c.m.MasterService   ] [node-2] elected_as_master, reason: new_master {node-2}{uX48182323823}{n9fXWXfX}{192.168.1.100}{192.168.1.100:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}
  • 计算代码示例(Python)
import re

log_content = """
[2024-01-01T12:00:00,000][INFO ][o.e.c.m.MasterService   ] [node-1] election of a new master started
[2024-01-01T12:01:00,000][INFO ][o.e.c.m.MasterService   ] [node-2] elected_as_master, reason: new_master {node-2}{uX48182323823}{n9fXWXfX}{192.168.1.100}{192.168.1.100:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}
"""
start_pattern = r'\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2},\d{3})\].*election of a new master started'
end_pattern = r'\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2},\d{3})\].*elected_as_master'

start_time = re.search(start_pattern, log_content)
end_time = re.search(end_pattern, log_content)

if start_time and end_time:
    from datetime import datetime
    start = datetime.strptime(start_time.group(1), '%Y-%m-%dT%H:%M:%S,%f')
    end = datetime.strptime(end_time.group(1), '%Y-%m-%dT%H:%M:%S,%f')
    election_time = (end - start).total_seconds()
    print(f'Election time: {election_time} seconds')
  • 参与选举节点数量:了解有多少节点参与了 Master 选举过程。异常的节点数量(如过多或过少)可能预示着集群配置或网络拓扑存在问题。
    • 监控方法:同样通过分析 ElasticSearch 日志,查找与选举相关的节点标识。例如,上述日志中可以看到 node - 1 发起选举,node - 2 最终当选 Master,表明至少有这两个节点参与了选举。
    • 统计代码示例(Python)
import re

log_content = """
[2024-01-01T12:00:00,000][INFO ][o.e.c.m.MasterService   ] [node-1] election of a new master started
[2024-01-01T12:01:00,000][INFO ][o.e.c.m.MasterService   ] [node-2] elected_as_master, reason: new_master {node-2}{uX48182323823}{n9fXWXfX}{192.168.1.100}{192.168.1.100:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}
[2024-01-01T12:00:30,000][INFO ][o.e.c.m.MasterService   ] [node-3] received join request from {node-3}{uX48182323824}{n9fXWXfY}{192.168.1.101}{192.168.1.101:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} during election
"""
node_pattern = r'\[.*\]\[.*\]\[.*\] \[(node-\d+)\].*'
nodes = set(re.findall(node_pattern, log_content))
print(f'Nodes participated in election: {nodes}')
  • 网络通信量:选举过程中节点之间的网络通信量。高通信量可能导致网络拥塞,影响选举速度。
    • 监控方法:可以使用网络监控工具,如 tcpdumpWireshark 等,针对 ElasticSearch 节点之间通信的端口(默认为 9300)进行流量捕获和分析。
    • 示例(tcpdump):在 ElasticSearch 节点所在服务器上执行以下命令捕获 9300 端口的网络流量:
sudo tcpdump -i eth0 port 9300 -w election_traffic.pcap
  • 分析工具:使用 Wireshark 打开 election_traffic.pcap 文件,分析数据包大小、数量等信息,以评估选举期间的网络通信量。

2. 节点加入集群相关指标

  • 加入时间:从节点发起加入请求到成功加入集群所花费的时间。这一指标反映了集群接纳新节点的效率。
    • 监控方法:在 ElasticSearch 日志中查找与节点加入相关的记录。例如:
[2024-01-01T12:02:00,000][INFO ][o.e.c.s.ClusterApplierService] [node-3] added {node-3}{uX48182323824}{n9fXWXfY}{192.168.1.101}{192.168.1.101:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}, reason: apply cluster state (from master [master {node-2}{uX48182323823}{n9fXWXfX}{192.168.1.100}{192.168.1.100:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}])
  • 计算代码示例(Python):假设日志中节点发起加入请求的记录格式为 [时间][INFO ][o.e.c.s.ClusterApplierService] [node - X] join request sent,则计算加入时间代码如下:
import re

log_content = """
[2024-01-01T12:01:30,000][INFO ][o.e.c.s.ClusterApplierService] [node-3] join request sent
[2024-01-01T12:02:00,000][INFO ][o.e.c.s.ClusterApplierService] [node-3] added {node-3}{uX48182323824}{n9fXWXfY}{192.168.1.101}{192.168.1.101:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}, reason: apply cluster state (from master [master {node-2}{uX48182323823}{n9fXWXfX}{192.168.1.100}{192.168.1.100:9300}{dilmrt}{ml.machine_memory=34359738368, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}])
"""
start_pattern = r'\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2},\d{3})\].*join request sent'
end_pattern = r'\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2},\d{3})\].*added \{node-\d+\}.*'

start_time = re.search(start_pattern, log_content)
end_time = re.search(end_pattern, log_content)

if start_time and end_time:
    from datetime import datetime
    start = datetime.strptime(start_time.group(1), '%Y-%m-%dT%H:%M:%S,%f')
    end = datetime.strptime(end_time.group(1), '%Y-%m-%dT%H:%M:%S,%f')
    join_time = (end - start).total_seconds()
    print(f'Join time: {join_time} seconds')
  • 数据同步量:新节点加入集群时,需要从其他节点同步数据。监控数据同步量可以了解加入过程对集群存储和网络资源的占用情况。
    • 监控方法:在 ElasticSearch 中,可以通过集群健康 API(/_cluster/health)结合索引统计 API(/_cat/indices?v)来估算数据同步量。新节点加入后,观察索引的文档数量、存储大小等变化。
    • 代码示例(Python,使用 Elasticsearch Python 客户端)
from elasticsearch import Elasticsearch

es = Elasticsearch(['http://192.168.1.100:9200'])

# 新节点加入前获取索引统计
before_indices = es.cat.indices(format='json')
total_docs_before = sum([int(index['docs.count']) for index in before_indices])
total_size_before = sum([int(index['store.size'].replace('b', '')) for index in before_indices])

# 模拟等待新节点加入并同步数据

# 新节点加入后获取索引统计
after_indices = es.cat.indices(format='json')
total_docs_after = sum([int(index['docs.count']) for index in after_indices])
total_size_after = sum([int(index['store.size'].replace('b', '')) for index in after_indices])

docs_synced = total_docs_after - total_docs_before
size_synced = total_size_after - total_size_before
print(f'Docs synced: {docs_synced}')
print(f'Size synced: {size_synced} bytes')
  • 资源利用率:新节点加入时,观察集群整体的 CPU、内存、磁盘 I/O 等资源利用率。过高的资源利用率可能导致加入过程缓慢甚至失败。
    • 监控方法
      • CPU 利用率:在 Linux 系统中,可以使用 tophtop 等命令查看 ElasticSearch 进程及系统整体的 CPU 使用情况。例如,使用 top 命令,找到 ElasticSearch 进程(通常为 java 进程),查看其 %CPU 列。
      • 内存利用率:同样在 top 命令中,可以查看系统整体内存使用情况(Mem 行的 usedtotal 字段),以及 ElasticSearch 进程的内存占用(VIRTRES 等字段)。也可以通过 free -h 命令查看系统内存统计信息。
      • 磁盘 I/O:使用 iostat 命令可以监控磁盘 I/O 情况。例如,执行 iostat -x 1 可以每秒输出一次磁盘 I/O 详细信息,观察新节点加入时磁盘读写请求数(r/sw/s)和读写数据量(rkB/swkB/s)的变化。

性能指标监控的工具与实践

1. ElasticSearch 内置监控 API

ElasticSearch 提供了一系列内置的 API 用于监控集群状态和性能指标。

  • 集群健康 API(/_cluster/health:通过该 API 可以获取集群的健康状态(如 greenyellowred)、节点数量、活动分片数量等信息。这对于判断集群整体运行状况以及新节点加入后对集群健康的影响非常有用。
    • 请求示例(使用 curl)
curl -X GET "http://192.168.1.100:9200/_cluster/health?pretty"
  • 响应示例
{
  "cluster_name": "my_cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 3,
  "number_of_data_nodes": 3,
  "active_primary_shards": 10,
  "active_shards": 20,
  "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
}
  • 节点统计 API(/_nodes/stats:该 API 可以获取每个节点的详细统计信息,包括 CPU、内存、索引、线程池等方面的使用情况。在监控节点加入集群或 Master 选举时,通过对比不同节点在这些指标上的变化,可以发现潜在问题。
    • 请求示例(使用 curl)
curl -X GET "http://192.168.1.100:9200/_nodes/stats?pretty"
  • 响应示例(部分内容)
{
  "_nodes": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "cluster_name": "my_cluster",
  "nodes": {
    "node-1": {
      "timestamp": 1672531200000,
      "name": "node-1",
      "transport_address": "192.168.1.100:9300",
      "host": "192.168.1.100",
      "ip": "192.168.1.100",
      "attributes": {
        "ml.machine_memory": "34359738368",
        "xpack.installed": "true",
        "ml.max_open_jobs": "20",
        "ml.enabled": "true"
      },
      "os": {
        "refresh_interval_in_millis": 1000,
        "name": "Linux",
        "arch": "amd64",
        "version": "5.4.0-104-generic",
        "available_processors": 4,
        "cpu": {
          "percent": 10,
          "load_average": {
            "1m": 0.5,
            "5m": 0.4,
            "15m": 0.3
          }
        },
        "mem": {
          "total_in_bytes": 34359738368,
          "free_in_bytes": 1234567890,
          "used_in_bytes": 33125170478,
          "free_percent": 3,
          "used_percent": 97
        }
      },
      // 其他统计信息...
    },
    // 其他节点信息...
  }
}

2. 第三方监控工具

  • Kibana:作为 ElasticStack 的一部分,Kibana 提供了直观的界面来展示 ElasticSearch 的监控数据。通过配置监控索引,Kibana 可以实时绘制集群性能指标图表,如节点 CPU 使用率、内存使用率、索引吞吐量等。
    • 配置步骤
      • 确保 ElasticSearch 开启了监控功能,在 elasticsearch.yml 中配置 xpack.monitoring.enabled: true
      • 启动 Kibana,在 Kibana 界面中进入 Stack Management -> Monitoring,按照提示配置监控连接到 ElasticSearch 集群。
      • 配置完成后,在 Monitoring 选项卡中可以选择查看集群、节点、索引等不同层级的监控指标。
  • Prometheus + Grafana:Prometheus 是一个开源的系统监控和警报工具包,Grafana 是一个可视化平台。结合两者可以实现对 ElasticSearch 性能指标的深度监控和定制化可视化。
    • Prometheus 配置
      • 安装 Prometheus,并编辑其配置文件 prometheus.yml。添加 ElasticSearch 节点的监控目标,例如:
scrape_configs:
  - job_name: 'elasticsearch'
    static_configs:
      - targets: ['192.168.1.100:9100', '192.168.1.101:9100', '192.168.1.102:9100']
    metrics_path: /_prometheus
    params:
      module: [elasticsearch]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.100:9200  # ElasticSearch 主节点地址
- 启动 Prometheus,确保其能够正常采集 ElasticSearch 指标。
  • Grafana 配置
    • 安装 Grafana,登录 Grafana 界面。
    • 添加 Prometheus 数据源,在 Configuration -> Data Sources 中配置 Prometheus 的地址和相关参数。
    • 在 Grafana 中导入 ElasticSearch 相关的仪表板模板(可以从 Grafana 官方仪表板库或社区获取),即可实现对 ElasticSearch 性能指标的可视化监控。

性能问题分析与优化

1. 选举时间过长问题分析

  • 网络问题:网络延迟或不稳定可能导致选举过程中节点之间通信缓慢,从而延长选举时间。可以通过 ping 命令测试节点之间的网络连通性和延迟,使用 traceroute 命令查看网络路由情况。如果发现网络存在高延迟或丢包现象,需要检查网络设备(如路由器、交换机)的配置,排查网络拥塞点。
  • 节点负载过高:当参与选举的节点 CPU、内存等资源被大量占用时,可能无法及时处理选举相关的消息。通过监控节点的资源利用率,如前文所述使用 tophtop 等命令,查看是否存在资源瓶颈。如果是 CPU 负载过高,可以检查 ElasticSearch 配置参数,如线程池设置是否合理,是否有大量复杂的查询或索引操作在选举期间同时进行。对于内存问题,确保 ElasticSearch 的堆内存设置符合服务器实际内存情况,避免内存溢出或频繁的垃圾回收导致性能下降。
  • 选举算法相关:ElasticSearch 使用基于 Quorum 的选举算法。如果集群配置不合理,如节点数量过少或过多,可能影响选举效率。一般来说,建议集群节点数量为奇数个,以确保在部分节点故障时仍能正常选举。同时,检查节点的角色配置,确保 Master - eligible 节点的数量和分布合理。

2. 节点加入时间过长问题分析

  • 数据同步问题:大量数据同步可能导致节点加入时间过长。可以通过监控数据同步量,如前文所述通过索引统计 API 观察数据增长情况。如果数据同步量过大,可以考虑在新节点加入前进行数据预分片或预索引,减少加入时的同步压力。另外,优化网络带宽,确保节点之间有足够的带宽进行数据传输。
  • 资源竞争:新节点加入时,可能与现有节点竞争资源,如 CPU、内存、磁盘 I/O 等。监控资源利用率,对于资源紧张的情况,可以适当调整 ElasticSearch 集群的资源分配策略。例如,对于磁盘 I/O 瓶颈,可以考虑升级磁盘设备(如从机械硬盘升级到固态硬盘),或优化索引存储设置,减少磁盘读写操作。
  • 集群状态不稳定:如果在节点加入时集群本身处于不稳定状态,如频繁的 Master 选举、大量的分片迁移等,可能会影响新节点的加入。先确保集群整体状态稳定,处理好其他潜在的集群问题,再尝试加入新节点。

3. 优化实践案例

假设一个 ElasticSearch 集群在新节点加入时出现加入时间过长的问题。通过监控发现,数据同步量非常大,同时节点的磁盘 I/O 利用率达到 100%。经过分析,确定是由于索引数据量较大且磁盘性能较低导致。

  • 优化措施
    • 数据预分片:在新节点加入前,对部分大索引进行预分片操作,将数据提前分布到新节点可能承担的分片上。例如,对于一个名为 big_index 的索引,使用 ElasticSearch 的 _split API 进行预分片:
curl -X POST "http://192.168.1.100:9200/big_index/_split?pretty" -H 'Content - Type: application/json' -d'
{
  "number_of_shards": 10,
  "settings": {
    "index.routing.allocation.require._name": "new_node"
  }
}
'
  • 磁盘升级:将节点的磁盘设备从机械硬盘升级到固态硬盘,提升磁盘 I/O 性能。
  • 优化索引设置:调整索引的刷新间隔(index.refresh_interval),适当延长刷新间隔,减少磁盘写入频率,提高写入性能。例如,在创建索引时设置 index.refresh_interval: 30s

经过这些优化措施后,再次加入新节点,加入时间明显缩短,集群性能得到提升。

通过对 ElasticSearch 确立 Master 或加入集群的性能监控指标进行深入分析和有效优化,可以确保集群在各种情况下都能保持高效稳定运行,为业务应用提供可靠的数据存储和检索服务。在实际应用中,需要根据具体的业务场景和集群规模,灵活运用这些监控指标和优化方法,不断提升 ElasticSearch 集群的性能和可靠性。