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

ElasticSearch选主相关配置的兼容性测试

2021-11-308.0k 阅读

ElasticSearch 选主相关配置的兼容性测试

ElasticSearch 选主机制概述

在 ElasticSearch 集群中,选主过程至关重要。ElasticSearch 采用基于 Quorum 的选主算法,目的是确保集群在大多数节点正常运行时能够选出一个稳定的主节点。主节点负责管理集群的元数据,包括索引的创建、删除以及节点的加入和离开等操作。

默认情况下,ElasticSearch 通过选举发现机制来确定主节点。节点之间通过 Gossip 协议交换信息,每个节点都有可能成为主节点的候选者。在选举过程中,节点会根据自身的状态和其他节点的信息进行投票,最终选出一个节点作为主节点。

例如,假设有一个由 5 个节点组成的 ElasticSearch 集群,当集群启动时,每个节点都会广播自己的存在以及自身的状态信息。节点之间相互交换这些信息后,开始进行投票。如果有 3 个或更多节点投票给某个节点,那么该节点就会成为主节点。

选主相关配置参数

  1. discovery.seed_hosts 这个配置参数用于指定初始的种子节点列表。种子节点是在集群启动时用于发现其他节点的关键节点。可以通过 IP 地址或者主机名来指定种子节点。例如:
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101"]

在一个跨机房的 ElasticSearch 集群中,每个机房可以选择几个性能较好、网络稳定的节点作为种子节点。这样在集群启动或者节点重启时,能够快速地发现其他节点,加速集群的组建。

  1. cluster.initial_master_nodes 该参数用于在集群首次启动时指定哪些节点有资格成为主节点。这是一个非常重要的配置,特别是在多节点集群启动时,它可以避免脑裂等问题。例如:
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

这里的“node - 1”、“node - 2”和“node - 3”是节点的名称。在实际生产环境中,通常会选择几个核心的、性能可靠的节点作为初始主节点候选人。

  1. discovery.zen.minimum_master_nodes 这个参数定义了形成一个合法集群所需的最少主节点数。在选举过程中,只有当投票数达到这个最小值时,选举才会成功。计算公式为 (master_eligible_nodes / 2) + 1。例如,对于一个有 5 个主节点资格的节点集群,minimum_master_nodes 应该设置为 3。
discovery.zen.minimum_master_nodes: 3

如果设置过小,可能会导致脑裂问题,即集群分裂成多个小集群,每个小集群都认为自己是主集群;如果设置过大,可能会在部分节点故障时,导致集群无法选举出主节点,影响集群的正常运行。

兼容性测试环境搭建

  1. 硬件环境 为了进行兼容性测试,准备了 5 台物理服务器,每台服务器配置如下:
  • CPU:Intel Xeon E5 - 2620 v4 @ 2.10GHz(8 核)
  • 内存:32GB DDR4
  • 硬盘:500GB SSD
  • 操作系统:CentOS 7.9
  1. 软件环境 在每台服务器上安装 ElasticSearch 7.10.2 版本。安装步骤如下:
  • 下载 ElasticSearch 安装包:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz
  • 解压安装包:
tar -zxvf elasticsearch - 7.10.2 - linux - x86_64.tar.gz
  • 进入解压后的目录:
cd elasticsearch - 7.10.2
  • 配置 ElasticSearch,编辑 config/elasticsearch.yml 文件,设置节点名称、网络地址、种子节点等信息。例如,对于节点 1 的配置:
cluster.name: my - cluster
node.name: node - 1
network.host: 192.168.1.100
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.1.104"]
cluster.initial_master_nodes: ["node - 1", "node - 2", "node - 3"]
discovery.zen.minimum_master_nodes: 3
  • 启动 ElasticSearch:
./bin/elasticsearch -d

按照类似的步骤,分别在其他 4 台服务器上进行安装和配置,确保每个节点都能正常启动并加入集群。

