本文讲述,如何理解Elasticsearch的分片、副本和路由策略。

1、预备知识

1)分片(shard)

Elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略shard。在一个索引index中,数据(document)被分片处理(sharding)到多个分片上。Elasticsearch屏蔽了管理分片的复杂性,使得多个分片呈现出一个大索引的样子。

2)副本(replica)

为了提升访问压力过大是单机无法处理所有请求的问题,Elasticsearch集群引入了副本策略replica。副本策略对index中的每个分片创建冗余的副本,处理查询时可以把这些副本当做主分片来对待(primary shard),此外副本策略提供了高可用和数据安全的保障,当分片所在的机器宕机,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失。

3)路由(routing)

当向Elasticsearch存放数据时,根据文档标识符_id将文档分配到多个分片上,负载均衡算法只需要实现平均即可。当取用数据时,查询所有的分片然后汇总结果,而并不必须知道数据到底存在哪个分片上。带来的问题是,在查询时,要查询所有的分片然后汇总结果,造成性能的损耗,在不乐观的情况下,有些分片的查询可能失败(failed),造成结果不准确。为了避免这个问题,引入了路由功能(routing),在存入时通过路由键将数据存入指定分片,在查询的时候可以通过相同的路由键指明在哪个分片将数据查出来。

默认情况下,索引数据的分片算法如下

shard_num = hash(_routing) % num_primary_shards

routing字段的取值,默认是_id字段或者是_parent字段,这样的取值在hash之后再与有多少个shard的数量取模,最终得到这条数据应该在被分配在那个一个shard上,也就是说默认是基于hash的分片,保证在每个shard上数据量都近似平均,这样就不会出现负载不均衡的情况,然后在检索的时候,es默认会搜索所有shard上的数据,最后在master节点上汇聚在处理后,返回最终数据。

假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢?

1. 这个搜索的请求会被发送到一个节点

2. 接收到这个请求的节点,将这个查询广播到这个索引的每个分片上(可能是主分片,也可能是复制分片)

3. 每个分片执行这个搜索查询并返回结果

4. 结果在通道节点上合并、排序并返回给用户

2、分片(shard)与副本(replica)的数量

ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas,否则会使用服务器中的默认配置参数shards=5,replicas=1。

index.number_of_shards: 5
index.number_of_replicas: 1

对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。

那么如何确定分片和副本的数量呢?

依照经验,最理想的分片数量应该依赖于节点的数量。假设索引index配置了10个分片,1个副本,那么总共的分片数应该是20个,10 *(1+1),那么最大的Elasticsearch节点数应该就是20。

节点最大数 = 分片数 * (副本数 + 1)

3、路由功能

1)安装Paramedic插件

Elasticsearch提供了很多插件化功能,Paramedic可以直观的查看Elasticsearch对数据的分片和副本。

[bigdata-dw@bigdata-arch-client10 es2.1.1]$ ./bin/plugin install karmi/elasticsearch-paramedic
-> Installing karmi/elasticsearch-paramedic...
Trying https://github.com/karmi/elasticsearch-paramedic/archive/master.zip ...
Downloading ............................................................................................................................................................................................................................................DONE
Verifying https://github.com/karmi/elasticsearch-paramedic/archive/master.zip checksums if available ...
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
Installed paramedic into /home/bigdata-dw/es2.1.1/plugins/paramedic

2)创建索引documents

创建ducuments索引,包含3个分片,1个副本。

[bigdata-dw@bigdata-arch-client10 es2.1.1]$ curl -XPUT http://10.93.21.21:8049/documents -d '{
> settings: {
> number_of_replicas: ,
> number_of_shards:
> }
> }'
{"acknowledged":true}

3)在索引数据的过程中使用路由

我们创建3个Document

id=1

curl -XPUT http://10.93.21.21:8049/documents/doc/1?routing=A -d '{"title": "Document"}'
{"_index":"documents","_type":"doc","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

id=2

curl -XPUT http://10.93.21.21:8049/documents/doc/2?routing=A -d '{"title": "Document"}'
{"_index":"documents","_type":"doc","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

id=3

curl -XPUT http://10.93.21.21:8049/documents/doc/3?routing=A -d '{ "title": "Document"}'
{"_index":"documents","_type":"doc","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

查询一下,可以看到document中是带有_routing键的。

curl -XGET 'http://10.93.21.21:8049/documents/_search?pretty'
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : 1.0,
"hits" : [ {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
}, {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
}, {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
} ]
}
}

在Paramedic中查看

4)在查询中使用路由

使用路由键“A”进行查询,可以看到_shards.total=1,便可知只查询了一个分片,这个分片便是路由键“A”算出的分片,在这个分片中可以查出我们以路由键“A”存入的数据

