Elasticsearch 集群架构与角色
一、Elasticsearch集群架构介绍
集群就是多个node统一对外提供服务。这样,就避免了单节点故障带来的服务的中断,保证了服务的高可用,同时,也因为多台节点的协同运作,提高了集群服务的计算能力和吞吐量。ES服务在实际应用中也是以集群的方式存在着。首先我们看一张典型的集群架构图:
ES集群架构
对于用户来说, ES是一个无中心化的集群,ES集群内部运行原理是对外面来说是透明的。你操作一个节点跟操作一个集群是一样的。也就是说,ES集群没有中心节点,任何一个节点出现故障都不会影响其它节点。这是由ES本身特性所决定的。这是它的典型特征。但是通过集群内部来看ES是有节点的。
在ElasticSearch的架构中,有三类角色,分别是Client Node、Data Node和Master Node,搜索查询的请求一般是经过Client Node来向Data Node获取数据,而索引查询首先请求Master Node节点,然后Master Node将请求分配到多个Data Node节点完成一次索引查询。我们看一下这张图:
典型的ES集群架构
我们讲解一下集群中各节点的作用:
Master Node:可以理解为主节点,用于元数据(metadata)的处理,比如索引的新增、删除、分片分配等,以及管理集群各个节点的状态包括集群节点的协调、调度。elasticsearch集群中可以定义多个主节点,但是,在同一时刻,只有一个主节点起作用,其它定义的主节点,是作为主节点的候选节点存在。当一个主节点故障后,集群会从候选主节点中选举出新的主节点。也就是说,主节点的产生都是由选举产生的。Master节点它仅仅是对索引的管理、集群状态的管理。像其它的对数据的存储、查询都不需要经过这个Master节点。因此在ES集群中。它的压力是比较小的。所以,我们在构建ES的集群当中,Master节点可以不用选择太好的配置,但是我们一定要保证服务器的安全性。因此,必须要保证主节点的稳定性。
Data Node: 存储数据的节点,数据的读取、写入最终的作用都会落到这个上面。数据的分片、搜索、整合等 这些操作都会在数据节点来完成。因此,数据节点的操作都是比较消耗CPU、内存、I/O资源。所以,我们在选择data Node数据节点的时候,硬件配置一定要高一些。高的硬件配置可以获得高效的存储和分析能力。因为最终的结果都是需要到这个节点上来。
Client Node:可选节点。作任务分发使用。它也会存储一些元数据信息,但是不会对数据做任何修改,仅仅用来存储。它的好处是可以分担datanode的一部分压力。因为ES查询是两层汇聚的结果,第一层是在datanode上做查询结果的汇聚。然后把结果发送到client Node 上来。Cllient Node收到结果后会再做第二次的结果汇聚。然后client会把最终的结果返回给用户。
那么从上面的结构图我们可以看到ES集群的工作流程:
1,搜索查询,比如Kibana去查询ES的时候,默认走的是Client Node。然后由Client Node将请求转发到datanode上。datanode上的结构返回给client Node.然后再返回给客户端。
2,索引查询,比如我们调用API去查询的时候,走的是MasterNode,然后由master 将请求转发到相应的数据节点上,然后再由Master将结果返回。
3,最终我们都知道,所有的服务请求都到了datanode上。所以,它的压力是最大的。
二、搭建集群示例
#启动3个虚拟机,分别在3台虚拟机上部署安装Elasticsearch
mkdir /es/es-cluster
#分发到其它机器
scp -r es-cluster elsearch@host:/es
#node01的配置:
cluster.name: es-cluster # 集群名称
node.name: node01 # 节点名称
node.master: true # 是否可以成为master节点
node.data: true # 是否可以成为data节点
network.host: 0.0.0.0 # ip
http.port: 9200 # port
discovery.zen.ping.unicast.hosts: ["host1","host2","host3"] # 集群ip列表
discovery.zen.minimum_master_nodes: 2 # 可以成为master节点的数量, 配置规则 n/2+1
# 设置cors
http.cors.enabled: true
http.cors.allow-origin: "*"
#node02的配置:
cluster.name: es-cluster
node.name: node02
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["host1","host2","host3"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
#node03的配置:
cluster.name: es-cluster
node.name: node02
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts:["host1","host2","host3"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
#分别启动3个节点
./elasticsearch
查看集群:
查询集群状态:/_cluster/health
{
cluster_name: "es-cluster"
status: "green"
timed_out: false
number_of_nodes: 3
number_of_data_nodes: 3
active_primary_shards: 5
active_shards: 10
relocating_shards: 0
initializing_shards: 0
unassigned_shards: 0
delayed_unassigned_shards: 0
number_of_pending_tasks: 0
number_of_in_flight_fetch: 0
task_max_waiting_in_queue_millis: 0
active_shards_percent_as_number: 100
}
分片和副本
为了将数据添加到Elasticsearch,我们需要索引(index)——一个存储关联数据的地方。实际上,索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.
- 一个分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。
- 我们需要知道是分片就是一个Lucene实例,并且它本身就是一个完整的搜索引擎。应用程序不会和它直接通信。
- 分片可以是主分片(primary shard)或者是复制分片(replica shard)。
- 索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
- 复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。
- 当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。
故障转移
总结:如果data节点停止,其他节点会自动分配主分片和和副分片,不会影响使用,当data节点恢复后,整个集群又可以恢复为之前的集群状态。如果master的节点停止,那么其他的data会自动分配一个master节点,如果之前停掉的master节点恢复后,则变为data节点,因为之前的data节点变为了master节点,同一个集群只能有一个master节点。
特别说明:
如果在配置文件中discovery.zen.minimum_master_nodes设置的不是N/2+1时,会出现脑裂问题,之前宕机
更多详情请查看该文档:Elasticsearch集群
相关文章:
ELK Stack系列之基础篇(三) - Elasticsearch集群架构与角色
Elasticsearch集群
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)