elasticsearch可以将一个node配置成本地存储数据或者不存储数据。存储数据意味着不同索引的shards允许分配到这个node上。默认情况下每一个node都是一个数据节点,通过将node.data设置成false,开关闭数据节点。这是一个非常强大的设置项,产生了两类非数据节点:专职master节点和客户端节点。
客户端节点是一个智能负载平衡器,只参与了处理过程的某些步骤。比如:我们可以设置http.enabled:false,来启动整个集群中的数据节点,这些节点显然无法启动HTTP。这些节点相互之间通过transport模块进行通信。在集群前端,我们可以启动一个或者多个客户端节点,这些节点可以启动HTTP,这些客户端节点都设置为node.data : false node.master : false。他们之间可以通过http通信。这些客户端节点仍然看作是集群中的一部分,可以重定向操作请求到具体承载数据的节点上。然而,他们本身并不承载数据也不执行集群的管理操作。另一个显著的优势是:这些节点执行分发(scatter)和汇聚(gather)的任务,客户端节点会启动分发进程,并且执行实际的汇聚进程。这就减轻了data节点的负担,data节点可以专注于index和search操作,同时不需要处理http请求、网络过载和汇聚结果。
专属master节点是设置node.data : false和node.master : true的节点。我们推荐在关键的集群中启用专属master节点,这些节点的唯一职责就是master,只负责集群管理的功能,执行轻量级操作。这样在这些节点上就大大较少了需要消耗大量资源的操作(换句话说,我们不会把index或者search操作发送到这些专属master节点上去),通过这些措施大大加强了集群的稳定性。
部落节点tribe node:es的部落属性允许一个节点扮演部落节点的角色,相当于不同集群之间的联邦节点。
部落节点汇聚它所连接的所有集群的状态合并到一起形成一个全局状态。借助这个全局状态,在多个集群间执行读写操作就跟在一个集群中执行一样。
elasticsearch.yml配置文件中配置部落节点如下:
tribe: t1: cluster.name: cluster_one t2: cluster.name: cluster_two这个部落节点连接了两个集群,cluster_one和cluster_two(t1,t2只是一个名字而已)。默认情况下部落节点会创建一个client node,用multicast discovery机制去连接没一个集群。多集群状态的合并意味着大多数操作(分布式检索,suggest,percolation,index等)都可以像在一个集群上操作一样,屏蔽了底层的多个集群。然而,也有一些限制:
1:多集群中同名索引无法处理,默认会选择其中一个。
2:master级别的读操作(cluster state,cluster health)将会自动设置为local flag去执行,因为没有master节点
3:master级别的写操作(create index)禁止使用。只能在一个集群上操作。
部落节点可以配置,来阻塞所有的写操作和metadata的操作:
tribe: blocks: write: true metadata: true同样可以设置在index级别的阻塞:
tribe: blocks: indices.write: hk*,ldn*在多个集群有重名索引的情况下,会导致冲突,默认情况下部落节点会自动选择其中一个集群去操作。这个可以通过tribe.on_conflict来设置。默认设置为any。可以设置为drop或者prefer_[tribeName](优先选择的集群索引)。