博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
控制Elasticsearch分片和副本的分配
阅读量:6225 次
发布时间:2019-06-21

本文共 4535 字,大约阅读时间需要 15 分钟。

hot3.png

控制Elasticsearch分片和副本的分配 博客分类: 搜索引擎,爬虫

ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务 器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配 到多个服务器,可以提高查询的负载能力。

为了进行分片和副本的操作,ES需要确定将这些分片和副本放到集群节点的哪个位置,就是需要确定把每个分片和副本分配到哪台服务器/节点上。

一、显式控制分配

生产情景:

比如生产环境有三个索引分别为 man、woman、katoey希望达到的效果:       man索引放置在一些集群节点上          woman索引又单独放置到集群的另外一些集群节点上       katoey索引希望放置在所有放置man索引和woman索引的集群节点上       这么做是因为katoey索引比其他两个索引小很多,因此我们可以将它和其他两个索引一起分配。但是基于ES默认算法的处理方法,我们不能确定分片和副本的存放位置,但是ES允许我们对其做相应的控制!

1、指定节点的参数

如上图所示,我们将ES集群划分为两个"空间"。当然你也可以叫做区域,随便命名。我们将左边的三台ES节点服务器放置到zone_one的空间上面,将右边的三台ES节点服务器放到zone_two的空间上。

配置

为了做到我们需要的效果,我们需要将如下属性配置到左边三台ES集群节点服务器的elasticsearch.yml配置文件中

node.zone: zone_one

将如下属性配置到右边的三台ES集群节点服务器elasticsearch.yml配置文件中

node.zone: zone_two

索引创建

当所有节点配置文件属性配置完成后,我们就可以根据空间名称,我们就可以创建索引放到指定的空间。

首先我们运行如下命令,来创建man索引:

# curl -XPOST "http://ESnode:9200/man'# curl -XPUT "http://ESnode:9200/man/_settings' -d '{
"index.routing.allocation.include.zone" : "zone_one" }'

第一条命令是创建man索引;第二条命令是发送到_settings REST端点,用来指定这个索引的其他配置信息。我们将 index.routing.allocation.include.zone属性设置为zone_one值,就是我们所希望的把man索引放置到 node.zone属性值为zone_one的ES集群节点服务器上。

同样对woman索引我们做类似操作:

# curl -XPOST "http://ESnode:9200/woman'# curl -XPUT "http://ESnode:9200/woman/_settings' -d '{
"index.routing.allocation.include.zone" : "zone_two" }'

不同的是,这次指定woman索引放置在node.zone属性值为zone_two的ES集群节点服务器上

最后我们需要将katoey索引放置到上面所有的ES集群节点上面,配置设置命令如下:

# curl -XPOST "http://ESnode:9200/katoey"# curl -XPUT "http://ESnode:9200/katoey/_settings" -d '{
"index.routing.allocation.include.zone" : "zone_one,zone_two" }'

2、分配时排除节点跟我们上面操作为索引指定放置节点位置一样,我们也可以在索引分配的时候排除某些节点。参照之前的例子,我们新建一个people索引,但是不希望people索引放置到zone_one的ES集群节点服务器上,我们可以运行如下命令操作:

# curl -XPOST "http://EScode:9200/people"# curl -XPUT "http://EScode:9200/people/_settings" -d '{
"index.routing.allocation.exclude.zone" : "zone_one" }'

请注意,在这里我们使用的是index.routing.allocation.exclude.zone属性而不是index.routing.allocation.include.zone属性。

使用IP地址进行分配配置

除了在节点的配置中添加一些特殊的属性参数外,我们还可以使用IP地址来指定你将分片和副本分配或者不分配到哪些节点上面。为了做到这点, 我们应该使用_ip属性,把zone换成_ip就好了。例如我们希望lucky索引分配到IP地址为10.0.1.110和10.0.1.119的节点 上,我们可以运行如下命令设置:

# curl -XPOST "http://ESnode:9200/lucky"# curl -XPUT "http://ESnode:9200/lucky/_settings" -d '{
"index.routing.allocation.include._ip" "10.0.1.110,10.0.1.119" }'

二、集群范围内分配

除了索引层面指定分配活着排除分配之外(上面我们所做的都是这两种情况),我们还可以指定集群中所有索引的分配。例如,我们希望将所有的新索引分配到IP地址为10.0.1.112和10.0.1.114的节点上,我们可以运行如下命令设置:

