ES学习(八)

一、bulk操作

  A. 语法

    POST _bulk

    {"action","metadata"}

    {"data"}

    注意:一个json串一行,不能换行

  B、bulk size最佳大小

    bulk request会加载到内存里,如果太大的话,性能反而会下降,因此需要反复尝试一个最佳bulk size。一般从1000-5000条数据开始,尝试逐渐增加。另外,如果看大小的话,最好在5-15M之间

二、数据路由原理

  A、路由算法

    shard=hash(routing) % number_of_primary_shards

  B、默认的routing就是id,也可以在发送请求时手动指定一个routing value

  C、过程

    1. 客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)

    2. coordinating node,对document进行路由,将请求转发给对应的node(有primary shard)

    3. 实际的node上primary shard处理请求,然后将数据同步到replica shard

    4. coordinating node,如果发现primary shard和所有的replica shard都搞定后,就返回响应结果给客户端

三、写一致性

  A、我们发送一个增删改操作的时候,都可以带上一个consistency参数,指明我们想要的写一致性是什么? put /index/_doc/id?constency=quorum

    1. one: 只要有一个primary shard 是active就可以执行

    2. all:要求所有的primary shard和replica shard都是active才可以执行

    3. quorum:要求大部分的shard都是活跃的才可以执行

  B、特殊:只有当number_of_replicas>1时才生效

  C、quorum不齐的时候,等待一分钟(默认)超时,可以指定超时时间 ....?timeout=30s(默认毫秒)

四、bulk处理步骤

  A、如果不写成奇特的格式步骤

    1. 将json数组解析成jsonArray对象,这个时候,整个数据,就会在内存中出现一份一模一样的拷贝,一份数据是json文本,一份数据是jsonArray对象

    2、解析json数组里的每个json,对每个请求中的document进行路由

    3、为路由到一个shard上的多个请求创建一个请求数组

    4、将请求数组序列化

    5、将序列化好的请求数组发送刀对应的节点上去

    bulk大小控制在10M左右,太大的话,处理时候内存使用量翻倍且更多,会占用其它更重要请求的内存。另外,占用内存更多就会导致java虚拟机的垃圾回收次数更多更频繁,耗费时间更多,导致es的java虚拟机停止工作线程的时间更长。

  B、奇特格式

    1. 不用将其转换成json对象,不会出现内存中相同数据的拷贝,直接按照换行符切割json

    2. 对每两个一组的json,读取meta,进行document路由

    3. 直接将对应的json发送到node上去

五、timeout机制

  A、默认没有timeout,请求可以手动指定

六、multi index搜索

  A、/_search:所有索引

  B、/index/_search:指定索引

  C、/index1,index2/_search:同时搜索index1和index2

  D、/*1,*2/_search: 按照通配符搜索多个索引

七、deep paging问题

  如果有60000条数据,有3个primary shard,每个shard有20000条,要取10001-10010数据,则每个shard要拿10010条数据出来给coordinating node,总共30030条数据,然后排序,取出10001-10010数据。

  搜索过深的时候,就需要在coordinating node上保存大量数据,还要进行大量数据的排序,再取出对应的那一页,这个过程即耗费网络带宽,耗费内存,耗费cpu,应该尽量避免

原文地址:https://www.cnblogs.com/DjanFey/p/12120123.html