14.4.1.6. ElasticSearch集群安装教程

分布式系统如Elasticsearch的设计旨在即使部分组件发生故障时仍能继续工作。只要有足够多的良好连接节点接管其职责,即使某些节点不可用或断开连接,Elasticsearch集群也能正常运行。

但弹性集群的最小规模是有限制的。所有Elasticsearch集群都需要以下组件才能运行:

  • 一个选举产生的主节点

  • 每个角色至少一个节点

  • 每个分片至少一个副本

一个弹性集群需要每个必需组件的冗余。这意味着一个弹性集群必须具备以下组件:

  • 至少三个有资格成为主节点的节点

  • 每个角色至少两个节点

  • 每个分片至少两个副本(一个主副本和一个或多个副本,除非索引是可搜索的快照索引)

一个弹性集群需要三个有资格成为主节点的节点,以便在其中一个节点故障时,剩下的两个节点仍能形成多数并进行成功选举。

同样,每个角色节点的冗余意味着,如果某个角色的节点发生故障,另一个节点可以承担其职责。

最后,一个弹性集群应至少有每个分片的两个副本。如果一个副本发生故障,应该有另一个良好的副本来接替。Elasticsearch会自动在剩余节点上重建任何故障的分片副本,以在故障后恢复集群的完全健康状态。

故障会暂时降低集群的总容量。此外,故障发生后,集群必须执行额外的后台活动以恢复健康状态。您应确保集群具有在部分节点故障时处理工作负载的能力。

根据您的需求和预算,Elasticsearch集群可以由单个节点、数百个节点或介于两者之间的任何数量组成。在设计较小的集群时,通常应着重于使其对单节点故障具有弹性。较大集群的设计者还必须考虑多个节点同时故障的情况。以下页面提供了构建各种规模弹性集群的一些建议:

14.4.1.6.1. 小型集群的弹性

14.4.1.6.2. 大型集群的弹性

很多节点共享通用基础设施,比如网络互连或电源供应并不少见。如果是这样的情况,您应当计划这些基础设施的故障,并确保这种故障不会影响太多节点。常见的做法是将共享某些基础设施的所有节点分组为区域,并计划一次性失败任何整个区域的情况。

Elasticsearch要求节点之间的连接可靠、延迟低且带宽充足。许多Elasticsearch任务需要节点之间多次往返通信。慢或不可靠的互连可能会显著影响集群的性能和稳定性。

举例来说,每次往返增加几毫秒的延迟可能会迅速积累成明显的性能惩罚。不可靠的网络可能会导致频繁的网络分区。Elasticsearch会尽快从网络分区中恢复,但在分区期间您的集群可能部分不可用,并且需要花费时间和资源来重新同步任何丢失的数据,以及在分区恢复后重新平衡自身。从故障中恢复可能涉及在节点之间复制大量数据,因此恢复时间通常取决于可用带宽。

如果您将集群分成区域,每个区域内的网络连接通常比区域之间的连接质量更高。确保区域之间的网络连接质量足够高。将所有区域都部署在同一个数据中心内,并为每个区域配备独立的电源供应和其他支持基础设施,通常能够获得最佳效果。如果网络互连足够良好,您也可以将集群延展到附近的多个数据中心。

运行健康的Elasticsearch集群并没有特定的最低网络性能要求。理论上,即使节点之间的往返延迟达到几百毫秒,集群也能正常工作。但实际上,如果您的网络速度太慢,集群性能将非常差。此外,慢速网络通常不够可靠,可能会导致网络分区,进而导致不可用期。

如果希望数据在距离较远或连接不佳的多个数据中心中可用,应在每个数据中心部署一个独立的集群,并使用跨集群搜索或跨集群复制将这些集群连接起来。这些功能旨在在集群到集群的连接不如集群内网络稳定或性能不佳的情况下仍能表现良好。

失去整个区域节点后,一个设计良好的集群可能仍能正常运行,但运行的容量显著减少。在处理此类故障时,您可能需要额外的节点来恢复集群的可接受性能。

为了提高对整个区域故障的弹性,重要的是每个分片都在不止一个区域中有副本,可以通过在多个区域放置数据节点并配置分片分配感知来实现。还应确保客户端请求发送到不止一个区域的节点。

您应考虑所有节点角色,并确保每个角色在两个或更多区域中具有冗余。例如,如果使用数据摄取管道或机器学习,则应在两个或更多区域中拥有摄取或机器学习节点。但是,放置有资格成为主节点的节点需要更多的注意,因为弹性集群需要至少两个三个有资格成为主节点中的节点才能正常运行。接下来的部分将探讨如何在多个区域中放置有资格成为主节点的选项。

14.4.1.6.2.1. Two-zone clusters - 两区域集群

14.4.1.6.2.2. Two-zone clusters with a tiebreaker - 带有仲裁者的两区域集群

14.4.1.6.3. 准备用户

sudo groupadd elasticsearch
sudo useradd -g elasticsearch -s /bin/bash -d /usr/local/elasticsearch elasticsearch
sudo passwd elasticsearch
sudo mkdir -p /usr/local/elasticsearch
sudo chown elasticsearch:elasticsearch /usr/local/elasticsearch/
tar -xzf elasticsearch-8.x.x-linux-x86_64.tar.gz
sudo mv elasticsearch-8.x.x /usr/local/elasticsearch

14.4.1.6.4. 配置三个节点

node-1:

cluster.name: my-cluster
node.name: node-1
network.host: 10.196.126.18
discovery.seed_hosts: ["10.196.126.18", "10.196.126.19", "10.196.126.20"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

node-2:

cluster.name: my-cluster
node.name: node-2
network.host: 10.196.126.19
discovery.seed_hosts: ["10.196.126.18", "10.196.126.19", "10.196.126.20"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

node-3:

cluster.name: my-cluster
node.name: node-3
network.host: 10.196.126.20
discovery.seed_hosts: ["10.196.126.18", "10.196.126.19", "10.196.126.20"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

14.4.1.6.5. 启动3个节点

14.4.1.6.6. 验证

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