ElasticSearch -- 理论学习

- 介绍

    他的核心概念就是去中心化。对于ES集群外部来说,Es集群就是一个整体,和任何一个节点的通信和对整个整体集群的通信代价是相等的。

    一个索引默认会有一个副本(replicas),5个分片(shards);

如图:

- 节点

ES有3种节点,分别为主节点,数据节点和客户端节点。

1. 主节点

以3台机器为例,会自动选举主节点,一旦主节点挂掉,另外2台会有一台升级为主节点。3台集群在挂掉任何一台都可以继续工作。主节点主要负责创建和删除索引,跟踪节点,对节点的发现和删除。同时可以管理分片和副本的状态。

2. 数据节点

主要是用来储存数据的节点。主要对文档数据进行增删查改以及聚合查询操作。此节点由于是和数据打交道,一般会有很多Io操作,所以这些节点会耗大量的内存和cpu。

扫描二维码关注公众号,回复: 4262356 查看本文章

3. 客户端节点

    即非主节点,也非数据节点。比如Transport Client, Node Client。他能处理路由请求,搜索请求,分发索引等。实际上来说,他就是数据节点和主节点的桥梁,负责协调二者。

    遍历方式:每次请求通过AtomicInteger进行原子加1(超过最大值后设置为0),按当前可用client数取模。

- 1. 节点客户端(Node Client)

    节点客户端是集群中的节点,不是主节点也不是数据节点。但是由于他是集群中节点的一部分,他可以轻松的探知整个节点的状态,包括其他节点的位置,分片在节点上的分配,数据分配的位置等等。正因为他已经是集群中的一部分,所以集群中的其他节点都会尝试和他建立Tcp连接。

    此时如果集群十分庞大,或者有很多节点客户端,这时候开销就会非常大。因为他和其他节点联系密切,所以他一直具有最新的集群状态。当有请求进来,可以跳过网络跳转,直接联系其他节点,减少整体工作量,并不会出现双跳。

- 2. 传输客户端(Transport Client)

    轻量级,不需要像节点客户端一样加入集群,只作为集群和应用之间的传输通信。他只需要服务嗅探整个集群,收集各个节点的数据,最后一期返回给客户端。由于用java编写,他是在JVM上运行(这里涉及到GC,后续再谈),速度很快,可以实现序列化,因此对Es实例的操作几乎没有开销。后续在对集群进行传输的时候,还会支持加密以及身份验证。

    工作时他会遍历所有可以连接的节点的client,但是很有可能这个节点本身是不可用的。比如正在修复数据、还未加入集群等等。因此这里会发生双跳,当遍历到node1,但是数据在node2,此时会先转发到node1,再通过node1转发到node2。

注意点:

由于节点客户端和传输客户端的差异,会出现当某一个节点挂掉的时候:对于传输客户端来说,这个节点成功连接了,但是当使用client来发起请求的时候,就会出现异常;对于节点客户端就不会有这样的情况,由于他就是属于集群中的节点,对于这些坏掉的节点,会踢出这个集群,所以对于这个挂掉的节点,节点客户端是不可见的。

若有错误,恳请指正,万分感谢!!!

猜你喜欢

转载自my.oschina.net/u/3095034/blog/2875960