简介

ES通常以集群方式工作,这样做不仅能够提高,ES的搜索能力还可以处理大数据搜索的能力,同时也增加了系统的容错能力及高可用,ES可以实现PB级数据的搜索

1. 结(节)点: ES集群由多个服务器组成,每个服务器即为一个Node结点(该服务只部署了一个ES进程)。
2. 当我们的文档量很大时,由于内存和硬盘的限制,同时也为了提高ES的处理能力、容错能力及高可用能力,我们将索引分成若干分片,每个分片可以放在不同的服务器,这样就实现了多个服务器共同对外提供索引及搜索服务。 一个搜索请求过来,会分别从各各分片去查询,最后将查询到的数据合并返回给用户。
3、副本为了提高ES的高可用同时也为了提高搜索的吞吐量,我们将分片复制一份或多份存储在其它的服务器,这样即使当前的服务器挂掉了,拥有副本的服务器照常可以提供服务。
4、主结点一个集群中会有一个或多个主结点,主结点的作用是集群管理,比如增加节点,移除节点等,主结点挂掉后ES会重新选一个主结点。
5、结点转发每个结点都知道其它结点的信息,我们可以对任意一个结点发起请求,接收请求的结点会转发给其它结点查询数据。

结点配置:

主结点:master节点主要用于集群的管理及索引比如新增结点、分片分配、索引的新增和删除等。

数据结点:data 节点上保存了数据分片,它负责索引和搜索操作。

客户端结点:client节点仅作为请求客户端存在,client的作用也作为负载均衡器,client节点不存数据,只是将请求均衡转发到其它结点。

集群健康

GET 请求:http://localhost:9200/_cluster/health

green:所有的主分片和副本分片都正常运行

yellow:所有的主分片都正常运行,但有些副本分片运行不正常

red:存在主分片运行不正常

存储数据在哪个节点?

当我们向一个集群存储数据时,文档是存储在哪个节点呢?是随机还是轮询呢?
实际上会采用计算公式确定存储在哪个节点。

shard=hash(routing) % number_of_primary_shards

  • routing是一个任意字符创,默认是ID,也可以自定义;
  • 这个routing字符串通过hash函数,然后除以主分片数量得到一个余数,(0<余数<number_of_primary_shards数),余数就是特定文档所在分片;

写操作

es集群高可用架构图 es 集群架构图_java

1.客户端向node1节点发送新建,索引和删除请求(都属于写操作)
2.节点根据_id确定文档属于分片0,于是转发请求node3(因为分片0在此)
3.node3在主分片执行请求,如果成功,将请求转发到node1和node2的复制节点,当所有复制节点报告成功,node3报告成功到请求的节点,请求的节点再报告给客户端,客户端收到成功响应式,文档修改已经被应用到主分片和所有副本分片,修改生效

搜索文档

es集群高可用架构图 es 集群架构图_java_02

1.客户端给node1发送get请求
2.节点根据_id确定文档属于分片0,分片0对应的分片在三个节点都有,他转发请求到node2(也可以是node3)
3.node2返回文档给node1,然后返回给客户端

注意:为了负载均衡,请求节点会为每个请求选择不同的分片