1、索引过程图解:

  • api向集群发送索引请求,集群会使用负载均衡节点来处理该请求,如果没有单独的负载均衡点,master节点会充当负载均衡点的角色。
  • 负载均衡节点根据routing参数来计算要将该索引存储到哪个primary shard上,然后将数据给到对应的shard。
  • 对应的shard拿到数据后进行索引写入,写入成功后,将数据给到自己的replica shard。
  • 当replica shard也将数据成功写入后,返回成功的结果到负载均衡节点。
  • 此时负载均衡节点才认为数据写入成功,将成功索引的结果返回给请求的api

2、routing(路由)参数

2.1、routing参数的指定和计算原理

每个document存放在哪个shard上是由routing参数决定的,那这个参数的值是什么,ElasticSearch又是怎么通过该参数来确定存放在哪个shard上呢?

  • routing参数的默认值为_id,也可以进行手动指定routing参数,可以是值,也可以是某个字段:

    PUT /index/type/id?routing=user_id
    {
    "user_id":"M9472323048",
    "name":"zhangsan",
    "age":54
    }
  • ElasticSearch有个哈希算法,通过 Hash(routing) % number_of_shards算得存储到哪个shard上面去,比如上面的语句,假设Hash("M9472323048") = 23,该index含有3个shard,则存储到 23 % 3 = 2,即P2上面。shard编号取值为0 number_of_shards - 1。

2.2、手动指定routing和自动routing的区别

routing的值默认为_id字段,_id可以保证在集群中唯一,但是有时候需要手动指定routing来优化后续的查询过程。因为routing确定,那就可以指定用哪个routing进行查询,缩减了目标结果集,减少了ElasticSearch集群的压力。

  • 使用自动routing:

    • 优点: 简单,可以很均衡的分配每个shard中的文档数量,做到负载均衡
    • 缺点: 当查询一下复杂的数据时,需要到多个shard中查找,查询偏慢
  • 使用手动routing:
    • 优点: 查询时指定当初入库的routing进行查询,锁定shard,直达目标,查询速度快
    • 缺点: 麻烦,要保证存储的均衡比较复杂

最新文章

  1. 配置nodejs环境
  2. Visual Studio Code 使用 Typings 实现智能提示功能
  3. git branch 管理常用命令
  4. 用etckeeper来解救运维工程师
  5. 转盘游戏[XDU1006]
  6. struts2获得request和session对象
  7. ListView单击单元格 产生其他控件
  8. openfire插件开发之完美开发
  9. EasyUi datagrid 表格分页例子
  10. APK的目录结构
  11. Eclipse利用代理快速安装插件
  12. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)
  13. ajax跨域请求解决方案
  14. mysql DISTINCT 的实现与优化
  15. MongoDB代码——Python篇
  16. Docker: Harbor一些小知识
  17. Kafka 0.10 Coordinator概述
  18. SQL SERVER BCP的用法
  19. wx工具栏,菜单栏,状态栏
  20. e770. 确定按钮租中已选的单选按钮

热门文章

  1. linux终端自定义命令的别名
  2. 解决ajax的parsererror错误的终极办法(后台传给前台的数据json问题)
  3. ASP.NET Core 2.0 MVC「远程」验证
  4. VPN连接机器不再输入密码以及Pin码方法
  5. Python源码分析
  6. 这应该是目前最快速有效的ASP.NET Core学习方式(视频)
  7. [译]漫画SELinux概念
  8. Windows server2012如何运行Javaweb项目?
  9. 2810:完美立方-poj
  10. UITextField的使用小技巧