Appearance
Hello ElasticSearch - 集群
1. ES 集群节点角色
在 ElasticSearch 集群中,节点可以根据其职责分配不同的角色,以优化性能、提高可用性并实现分布式功能。ElasticSearch 节点可以通过 node.roles 配置项分配一个或多个角色。以下是主要角色:
主节点(Master Node)
负责集群的管理和协调任务,如创建/删除索引、跟踪节点状态、分片分配等。不直接处理数据存储或查询,但对集群元数据的管理至关重要。
只需要轻量资源(低 CPU 和内存需求)。建议部署奇数个主节点(至少 3 个)以避免脑裂。需设置
discovery.zen.minimum_master_nodes为 , 为主节点数(7.x 起已自动配置)。只有一个主节点处于活跃状态,其余为主备。
YAMLnode.roles: [master]数据节点(Data Node)
存储索引数据,执行数据相关的操作(如索引、搜索、聚合等)。
分为以下子角色(ElasticSearch 8.x 细化了数据角色):
data:通用数据节点,处理所有数据操作;data_content:存储常规文档数据;data_hot:处理高频写入/查询的热数据(需高性能硬件);data_warm:存储较少访问的数据;data_cold:存储极少访问的归档数据;data_frozen:存储几乎不访问的冷冻数据(需快照支持)。
建议根据数据访问模式分配不同子角色(如 “热-温-冷” 架构),以优化资源使用。
YAMLnode.roles: [data]协调节点(Coordinating Node)
负责协调客户端请求,路由查询到正确的数据节点,汇总结果。不存储数据,也不参与主节点选举。默认情况下,所有节点都具有协调功能,但可以专设协调节点以减轻其他节点的压力。
需要足够的 CPU 和内存来处理查询合并和结果排序。建议在大型集群中,设置专用协调节点以提高查询性能。
YAMLnode.roles: []摄入节点(Ingest Node)
处理数据预处理管道(如数据转换、过滤、丰富)。执行 ingest pipeline,例如解析日志、添加时间戳等。
YAMLnode.roles: [ingest]
如果不指定 node.roles,节点默认具有以上所有角色。
大型集群中,建议为主节点、数据节点、协调节点分配专用机器。如:3 个主节点(仅 master)、5 个数据节点(data_hot/data_warm)、3 个协调节点。
2. ES 集群数据分片
ElasticSearch 集群支持数据分片,将索引数据分片存储在不同数据节点上,同时还支持副本分片,主分片和副本分片存储在不同节点上,以确保高可用性。
当新增文档时 Coordinating 节点会通过 Hash 算法来计算文档应该存储的分片,具体公式如下:
:文档 Id; :哈希函数; :目标索引的主分片数量; :文档将被分配到的主分片编号。
可以看到,算法与分片数量有关,因此索引库一旦创建便不能修改分片数量。
3. ES 分布式查询流程
ES 的分布式查询工作流程可以概括为以下几个步骤:
查询接收:客户端发送查询请求到 ES 集群的某个 Coordinating 节点;
查询解析:协调节点解析查询请求,确定涉及的索引和分片(Shards),并生成查询计划;
分片查询:
- 协调节点将查询分发到包含相关数据的分片(可能分布在不同节点上);
- 每个分片独立执行查询,搜索本地数据,生成初步结果(如匹配的文档 Id 和评分)。
结果合并:
- 各分片将查询结果返回给协调节点;
- 协调节点合并结果,进行排序、分页或聚合等操作,生成最终结果集。
响应返回:协调节点将最终结果返回给客户端。
4. 配置索引的分片、副本数量
JSON
PUT /product
{
"settings": {
"number_of_shards": 3, // 主分片数量
"number_of_replicas": 2 // 副本分片数量
},
"mappings": {
/* ... */
}
}