ElasticSearch节点类型

本文深入解析Elasticsearch中的四种节点类型:主节点、数据节点、客户端节点和部落节点的功能与配置,探讨如何合理分配节点角色以优化集群性能。

官方文档写得更好: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/modules-node.html

当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接就组成了一个集群。

在默认情况下,集群中的每个节点都可以处理http请求和集群节点间的数据传输,集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。

节点有以下类型

  1. 主(master)节点

    node.master设置为True(默认)的时候,它有资格被选作为主节点,控制整个集群。

  2. 数据(data)节点

    在一个节点上node.data设置为True(默认)的时候。该节点保存数据和执行数据相关的操作,如增删改查,搜索,和聚合

  3. 客户端节点

    当一个节点的node.master和node.data都设置为false的时候,它既不能保持数据也不能成为主节点,该节点可以作为客户端节点,可以响应用户的情况,把相关操作发送到其他节点

  4. 部落节点

    当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作

Elasticsearch的data node除了放数据以外,也可以兼任master和client的角色,对于一个规模较大,用户较多的集群,master和client在一些极端使用情况下可能会有性能瓶颈甚至内存溢出,从而使得共存的data node故障。data node的故障恢复涉及到数据的迁移,对集群资源有一定消耗,容易造成数据写入延迟或者查询减慢。

如果将master和client独立出来,一旦出现问题,重启后几乎是瞬间就恢复的,对用户几乎没有任何影响。另外将这些角色独立出来的以后,也将对应的计算资源消耗从data node剥离出来,更容易掌握data node资源消耗与写入量和查询量之间的联系,便于做容量管理和规划。

 

主(Master)节点说明

​ 主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。

​ 默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。

创建一个独立的主节点只需在配置文件中添加如下内容:

node.master: true

node.data: false

为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置是至关重要的

(默认为1),每个主节点应该知道形成一个集群的最小数量的主资格节点的数量。

解释如下:

​ 假设我们有一个集群。有3个主资格节点,当网络发生故障的时候,有可能其中一个节点不能和其他节点进行通信了。这个时候,当discovery.zen.minimum_master_nodes设置为1的时候,就会分成两个小的独立集群,当网络好的时候,就会出现数据错误或者丢失数据的情况。当discovery.zen.minimum_master_nodes设置为2的时候,一个网络中有两个主资格节点,可以继续工作,另一部分,由于只有一个主资格节点,则不会形成一个独立的集群,这个时候当网络回复的时候,节点又会从新加入集群。

设置这个值的原则是:

(master_eligible_nodes / 2)+ 1

这个参数也可以动态设置:

PUT localhost:9200/_cluster/settings

{

“transient”: {

“discovery.zen.minimum_master_nodes”: 2

}

}

数据节点说明

​ 数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。数据节点的配置如下:

node.master: false

node.data: true

数据节点路径设置,每一个主节点和数据节点都需要知道分片,索引,元数据的物理存储位置,path.data默认位为 $ES_HOME/data,可以通过配置文件 elasticsearch.yml进行修改,例如:

path.data:  /data/es/data/

这个设置也可以在命令行上执行,例如:

./bin/elasticsearch --path.data /data/es/data

这个路径最好进行单独配置,这样Elasticsearch的目录和数据的目录就会分开。当删除了Elasticsearch主目录的时候,不会影响到数据。通过rpm安装默认是分开的。
数据目录可以被多个节点共享,甚至可以属于不同的集群,为了防止多个节点共享相同的数据路径,可以在配置文件elasticsearch.yml中添加:node.max_local_storage_nodes: 1

注意:在相同的数据目录不要运行不同类型的节点(例如:master, data, client)这很容易导致意外的数据丢失。

客户端节点说明

​ 当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
警告:添加太多的客户端节点对集群是一种负担,因为主节点必须等待每一个节点集群状态的更新确认!客户节点的作用不应被夸大,数据节点也可以起到类似的作用。配置如下:

node.master: false

node.data: false

部落节点说明

​ 部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据,部落节点在elasticsearch.yml中的配置如下:

tribe:

t1:

cluster.name:   cluster_one

t2:

cluster.name:   cluster_two

