ES分布式集群架构如何实现?

南风 2020年10月24日 265次浏览

 Elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的。核心思想就是在多台机器上启动多个es进程实例,组成了一个es集群。如果使用ES集群,会将单台服务器节点的索引文件使用分片技术,分布式的存放在多个不同的物理机器上,从而可以实现高可用、容错性等。

一、什么是分片?

分片是ES将索引数据切分成多个块多节点存放部署。

二、ES如何解决高并发问题?

ES使用分片技术将索引技术分布到不同的节点,同时构建一定数量(可由用户指定,默认是1)的replica分布到不同节点,一般的相同的shards和replica不会在同一个节点上,为了保证了集群的高可用。下面了解下shards和replica:

  • shards
    es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
  • replica
    es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

理论上一个shards存在更多的replica,说明集群的查询能力越强,但是太多的shards会增加协调节点每次查询结果的性能负担。

三、什么将索引写入ES集群?

ES集群是主从模式,当用户向集群新建索引,ES在创建完成后,就会向各个节点进行主从同步。
ES写入主从同步

  • 1、索引数据先写入Master的主分片;
  • 2、写入master主分片成功后,同步到各个节点的主分片;
  • 3、相应的同步到各个节点的副分片(replica).

(一)、ES集群是如何保证数据的一致性和实时性?

1、ES集群一致性

 在一致性的条件下,系统在执行数据更新操作之后能够从一致性状态转移到另一个一致性状态。
 对系统的一个数据更新成功之后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性。

ES数据并发冲突控制是基于的乐观锁和版本号的机制
 一个document第一次创建的时候,它的_version内部版本号就是1;以后,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1;哪怕是删除,也会对这条数据的版本号加1(假删除)。
 客户端对es数据做更新的时候,如果带上了版本号,那带的版本号与es中文档的版本号一致才能修改成功,否则抛出异常。如果客户端没有带上版本号,首先会读取最新版本号才做更新尝试,这个尝试类似于CAS操作,可能需要尝试很多次才能成功。乐观锁的好处是不需要互斥锁的参与。
 es节点更新之后会向副本节点同步更新数据(同步写入),直到所有副本都更新了才返回成功。

2、ES集群实时性

前面文章已经简述了ES准实时架构的实现 准实时构建索引

(二)、ES选主算法

1、Bully算法

选举的流程说明如下:
节点node向所有比自己大的节点发送选举消息(选举为election消息)
如果节点node得不到任何回复(回复为alive消息),那么节点node成为master,并向所有的其它节点宣布自己是master(宣布为Victory消息)
如果node得到了任何回复,node节点就一定不是master,同时等待Victory消息,如果等待Victory超时那么重新发起选举。

2、Raft算法

raft协议中,一个节点任一时刻处于以下三个状态之一:

  • leader
  • follower
  • candidate

给出状态转移图能很直观的直到这三个状态的区别

  可以看出所有节点启动时都是follower状态;在一段时间内如果没有收到来自leader的心跳,从follower切换到candidate,发起选举;如果收到majority的造成票(含自己的一票)则切换到leader状态;如果发现其他节点比自己更新,则主动切换到follower。

   总之,系统中最多只有一个leader,如果在一段时间里发现没有leader,则大家通过选举-投票选出leader。leader会不停的给follower发心跳消息,表明自己的存活状态。如果leader故障,那么follower会转换成candidate,重新选出leader。

3、Paxos算法

请阅

四、什么在ES集群上检索数据?

ES检索处理

ES检索首先去master节点获取该数据存储的节点位置,因而直接去该机器上查询其副本内容,如果副本内容有多个,就会做负载均衡。


参考:Elasticsearch选举原理之Bully算法
参考:axos、Raft分布式一致性最佳实践 写文章