
【Elasticsearch 技术分享】—— Elasticsearch 存储一条数据, put 过程是什么样子的?
#### 查询数据
发布日期:2021-05-19 03:30:32
浏览次数:15
分类:博客文章
本文共 1878 字,大约阅读时间需要 6 分钟。
前言
在前面已经介绍了 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
文档地址:
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"
文档地址:
一条数据该存放在哪个 shard
通过命令可以看出:在存放数据时并没有指定到哪个 shard,那数据是存在哪里的呢?
当一条数据进来,会默认会根据 id 做路由
shard = hash(routing) % number_of_primary_shards
从而确定存放在哪个 shard。 routing 默认是 _id, 也可以设置其他。
这个 id 可以自己指定也可以系统给生成, 如果不指定则会系统自动生成。
put 一条数据的过程是什么样的?
写入过程主要分为三个阶段
- 协调阶段:Client 客户端选择一个 node 发送 put 请求,此时当前节点就是协调节点(coordinating node)。协调节点根据 document 的 id 进行路由,将请求转发给对应的 node。这个 node 上的是 primary shard 。
- 主要阶段:对应的 primary shard 处理请求,写入数据 ,然后将数据同步到 replica shard。
- primary shard 会验证传入的数据结构
- 本地执行相关操作
- 将操作转发给 replica shard
- 当数据写入 primary shard 和 replica shard 成功后,路由节点返回响应给 Client。
- 副本阶段:每个 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。
相关资料
- ES 创建索引:
- ES 查询数据:
- ES 检索 shard:
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月01日 09时10分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
"WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
2023-01-23
#if 0 #elif 1 #else #endif 用法
2023-01-23
#include <gdiplus.h>出错
2023-01-23
$ajax({}).done 和 $ajax({}) success 区别
2023-01-23
(反射+内省机制的运用)处理jdbc的结果集
2023-01-23
(反射+内省机制的运用)简单模拟spring IoC容器的操作
2023-01-23
(转)SQLServer全局变量
2023-01-23
(转)tomcat7.0 manager app和host manager web管理
2023-01-23
(转)【英雄会即时报道】五大CTO畅谈软件公司如何招聘技术人才
2023-01-23
(转)使用公用表表达式的递归查询(SQLSERVER2005)
2023-01-23
(转)在CListView列表视图中添加右键菜单的方法
2023-01-23
(转)考虑错误情况
2023-01-23
++b&&a--运算结果解析
2023-01-23
.Net(C#)实现异步编程
2023-01-23
.Net中webBrowser控件JS交互
2023-01-23
.Net中webBrowser控件指定IE版本
2023-01-23
0-1背包问题:贪心算法与动态规划的比较
2023-01-23
02-docker系列-镜像分类以及操作(导入、导出、删除)
2023-01-23
02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除
2023-01-23