高可用性Elasticsearch集群搭建指南
搭建高可用性Elasticsearch集群,涵盖节点角色、发现机制、副本配置、JVM大小调整及健康检查。
高可用性Elasticsearch集群搭建指南
Elasticsearch能够在节点故障时保持可用,但前提是正确规划主节点选举、数据放置、副本和发现机制。单节点集群在开发环境中可能够用,但无法保护你的搜索工作负载免受主机故障影响。
本指南将展示如何搭建一个高可用性Elasticsearch集群,包括专用的符合主节点条件的节点、数据节点、分片副本以及基本的验证命令。
理解Elasticsearch中的高可用性
Elasticsearch的高可用性通过以下几个关键机制实现:
- 分布式架构:Elasticsearch天然地将数据和操作分布到多个节点上。
- 节点角色:不同节点可以承担不同功能,实现资源专有和故障隔离。
- 分片复制:每个索引被划分为分片,每个主分片可以有一个或多个副本分片,存储在不同的节点上。
- 主节点选举:健壮的选举过程确保始终有一个主节点来管理集群状态。
- Zen Discovery (Zen2):该模块处理节点发现和主节点选举,确保节点能够相互发现并可靠地形成集群。
关键节点角色
在高可用性设置中,理解节点角色至关重要。与高可用性相关的主要角色有:
- 符合主节点条件的节点:这些节点负责管理集群状态,包括索引创建/删除、跟踪节点和分片分配。除非它们也拥有
data角色,否则它们不直接存储数据或处理搜索/索引请求。为了实现高可用性,你应该拥有奇数个(通常是3个)专用的符合主节点条件的节点来形成法定人数。 - 数据节点:这些节点将索引数据存储在分片中,并执行与数据相关的操作,如搜索、聚合和索引。它们是集群的主力。
- 仅协调节点:(可选)这些节点可用于路由请求、处理搜索归约阶段以及管理批量索引。它们不保存数据或集群状态,但可以减轻数据节点和主节点的工作负担。
分片和副本
Elasticsearch将数据存储在分片中。每个索引由一个或多个主分片组成。为了实现高可用性,你应该为每个主分片配置一个或多个副本分片。副本分片是主分片的副本。如果托管主分片的节点发生故障,另一个节点上的副本分片可以被提升为新的主分片,从而确保数据不丢失并持续运行。
搭建高可用性集群的前提条件
在深入配置之前,请确保你的环境满足以下基本要求:
- Elasticsearch包或归档文件:官方包在最近的Elasticsearch版本中包含了捆绑的JDK。如果你的安装使用单独的JDK,请确保它与你的Elasticsearch版本兼容。
- 系统资源:为每个节点分配足够的RAM(例如8-32GB)、CPU核心和快速I/O磁盘空间(推荐SSD),尤其是数据节点。
- 网络配置:所有节点必须能够通过特定端口(节点间通信默认9300,HTTP API默认9200)相互通信。确保防火墙配置正确。
- 操作系统:生产环境通常首选稳定的Linux发行版(例如Ubuntu、CentOS、RHEL)。
高可用性集群搭建分步指南
本节概述了安装和配置多节点Elasticsearch集群的过程。
步骤1:在所有节点上安装Elasticsearch
在将成为集群一部分的每台服务器上安装Elasticsearch。你可以使用包管理器(Debian/Ubuntu使用APT,RHEL/CentOS使用YUM)或直接下载归档文件。
示例(Debian/Ubuntu通过APT):
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
安装后,启用并启动服务(不过我们会先进行配置)。
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
步骤2:在每个节点上配置elasticsearch.yml
elasticsearch.yml文件通常位于/etc/elasticsearch/,你可以在其中定义集群的设置。在每个节点上编辑此文件,并应用适当的配置。
所有节点的通用配置
cluster.name:所有要加入同一集群的节点必须相同。cluster.name: my-ha-clusternode.name:每个节点的唯一名称,有助于识别。node.name: node-1network.host:将Elasticsearch绑定到特定的网络接口。使用0.0.0.0绑定到所有可用接口,或使用特定IP地址。network.host: 0.0.0.0 # 或为安全/多网卡设置指定IP地址 # network.host: 192.168.1.101http.port:HTTP客户端通信端口(默认9200)。http.port: 9200transport.port:节点间通信端口(默认9300)。应保持一致。transport.port: 9300
发现设置(对高可用性至关重要)
这些设置告诉节点如何相互发现并形成集群。
discovery.seed_hosts:集群中符合主节点条件的节点地址列表。这是节点发现初始符合主节点条件的节点的方式。提供所有符合主节点条件的节点的IP地址或主机名。discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]cluster.initial_master_nodes:仅用于首次引导全新集群。此列表应包含将参与首次主节点选举的符合主节点条件的节点的node.name。集群形成后,此设置将被忽略。cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- 重要提示:集群成功形成后,请移除或注释掉
cluster.initial_master_nodes。不要在重启或添加新节点时再次设置它。
- 重要提示:集群成功形成后,请移除或注释掉
节点角色配置
为每个节点指定角色。常见的高可用性设置包括3个专用主节点和多个数据节点。
- 符合主节点条件的节点(例如node-1、node-2、node-3):
node.roles: [master] - 数据节点(例如node-4、node-5、node-6):
node.roles: [data] - 混合角色节点(不推荐用于大型生产高可用性):
node.roles: [master, data]- 最佳实践:为了在生产环境中实现真正的高可用性和稳定性,请将主节点和数据节点角色分开部署在专用节点上。这可以将关键的主节点进程与资源密集型的数据操作隔离开来。
步骤3:配置JVM堆大小
编辑/etc/elasticsearch/jvm.options以设置JVM堆大小。一个好的经验法则是分配可用RAM的50%,但不要超过30-32GB。例如,如果服务器有16GB RAM,则分配8GB:
-Xms8g
-Xmx8g
步骤4:系统设置
对于生产环境,在所有节点上增加vm.max_map_count和打开文件的ulimit。将这些行添加到/etc/sysctl.conf并应用(sudo sysctl -p)。
vm.max_map_count=262144
并在/etc/security/limits.conf(或/etc/security/limits.d/99-elasticsearch.conf)中:
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
步骤5:启动Elasticsearch服务
在所有已配置的节点上启动Elasticsearch服务。通常建议先启动符合主节点条件的节点,但使用现代发现机制,只要正确配置了discovery.seed_hosts,顺序就不那么重要了。
sudo systemctl start elasticsearch
检查服务状态和日志以查找任何错误:
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
步骤6:验证集群健康状态
所有节点运行后,使用Elasticsearch API验证集群健康状态。你可以查询集群中的任何节点。
curl -X GET "localhost:9200/_cat/health?v&pretty"
预期输出:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00 my-ha-cluster green 6 3 0 0 0 0 0 0 - 100.0%
status:应为green(所有主分片和副本分片都已分配)或yellow(所有主分片已分配,但某些副本分片尚未分配)。red表示严重问题。node.total:应与启动的节点总数匹配。node.data:应与数据节点数量匹配。
检查节点以确保它们都已加入集群:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
预期输出(例如3个主节点、3个数据节点):
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 21 87 0 0.00 0.01 0.05 m * node-1
192.168.1.102 20 88 0 0.00 0.01 0.05 m - node-2
192.168.1.103 22 86 0 0.00 0.01 0.05 m - node-3
192.168.1.104 35 90 1 0.10 0.12 0.11 d - node-4
192.168.1.105 32 89 1 0.11 0.13 0.10 d - node-5
192.168.1.106 30 91 1 0.12 0.10 0.09 d - node-6
这显示node-1是选举出的主节点(master列下的*),其他节点是集群的一部分。
步骤7:配置索引分片和复制
对于新创建的索引,Elasticsearch默认使用一个主分片和一个副本(index.number_of_shards: 1,index.number_of_replicas: 1)。为了实现高可用性,你通常需要至少一个副本,这意味着你的数据至少存在于两个不同的节点上。这确保如果一个节点发生故障,其他地方还有副本可用。
创建索引时,指定这些设置:
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}'
如果启用了安全功能,请在curl命令中使用HTTPS和凭据或API密钥。例如:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic "https://localhost:9200/_cluster/health?pretty"
运维检查
在集群变为绿色后,在生产流量依赖它之前验证故障行为:
- 停止一个数据节点,确认副本被提升且主分片保持可用。
- 停止选举出的主节点,确认另一个符合主节点条件的节点被选举。
- 在集群稳定后检查
_cat/shards?v中是否有未分配的分片。 - 确认客户端通过多个节点或负载均衡器连接,而不是单个HTTP端点。
最终要点
Elasticsearch的高可用性来自三个实际选择:保持可靠的主节点法定人数、将分片副本放置在不同节点上、以及使客户端能够容忍节点丢失。从三个专用的符合主节点条件的节点、足够容纳主分片和副本分片的数据节点,以及经过测试的节点重启和故障恢复程序开始。