# curl -XPUT "http://ESnode:9200/_cluster/settings" -d '{
"transient" : { "cluster.routing.allocation.include._ip" "10.0.1.112,10.0.1.114" } }'

集群级别的控制后续还会分享transient和persistent属性介绍

三、每个节点上分片和副本数量的控制

除了指定分片和副本的分配,我们还可以对一个索引指定每个节点上的最大分片数量。例如我们希望ops索引在每个节点上只有一个分片,我们可以运行如下命令:

# curl -XPUT "http://ESnode:9200/ops/_settings" -d '{
"index.routing.allocation.total_shards_per_node" : 1 }'

这个属性也可以直接配置到elasticsearch.ym配置文件中,或者使用上面命令在活动索引上更新。如果配置不当,导致主分片无法分配的话,集群就会处于red状态。

四、手动移动分片和副本

接下来我们介绍一下节点间手动移动分片和副本。可以使用ElasticSearch提供的_cluster/reroute REST端点进行控制,能够进行下面操作:

  • 将一个分片从一个节点移动到另外一个节点
  • 取消对分片的分配
  • 强制对分片进行分配

移动分片

假设我们有两个节点:es_node_one和es_node_two,ElasticSearch在es_node_one节点上分配了ops索引的两个分片,我们现在希望将第二个分片移动到es_node_two节点上。可以如下操作实现:

# curl -XPOST "http://ESnode:9200/_cluster/reroute' -d  '{
"commands" : [ { "move" : { "index" : "ops", "shard" : 1, "from_node" : "es_node_one", "to_node" : "es_node_two" } }] }'

我们通过move命令的index属性指定移动哪个索引,通过shard属性指定移动哪个分片,最终通过from_node属性指定我们从哪个节点上移动分片,通过to_node属性指定我们希望将分片移动到哪个节点。

取消分配

如果希望取消一个正在进行的分配过程,我们通过运行cancel命令来指定我们希望取消分配的索引、节点以及分片,如下所示:

# curl -XPOST "http://ESnode:9200/_cluster/reroute" -d '{
"commands" : [ { "cancel" : { "index" : "ops", "shard" : 0, "node" : "es_node_one" } } ] }'

运行上面的命令将会取消es_node_one节上ops索引的第0个分片的分配

分配分片

除了取消和移动分片和副本之外,我们还可以将一个未分配的分片分配到一个指定的节点上。假设ops索引上有一个编号为0的分片尚未分配,并且我们希望ElasticSearch将其分配到es_node_two上,可以运行如下命令操作:

# curl -XPOST "http://ESnode:9200/_cluster/reroute' -d '{
"commands" : [ { "allocate" : { "index" : "ops", "shard" : 0, "node" : "es_node_two" } } ] }'

一次HTTP请求包含多个命令我们可以在一次HTTP请求中包含多个命令,例如:

# curl -XPOST "http://ESnode:9200/_cluster/reroute" -d '{
"commands" : [ {
"move" : {
"index" : "ops", "shard" : 1, "from_node" : "es_node_one", "to_node" : "es_node_two"}}, {
"cancel" : {
"index" : "ops", "shard" : 0, "node" : "es_node_one"}} ] }'http://www.tuicool.com/articles/bi22muuhttp://news.yesky.com/prnews/343/97768343.shtml

转载于:https://my.oschina.net/xiaominmin/blog/1599283

你可能感兴趣的文章
Robot Framework与Web界面自动化测试学习笔记:定位到新窗口
查看>>
u3d demo起步第二章
查看>>
The Dataflow Model 论文
查看>>
Linux守护进程
查看>>
Redis的字典(dict)rehash过程源代码解析
查看>>
遇到没“人性”的管理:你真可怜!
查看>>
局域网之php项目IP访问共享
查看>>
http://www.bootcss.com/p/font-awesome/
查看>>
新浪微博UWP UI意见征求
查看>>
使用ServiceStack构建Web服务
查看>>
Linqer工具
查看>>
table中超过长度的列,显示省略号
查看>>
Qtcreator中经常使用快捷键总结
查看>>
模块管理常规功能自己定义系统的设计与实现(16--模块数据的导出和打印[1])
查看>>
可扩展Web架构与分布式系统(转)
查看>>
KVM虚拟机的安装
查看>>
【转】PHP中require和include路径问题总结
查看>>
KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布
查看>>
java 小数点取2位并且四舍五入
查看>>
web.xml 配置中classpath: 与classpath*:的区别
查看>>