T1和T2是任意的名字代表连接到每个集群。上面的示例配置两集群连接,名称分别是T1和T2。默认情况下部落节点通过广播可以做为客户端连接每一个集群。大多数情况下,部落节点可以像单节点一样对集群进行操作。

注意:以下操作将和单节点操作不同,
如果两个集群的名称相同,部落节点只会连接其中一个。由于没有主节点,当设置local为true的是,主节点的读操作会被自动的执行,例如:集群统计,集群健康度。主节点级别的写操作将被拒绝,这些应该是在一个集群进行。部落节点可以通过块(block)设置所有的写操作和所有的元数据操作,例如:

tribe:

blocks:

write:    true

metadata: true

部落节点可以也可以在选中的索引块中进行配置,例如:

tribe:

blocks:

write.indices:    hk*,ldn*

metadata.indices: hk*,ldn*

当多个集群有相同的索引名的时候,默认情况下,部落的节点将选择其中一个。这可以通过tribe.on_conflict setting进行配置,可以设置排除那些索引或者指定固定的部落名称。

java 连接Elasticsearch

可以通过两种方式来连接到elasticsearch集群

  1. 在你的程序中创建一个嵌入es节点(Node),使之成为es集群的一部分,然后通过这个节点来与es集群通信

    Node node = NodeBuilder.nodeBuilder().clusterName(CLUSTERNAME).client(true).node();
    Clientclient = node.client();
    
    • 1
    • 2

    默认的话启动一个节点,es集群会自动给它分配一些索引的分片,如果你想这个节点仅仅作为一个客户端而不去保存数据,你就可以设置把node.data设置成false或 node.client设置成true。

  2. 通过TransportClient这个接口和es集群通信(推荐)

Settings settings = Settings.settingsBuilder()
	.put("cluster.name", CLUSTERNAME)
	.put("client.transport.sniff", true).build();
client = TransportClient.builder().settings(settings).build()
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), PORT))
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), PORT));

参数:

client.transport.sniff

​ true表示让客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器

client.transport.ping_timeout

​ 连接超时时间

client.transport.nodes_sampler_interval

​ 心跳时间

