Elasticsearch 5.X集群多节点角色配置深入详解
问题引出
ES5.X节点类型多了ingest节点类型。
针对3个节点、5个节点或更多节点的集群,如何配置节点角色才能使得系统性能最优呢?
ES2.X及之前版本节点角色概述
Elasticsearch集群中的三种角色
- master node:master 节点主要用于元数据(metadata)的处理,比如索引的新增、删除、分片分配等。
- data node:data 节点上保存了数据分片。它负责数据相关操作,比如分片的 CRUD,以及搜索和整合操作。这些操作都比较消耗 CPU、内存和 I/O 资源;
- client node:client 节点起到路由请求的作用,实际上可以看做负载均衡器。
其对应的高性能集群拓扑结构模式为:
# 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下:
# 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为负载器
# node.master: false
# node.data: true
# 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器
# node.master: true
# node.data: false
# 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等
# node.master: false
# node.data: false
ES5.X节点角色清单
由于其他几种类型节点和用途都很好理解,无非主节点、数据节点、路由节点。
主节点,主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。
node.master:true数据节点,即Data节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对CPU、内存、IO要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
node.data:true负载均衡节点,也称作 Client 节点,也称作客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
预处理节点,也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。
Node.ingest:true-
Ingest的用途:
- Ingest节点和集群中的其他节点一样,但是它能够创建多个处理器管道,用以修改传入文档。类似最常用的Logstash过滤器已被实现为处理器。
- Ingest节点 可用于执行常见的数据转换和丰富。 处理器配置为形成管道。 在写入时,Ingest Node有20个内置处理器,例如grok,date,gsub,小写/大写,删除和重命名。
- 在批量请求或索引操作之前,Ingest节点拦截请求,并对文档进行处理。
这样的处理器的一个例子可以是日期处理器,其用于解析字段中的日期。
另一个例子是转换处理器,它将字段值转换为目标类型,例如将字符串转换为整数。
ES5.X节点组合类型有多种类型,如何抉择?
一个节点的缺省配置是:主节点+数据节点两属性为一身。对于3-5个节点的小集群来讲,通常让所有节点存储数据和具有获得主节点的资格。你可以将任何请求发送给任何节点,并且由于所有节点都具有集群状态的副本,它们知道如何路由请求。
通常只有较大的集群才能开始分离专用主节点、数据节点。对于许多用户场景,路由节点根本不一定是必需的。
专用协调节点(也称为client节点或路由节点)从数据节点中消除了聚合/查询的请求解析和最终阶段,并允许他们专注于处理数据。
在多大程度上这对集群有好处将因情况而异。 通常我会说,在查询大量使用情况下路由节点更常见。
ES5.X集群中如何设置节点角色
对于3个节点、5个节点甚至更多节点角色的配置,Elasticsearch官网、国内外论坛、博客都没有明确的定义。
我的思考如下:
- 1.对于Ingest节点,如果我们没有格式转换、类型转换等需求,直接设置为false。
- 2.3-5个节点属于轻量级集群,要保证主节点个数满足((节点数/2)+1)。
- 3.轻量级集群,节点的多重属性如:Master&Data设置为同一个节点可以理解的。
- 4.如果进一步优化,5节点可以将Master和Data再分离。
config/elasticsearch.ymal中配置项说明
- cluster_name 集群名称,默认为elasticsearch,这里我们设置为es5.2.1Cluster
- node.name配置节点名,用来区分节点
- network.host 是配置可以访问本节点的路由地址
- http.port 路由地址端口
- transport.tcp.port TCP协议转发地址端口
- node.master 是否作为集群的主结点 ,值为true或true
- node.data 是否存储数据,值为true或true
- discovery.zen.ping.unicast.hosts 用来配置所有用来组建集群的机器的IP地址,由于5.2.1新版本是不支持多播的,因此这个值需要提前设定好,当集群需要扩展的时候,该值都要做改变,增加新机器的IP地址,如果是在一个ip上,要把TCP协议转发端口写上
- discovery.zen.minimum_master_nodes 用来配置主节点数量的最少值,如果主节点数量低于该值,闭包范围内的集群将会停止服务,之所以加粗体,是因为暂时尚未认证,下面配置为1方便集群更容易形成,即使只有一个主节点,也可以构建集群
- gateway.* 网关的相关配置
- script.* indices.* 根据需求添加的配置(可选)
elasticsearch-5.2.1_1中的yaml文件
该结点作为master-node运行
cluster.name: es5
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
该结点作为data-node运行
node.name: node-2
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
该结点作为client-node运行
cluster.name: es5
node.name: node-3
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: false
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
参考: