#yyds干货盘点#--ELK-Elasticsearch介绍-1

仓廪实则知礼节,衣食足则知荣辱。这篇文章主要讲述#yyds干货盘点#--ELK-Elasticsearch介绍-1相关的知识,希望能为你提供帮助。
Elasticsearch节点概念

  • 客户端节点:当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
  • 数据节点:数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高, 在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
  • 主节点:主资格节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。
  • Elasticsearch冷热分离架构
为了保证Elasticsearch的读写性能,官方建议磁盘使用SSD固态硬盘。然而Elasticsearch要解决的是海量数据的存储和检索问题,海量的数据就意味需要大量的存储空间,如果都使用SSD固态硬盘成本将成为一个很大的问题,这也是制约许多企业和个人使用Elasticsearch的因素之一。为了解决这个问题,Elasticsearch冷热分离架构应运而生。冷热架构是一项十分强大的功能,能够让您将 Elasticsearch 部署划分为“热”数据节点和“冷”数据节点。
  • 热数据节点处理所有新输入的数据,并且存储速度也较快,以便确保快速地采集和检索数据。
  • 冷节点的存储密度则较大,如需在较长保留期限内保留日志数据,不失为一种具有成本效益的方法。
将这两种类型的数据节点结合到一起后,您便能够有效地处理输入数据,并将其用于查询,同时还能在节省成本的前提下在较长时间内保留数据。此架构对日志用例来说尤其大有帮助,因为在日志用例中,人们的大部分精力都会专注于近期的日志(例如最近两周),而较早的日志(由于合规性或者其他原因仍需要保留)则可以接受较慢的查询时间。

数据如何分布?怎么迁移数据?
集群节点异构后接着要考虑的是数据分布问题,即用户如何对冷热数据进行标识,并将冷数据移动到冷节点,热数据移动到热节点。
  • 节点指定冷热属性:仅仅将不同的节点设置为不同的规格还不够,为了能明确区分出哪些节点是热节点,哪些节点是冷节点,需要为对应节点打标签,Elasticsearch支持给节点打标签,具体方式是在elasticsearch.yml文件中增加配置
node.attr.attribute: value

其中attribute为用户自定义的任意标签名,value为该节点对应的该标签的值,例如对于冷热分离,可以使用如下设置
node.attr.temperature: hot //热节点
node.attr.temperature: warm //冷节点

  • 索引指定冷热属性:节点有了冷热属性后,接下来就是指定数据的冷热属性,来设置和调整数据分布。冷热分离方案中数据冷热分布的基本单位是索引,即指定某个索引为热索引,另一个索引为冷索引。通过索引的分布来实现控制数据分布的目的。
【#yyds干货盘点#--ELK-Elasticsearch介绍-1】Elasticsearch提供了index shard filtering功能(2.x开始),该功能在索引配置中提供了如下几个配置
index.routing.allocation.include.attribute
Assign the index to a node whose attribute has at least one of the comma-separated values.
index.routing.allocation.require.attribute
Assign the index to a node whose attribute has all of the comma-separated values.
index.routing.allocation.exclude.attribute
Assign the index to a node whose attribute has none of the comma-separated values.

用户可以在创建索引,或后续的任意时刻设置这些配置来控制索引在不同标签节点上的分配动作。
??index.routing.allocation.include.attribute??表示索引可以分配在包含多个值中其中一个的节点上。
??index.routing.allocation.require.attribute??表示索引要分配在包含索引指定值的节点上(通常一般设置一个值)。
??index.routing.allocation.exclude.attribute??表示索引只能分配在不包含所有指定值的节点上。
  • 数据分布控制:Elasticsearch的索引分片分配由??ShardAllocator???决定,??ShardAllocator???通过在索引分片创建或rebalance时对每个节点调用一系列??AllocationDecider???来决定是否将节点分配到指定节点上其中一个AllocationDecider是??FilterAllocationDecider??,该decider用于应用集群,节点的一些基于attr的分配规则,涉及到节点级别配置的核心代码如下
private Decision shouldIndexFilter(IndexMetaData indexMd, RoutingNode node, RoutingAllocation allocation)
if (indexMd.requireFilters() != null)
if (indexMd.requireFilters().match(node.node()) == false)
return allocation.decision(Decision.NO, NAME, "node does not match index setting [%s] filters [%s]",
IndexMetaData.INDEX_ROUTING_REQUIRE_GROUP_PREFIX, indexMd.requireFilters());


if (indexMd.includeFilters() != null)
if (indexMd.includeFilters().match(node.node()) == false)
return allocation.decision(Decision.NO, NAME, "node does not match index setting [%s] filters [%s]",
IndexMetaData.INDEX_ROUTING_INCLUDE_GROUP_PREFIX, indexMd.includeFilters());


if (indexMd.excludeFilters() != null)
if (indexMd.excludeFilters().match(node.node()))
return allocation.decision(Decision.NO, NAME, "node matches index setting [%s] filters [%s]",
IndexMetaData.INDEX_ROUTING_EXCLUDE_GROUP_SETTING.getKey(), indexMd.excludeFilters());


return null;





    推荐阅读