zoukankan      html  css  js  c++  java
  • 【Elasticsearch 技术分享】—— Elasticsearch 存储一条数据, put 过程是什么样子的?

    前言

    在前面已经介绍了 ES 中常用的一些名词,知道了数据是存储在 shard 中的,而 index 会映射一个或者多个 shard 。那这时候我要存储一条数据到某个索引下,这条数据是在哪个 index 下的呢?

    ES 演示

    一切按照官方教程使用 三条命令,在本机启动三个节点组装成伪集群。

    ~  % > ./elasticsearch
    
    ~  % > ./elasticsearch -Epath.data=data2 -Epath.logs=log2
    
    ~  % > ./elasticsearch -Epath.data=data3 -Epath.logs=log3
    

    创建索引

    curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
    {
      "settings": {
        "index": {
          "number_of_shards": 3,  
          "number_of_replicas": 2 
        }
      }
    }
    '
    

    当前版本 7.9

    文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html

    ES 默认 number_of_shards 为 1
    默认 number_of_replicas 为 1,即一个分片只有一个副本

    下面命令可以查看索引信息

    curl -X GET "localhost:9200/_cat/indices/my-index-000001?v&s=index&pretty"
    

    存放数据

    curl -X PUT "localhost:9200/my-index-000001/_doc/0825?pretty" -H 'Content-Type: application/json' -d'
    {
      "name": "liuzhihang"
    }
    '
    
    #### 查询数据
    curl -X GET "localhost:9200/my-index-000001/_doc/0825?pretty"
    

    文档地址:
    https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html

    一条数据该存放在哪个 shard

    通过命令可以看出:在存放数据时并没有指定到哪个 shard,那数据是存在哪里的呢?

    当一条数据进来,会默认会根据 id 做路由

    shard = hash(routing) % number_of_primary_shards
    

    从而确定存放在哪个 shard。 routing 默认是 _id, 也可以设置其他。

    这个 id 可以自己指定也可以系统给生成, 如果不指定则会系统自动生成。

    put 一条数据的过程是什么样的?

    写入过程主要分为三个阶段

    1. 协调阶段:Client 客户端选择一个 node 发送 put 请求,此时当前节点就是协调节点(coordinating node)。协调节点根据 document 的 id 进行路由,将请求转发给对应的 node。这个 node 上的是 primary shard 。
    2. 主要阶段:对应的 primary shard 处理请求,写入数据 ,然后将数据同步到 replica shard。
      1. primary shard 会验证传入的数据结构
      2. 本地执行相关操作
      3. 将操作转发给 replica shard
      4. 当数据写入 primary shard 和 replica shard 成功后,路由节点返回响应给 Client。
    3. 副本阶段:每个 replica shard 在转发后,会进行本地操作。

    在写操作时,默认情况下,只需要 primary shard 处于活跃状态即可进行操作。

    在索引设置时可以设置这个属性

    index.write.wait_for_active_shards

    默认是 1,即 primary shard 写入成功即可返回。

    如果设置为 all 则相当于 number_of_replicas+1 就是 primary shard 数量 + replica shard 数量。 就是需要等待 primary shard 和 replica shard 都写入成功才算成功。

    可以通过索引设置动态覆盖此默认设置。

    总结

    如何查看数据在哪个 shard 上呢?

    curl -X GET "localhost:9200/my-index-000001/_search_shards?routing=0825&pretty"
    

    通过上面命令可以查到数据 0825 的所在 shard。

    相关资料

    1. ES 创建索引:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
    2. ES 查询数据:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html
    3. ES 检索 shard:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html
  • 相关阅读:
    Golang进阶实战之IO操作
    动态获取输入框光标在页面中的位置! || 动态添加 style标签 || 获取元素样式 || 获取元素在页面中的位置
    v-select插件
    各种创建数组的方法
    百度UEditor编辑器
    vue-router 各种守卫以及流程梳理
    Snipaste 一款好用的 windows截图工具
    ant-design-vue
    罕见的css样式
    vue图片点击放大预览v-viewer
  • 原文地址:https://www.cnblogs.com/liuzhihang/p/elasticsearch-3.html
Copyright © 2011-2022 走看看