目 录CONTENT

文章目录

【原理篇】1. ElasticSearch基本架构

冰点
2023-06-07 / 0 评论 / 0 点赞 / 24 阅读 / 30076 字

1、Elasticsearch 的基本概念

Node(节点)是 ES 架构中最基础的单元,它代表着单个 Elasticsearch 实例。每个节点都可以承担不同的角色,如主节点、数据节点、客户端节点等。主节点负责集群状态的管理,包括索引的创建、删除,节点的加入和离开等;数据节点专注于存储和处理数据;客户端节点则主要用于接收客户端请求,并将请求转发到合适的数据节点。一个节点可以同时承担多个角色,也可以根据业务需求进行角色划分,通过合理配置节点角色,能够充分发挥硬件资源的优势,提升整个集群的性能

概念

描述

Node(节点)

单个 Elasticsearch 实例

Cluster(集群)

多个节点组成的逻辑组

Index(索引)

类似于数据库中的“表”

Document(文档)

JSON 格式的数据记录

Shard(分片)

索引的子集,用于水平拆分数据

Replica(副本)

分片的拷贝,用于容灾与提高性能


2、Elasticsearch 架构图解


3、Elasticsearch 的核心架构原理

1. 分布式分片机制

Elasticsearch 将每个索引分成多个 Shard(分片),每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,从而实现:

  • 负载均衡

  • 数据冗余

  • 横向扩展

📌 主分片数量一旦创建不可更改,副本分片可动态调整。

2. 副本机制(Replication)

每个主分片(Primary Shard)可以配置多个副本(Replica Shard),以提升系统的:

  • 容错能力(故障恢复)

  • 查询吞吐量(负载均衡)

3. 节点角色划分

  • Master Node(主节点):负责管理集群元数据、节点加入/退出等操作。

  • Data Node(数据节点):存储数据并执行 CRUD、搜索、聚合等操作。

  • Ingest Node(摄入节点):负责对数据进行预处理(如转换、过滤)。

  • Coordinating Node(协调节点):接收用户请求,将请求路由到合适节点并汇总结果返回。

一个节点可以同时承担多种角色。


4、Elasticsearch 的工作流程

读取流程(Search)

读取流程(Search)详解

1. 客户端发起搜索请求

  • 客户端发送搜索请求(如 search、get)到协调节点,请求中可指定查询条件、过滤条件、排序等参数。

2. 协调节点广播请求到相关分片

  • 协调节点根据索引的分片配置,确定需要查询的分片(主分片或副本分片,优先选择负载较低的节点)。

  • 对于 查询阶段(Query Phase) ,协调节点将请求广播到所有相关分片(每个分片处理自己的部分数据)。

3. 分片执行本地搜索并返回中间结果

  • 每个分片在本地执行搜索,过滤出符合条件的文档,并提取文档 ID、分数(Score)等信息,形成中间结果集(不返回完整文档内容)。

  • 分片将中间结果返回给协调节点,协调节点收集所有分片的结果后进行全局排序(按分数、指定字段等)。

4. 协调节点汇总结果并获取完整文档(Fetch Phase)

  • 若搜索结果需要返回完整文档(如 get 请求或 search 中指定返回字段),协调节点会根据排序后的文档 ID,向对应的分片发送获取文档请求(仅获取目标文档)。

  • 分片返回完整文档内容,协调节点汇总后整理成最终结果,返回给客户端。。


写入流程(Search)详解

写入流程(Indexing)详解

1. 客户端请求与协调节点路由

  • 客户端发送写入请求(如索引文档、更新文档)到任意节点,该节点自动成为协调节点(Coordinating Node)。

  • 协调节点根据文档的 ID(若未指定则自动生成),通过公式 shard = hash(doc_id) % number_of_primary_shards 计算目标主分片的位置。

2. 转发至主分片所在节点

  • 协调节点将请求转发到目标主分片所在的节点(若主分片所在节点故障,会自动路由到副本分片,后续由副本分片提升为主分片处理)。

3. 主分片写入与副本同步

  • 主分片节点接收请求后,将文档写入本地分片(先写入内存缓冲区,再定期刷新到磁盘)。

  • 主分片完成写入后,会将操作同步到该分片的所有副本分片(Replica Shard)。同步方式为同步复制(默认),即主分片会等待所有副本分片确认写入成功。

4. 响应客户端

  • 当所有副本分片确认写入成功后,主分片节点将成功信号返回给协调节点,最终由协调节点响应客户端,完成写入流程。

  • 写入一致性:可通过 consistency 参数调整(如 one、quorum、all),默认 quorum(要求超过半数的分片成功)。

  • 故障处理:若副本分片写入失败,主分片会记录失败节点,后续重试;若主分片故障,集群会自动选举副本分片成为新主分片。

Elasticsearch 中 Node 的通信机制解析

在 Elasticsearch 的架构体系中,多个 Node(节点)共同组成一个 Cluster(集群),协同工作。而节点之间的高效、稳定通信,是实现集群高可用性、数据一致性以及水平扩展的基础。

接下来,我们将深入解析 Elasticsearch 不同节点之间是如何进行通信的。


一、通信协议与端口