兼容性测试用例设计

  1. 测试用例 1:不同 discovery.seed_hosts 配置与其他参数的兼容性
  • 测试目的:验证 discovery.seed_hosts 配置与 cluster.initial_master_nodesdiscovery.zen.minimum_master_nodes 配置的兼容性。
  • 测试步骤
    • 初始配置:所有节点的 discovery.seed_hosts 配置为 ["192.168.1.100", "192.168.1.101"],cluster.initial_master_nodes 为 ["node - 1", "node - 2", "node - 3"],discovery.zen.minimum_master_nodes 为 3。启动集群,观察集群是否正常组建,主节点是否能正常选举。
    • 修改 discovery.seed_hosts 配置:将其中 3 个节点的 discovery.seed_hosts 配置修改为 ["192.168.1.102", "192.168.1.103"],另外 2 个节点保持不变。重启集群,观察集群状态和主节点选举情况。
  • 预期结果
    • 初始配置下,集群应能正常组建,主节点选举正常。
    • 修改配置后,集群仍应能正常组建和选举主节点,但可能会因为种子节点的变化,导致节点发现和选举过程稍有不同。
  1. 测试用例 2:cluster.initial_master_nodes 配置变化的兼容性
  • 测试目的:测试 cluster.initial_master_nodes 配置变化对选主及集群运行的影响。
  • 测试步骤
    • 初始配置:cluster.initial_master_nodes 配置为 ["node - 1", "node - 2", "node - 3"]。启动集群,确保集群正常运行。
    • 修改 cluster.initial_master_nodes 配置:将其修改为 ["node - 2", "node - 3", "node - 4"]。重启集群,观察集群状态、主节点选举以及数据的一致性。
  • 预期结果
    • 初始配置下,集群正常运行。
    • 修改配置后,集群应能重新选举主节点,且数据应保持一致。但可能会出现短暂的集群不稳定,直到新的主节点稳定运行。
  1. 测试用例 3:discovery.zen.minimum_master_nodes 配置调整的兼容性
  • 测试目的:验证 discovery.zen.minimum_master_nodes 配置调整对选主机制的影响。
  • 测试步骤
    • 初始配置:discovery.zen.minimum_master_nodes 设置为 3。启动集群,确保集群正常。
    • 降低配置值:将 discovery.zen.minimum_master_nodes 修改为 2。重启集群,观察集群状态,注意是否可能出现脑裂问题。
    • 增加配置值:将 discovery.zen.minimum_master_nodes 修改为 4。重启集群,观察集群是否能正常选举主节点,特别是在部分节点故障的情况下。
  • 预期结果
    • 初始配置下,集群正常。
    • 降低配置值后,可能会增加脑裂的风险,需要观察集群是否分裂。
    • 增加配置值后,在节点故障时,集群可能需要更多正常节点才能选举主节点,可能导致部分节点故障时集群无法正常运行。

兼容性测试结果分析

  1. 测试用例 1 结果分析
  • 初始配置:集群成功组建,主节点选举正常。通过 _cat/nodes API 查看节点状态,可以看到主节点已经确定,并且其他节点也正常加入集群。
curl -X GET "http://192.168.1.100:9200/_cat/nodes?v"

