一、路由文档到分片

当你索引一个文档的时候,他被存储在单独一个主分片上。Elasticsearch根据一个算法来找到所在分片上。

shard=hash(routing)%number_of_primary_shards

routing值是一个任意字符串,默认是_id但也可以自定义。这个routing通过哈希函数生成一个数字,然后除以主切片的数量得到一个榆树。这也就是为什么主分片的数量只能在创建索引时定义且不能修改:如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档就永远找不到了。

所有的文档API都接受一个routing参数,用来定义文档到分片的映射。

二、分片交互

这里有三个节点的集群,他包含一个叫做bblogs的索引并拥有两个主分片。每个主分片有两个复制分片。相同的分片不会再同一个节点上。

我们可以发送请求给集群中任意一个节点,每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点。所以也可以请求转发到需要的节点。

在我们发送请求时,最好的做法是循环通过所有节点请求,这样可以平衡负载。

三、新建索引和删除文档

新建索引和删除文档都是写操作,他们必须在主分片上成功完成才能复制到相关的复制分片上

以下为在主分片和复制分片上成功新建索引和删除文档的步骤:

①:客户端给Node1发送新建索引或删除请求

②:节点使用文档的_id确定文档属于分片0.他转发请求到Node3,分片0位于这个节点上

③:Node3在主分片上执行请求,如果成。他组案发请求到相应的位于Node1和Node2的复制节点上,当所有的复制节点报告成功,Node3报告成功到请求的节点,请求的节点再报告给客户端。

客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片,你的修改就生效了。

replication:

复制的默认值是sync.这将导致主分片得到复制分片的成功响应后才返回。

如果你设置replication为async,请求在主分片上被执行后就会返回客户端,他依旧会转发请求给复制节点,但是你将不知道复制节点成功与否。

consistency:

默认主分片在尝试写入时需要规定数量(quorum)或过半的分片可用。为了防止数据被写入到错的网络分区。

int((primary+number_of_replicas)/2)+1

consistency允许值为一个 全部过过半分区、

timeout:

当分片副本不足时,Elasticsearch会等待更多的分片出现,默认等待一分钟还可以自己设置。

四、检索文档

文档能够从主分片或任意一个复制分片被检索

以下为从主分片或复制分片上检索一个文档的步骤:

①:客户端给Node1发送请求

②:节点使用文档的_id确定文档属于分片0、分片0对应的复制分片在三个节点上都有。此时。他转发请求到Node2

③:Node2返回endangered给Node1然后返回给客户端

五、局部更新文档

以下为局部更新的步骤:

①:客户端给Node1发送更新请求

②:他转发请求到主分片所在节点Node3

③:Node3从主分片检索出文档,修改_source字段的JSON。然后在主分片上重建索引。如果有其他进程修改了文档,他以retry_on_confluct设置的次数重复步骤3,都未成功则放弃

④:如果Node3成功更新文档,他同时转发文档的新版本到Node1和Node2上的复制节点以重建索引,当所有复制节点报告成功,Node3返回成功给请求节点,然后返回给客户端

六、批量请求

mgetbulk API与单独的文档类似。差别是请求节点知道每个文档所在的分片。它把多文档请求拆成每个分片的对文档请求,然后转发每个参与的节点。

一旦接收到每个节点的应答,然后整理这些响应组合为一个单独的响应,最后返回给客户端。

以下为请求步骤:

1.客户点向Node1发送mget请求

2.Node1为每个分片构建一个多条数据检索请求,然后转发到这些请求所需的主分片或复制分片上。当所有回复被接受,Node1构建响应并返回给客户端

routing参数可以被docs中的每个文档设置

下面我们将罗列使用一个bulk执行多个createindexdeleteupdate请求的顺序步骤:

  1. 客户端向Node 1发送bulk请求。
  2. Node 1为每个分片构建批量请求,然后转发到这些请求所需的主分片上。
  3. 主分片一个接一个的按序执行操作。当一个操作执行完,主分片转发新文档(或者删除部分)给对应的复制节点,然后执行下一个操作。复制节点为报告所有操作完成,节点报告给请求节点,请求节点整理响应并返回给客户端。

