【Elasticsearch 技术分享】—— Elasticsearch 存储一条数据, put 过程是什么样子的?

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在前面已经介绍了 ES 中常用的一些名词,知道了数据是存储在 shard 中的,而 index 会映射一个或者多个 shard 。那这时候我要存储一条数据到某个索引下,这条数据是在哪个 index 下的呢?

网络异常,图片无法展示
|


前言


在前面已经介绍了 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

文档地址:www.elastic.co/guide/en/el…


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

image.png

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

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

image.png


存放数据

curl -X PUT "localhost:9200/my-index-000001/_doc/0825?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "liuzhihang"
}
'
复制代码

image.png


查询数据

curl -X GET "localhost:9200/my-index-000001/_doc/0825?pretty"
复制代码

文档地址: www.elastic.co/guide/en/el…

image.png


一条数据该存放在哪个 shard

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

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

shard = hash(routing) % number_of_primary_shards
复制代码

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

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


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

image.png

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

  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。
  1. 副本阶段:每个 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。

image.png

相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
7天前
|
API 网络架构 索引
Elasticsearch索引中数据的增删改查与并发控制
Elasticsearch索引中数据的增删改查与并发控制
11 0
|
3天前
|
存储 安全 文件存储
【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存
【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存
7 1
|
7天前
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
11 3
|
7天前
|
数据库 索引
Elasticsearch索引别名:管理与优化数据访问
Elasticsearch索引别名:管理与优化数据访问
9 2
|
7天前
|
数据安全/隐私保护 网络架构 索引
Elasticsearch索引数据的路由规则与自定义路由分发
Elasticsearch索引数据的路由规则与自定义路由分发
8 0
|
8天前
|
存储 Java API
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
|
8天前
|
存储 自然语言处理 NoSQL
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)
|
8天前
|
存储 自然语言处理 NoSQL
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)
|
22天前
Elasticsearch安装配置文件
Elasticsearch安装配置文件
16 0
|
3天前
|
Linux Python
【Elasticsearch】linux使用supervisor常驻Elasticsearch,centos6.10安装 supervisor
【Elasticsearch】linux使用supervisor常驻Elasticsearch,centos6.10安装 supervisor
9 3