集群介绍
2023年8月26日大约 8 分钟
ES分布式集群架构特性
集群
- 在一个ES集群中,通过多个ES实例组成,其中有一个为主节点(master)
- ES是去中心化的,所以主节点是动态选举出来的,不是单点故障
- 你与任何一个节点通信和与整个ES集群通信结果是一样的
- 节点通信
- 在同一个子网中,只需要在每个节点上设置相同的集群名,ES就自动把这些几圈名相同的节点组成一个集群
- 节点与节点间通信以及节点之间的数据分配和平衡完全由ES自动管理
- 一个ES集群建议数量不要超过100个节点
节点
- 每个运行ES实例称为一个节点,每一个ES运行实例(服务器进程)既可以在同一个机器上,也可以在不同机器上
- 在测试环境中,可以在一台服务器上运行多个服务器进程
- 在生产环境中,建议每一台服务器运行一个服务器进程
- ES7中节点(node)主要有4中类型
- 主节点(Master)
- 数据节点(data)
- 协调节点(Coordinating)
- 预处理节点
ES集群架构
架构介绍
- 真实环境中需要至少 9 台机器

ES 主节点(Master)
ES主节点作用(Master)
主节点主要负责集群中的轻量级操作,负责创建索引,删除索引,分配分配,追踪集群中的节点状态等工作
集群中的大脑,非常重要(不存储数据)
集群中如果某一个主节点挂掉,从节点会重新选择主节点
生产环境master部署建议
- 使用独立节点,尽量与data分开
- 数据节点达到3个,主节点至少三台
- 采用低配的服务器资源即可
ES数据节点(Data)
数据节点
数据节点存储了所有的分配,文档,索引数据
主要处理数据相关的操作,CRUD、搜索和聚合
数据节点需要大量的空间来存储数据,索引和搜索等数据操作对CPU、内存、IO密集型的消耗非常大
需要大量的磁盘空间来存储数据
生产环境Data节点建议
- 单节点处理数据量5TB内
- 采用高配置的服务器资源(内存不建议超过64G,高速硬盘)
协调节点(Coordinating)
- 协调节点主要用来负载均衡,把客户端的请求转发分配给最合适的节点来处理,降低主节点和数据节点负载
- 在校集群中,协调节点的功能可以有主节点或数据节点来完成
- 生产环境建议
- 大型集群中协调节点知识3个
- 采用中高配置的服务器资源
预处理节点(Ingest)
- ES支持在将数据写入索引之前对数据进行预处理,内容富华等操作
- Ingest节点的功能抽象为:大数据处理环节的ETL(抽取、转换、加载)
- 所有的节点都是默认支持ingest的,任何节点都可以处理ingest请求
- 注意:监控数需要走ingest node进入集群,所以不建议关闭ingest功能
Recovery
- 数据恢复或者叫做数据重新分布
- 在ES集群中当前节点加入或退出时他会根据机器的负载均衡对索引分片进行重新分配
- 当挂掉的节点再次重新启动的时候也会进行数据恢复
River
- ES river 代表的是一个数据源,这也是从其他数据库同步数据到ES的方法
gateway
- 代表ES索引的持久化存储方式,ES默认是先把索引存放到内存中去
- 当内存满了的时候再持久化到硬盘里,当ES集群关闭或者再次重新启动时就会从gateway中读取索引数据
Transport
- Transport代表ES内部的节点或者集群与客户端之间的交互方式
- 默认的内部是使用tcp协议(如9300端口)来进行交互的,同时也支持http协议等多种传输协议
ES分布式集群特性
分片(shards)
- ES会把一个索引分解成多个小索引,每个小的索引就叫做分片
- 再把各个分片分配到不同的节点中去
- 过多的分片数量会照成较大的管理压力,ES7.x 默认分片为1
- 注:类似MySQL的分库分表
生产环境建议
- 搜索场景下一个分片大小建议不要操作30G索引
- 整个集群的分片数量建议不超过10万个
- 分片越多,单分片数据就约少,约分散,但是管理压力会更大
副本(replicas)
- ES的每一个分片都可以有0~N个副本,而每个副本也都是分片的完整拷贝
- 作用:故障转移/集群恢复,通过副本进行负载均衡
- ES的某一个节点数据损坏或者服务器不可用的时候,那么这个时候就可以用其他节点来替换坏掉的节点,已到达高可用的目的
- 当主分片异常时,副本可以提供数据的查询等操作
- 对文档的新建、索引和删除请求都是写操作,必须在主分片上完成之后才能被复制到相关的副本分片
生产环境建议
- 副本数(replicas)最低为1
- 副本越多消耗约大,但也越保险
副本存储过程
- 客户端中存储一个数据时,先进行分片,这里分成六个片
- 分别是:Node1(P0、P4)、Node2(P1、P3)、Node2(P2、P5)
- 然后对于每个分片,在其他节点上创建了一个副本
- 比如:node1中的P0的副本就在node2的R0中
- 副本实质上就是对分片的备份,保证数据不会丢失

ES分布式集群路由机制
集群是如何组成的
- A. 首先启动第一个节点fgNode1
- 第一个节点的一定是主节点,主节点存储的是集群的元数据信息
- B. 然后启动第二个节点fgNode2
- 启动之前会配置集群的名称Cluster-name:fgescluster1
- 然后配置可以作为主节点的IP地址信息 [“192.168.56.11”,“192.168.56.21”]
- 配置自己的ip地址network.host:192.168.56.12
- C. fgNode2启动的过程
- fgNode2启动的过程中会去找到主节点fgNode1,告诉fgNode1我要加入到集群
- 主节点fgNode1接受到请求后看看fgNode2是否满足加入集群的条件
- 如果满足就把fgNode2的ip地址加入的元信息里面,然后广播给集群中的其他节点
- 主节点会把最新的元信息发送给其他的节点中更新
集群中的索引是如何创建
的?
- 客户端请求到fgNode3节点创建索引
- fgNode3节点把请求转发给master主节点
- master主节点选择一个合适节点来存储分片和副本,并记录元信息
- 然后master主节点通知集群中存放索引分片和副本的相应节点,进行创建分片和副本
- 创建节点会向master主节点反馈结果
- master主节点向fgNode3反馈结果
- fgNode3节点响应客户端请求
- master主节点将元信息广播给所有从节点

集群中如何存放文档
?
- 客户端请求fgNode3,fgNode3计算文档路由值并得到文档存放的分片(如:分片P1)
- fgNode3将文档转发给分片1(P1)的主分片节点fgNode2
- fgNode2索引文档,同步给副本(R1)节点fgNode1索引文档
- fgNode2向fgNode3反馈结果
- fgNode3做出相应

ES集群如何搜索文档
- 客户端搜索索引 fgindex,并请求 fgNode3
- fgNode3将查询发给索引 fgindex 的 分片/副本节点(P0P5,R0R5)
- 各个节点执行查询,将结果给 fgNode3
- fgNode3合并结果,响应客户端

- 举例:
- 所以 fgindex 中有6个分片,每个分片有1个副本,共12个分片
- 一次搜索请求会由6个分片来完成,他们可能是主分片也可能是副本分片【如:P0,P1,P2,R3,R4,R5】
- 所以一次搜索请求智慧命中所有分片副本中的一个(分片/副本),所以增加副本数不会因并行查询而变快
- 但是在某些场景下多个副本,可能会选择出一个当前集群状态写能快速响应的副本,从而加快速度