输出结果类似:

ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.100           10          99   0    0.01    0.02     0.05 cdm       *      node - 1
192.168.1.101           12          98   0    0.01    0.02     0.05 cdm       -      node - 2
192.168.1.102           11          99   0    0.01    0.02     0.05 cdm       -      node - 3
192.168.1.103           10          98   0    0.01    0.02     0.05 cdm       -      node - 4
192.168.1.104           11          99   0    0.01    0.02     0.05 cdm       -      node - 5
  • 修改配置后:集群仍然能够组建,但部分节点在发现其他节点时稍有延迟。这是因为部分节点的种子节点列表发生了变化,需要重新建立连接和交换信息。不过,最终主节点选举成功,集群恢复正常运行。这表明 discovery.seed_hosts 配置的变化在一定范围内不会影响集群的选主和正常运行,但可能会对节点发现的速度和稳定性产生影响。
  1. 测试用例 2 结果分析
  • 初始配置:集群运行稳定,数据读写正常。
  • 修改配置后:集群重启后,出现了短暂的不稳定状态。通过日志分析发现,节点在重新选举主节点的过程中,需要交换大量的元数据信息。最终,新的主节点选举成功,集群恢复正常。数据一致性方面,经过数据校验工具(如 ElasticSearch 自带的 _cat/indices API 检查索引状态,以及通过读取和写入数据进行验证)验证,数据没有丢失或损坏。这说明 cluster.initial_master_nodes 配置的变化会导致集群重新选举主节点,但只要配置合理,集群能够在短时间内恢复正常,并且数据一致性能够得到保证。
  1. 测试用例 3 结果分析
  • 初始配置:集群正常运行,在部分节点故障时,仍能保持主节点的稳定选举和集群的正常运行。
  • 降低配置值后:在模拟 2 个节点故障的情况下,集群出现了脑裂现象。通过监控工具(如 Kibana 的集群监控功能)发现,集群分裂成了两个小集群,每个小集群都有自己的“主节点”。这验证了降低 discovery.zen.minimum_master_nodes 配置值会增加脑裂的风险。
  • 增加配置值后:当模拟 2 个节点故障时,集群无法选举出主节点,处于未就绪状态。这是因为按照新的 discovery.zen.minimum_master_nodes 值(4),在 5 个节点中有 2 个节点故障的情况下,剩余正常节点数量不足,无法满足选举主节点的条件。这表明增加 discovery.zen.minimum_master_nodes 配置值会提高集群选举主节点的门槛,在节点故障时可能会导致集群无法正常运行,需要在配置时谨慎考虑。

总结测试结论与建议

  1. 测试结论
  • discovery.seed_hosts 配置的变化在合理范围内不会影响集群选主,但可能影响节点发现速度。应确保种子节点的可靠性和稳定性,避免频繁更改种子节点配置。
  • cluster.initial_master_nodes 配置的修改会导致集群重新选举主节点,只要配置合理,数据一致性可以得到保证。在集群扩展或节点调整时,修改该配置需要谨慎操作,并密切关注集群状态。
  • discovery.zen.minimum_master_nodes 配置对集群稳定性和选主机制影响较大。降低该值会增加脑裂风险,增加该值会提高选举门槛,在节点故障时可能导致集群无法正常运行。配置时应根据集群规模和节点可靠性进行合理设置。
  1. 建议
  • 在生产环境中,选择稳定可靠的节点作为种子节点,并定期检查种子节点的状态。
  • 在修改 cluster.initial_master_nodes 配置前,应进行充分的测试,并备份重要数据。修改过程中,密切监控集群的状态,确保数据一致性。
  • 对于 discovery.zen.minimum_master_nodes 配置,应根据集群的实际情况,按照计算公式 (master_eligible_nodes / 2) + 1 进行合理设置。同时,应制定节点故障应急预案,以应对可能出现的集群不稳定情况。

通过以上详细的兼容性测试和分析,可以更好地理解 ElasticSearch 选主相关配置的相互关系和影响,从而在生产环境中更加合理地配置和管理 ElasticSearch 集群,提高集群的稳定性和可靠性。

在实际应用中,还需要结合业务需求和数据规模等因素,对 ElasticSearch 集群进行全面的优化和配置,以确保其能够高效地支持各种应用场景。例如,对于数据读写频繁的场景,可能需要进一步优化节点的硬件配置、调整索引设置等。同时,持续关注 ElasticSearch 的版本更新,及时了解新的选主机制改进和配置优化建议,也是保障集群长期稳定运行的重要措施。

此外,随着容器化技术的广泛应用,将 ElasticSearch 部署在容器环境中时,还需要考虑容器网络、资源分配等因素对选主配置的影响。例如,容器的动态 IP 分配可能会影响 discovery.seed_hosts 的配置,需要采用合适的网络方案(如 Service Mesh)来确保节点之间的稳定通信。

在监控方面,除了使用 ElasticSearch 自带的监控 API 和 Kibana 等工具外,还可以结合第三方监控系统(如 Prometheus + Grafana),对集群的选主过程、节点状态、网络流量等进行全方位的监控和预警。通过设置合理的监控指标和阈值,及时发现并解决可能出现的选主相关问题,保障集群的高可用性。

总之,ElasticSearch 选主相关配置的兼容性测试是一个复杂而重要的工作,需要综合考虑多方面的因素,通过不断的实践和优化,才能构建出稳定、高效的 ElasticSearch 集群。