Elasticsearch:运用shard filtering来控制索引分配给哪个节点
在我们的实际部署中,我们的各个node(节点)的能力是不一样的。比如有的节点的计算能力比较强,而且配有高性能的存储,速度也比较快,同时我们可能有一些node的能力稍微差一点,比如计算能力及存储器的速度都比较差一点。针对这两种情况,我们其实可以把这两种节点用来做不同的用途:运算能力较强的节点可以用来做indexing(建立索引表格)的工作,而那些能力较差一点的节点,我们可以用来做搜索用途。我们可以把这两种节点分别叫做:
- hot node:用于支持索引并写入新文档
- warm node:用于处理不太频繁查询的只读索引
这种架构在Elasticsearch中,我们称之为hot/warm架构。
Hot node
我们可以使用hot node来做indexing:
- indexing是CPU和IO的密集操作,因此热节点应该是功能强大的服务器
- 比warm node更快的存储
Warm node
对较旧的只读索引使用热节点:
- 倾向于利用大型附加磁盘(通常是旋转磁盘)
- 大量数据可能需要其他节点才能满足性能要求
Shard filtering
Shard filtering在Elasticsearch中,我们可以利用这个能力来把我们想要的index放入到我们想要的node里。我们可以使用在elasticsearch.yml配置文件中的:
- node.attr来指定我们node属性:hot或是warm。
- 在index的settings里通过index.routing.allocation来指定索引(index)到一个满足要求的node
为节点分配索引有三种规则:
就像上面的表格说明的一样:include指的是至少包含其中的一个值;exclude指的是不包含任何值;require指的是必须包含里面索引的值。这些值实际上我们用来标识node的tag。针对自己的配置这些tag可以由厂商自己标识。
标识node
在上面的图中,我们标识my_temp属性为hot或是warm,表明我们的cluster中分为两类:hot或是warm。在这里特别指出:这里的my_temp,hot及warm都是我们任意取的可以让我们记住的属性及名称。只要在使用时和index.routing.allocation.include index.routing.allocation.exclude及index.routing.allocation.require中的值相对应即可。
配置index的settings
我们可以通过配置在Index中的settings来分配我们的index到相应的具有哪些属性的node里,比如:
PUT logs-2019-03
{
"settings": {
"index.routing.allocation.require.my_temp": "hot"
}
}
在上面我们通过logs-2019-03的这个index的settings来控制这个index必须分配到具有hot属性的node里。
假如我们上面的index logs-2019-03由于一些原因不再是当前的用来做indexing的index,比如我们可以通过rollover API接口来自动滚动我们的index名字。我们可以通过如下的命令把该index移动到warm node里:
PUT logs-2019-03
{
"settings": {
"index.routing.allocation.require.my_temp": "warm"
}
}
这样Elasticsearch会自动帮我们把logs-2019-03索引移动到warm node中,以便直供搜索之用。
例子
首先,我们我们按照如下的方式来做一个实验,虽然不能应用于实际的生产环境中:
- 按照“如何在Linux,MacOS及Windows上进行安装Elasticsearch”安装好自己的Elasticsearh,但是不要运行Elasticsearch
- 按照“如何在Linux及MacOS上安装Elastic栈中的Kibana”安装好自己的Kibana
在我们完成上面的两个安装后,我们分别打开两个terminal,然后分别在两个terminal中运行如下的指令:
./bin/elasticsearch -E node.name=node1 -E node.attr.data=hot -Enode.max_local_storage_nodes=2
上面的指令运行一个名字叫做node1的,data属性为hot的node。
./bin/elasticsearch -E node.name=node2 -E node.attr.data=warm -Enode.max_local_storage_nodes=2
上面的指令运行一个名字叫做node2的,data属性为hot的warm。
我们可以在Kibana里查看我们的nodes:
我们可以看出来有两个node正在运行:node1及node2。如果我们想了解这两个node的更多属性,我们可以打入如下的命令:
GET _cat/nodeattrs?v&s=name
显示的结果为:
我们可以看到node被标识为hot node,而node2被标识为warm node。
接下来,我们运用我们上面命令来把我们的logs-2019-03置于我们的hot node里。我们可以通过如下的命令:
PUT logs-2019-03
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.routing.allocation.require.data": "hot"
}
}
运行上面的结果后,可以通过如下的命令来查看:
GET _cat/shards/logs-*?v&h=index,shard,prirep,state,node&s=index,shard,prirep
显示的结果为:
从上面我们可以看出来我们的logs-2019-03是分配到node1上面的。
假如我们由于某种原因,想把logs-2019-03分配到node2上面,那么该怎么做呢?我们可以通过如下的命令来实现:
PUT logs-2019-03/_settings
{
"index.routing.allocation.require.data": "warm"
}
运行上面的指令显示的结果是:
显然我们logs-2019-03已经成功地移到node2了。
针对硬件的shard filtering
上面我们说了,对于node.attr来说,我们可以添加任意的属性。在上面的我们已经使用hot/warm来标识我们的my_temp属性。其实我们也可以同时定义一些能标识硬件的属性my_server,这个属性值可以为small,medium及large。有多个属性组成的集群就像是如下的结构:
那么这样的集群里的每个node可能具有不同的属性。我们可以通过如下的方法来分配index到同时具有两个或以上属性的node里:
PUT my_index1
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.routing.allocation.include.my_server": "medium",
"index.routing.allocation.require.my_temp": "hot"
}
}
如上所示,我们把我们的my_index1分配到这么一个node:这个node必须具有hot属性,同时也具有medium的属性。针对我们上面显示的图片,只有node1满足我们的要求。
总结:在今天的这篇文章中,我们介绍了如何使用shard filtering来控制我们的index的分配。在实际的操作中,可能大家会觉得麻烦一点,因为这个比较需要我们自己来管理这个。这个技术可以和我之前的文章“Elasticsearch: rollover API”一起配合使用。Elasticsearch实际已经帮我做好了。在接下来的文章里,我会来介绍如何使用Index life cycle policy来自动管理我们的Index。
Elasticsearch:运用shard filtering来控制索引分配给哪个节点的更多相关文章
- 【控制分片分配】控制Elasticsearch分片和副本的分配
ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本.通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题.不能运 ...
- ES ElasticSearch 7.x 下动态扩大索引的shard数量
ES ElasticSearch 7.x 下动态扩大索引的shard数量 背景 在老版本的ES(例如2.3版本)中, index的shard数量定好后,就不能再修改,除非重建数据才能实现. 从ES6. ...
- Elasticsearch 模块 - Shard Allocation 机制
原文 1. 背景 shard allocation 意思是分片分配, 是一个将分片分配到节点的过程; 可能发生该操作的过程包括: 初始恢复(initial recovery) 副本分配(replica ...
- ElasticSearch入门 第三篇:索引
这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复
摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...
- 【原创】《从0开始学Elasticsearch》—集群健康和索引管理
内容目录 1.搭建Kibana2.集群健康3.索引操作 1.搭建Kibana 正如<Kibana 用户手册>中所介绍,Kibana 是一款开源的数据分析和可视化平台,因此我们可以借助 Ki ...
- Elasticsearch从入门到放弃:索引基本使用方法
前文我们提到,Elasticsearch的数据都存储在索引中,也就是说,索引相当于是MySQL中的数据库.是最基础的概念.今天分享的也是关于索引的一些常用的操作. 创建索引 curl -X PUT & ...
- Elasticsearch系列---实战零停机重建索引
前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成 ...
- Elasticsearch核心技术(四):索引原理分析
本文探讨Elasticsearch的数据请求.路由和写入过程的原理,主要涉及ES的分布式存储架构.节点和副本的写入过程.近实时搜索的原因.持久化机制等. 4.1 ES存储架构 我们经常说,看一件事情千 ...
随机推荐
- 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例
类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...
- poj 2226 Muddy Fields (二分图)
大意:给定n*m网格, 每个格子为泥地或草地, 可以用一些长度任意宽度为1的木板盖住泥地, 要求不能盖到草地, 求最少要多少块木板能盖住所有泥地. 最小点覆盖板子题, 建图跑最大匹配即可. #incl ...
- JavaScript内置排序方法sort实现排序操作
var arr = [10,8,6,9,1,7,2,13,5,1,9]; //sort排序 arr.sort(function(a,b){ //可以改变数组本身的排序方法 return a-b; }) ...
- HBASE学习笔记(五)
一.HBase的RowKey设计原则 1.我们知道HBase是三维有序存储的,通过RowKey(行键),ColumnKey(Column family和qualifier)和TimeStamp(时间戳 ...
- 【科创人·独家】连续创业者高春辉的这六年:高强度投入打造全球领先的IP数据库
您能看到:高春辉的创业观,IPIP.NET半程复盘及未来规划,连续创业的体验,小众产品趣事 您看不到:往年创业的回顾,技术干货,受制于篇幅忍痛割舍的精彩观点 文末彩蛋:<与雷军的分歧并非否定电商 ...
- element-ui 中 el-table 根据scope.row行数据变化动态显示行内控件
加入本行的数据为scope.row,其数据格式为 { "propertyId": 4, "propertyName": "标题", &quo ...
- Java经典基础与高级面试36题和答案
1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实 ...
- nginx 配置简单的静态页面
nginx 文件服务配置,MIME和 default_type https://blog.csdn.net/qq_26711103/article/details/81116900 nginx 静态页 ...
- Oracle12cCDB和PDB数据库的启动与关闭说明
在Oracle 12c中,分CDB 和PDB,他们的启动和关闭操作整理如下. 1 Container Database (CDB) 对于CDB,启动和关闭与之前传统的方式一样,具体语法如下: STAR ...
- vim 绑定到 source insight 快捷键
1. optioons -> custom commands 2. 选择然后写入run命令: "D:\Program Files (x86)\Vim\vim74\gvim.exe&qu ...