当咱们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的链接就组成了一个集群,在默认状况下,集群中的每一个节点均可以处理http请求,和集群节点的数据传输,集群中全部的节点都知道集群中其余全部的节点,能够将客户端请求转发到适当的节点。节点有如下类型:node
主(master)节点:在一个节点上当node.master设置为True(默认)的时候,它有资格被选做为主节点,控制整个集群。网络
数据(data)节点:在一个节点上node.data设置为True(默认)的时候。该节点保存数据和执行数据相关的操做,如增删改查,搜索,和聚合。elasticsearch
客户端节点:当一个节点的node.master和node.data都设置为false的时候,它既不能保持数据也不能成为主节点,该节点能够做为客户端节点,能够响应用户的状况,并把相关操做发送到其余节点。优化
部落节点: 当一个节点配置tribe.*的时候,它是一个特殊的客户端,它能够链接多个集群,在全部链接的集群上执行搜索和其余操做。spa
默认状况下,节点配置是一个主节点和一个数据节点。这是很是方便的小集群,但随着集群的发展,分离主节点和数据节点将变得很是重要。命令行
节点协调,搜索请求或批量增长索引请求等可能涉及在不一样的数据节点上操做。在这些请求会分红两个阶段,一是接收客户端的请求 ,二是协调节点执行相关操做。当数据分散在不一样的节点上的时候,协调节点将请求转发到数据节点,每一个数据节点在本地执行请求并把结果传输给协调节点,而后协调节点收集各个数据节点的结果转换成一个单一的请求结果返回。因此须要客户端有足够的内存和cpu来处理各个节点的返回结果。code
主资格节点的主要职责是和集群操做相关的内容,如建立或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是很是重要的。默认状况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操做会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。索引
虽然主节点也能够协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽量作尽可能少的工做。建立一个独立的主节点的配置为:内存
node.master: true node.data: false
为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置是相当重要的(默认为1),每一个主节点应该知道造成一个集群的最小数量的主资格节点的数量。解析一下:ci
假设咱们有一个集群。有3个主资格节点,当网络发生故障的时候,有可能其中一个节点不能和其余节点进行通讯了。这个时候,当discovery.zen.minimum_master_nodes设置为1的时候,就会分红两个小的独立集群,当网络好的时候,就会出现数据错误或者丢失数据的状况。当discovery.zen.minimum_master_nodes设置为2的时候,一个网络中有两个主资格节点,能够继续工做,另外一部分,因为只有一个主资格节点,则不会造成一个独立的集群,这个时候当网络回复的时候,节点又会重新加入集群。设置这个值的原则是:
(master_eligible_nodes / 2)+ 1。
这个参数也能够动态设置:
PUT _cluster/settings
{ "transient": { "discovery.zen.minimum_master_nodes": 2 } }
本文由赛克 蓝德(secisland)原创,转载请标明做者和出处。
数据节点主要是存储索引数据的节点,主要对文档进行增删改查操做,聚合操做等。数据节点对cpu,内存,io要求较高,在优化的时候须要监控数据节点的状态,当资源不够的时候,须要在集群中添加新的节点。数据节点的配置以下:
node.master: false node.data: true
当主节点和数据节点配置都设置为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安装默认是分来的。
数据目录能够被多个节点共享,甚至能够属于不一样的集群,为了防止多个节点共享相同的数据路径,能够在配置文件elasticsearch.yml中添加:node.max_local_storage_nodes: 1
注意:在相同的数据目录不要运行不一样类型的节点(例如:master, data, client)这会致使意外的数据丢失。
部落节点能够跨越多个集群,它能够接收每一个集群的状态,而后合并成一个全局集群的状态,它能够读写全部节点上的数据,部落节点在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进行配置,能够设置排除那些索引或者指定固定的部落名称。
赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注。