Elasticsearch节点类型

来源:互联网 发布:linux查看文件个数命令 编辑:程序博客网 时间:2024/05/16 05:23

http://blog.csdn.net/xifeijian/article/details/49618961

Elasticsearch节点类型

当我们启动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();

    默认的话启动一个节点,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

​ 心跳时间

0 0
原创粉丝点击