Elasticsearch 基于 TCP 协议 实现节点间的通信,默认使用端口 9300。TCP 是一种面向连接、可靠的传输协议,能够确保节点间交换的关键信息(如集群状态更新、分片分配指令、文档操作请求等)不会丢失或错乱。

⚠️ 注意:
在实际部署中,若默认端口被占用,可通过配置文件修改节点间通信端口,以确保节点正常建立连接。


二、节点发现机制

当新节点加入集群或已有节点感知到集群变化时,需要通过 节点发现机制 来建立通信连接。

Elasticsearch 支持多种发现方式,包括:

  • 组播(Multicast)

  • 单播(Unicast)

推荐使用:单播(Unicast)

在生产环境中,推荐使用单播方式,其优势在于网络开销小、安全性高、可控性强。

单播发现流程如下:

  1. 管理员在每个节点的配置文件中指定部分已知节点的 IP 地址。

  2. 当新节点启动时,会向这些已知节点发送请求,获取当前集群的状态和其他节点列表。

  3. 已知节点收到请求后,返回集群信息,帮助新节点完成初始化。

  4. 新节点将自身信息同步给其他节点,从而完成整个集群的通信连接。

这种方式避免了广播带来的网络负担和安全隐患,提升了节点发现过程的稳定性与效率。

在 Elasticsearch 集群部署中,核心配置文件是 elasticsearch.yml,其配置内容需根据集群规模、节点角色及网络环境等因素进行调整。以下是单播发现机制下典型的集群配置示例及详细说明:

集群配置

# 集群基本配置
cluster.name: my-elasticsearch-cluster  # 集群名称,同一集群内所有节点需一致
node.name: node-1                         # 节点名称,集群内唯一标识

# 节点角色配置(根据需求选择)
node.master: true                         # 是否有资格成为主节点
node.data: true                           # 是否存储数据
node.ingest: true                         # 是否处理 ingest pipeline
# node.ml: true                           # 是否启用机器学习功能(可选)

# 网络配置
network.host: 192.168.1.101               # 节点绑定的IP地址(本机IP)
http.port: 9200                           # HTTP服务端口
transport.port: 9300                      # 节点间通信端口(TCP)

# 单播发现机制配置(生产环境推荐)
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
# 上述IP为集群中部分已知节点的IP地址,新节点通过这些IP发现集群

# 主节点选举配置
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 初始化时参与主节点选举的节点列表,需与node.name对应

# 其他常用配置(可选)
path.data: /data/elasticsearch/data       # 数据存储路径
path.logs: /data/elasticsearch/logs       # 日志存储路径
bootstrap.memory_lock: true               # 锁定物理内存,避免交换分区影响性能
http.cors.enabled: true                   # 启用CORS跨域访问
http.cors.allow-origin: "*"                # 允许所有来源访问(生产环境可限制具体域名)

不同节点的配置差异

1. 主节点(Master Node)

  • 必须配置 node.master: true,建议不存储数据(node.data: false)以减轻负载。

  • discovery.seed_hosts 和 cluster.initial_master_nodes 需包含自身信息。

2. 数据节点(Data Node)

  • 配置 node.data: true,建议分配更多磁盘空间和内存。

  • 可根据需求设置 node.master: false(避免参与主节点选举)。

3. 客户端节点(Client Node)

  • 不存储数据且不参与主节点选举(node.data: false, node.master: false),仅用于接收客户端请求并转发至数据节点。

单播发现机制的部署注意事项

  1. IP地址准确性:
    discovery.seed_hosts 中配置的IP必须可被新节点访问(确保防火墙开放9300端口)。

  2. 初始主节点选举:
    cluster.initial_master_nodes 列表需包含至少3个候选主节点(形成多数派选举),避免脑裂问题。

  3. 动态发现优化:
    若集群节点较多,可配合 cloud discovery(如AWS、阿里云)或容器服务(Kubernetes)实现动态发现,减少手动配置成本。

配置文件示例(三节点集群)

节点1(主节点+数据节点)

cluster.name: es-cluster
node.name: node-1
node.master: true
node.data: true
network.host: 192.168.1.101
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

节点2(主节点+数据节点)

cluster.name: es-cluster
node.name: node-2
node.master: true
node.data: true
network.host: 192.168.1.102
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

节点3(数据节点)

cluster.name: es-cluster
node.name: node-3
node.master: false  # 不参与主节点选举
node.data: true
network.host: 192.168.1.103
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

新节点启动时会通过 discovery.seed_hosts 中的IP连接已知节点,获取集群状态并完成加入流程,确保集群通信的稳定性和安全性。实际部署时需根据硬件资源、网络环境及业务需求调整参数。


三、集群状态同步

集群状态(Cluster State) 包含索引元数据、分片分布、副本状态等关键信息。为了保障集群的一致性和协调性,所有节点都必须保持集群状态的同步。

主节点职责

  • 负责维护和更新集群状态。

  • 当发生以下事件时,主节点生成新的集群状态版本:

    • 创建/删除索引

    • 节点加入/离开

    • 分片重新分配

同步流程

  1. 主节点通过 TCP 连接将新的集群状态广播给所有节点。

  2. 各节点接收后校验版本,并更新本地状态。

  3. 每个节点基于最新状态处理数据操作和请求转发。

这种机制确保了集群内所有节点对集群结构有统一认知,是实现高可用和一致性的重要基础。





0

评论区