Discovery模块负责发现集群中的节点,以及选择主节点。ES支持多种不同的Discovery选择,内置的实现称为Zen Discovery,其封装了节点发现(ping)、选主等实现过程。本文基于ES 6.7。
这三种Node你晓得伐
Node Name | Node Role | 看不懂英文? | 配置(其他配成false) |
---|---|---|---|
Master-eligible node | A node that has node.master set to true (default), which makes it eligible to be elected as the master node, which controls the cluster. | 主节点:负责集群层面的相关操作,管理集群变更。尽可能做少量的工作,生产环境应该尽量分离主节点和数据节点。 | node.master: true |
Data node | A node that has node.data set to true (default). Data nodes hold data and perform data related operations such as CRUD, search, and aggregations. | 数据节点:负责保存数据、执行数据相关操作:CRUD、搜索、聚合等。对CPU、内存、IO要求较高。一般情况下,数据读写流程只和数据节点交互,不会和主节点打交道(异常情况除外)。 | node.data: true |
Ingest node | A node that has node.ingest set to true (default). Ingest nodes are able to apply an ingest pipeline to a document in order to transform and enrich the document before indexing. With a heavy ingest load, it makes sense to use dedicated ingest nodes and to mark the master and data nodes as node.ingest: false. | 预处理节点:从5.0引入的概念。通过定义一系列的processors处理器和pipeline管道,对数据进行某种转换、富化。 | node.ingest: true |
Master节点的特殊性
ES中有一项工作是Master独有的:维护集群状态。集群状态信息,只由Master节点进行维护,并且同步到集群中所有节点,其他节点只负责接收从Master同步过来的集群信息而没有维护的权利。集群状态包括以下信息:
- 集群层面的配置
- 集群内有哪些节点
- 各索引的设置,映射,分析器和别名等
- 索引内各分片所在的节点位置
【思维拓展】ES集群中的每个节点都会存储集群状态,知道索引内各分片所在的节点位置,因此在整个集群中的任意节点都可以知道一条数据该往哪个节点分片上存储。反之也知道该去哪个分片读。所以,Elasticsearch不需要将读写请求发送到Master节点,任何节点都可以作为数据读写的切入点对请求进行响应。这样进一步减轻了Master节点的网络压力,同时提高了集群的整体路由性能。
主从模式 VS. 无主模式
分布式系统的集群方式大致可以分为主从模式(Master-Slave)和无主模式。
模式 | 代表组件 | 优点 | 缺点 |
---|---|---|---|
主从模式 | ES/HDFS/HBase | 简化系统设计,Master作为权威节点,负责维护集群原信息。 | Master节点存在单点故障,需要解决在被问题,并且集群规模会受限于Master节点的管理能力。 |
无主模式 | Cassandra | 分布式哈希表(DHT),支持每小时数千个节点的离开和加入。集群没有master的概念,所有节点都是同样的角色,彻底避免了整个系统的单点问题导致的不稳定性。 | 多个节点可能操作同一条数据,数据一致性上可能比较难以保证。 |
为什么主从模式更适合ES
ES的典型场景中的节点数没有那么多(目前官方推荐是几百节点)。一般情况下,节点的数量远远小于单个节点能够维护的连接数,并且网络环境下不必经常处理节点的加入和离开。这就是为什么主从模式更加适合ES。
主节点的选举机制
【举个栗子】通常一个HBase集群存在多个HMaster节点(有资格成为Active HMaster),每个节点都会向ZooKeeper注册,在正常情况下有且仅有一个节点会成为Active Master,其余都为Backup Master。它们将一直处于阻塞状态,直至/hbase/master节点发生delete事件,当Zookeeper Watcher监听到此事件,回唤醒阻塞的Backup Master再次去/master节点注册,如果注册成功就会成为Active HMaster,对外提供服务;如果注册失败,说明已经有节点注册成功,就只能再次阻塞等待被唤醒。
Elasticsearch不像Solr,HDFS和HBase依赖于ZooKeeper,Elasticsearch自己有一套选举机制来保证集群的协同服务。
- Bully算法
Leader选举的基本算法之一,优点是易于实现,该算法和Solr Leader Shard选举非常相似。
该算法假定所有节点都有一个唯一的ID,使用该ID对节点进行排序,选择最小的节点作为Master。参考ElectMasterService的函数electMaster
但是节点处于不稳定状态下会出问题,比如Master负载过重而假死(推迟选举解决假死 +