bulk API还可以在最上层使用replicationconsistency参数,routing参数则在每个请求的元数据中使用。

ElasticSearch入门系列(六)分布式操作的更多相关文章

  1. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  2. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  3. ElasticSearch实战系列六: Logstash快速入门和实战

    前言 本文主要介绍的是ELK日志系统中的Logstash快速入门和实战 ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  4. Go语言入门系列(六)之再探函数

    Go语言入门系列前面的文章: Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 Go语言入门系列(五)之指针和结构体的使用 在Go语言入门系列(二)之基础语法总结这篇文章中已经 ...

  5. ElasticSearch入门系列(四)分布式初探

    序言:ElasticSearch致力于隐藏分布式系统的复杂性,以下的操作都是在底层自动完成的: 将你的文档分区到不同的容器或者分片(shards),他们可以存在于一个或多个节点中 将分片均匀的分配到各 ...

  6. Elasticsearch入门系列~通过Java一系列操作Elasticsearch

    Elasticsearch索引的创建.数据的增删该查操作 上一章节已经在Linux系统上安装Elasticsearch并且可以外网访问,这节主要通过Java代码操作Elasticsearch 1.创建 ...

  7. ElasticSearch入门系列(五)数据

    序言:无论程序如何写,最终都是为了组织数据为我们服务.在实际应用中,并不是所有相同类型的实体的看起来都是一样的.传统上我们使用行和列将数据存储在关系型数据库中相当于使用电子表格,这种固定的存储方式导致 ...

  8. ElasticSearch入门系列(七)搜索

    一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...

  9. ElasticSearch入门系列(三)文档,索引,搜索和聚合

    一.文档 在实际使用中的对象往往拥有复杂的数据结构 Elasticsearch是面向文档的,这意味着他可以存储整个对象或文档,然而他不仅仅是存储,还会索引每个文档的内容使之可以被搜索,在Elastic ...

随机推荐

  1. java.util.Date与java.sql.Date

    我数据库里用到了日期类型.用java编程的时候同时import了java.util.*和java.sql.*,发现直接申明Date类型 Date dt; 会报错,查了一下才发现有java.util.D ...

  2. Linux screen 命令

    简单的来说 在screen里面敲的命令都是在后台的,所以不需要想bg那样,ctrl+z在bg把后台服务运行起来.而且下次可以直接进去screen作业的后台界面,可以看到我们过去敲的命令记录,即使你的C ...

  3. JDK环境变量详细讲解

    首先,你应该已经安装了 java 的 JDK 了,笔者安装的是:jdk-8u65-windows-x64 下载地址: http://www.oracle.com/technetwork/java/ja ...

  4. Java基础-super关键字与this关键字

    用super调用父类构造方法 类如果没有显式声明构造方法,则自动生成无参数的默认构造方法. 1.先用一个无参数的父类构造方法验证一下, 执行子类构造方法会自动调用父类的构造方法.测试代码: class ...

  5. [Notes] Learn Python2.7 From Python Tutorial

    I have planed to learn Python for many times. I have started to learn Python for many times . Howeve ...

  6. leetcode-Excel Sheet Column Title

    题目: 把数字转化为excel形式的字符表示.示例:1->A 2->B 3->C ... 26->Z 27->AA... 解题思路: 乍一看有点像进制转换题目,不过细想想 ...

  7. POJ 1584 A Round Peg in a Ground Hole --判定点在形内形外形上

    题意: 给一个圆和一个多边形,多边形点可能按顺时针给出,也可能按逆时针给出,先判断多边形是否为凸包,再判断圆是否在凸包内. 解法: 先判是否为凸包,沿着i=0~n,先得出初始方向dir,dir=1为逆 ...

  8. 第六章、Struts2数据校验

    一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...

  9. Linux下误删除后的恢复操作(ext3/ext4)

    Linux是作为一个多用户.多任务的操作系统,文件一旦被删除是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据.在日常工程 ...

  10. jquery.validate.min.js 用法方法示例

    页面html 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...