ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

时间:2022-09-03 14:59:53

ElasticSearch 系列文章

1 ES 入门之一 安装ElasticSearcha

2 ES 记录之如何创建一个索引映射

3 ElasticSearch 学习记录之Text keyword 两种基本类型区别

4 ES 入门记录之 match和term查询的区别

5 ElasticSearch 学习记录之ES几种常见的聚合操作

6 ElasticSearch 学习记录之父子结构的查询

7 ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

8 ElasticSearch 学习记录之ES高亮搜索

9 ElasticSearch 学习记录之ES短语匹配基本用法

10 ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

11 ElasticSearch 学习记录之集群分片内部原理

12 ElasticSearch 学习记录之ES如何操作Lucene段

13 ElasticSearch 学习记录之如任何设计可扩容的索引结构

14 ElasticSearch之 控制相关度原理讲解

分布式文档存储

ES分布式特性
  • 屏蔽了分布式系统的复杂性
  • 集群内的原理
    • 垂直扩容和水平扩容
    • 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中
ES集群特点
  • 一个集群拥有相同的cluster.name 配置的节点组成, 它们共同承担数据和负载的压力
  • 主节点负责管理集群的变更例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作
  • 集群健康

1.GET /_cluster/health

返回值中的status 是我们关注的

  • green 主副分片均正常
  • yellow 主都正常,不是所有的副都正常
  • red 所有主分片都不正常
  • 分片的特点
    • Elasticsearch 是利用分片将数据分发到集群内各处
    • 分片是数据的容器,文档保存在分片内
    • 分片又被分配到集群内的各个节点里
    • 当集群规模变动,ES会自动在各个节点中迁移分片。使得数据任然均匀分布在集群中
    • 副分片是主分片的一个拷贝,作为硬件故障时的备份。并提供返回文档读操作
    • 在创建索引时,确定主分片数,但是副分片可以在后面进行更改
在更新一个文档时的ES内部操作
  • Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。
  • 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。
  • 当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档
ES如何处理冲突
  • 使用乐观并发控制
  • 利用 _version 号来确保 应用中相互冲突的变更不会导致数据丢失
  • 通过外部系统使用版本控制
文档的部分更新
  • 文档不能被修改,只能被替换
如何路由一个文档到一个分片中
  • 当索引一个文档时,我们怎么知道这个文档在什么位置
  • 使用下面的这个路由选择公式

1.shard = hash(routing) % number_of_primary_shards

  • 下面将对这个公式每个字段进行分析
    • shard 哪个分片, 也就是分片id
    • routing 一个可变值,默认是文档的id
    • hash 一个哈希函数,对rounting字段进行哈希计算生成一个数字
    • number_of_primary_shards 主分片的数量,routing字段经过hash函数计算之后的值,将对 主分片的数量也就是 number_of_primary_shards 进行取与,之后得到的shard就是我们文档所在的分片的位置
主分片和副分片如何交互
  • 假设一个集群由三个节点组成。有一个索引,这个索引有两个主分片,每个主分片有两个副分片相同的分片的副本不会放在同一个节点上
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
  • 请求发送到集群任意节点,每个节点都有能力处理请求。每个节点都知道集群中任一文档的位置,所以可以将请求转发到需求节点上
新建、索引和删除单个文档 时的流程
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    1. 先向 node 1 来一个请求这个请求可能是发送新建,索引或者删除文档等。
    2. node 1 节点根据文档的_id 确定文档属于分片0, 请求被转发到node3 节点
    3. node 3 在主分片执行了请求,如果主分片执行成功了,它将请求转发给node1 和node 2 节点。当所有的副分片都执行成功,node 3 将协调节点报告成功,并向客户端报告完成
  • consistency 参数的值可以设为 one (只要主分片状态 ok 就允许执行操作),all(必须要主分片和所有副本分片的状态没问题才允许执行_写_操作), 或quorum 。默认值为 quorum , 即大多数的分片副本状态没问题就允许执行操作

  • 在执行一个写操作时,主分片都需要必须有一个规定数量的(quorum),也就是在大多数主副分片处于活跃状态。这样是防止在网络分区故障是执行写操作会导致数据不一致

1.quorum = int( (primary + number_of_replicas) / 2 ) + 1

取回一个文档
  • 可以从主分片或者任意副本分片检索文档
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
    1. 某个请求向node 1 发送获取请求 节点使用
    2. 节点使用节点文档_ID来确定文档属于分片0, 分片0 的副本分片存在于所有的三个节点上,在这种情况下,他将请求转发到node 2
    3. node 2 将文档返回给node 1 ,然后将文档返回给客户端
  • 在每次处理读取请求时,协调结点在每次请求的时候都会轮训所有的副本片来达到负载均衡
局部更新文档
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
  • 部分更新一个文档的步骤
    1. 客户端向node1 发送一个请求
    2. 它将请求转发到主分片这个文档所在的Node 3
    3. node 3从主分片检索文档,修改_Source json ,并且尝试重新索引主分片的文档。如果文档被另一个进程修改,他会重复步骤3 知道超过retry_on_conflict 次后放弃
    4. node 3 成功更新文档,它将新版本的文档并行转发到node 1 和node 2 的副本分片,重新建立索引。所有副本分片都返回成功,node 3 向协调节点也返回成功,协调节点向客户端返回成功
    5. update 操作也支持 新建索引的时的那些参数 routing 、 replication 、 consistency 和 timeout

