ES分布式增删改查

1 第一步——路由文档到分片

这涉及到新文档存储的主分片的判定:
shard = hash(routing) % number_of_primary_shards  
这也是主分片数目不可变得根本原因

2 分片交互

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

3 写操作

下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
客户端给Node 1发送新建、索引或删除请求。
节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。

replication参数

复制默认的值是 sync。这将导致主分片得到复制分片的成功响应后才返回。
如果你设置 replication为 async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
上面的这个选项不建议使用。默认的 sync复制允许Elasticsearch强制反馈传输。 async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。

consistency参数

默认主分片在尝试写入时需要规定数量(quorum)或过半的分片(可以是主节点或复制节点)可用。这是防止数据被写入到错的网络分区。规定的数量计算公式如下:
int( (primary + number_of_replicas) / 2 ) + 1
consistency允许的值为 one(只有一个主分片), all(所有主分片和复制分片)或者默认的 quorum或过半分片。
注意 number_of_replicas是在索引中的的设置,用来定义复制分片的数量,而不是现在活动的复制节点的数量。如果你定义了索引有3个复制节点,那规定数量是:
int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2个节点,那你的活动分片不够规定数量,也就不能索引或删除任何文档。

timeout参数

当分片副本不足时会怎样?Elasticsearch会等待更多的分片出现。默认等待一分钟。如果需要,你可以设置 timeout参数让它终止的更早: 100表示100毫秒, 30s表示30秒。

注意

新索引默认有 1个复制分片,这意味着为了满足 quorum的要求需要两个活动的分片。当然,这个默认设置将阻止我们在单一节点集群中进行操作。为了避开这个问题,规定数量只有在 number_of_replicas大于一时才生效。

4 读操作

下面我们罗列在主分片或复制分片上检索一个文档必要的顺序步骤:
客户端给 Node 1发送get请求。
节点使用文档的 _id确定文档属于分片 0。分片 0对应的复制分片在三个节点上都有。此时,它转发请求到 Node 2。
Node 2返回文档(document)给 Node 1然后返回给客户端。
对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。
可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

5 多文档操作

多文档模式

mget和 bulk API与单独的文档类似。差别是请求节点知道每个文档所在的分片。它把多文档请求拆成每个分片的对文档请求,然后转发每个参与的节点。
一旦接收到每个节点的应答,然后整理这些响应组合为一个单独的响应,最后返回给客户端。
下面我们将罗列通过一个 mget请求检索多个文档的

多文档模式请求处理步骤
1. 客户端向 Node 1发送 mget请求。
2. Node 1为每个分片构建一个多条数据检索请求,然后转发到这些请求所需的主分片或复制分片上。当所有回复被接收, Node 1构建响应并返回给客户端。
routing 参数可以被 docs中的每个文档设置。

下面我们将罗列使用一个 bulk执行多个 create、 index、 delete和 update请求的顺序步骤:

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

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

多文档操作中,换行的作用是便于按行读取文件流,而不用将全部文件加载到内存中来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值