仓廪实则知礼节,衣食足则知荣辱。这篇文章主要讲述#yyds干货盘点#--ELK-Elasticsearch介绍-1相关的知识,希望能为你提供帮助。
Elasticsearch节点概念
- 客户端节点:当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
- 数据节点:数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高, 在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
- 主节点:主资格节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。
- Elasticsearch冷热分离架构
- 热数据节点处理所有新输入的数据,并且存储速度也较快,以便确保快速地采集和检索数据。
- 冷节点的存储密度则较大,如需在较长保留期限内保留日志数据,不失为一种具有成本效益的方法。
数据如何分布?怎么迁移数据?
集群节点异构后接着要考虑的是数据分布问题,即用户如何对冷热数据进行标识,并将冷数据移动到冷节点,热数据移动到热节点。
- 节点指定冷热属性:仅仅将不同的节点设置为不同的规格还不够,为了能明确区分出哪些节点是热节点,哪些节点是冷节点,需要为对应节点打标签,Elasticsearch支持给节点打标签,具体方式是在elasticsearch.yml文件中增加配置
node.attr.attribute: value
其中attribute为用户自定义的任意标签名,value为该节点对应的该标签的值,例如对于冷热分离,可以使用如下设置
node.attr.temperature: hot //热节点
node.attr.temperature: warm //冷节点
- 索引指定冷热属性:节点有了冷热属性后,接下来就是指定数据的冷热属性,来设置和调整数据分布。冷热分离方案中数据冷热分布的基本单位是索引,即指定某个索引为热索引,另一个索引为冷索引。通过索引的分布来实现控制数据分布的目的。
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;
推荐阅读
- #yyds干货盘点#害,这恼人的BOM头
- #yyds干货盘点#Windows Server之CA证书服务器看不到"web服务器"模板
- Ubuntu 18.04.1安装k8s的时候,提示缺少依赖包kubernetes-cni (= 0.7.5)
- 如何在WordPress分页上向上一个/下一个添加类( (paginate_links))
- 如何从WordPress中删除分类()
- 如何在PHP数组元素中连接字符串()
- 如何检索WordPress页面的兄弟页面列表()
- 如何在Visual Composer中的带有文本,覆盖和圆角的列内制作全角和全角图像()
- 如何获取在functions.php中的函数中使用的woocommerce订单的订单ID()