多文档模式

  • mget 和 bulk API 的 模式类似于单文档模式。 协调节点知道每个文档的位置,将多个文档分解成每个文档的的多文档请求,并且将这些请求并行的转发到每个参与节点中 。
  • 使用 mget 取回多个文档
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
    1. 客户端向node 1 发送一个mget请求
    2. node 1 向每个分片构建多文档请求,并行的转发这些请求到托管在每个所需的主分盘或者副分片的节点上一旦收到所有的额回复,node 1 构建响应并将其返回给客户端
  • 使用 bulk 修改多个文档
  • ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
    1. 一个bulk请求请求到node 1
    2. node 1 为每个节点创建一个批量请求,并将这些请求并行转发到每个包含主分片的节点
    3. 主分片一个接一个按顺序执行每个操作。当每个操作成功时,主分片并行转发新文档(或删除)到副本分片,然后执行下一个操作。 一旦所有的副本分片报告所有操作成功,该节点将向协调节点报告成功,协调节点将这些响应收集整理并返回给客户端

搜索—–最基本的工具

  • ElastcSearch 的三个基本概念
    1. 映射 Mapping 描述数据在每个字段是如何存储的
    2. 分析 Analysis 全文如何处理使之可以被搜索到
    3. Query DSL ES中强大灵活的查询语言
  • 空搜索
    • GET /_search 没有指定任何查询的搜索包括没有指定索引

1.**查询获取之后**
**查询获取之后**
2.
3. {
4. "took": 8, //请求耗费多少毫秒
5. "timed_out": false,//是否超时
6. "_shards": {//在查询中参与分片的总数,成功多少,失败多少
7. "total": 42,//总分片数
8. "successful": 42,//成功数
9. "skipped": 0,//跳过数
10. "failed": 0//失败数
11. },
12. "hits": {//hits指返回的结果集
13. "total": 6184,//总文档数量
14. "max_score": 1,
15. "hits": [
16. {
17. "_index": ".kibana", //索引名称
18. "_type": "config",//索引type
19. "_id": "5.6.3",//文档在这个索引下的id
20. "_score": 1,//索引得分,是查询后的计算得来的
21. "_source": {
22. "buildNum": 15554
23. }
24. },

xxxxxxxxxxxxxxxxxx

ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理的更多相关文章

  1. ElasticSearch 5学习(8)——分布式文档存储(wait_for_active_shards新参数分析)

    学完ES分布式集群的工作原理以及一些基本的将数据放入索引然后检索它们的所有方法,我们可以继续学习在分布式系统中,每个分片的文档是被如何索引和查询的. 路由 首先,我们需要明白,文档和分片之间是如何匹配 ...

  2. ElasticSearch文档及分布式文档存储

    1.什么是文档? 文档由索引(_index),类型(_type),唯一标识(_id) 组成,我们为 _index(索引) 分配相关逻辑地址分片,该索引下的数据会根据索引以及类型计算哈希来分配数据存储的 ...

  3. elasticsearch 基础 —— 分布式文档存储原理

    路由一个文档到一个分片中 当索引一个文档的时候,文档会被存储到一个主分片中. Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片  ...

  4. ElasticSearch权威指南学习(分布式文档存储)

    路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...

  5. Elasticsearch 分布式文档存储

    shard = hash(routing) % number_of_primary_shards决定文档在哪个分片上,routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值. ...

  6. 分布式文档存储数据库 MongoDB

    MongoDB 详细介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以 ...

  7. Elasticsearch学习系列之多文档操作mget

    测试数据 GET /library/books/1 { "_index": "library", "_type": "books& ...

  8. 分布式文档存储数据库之MongoDB基础入门

    一.MongoDB简介 MongoDB是用c++语言开发的一款易扩展,易伸缩,高性能,开源的,schema free 的基于文档的nosql数据库:所谓nosql是指不仅仅是sql的意思,它拥有部分s ...

  9. ElasticSearch学习之——基本的文档CURD

    一.文档的添加 POST http://127.0.0.1:9200/{index}/{type}/{id} { "key":"value", "ke ...

随机推荐

  1. Linux Epoll相关知识

    其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及 ...

  2. Git很好的教程

    本文地址:http://www.cnblogs.com/yhLinux/p/4067064.html 很好的Git教程,作为初学者,跟着作者的教程走了一遍之后,基本熟悉了Git的常用操作,此教程简洁明 ...

  3. 使用Code::blocks在windows下写网络程序

    使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...

  4. Facebook MyRocks at MariaDB

    Recently my colleague Rasmus Johansson announced that MariaDB is adding support for the Facebook MyR ...

  5. HDU 5723 Abandoned country(落后渣国)

    HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  6. IIS的虚拟目录和子应用程序

    一.虚拟目录     虚拟目录是指在发布的网站下建立一个虚拟子目录,指定一个固定的物理路径做为站点的应用路径.     1. 虚拟目录与父级站点共用一个应用程序池,网站Test是在D盘下建立了的虚拟目 ...

  7. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  8. 删除U8中单据已经审核完成但工作流未完成的任务

    问题描述: U8工作流终审结点后面还有节点时,当终审终点完成后,系统会通知后面的节点进行审核,但单据显示已经审核完成,后面的节点无法审核,工作任务会一直挂着,无法删除. 例如下图中,节点"终 ...

  9. &lbrack;openjudge-动态规划&rsqb;Maximum sum

    题目描述 题目原文 描述 Given a set of n integers: A={a1, a2,-, an}, we define a function d(A) as below: d(A)=m ...

  10. idea集成tomcat

    1 Tomcat的使用 * Tomcat:web服务器软件 1. 下载:http://tomcat.apache.org/ 2. 安装:解压压缩包即可. * 注意:安装目录建议不要有中文和空格 3. ...