curl -XGET 'http://10.93.21.21:8049/documents/_search?pretty&q=*:*&routing=A'
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : 1.0,
"hits" : [ {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
}, {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
}, {
"_index" : "documents",
"_type" : "doc",
"_id" : "",
"_score" : 1.0,
"_routing" : "A",
"_source":{
"title": "Document"}
} ]
}
}

使用路由键“B”,可以看到_shards.total=1,也是只查询由路由键“B”指定的分片,在这个分片中不能查出我们以路由键“A”存入的数据

curl -XGET 'http://10.93.21.21:8049/documents/_search?pretty&q=*:*&routing=B'
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : null,
"hits" : [ ]
}
}

总结一下路由的优点

1)只查询一个shard,避免在其他shard无用的查询与master上的合并,提升了查询效率。

2)在nodes与shards较多的大规模集群中,在多个shards上查询出现failed的可能性较大,在master上合并后,对数据完整性并不能很好的确定,使用routing可以有效避免。例如在total=64个shards的索引上查询,successful=60,failed=4,这时候对合并的数据,我们不能保证其是完整的。

 

Elasticsearch分片、副本与路由(shard replica routing)的更多相关文章

  1. Elasticsearch技术解析与实战--shard&replica机制

    序言 1.shard&replica机制 (1)index包含多个shard (2)每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力 (3)增 ...

  2. Elasticsearch分片&副本分配

    集群索引中可能由多个分片构成,并且每个分片可以拥有多个副本,将一个单独的索引分为多个分片,可以处理不能在单一服务器上运行的 大型索引. 由于每个分片有多个副本,通过副本分配到多个服务器,可以提高查询的 ...

  3. Elasticsearch 分片路由原理指定分片存储查询

    Elasticsearch 项目中使用到Es的父子结构.在数据填充之后,查看每个节点的数据分布情况,发现有的节点数据多,有的节点少的情况,在未使用Es父级结构之前,每个节点的数据分布还算平均,如下图: ...

  4. elasticsearch问题解决之分片副本UNASSIGNED

    在上一篇文章中,我记录了在windows下同一台机器上搭建es集群的步骤,第二天在向集群中创建索引的时候,出现了分片副本未分配的情况(UNASSIGNED). 虽然并不影响数据的插入和查询,但是有问题 ...

  5. Elasticsearch技术解析与实战(四)shard&replica机制

    序言 shard&replica机制 1.index包含多个shard 2.每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力 3.增减节点时, ...

  6. MongoDBV3.0.7版本(shard+replica)集群的搭建及验证

    集群的模块介绍: 从MongoDB官方给的集群架构了解,整个集群主要有4个模块:Config Server.mongs. shard.replica set: Config Server:用来存放集群 ...

  7. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  8. mongodb 3.6 集群搭建:分片+副本集

    mongodb是最常用的nosql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  9. mongodb3.6集群搭建:分片+副本集

    mongodb是最常用的noSql数据库,在数据库排名中已经上升到了前五.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

随机推荐

  1. Java 定时器 Timer 的使用.

    一.概念       定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能, ...

  2. CSS3动画效果之transition

    CSS3中有两种方式实现动画,transition和animation+@keyframe. 两者的作用机制不一样:transition定义在可能要进行动画的元素上,对某些CSS属性进行监听,一旦CS ...

  3. Core Java 谈谈HashMap

    说起Java的HashMap相信大家都不是很陌生,但是对于HashMap内部结构有些同学可能不太了解,咱们下一步就将其展开. HashMap是基于Hash算法的,同理的还有HashSet和HashTa ...

  4. [我所理解的REST] 3.基于网络应用的架构

    上篇中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于基于网络的应用来说,哪些点是需要我们重点关注的. 1 ...

  5. yyt

    红颜迤逦隔云梯, 相思萦系解花语. 我有相思千般意, 百磨不灭铭肝肠.

  6. 团队作业4——第一次项目冲刺(Alpha版本)4th day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 计时功能已经完成,然后24点的代码如何在游戏界面与界面组件联系上正在进行. 四.困难与问题 1.在安卓框架与java代码的结合 ...

  7. 201521123069 《Java程序设计》 第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  8. 201521123040《Java程序设计》第2周学习总结

    1. 本周学习总结 本周学习目录: <1>回顾(Java程序) <2>掌握各种数据类型的使用 <3>掌握运算符和表达式的使用 <4>枚举类.String ...

  9. 201521123026 《java程序设计》 第九周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) PTA提交结果: 运行结果截图: 1.2 ...

  10. SVM原理以及Tensorflow 实现SVM分类(附代码)

    1.1. SVM介绍 1.2. 工作原理 1.2.1. 几何间隔和函数间隔 1.2.2. 最大化间隔 - 1.2.2.0.0.1. \(L( {x}^*)\)对$ {x}^*$求导为0 - 1.2.2 ...