<think>嗯,用户想了解Elasticsearch节点类型详解。好的,我需要先回忆一下ES的不同节点类型以及它们的功能。首先,ES集群由多个节点组成,每个节点可以承担不同的角色。常见的节点类型包括主节点、数据节点、协调节点、摄取节点、机器学习节点等。需要逐一解释每个类型的作用和配置方法。 主节点负责集群的管理,比如索引的创建删除、节点状态的维护。但主节点不处理数据相关的请求,这点需要注意。配置主节点时,需要设置node.master为true,而node.data为false。不过要注意,主节点需要足够的资源,避免因负载过高导致集群不稳定。 然后是数据节点,负责存储数据和执行数据操作,如CRUD、搜索和聚合。数据节点需要更多的磁盘和内存资源。配置时node.data设为true,node.master设为false。可能需要根据数据量调整磁盘类型和容量。 协调节点,作为客户端请求的入口,负责将请求路由到正确的节点并汇总结果。通常在生产环境中会单独部署协调节点,以减轻主节点和数据节点的压力。配置时node.master和node.data都设为false,但需要处理HTTP和Transport流量,所以网络配置要注意。 摄取节点,专门处理预处理管道,比如解析、转换数据。适合在写入前进行数据加工的场景。需要配置node.ingest为true,同时可能需要关闭其他角色。资源方面,CPU和内存要足够支持处理任务。 机器学习节点,用于运行Elasticsearch的机器学习任务,如异常检测。需要安装X-Pack插件,并配置node.ml为true。这类节点对计算资源要求较高,尤其是在处理大量数据时。 另外还有一些特殊节点,比如部落节点(Tribe Node),用于跨集群操作,但已被Cross Cluster Search取代;远程节点(Remote-eligible Node)用于跨集群连接。不过这些可能不常用,用户可能更关注基础类型。 用户可能的疑问包括如何选择节点类型,如何配置,以及资源分配的问题。需要强调根据集群规模和需求合理分配节点角色,比如小集群可能合并角色,而大集群需要分离角色以提高性能。还要提到配置示例,比如elasticsearch.yml中的参数设置,以及硬件建议。 可能用户没提到但需要注意的地方包括节点的发现和选举机制,主节点和数据节点的分离对于集群稳定性的重要性,以及协调节点在处理复杂查询时的负载均衡作用。此外,节点类型配置错误可能导致的问题,比如将主节点同时作为数据节点可能导致资源争用,影响集群稳定性。 总结,回答需要结构清晰,分点解释每个节点类型的功能、配置和注意事项,结合实际用例和配置示例,帮助用户全面理解。同时要确保使用正确的中文术语,避免技术术语翻译错误。</think>Elasticsearch(ES)的节点类型决定了节点在集群中的职责。合理配置节点类型可提升集群性能和稳定性。以下是核心节点类型的详解及配置指南: --- ### 1. **主节点(Master Node)** #### 功能 - 管理集群状态(如索引创建/删除、节点加入/离开) - 协调分片分配与恢复 - **不处理数据读写或搜索请求** #### 配置 ```yaml node.master: true node.data: false ``` #### 注意事项 - 生产环境至少配置 **3个专用主节点**,避免脑裂问题 - 主节点需低负载,确保快速响应集群事件 - 避免与数据节点混合部署,防止资源争用 --- ### 2. **数据节点(Data Node)** #### 功能 - 存储索引分片数据 - 执行数据增删改查(CRUD)、搜索、聚合等操作 #### 配置 ```yaml node.master: false node.data: true ``` #### 优化建议 - 优先选择 **SSD硬盘**,提升IO性能 - 根据数据量规划存储容量(预留20%空间用于合并操作) - 大规模集群可细分冷热节点(Hot-Warm架构) --- ### 3. **协调节点(Coordinating Node)** #### 功能 - 接收客户端请求,路由到数据节点并聚合结果 - 分担搜索/写入的负载压力 #### 配置 ```yaml node.master: false node.data: false ``` #### 使用场景 - 客户端直接连接协调节点,而非直连数据节点 - 复杂查询(如跨索引搜索)时减少数据节点压力 --- ### 4. **摄取节点(Ingest Node)** #### 功能 - 执行预处理管道(Pipeline),如数据解析、格式转换 - 常见用途:日志解析(如拆分字段、提取时间戳) #### 配置 ```yaml node.ingest: true node.master: false node.data: false ``` #### 示例管道 ```json PUT _ingest/pipeline/logs_pipeline { "processors": [ { "grok": { "field": "message", "patterns": ["%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:content}"] } } ] } ``` --- ### 5. **机器学习节点(Machine Learning Node)** #### 功能 - 运行Elasticsearch内置的机器学习任务 - 典型应用:时序数据异常检测、日志模式分析 #### 配置 ```yaml node.ml: true node.master: false node.data: false ``` #### 资源要求 - 需较高CPU和内存资源 - 建议独立部署,避免与其他任务竞争资源 --- ### **混合节点与生产建议** #### 小型集群(<10节点) 可混合角色(但主节点必须专用): ```yaml node.master: true node.data: true node.ingest: true ``` #### 中大型集群 - 严格分离角色:3专用主节点 + N数据节点 + 协调节点池 - 示例架构: ``` Master Nodes ×3(8GB内存,2核CPU) Data Nodes ×10(64GB内存,8核CPU,8TB SSD) Coordinating Nodes ×3(16GB内存,4核CPU) ``` --- ### **节点类型对比表** | 类型 | 关键配置 | 资源需求 | 典型数量 | |--------------|------------------------|----------|----------| | 主节点 | node.master: true | 中等CPU | 3(固定)| | 数据节点 | node.data: true | 高IO | 按数据量 | | 协调节点 | 全部角色设为false | 中等网络 | 2-5 | | 摄取节点 | node.ingest: true | 高CPU | 按吞吐量 | | 机器学习节点 | node.ml: true | 高CPU/内存 | 按任务量 | --- ### **常见问题** 1. **如何防止主节点过载?** - 专用部署,禁用`node.data` - 监控`cluster.management`线程池队列 2. **协调节点宕机是否影响数据?** - 不影响数据安全,但会导致客户端连接中断 3. **如何扩展数据节点?** - 水平扩容:增加节点后,ES自动均衡分片 - 垂直扩容:升级磁盘或内存(需滚动重启) 通过合理规划节点类型,可显著提升Elasticsearch集群的吞吐量和容错能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值