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

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

 [[340646]]

前言

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

1.ES演示

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

  1. ~  % > ./elasticsearch 
  2.  
  3. ~  % > ./elasticsearch -Epath.data=data2 -Epath.logs=log2 
  4.  
  5. ~  % > ./elasticsearch -Epath.data=data3 -Epath.logs=log3 

创建一个索引

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

当前版本 7.9

ES 默认 number_of_shards 为 1

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

 

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

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

 

存放数据

  1. curl -X PUT "localhost:9200/my-index-000001/_doc/0825?pretty" -H 'Content-Type: application/json' -d' 
  2.   "name""liuzhihang" 

 

查询数据

  1. curl -X GET "localhost:9200/my-index-000001/_doc/0825?pretty" 

 

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

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

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

  1. 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。

  • primary shard 会验证传入的数据结构
  • 本地执行相关操作
  • 将操作转发给 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 上呢?

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

本文转载自微信公众号「刘志航」,可以通过以下二维码关注。转载本文请联系刘志航公众号。

 

 

 

责任编辑:武晓燕 来源: 刘志航
相关推荐

2023-06-18 23:13:27

MySQL服务器客户端

2018-01-16 15:02:20

存储RAIDSAN

2022-10-10 08:47:49

ITCIO数据

2021-02-19 10:14:49

云计算公共云

2015-11-18 10:13:54

数据中心数据中心发展

2021-05-08 13:11:58

物联网IOT物联网技术

2022-03-15 16:19:13

物联网物联网 2.0IoT

2011-10-10 11:04:54

2024-03-04 09:19:33

CSSbackground前端

2021-05-27 09:30:51

Java流程控制

2019-06-24 11:07:34

数据数据库存储

2021-11-29 07:42:44

CSS 技巧CSS 绘图技巧

2020-11-04 11:17:20

好代码程序员整洁

2014-04-08 09:56:30

销售易CRM

2021-01-07 07:33:06

Tomcat启动工具

2021-09-30 19:12:46

通信网络ADSL

2022-11-18 10:17:10

2019-09-03 14:57:33

智慧城市虚拟新加坡3D

2023-02-17 14:40:06

物联网供应链

2012-10-29 15:45:51

点赞
收藏

51CTO技术栈公众号