网站首页 > 教程文章 正文
前言
" 在前面已经介绍了 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。
相关资料
[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 /> -
作者:刘志航,一个宅宅的北漂程序员。
公众号:liuzhihangs,记录工作学习中的技术、开发及源码笔记;时不时分享一些生活中的见闻感悟。欢迎大佬来指导!
猜你喜欢
- 2024-12-03 Yii::$app->request常用属性和方法
- 2024-12-03 查缺补漏:一文看懂HTTP请求流程,不信你还不会
- 2024-12-03 Mysql写入频繁,怎么破?这是我见过的最清晰的“神操作”
- 2024-12-03 “我将 AWS 的数据传输成本,降低了 99%!”
- 2024-12-03 必备 Python 库:Requests - 轻松完成 HTTP 请求
- 2024-12-03 免费获取韵达快递查询API的使用指南
- 2024-12-03 手撸了一个网络请求工具类,开发速度迅速提升了300%
- 2024-12-03 应用层协议HTTP和HTTPS,一篇文章学会
- 2024-12-03 HTTP客户端连接,选择HttpClient还是OkHttp?
- 2024-12-03 深入理解 HTTP 请求参数和响应参数
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)