Elasticsearch的集群节点配置
当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接就组成了一个集群,在默认情况下,集群中的每个节点都可以处理HTTP请求和集群节点的数据传输。集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。节点有以下类型:
1) 主节点:在一个节点上当node.master设置为true(默认)的时候,它有资格被选作为主节点,控制整个集群。
2) 数据节点:在一个节点上node.data设置为true(默认)的时候。该节点保存数据和执行数据相关的操作,如增删改查、搜索和聚合。
提示:默认情况下,节点同时是主节点和数据节点,这是非常方便的小集群,但随着集群的发展,分离主节点和数据节点将变得非常重要。
3) 客户端节点:当一个节点的node.master和node.data都设置为false的时候,它既不能保存数据也不能成为主节点,该节点可以作为客户端节点,可以响应用户的请求,并把相关操作发送到其他节点。
4) 部落节点:当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作。
客户端节点在搜索请求或批量增加索引请求等可能涉及在不同数据节点上的操作。这些请求会分成两个阶段:一是接收客户端的请求,二是协调节点执行相关操作。当数据分散在不同的节点上时,客户端节点将请求转发到数据节点,每个数据节点在本地执行请求并把结果传输给客户端节点,然后客户端节点收集各个数据节点的结果转换成单个请求结果返回。所以需要客户端节点有足够的内存和CPU来处理各个节点的返回结果。
1、主节点
主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的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 http://127.0.0.1:9200/_cluster/settings
参数:{"transient": {"discovery.zen.minimum_master_nodes": 2}}
2、数据节点
数据节点主要是存储索引数据的节点,主要对文档进行增删改查、聚合操作等。数据节点对CPU、内存、IO要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。数据节点的配置如下:
node.master: false
node.data: true
3、客户端节点
当主节点和数据节点配置都设置为false时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户端节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,它协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接发送路由请求。
配置如下:
node.master: false
node.data: false
数据节点路径设置:每一个主节点和数据节点都需要知道分片、索引、元数据的物理存储位置,path.data默认位置为$ES_HOME/data,可以通过配置文件elasticsearch.yml进行修改,例如:
path.data: /var/elasticsearch/data
这个设置也可以在命令行上执行,例如:
elasticsearch --path.data /var/elasticsearch/data
这个路径最好进行单独配置,这样Elasticsearch的目录和数据的目录就会分开。当删除了Elasticsearch主目录的时候,不会影响到数据。通过RPM安装默认是分开的。
数据目录可以被多个节点共享,甚至可以属于不同的集群,为了防止多个节点共享相同的数据路径,可以在配置文件elasticsearcy.yml中添加node.max_local_storage_nodes: 1
4、部落节点
部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据,部落节点在elasticsearch.yml中的配置如下:
tribe:
t1:
cluster.name: cluster_one
t2:
cluster.name: cluster_two
t1和t2是任意名字,代表连接到每个集群。上面的示例配置两个集群连接,名称分别为t1和t2。默认情况下,部落节点通过单播发现来连接每一个集群。用于连接的任何其他设置都可以配置在tribe {name}后,就像上面的例子。大多数情况下,部落节点可以像单节点一样对集群进行操作。
注意,以下操作将和单节点操作不同,如果两个集群的名称相同,部落节点只会连接其中一个。
由于没有主节点,主节点级别的读操作如:集群统计、集群健康度,会在本地标志设置为true的节点自动执行。
主节点级别的写操作将被拒绝,如创建索引,这些操作应该在单个集群节点上执行。
部落节点可以通过块(block)设置所有的写操作和所有的元数据操作,例如:
tribe:
blocks:
write: true
metadata: true
部落节点也可以在选中的索引块中单独配置以上操作,例如:
tribe:
blocks:
write.indices: hk*,ldn*
metadata.indices: hk*,ldn*
当多个集群有相同的索引名的时候,默认情况下,部落节点将选择其中一个。这可以通过tribe.on_conflict_setting进行配置,可以设置排除哪些索引或者指定固定的部落名称。