前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch 存储一条数据, put 过程是什么样子的?

Elasticsearch 存储一条数据, put 过程是什么样子的?

作者头像
程序员小航
发布2020-11-23 11:53:53
7520
发布2020-11-23 11:53:53
举报
文章被收录于专栏:程序员小航

前言

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

1

ES演示

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

代码语言:javascript
复制
~  % > ./elasticsearch

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

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

创建一个索引

代码语言:javascript
复制
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

ES 默认 number_of_shards 为 1

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

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

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

存放数据

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

查询数据

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

2

一条数据该存放在哪个 shard ?

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

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

代码语言:javascript
复制
shard = hash(routing) % number_of_primary_shards

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

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

3

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
  3. 当数据写入 primary shard 和 replica shard 成功后,路由节点返回响应给 Client。
  4. 副本阶段:每个 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 都写入成功才算成功。

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

4

总结

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

代码语言:javascript
复制
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

[2] ES 检索 shard:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html

- <End /> -


历史文章 | 相关推荐

Elasticsearch 常用名词了解一下

Elasticsearch 有什么特点及应用场景

使用 Maven Archetype 创建项目模版

作者:刘志航,一个宅宅的北漂程序员。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小航 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档