分布式系统的集群方式大致可以分为主从(Master-Slave)模式和无主模式。ES、HDFS、HBase使用主从模式,Cassandra使用无主模式。主从模式可以简化系统设计,Master作为权威节点,部分操作仅由Master执行,并负载维护集群元信息。缺点是Master节点存在单点故障,需要解决灾备问题,并且集群规模会受限于Master节点的管理能力。
因此,从集群节点角色的角度划分,至少存在主节点和数据节点,另外还有协调节点、预处理节点和部落节点,下面分别介绍各种类型节点的职能。
1、集群节点角色
(一)主节点(Master node)
主节点负载集群层面的相关操作,管理集群变更。
通过配置node.master: true(默认)使节点具有被选择为Master的资格。主节点是全局唯一的,将从有资格成为Master的节点中进行选举。
主节点也可以作为数据节点,但尽可能做少量的工作,因此生产环境应尽量分离主节点和数据节点,创建独立主节点的配置:
node.master: true
node.data: false
为了防止数据丢失,每个主节点应该知道有资格成为主节点的数量,默认为1,为避免网络分区时出现多主的情况,配置discovery.zen.minimum_master_nodes原则上最小值应该是:
(master_eligible_nodes / 2) + 1
(二)数据节点(Data node)
负责保存数据、执行数据相关操作:CRUD、搜索、聚合等。数据节点对CPU、内存、I/O要求较高。一般情况下,数据读写流程只和数据节点交互,不会和主节点打交道(异常情况除外)。
通过配置node.data: true(默认)来使一个节点成为数据节点,也可以通过下面的配置创建一个数据节点:
node.master: false
node.data: true
node.ingest: false
(三)预处理节点(Ingest node)
这是从5.0版本开始引入的概念。预处理操作允许在索引文档之前,即写入数据之前,通过事先定义好的一系列的processors(处理器)和pipeline(管道),对数据进行某种转化、富化。processors和pipeline拦截bulk和index请求,在应用相关操作后将文档传回给index或bulk API。
默认情况下,在所有的节点上启用ingest,如果想在某个节点上禁用ingest,则可以添加配置node.ingest: false,也可以通过下面的配置创建一个仅用于预处理的节点:
node.master: false
node.data: false
node.ingest: true
(四)协调节点(Coordinating node)
客户端请求可以发送到集群的任何节点,每个节点都直到任意文档所处的位置,然后转发这些请求,收集数据并返回给客户端,处理客户端请求的节点成为协调节点。
协调节点将请求转发给保存数据的数据节点。每个数据节点在本地执行请求,并将结果返回协调节点。协调节点手机完数据后,将每个数据节点的结果合并为单个全局结果。对结果收集和排序的过程可能需要很多CPU和内存资源。
通过下面的配置创建一个仅用于协调的节点:
node.master: false
node.data: false
node.ingest: false
(五)部落节点(Tribe node)
tribes(部落)功能允许部落节点在多个集群之间充当联合客户端。
在ES 5.0之前还有一个客户端节点(Node Client)的角色,客户端节点有以下属性:
node.master: false
node:data: false
它不做主节点,也不做数据节点,仅用于路由请求,本质上是一个只能负载均衡器(从负载均衡器的定义来说,智能和非智能的区别在于是否知道访问的内容存在于哪个节点),从5.0版本开始,这个角色被协调节点(Coordinating node)取代。
2、集群健康状态
从数据完整性的角度划分,集群健康状态分为三种:
(1)Green:所有的主分片和副分片都正常运行。
(2)Yellow:所有的主分片都正常运行,但不是所有的副分片都正常运行。这意味着存在单点故障风险。
(3)Red:有主分片没能正常运行。
每个索引也有上述三种状态,假设丢失了一个副分片,该分片所属的索引和整个集群变为Yellow状态,其他索引仍为Green。
3、集群状态
集群状态元数据是全局信息,云数据包括路由信息、配置信息等,其中最重要的是内容路由信息,它描述了“哪个分片位于哪个节点”这种信息。
集群状态由主节点负载维护,如果主节点从数据节点接收更新,则将这些更新广播到集群的其他节点,让每个节点上的集群状态保持最新。ES 2.0版本之后,更新的集群状态信息只发增量内容,并且是被压缩的。
4、集群扩容
当扩容集群、添加节点时,分片会均衡地分配到集群的各个节点,从而对索引和搜索过程进行负载均衡,这些都是系统自动完成的。
分片副本实现了数据冗余,从而防止硬件故障导致的数据丢失。
下面演示了当集群只有一个节点,到变成两个节点、三个节点时的shard迁移过程示例。
起初,在NODE1上有三个分片,没有副分片,如下图所示:
其中,P代表Primary shard;R代表Replica shard。
添加第二个节点后,副分片被分配到NODE2,如下图所示:
添加第三个节点后,索引的留个分片被平均分配到集群的三个节点,如下图所示:
分片分配过程中除了让节点间均匀存储,还要保证不把主分片和副分片分配到同一节点,避免单个节点故障引起数据丢失。
分布式系统中难免出现故障,当节点异常时,ES会自动处理节点异常。当主节点异常时,集群会重新选举主节点。当某个主分片异常时,会将副分片提升为主分片。
网友评论