当前位置: 首页 > news >正文

记录一下Elasticsearch集群搭建的知识点

文章目录

  • 1、Elasticsearch
  • 2、使用docker搭建集群
  • 3、分片和副本
  • 4、故障转移
  • 5、分布式文档
    • 5.1、路由
    • 5.2、文档的写操作
    • 5.3、搜索文档(单个文档)
    • 5.4、全文搜索

文档背景

单纯的记录一下Elasticsearch集群搭建中的一些知识点

1、Elasticsearch

ELasticsearch的集群是由多个节点组成的,通过cluster.name设置集群名称,并且用于区分其它的集群,每个节点通过node.name指定节点的名称。
在Elasticsearch中,节点的类型主要有4种:

  • master节点
    • 配置文件中node.master属性为true(默认为true),就有资格被选为master节点。
    • master节点用于控制整个集群的操作。比如创建或删除索引,管理其它非master节点等。
  • data节点
    • 配置文件中node.data属性为true(默认为true),就有资格被设置成data节点。
    • data节点主要用于执行数据相关的操作。比如文档的CRUD。
  • 客户端节点
    • 配置文件中node.master属性和node.data属性均为false。
    • 该节点不能作为master节点,也不能作为data节点。
    • 可以作为客户端节点,用于响应用户的请求,把请求转发到其他节点
  • 部落节点
    • 当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执
      行搜索和其他操作。

2、使用docker搭建集群

我先构建两个Elasticsearch节点

转载一篇一篇集群搭建
链接: https://blog.csdn.net/TheLongir/article/details/125428027?spm=1001.2014.3001.5501

查看集群:
在这里插入图片描述
创建索引
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、分片和副本

为了将数据添加到Elasticsearch,我们需要索引(index)——一个存储关联数据的地方。实际上,索引只是一个用
来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.

  • 一个分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。
  • 我们需要知道是分片就是一个Lucene实例,并且它本身就是一个完整的搜索引擎。应用程序不会和它直接通
    信。
  • 分片可以是主分片(primary shard)或者是复制分片(replica shard)。
  • 索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
  • 复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或
    者从别的shard取回文档。
  • 当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。

4、故障转移

为了测试故障转移,需要再向集群中添加一个节点,并且将所有节点的node.master设置为true。

查看集群状态
在这里插入图片描述
创建索引
在这里插入图片描述
查看集群状态
在这里插入图片描述
将node1停止
在这里插入图片描述

脑裂问题:
关于脑裂问题,当我们将master节点关闭后,剩下的两个节点中,会选取一个最合适当master的节点,来做master。
这时再将原Master启动,此时就会出现双Master,正所谓一山不容二虎,当前master不会让原Master连接进来。这就是脑裂问题
脑裂的解决方案:

  1. 不要让节点很容易的变成master,必须有多个节点认可后才可以
  2. 设置minimum_master_nodes的大小为2,官方推荐:(n/2)+1,n为集群中节点数

5、分布式文档

5.1、路由

首先,来看个问题:
在这里插入图片描述
如图所示:当我们像一个集群保存文档时,文档该存储到哪个节点呢?是轮询还是随机呢?
实际上,在es中,会采用计算的方式来确定存储到那个节点上,计算公式如下

shard = hash(routing) % number_of_primary_shards

  • routing值是一个任意字符串,它默认是_id但也可以自定义。
  • 这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余
    数的范围永远是0到number_of_primary_shards - 1,这个数字就是特定文档所在的分片。

这就是为什么创建了主分片后,不能修改的原因

5.2、文档的写操作

新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。

在这里插入图片描述
下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:

  1. 客户端给 Node 1 发送新建、索引或删除请求。
  2. 节点使用文档的 _id 确定文档属于分片 0 。它转发请求到 Node 3 ,分片 0 位于这个节点上。
  3. Node 3 在主分片上执行请求,如果成功,它转发请求到相应的位于 Node 1 和 Node 2 的复制节点上。当
    所有的复制节点报告成功, Node 3 报告成功到请求的节点,请求的节点再报告给客户端。

客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片。你的修改生效了。

5.3、搜索文档(单个文档)

文档能够从主分片或任意一个复制分片被检索。
在这里插入图片描述

下面我们罗列在主分片或复制分片上检索一个文档必要的顺序步骤:

  1. 客户端给 Node 1 发送get请求。
  2. 节点使用文档的 _id 确定文档属于分片 0 。分片 0 对应的复制分片在三个节点上都有。此时,它转发请求
    到 Node 2 。
  3. Node 2 返回文档(document)给 Node 1 然后返回给客户端。

对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。
可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

5.4、全文搜索

对于全文搜索而言,文档可能分散在各个节点上,那么在分布式的情况下,如何搜索文档呢?
搜索,分为2个阶段,搜索(query)+取回(fetch)。

搜索( query )

在这里插入图片描述
查询阶段包含以下三步:

  1. 客户端发送一个 search(搜索) 请求给 Node 3 , Node 3 创建了一个长度为 from+size 的空优先级队
  2. Node 3 转发这个搜索请求到索引中每个分片的原本或副本。每个分片在本地执行这个查询并且结果将结果
    到一个大小为 from+size 的有序本地优先队列里去。
  3. 每个分片返回document的ID和它优先队列里的所有document的排序值给协调节点 Node 3 。 Node 3 把这
    些值合并到自己的优先队列里产生全局排序结果。

取回 ( fetch )

在这里插入图片描述

分发阶段由以下步骤构成:

  1. 协调节点辨别出哪个document需要取回,并且向相关分片发出 GET 请求。
  2. 每个分片加载document并且根据需要丰富(enrich)它们,然后再将document返回协调节点。
  3. 一旦所有的document都被取回,协调节点会将结果返回给客户端。

相关文章:

  • 自发荧光/阳离子纳米聚苯乙烯微球/功能化聚苯乙烯共聚荧光微球的研究
  • GBase 8s V8.8的锁机制和隔离级别
  • 浅谈MES管理系统对中国中小企业智能化生产的影响
  • 搜题接口创建 对接百万题库接口
  • SpringBoot自动配置原理入门
  • Linux 磁盘管理
  • 涂鸦电工产品开发包如何使用
  • 初识react笔记
  • Java中的串口编程是怎样的呢?
  • SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(二)
  • 数据结构学习笔记 4-2 哈希表与布隆过滤器 与 LeetCode真题(Java)
  • JAVA基础之动态代理
  • 轻量级神经网络算法系列文章-MobileNet v3
  • 聚苯乙烯负载酸性离子液体(P[Vim-PS][HSO4])|活性炭(AC)负载酸性离子液体[Hmim-BS][HSO4]齐岳
  • 视频流PS打包方式详解
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【EOS】Cleos基础
  • 0x05 Python数据分析,Anaconda八斩刀
  • Github访问慢解决办法
  • GraphQL学习过程应该是这样的
  • javascript 哈希表
  • js面向对象
  • October CMS - 快速入门 9 Images And Galleries
  • Python_OOP
  • vuex 学习笔记 01
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 大整数乘法-表格法
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 来,膜拜下android roadmap,强大的执行力
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 移动端 h5开发相关内容总结(三)
  • 异步
  • linux 淘宝开源监控工具tsar
  • ​用户画像从0到100的构建思路
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (算法)N皇后问题
  • (算法)Travel Information Center
  • (算法设计与分析)第一章算法概述-习题
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net 6.0 处理跨域的方式
  • .net mvc部分视图
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @Mapper作用
  • []sim300 GPRS数据收发程序
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [codeforces] 25E Test || hash