热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elasticsearch—分布式特性及分布式搜索的机制

 维护并且更新ClusterState 集群分布式模型及选主与脑裂问题分布式特性●Elasticsearch的分布式架构带来的好处存储的⽔平扩容,⽀持PB级数据提⾼系统的可⽤性,部

 维护并且更新 Cluster State 集群分布式模型及选主与脑裂问题

分布式特性

● Elasticsearch 的分布式架构带来的好处

  • 存储的⽔平扩容,⽀持 PB 级数据

  • 提⾼系统的可⽤性,部分节点停⽌服务,整个集群的服务不受影响

● Elasticsearch 的分布式架构

  • 不同的集群通过不同的名字来区分,默认名字 “elasticsearch”

  • 通过配置⽂件修改,或者在命令⾏中 -E cluster.name=geektime 进⾏设定

节点

节点是⼀个 Elasticsearch 的实例

  • 其本质上就是⼀个 JAVA 进程

  • ⼀台机器上可以运⾏多个 Elasticsearch 进程,但是⽣产环境⼀般建议⼀台机器上就 运⾏⼀个 Elasticsearch 实例

每⼀个节点都有名字,通过配置⽂件配置,或者启动时候 -E node.name=geektime 指定

每⼀个节点在启动之后,会分配⼀个 UID,保存在 data ⽬录下

Coordinating Node (协调节点)

处理请求的节点,叫 Coordinating Node

  • 路由请求到正确的节点,例如创建索引的请求,需要路由到 Master 节点

所有节点默认都是 Coordinating Node

通过将其他类型设置成 False,使其成为 Dedicated Coordinating Node

Demo – 启动节点,Cerebro 介绍

命令行方式启动集群

bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -E http.port=9200 -E network.host=0.0.0.0 -E node.master=true
bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -E http.port=9201 -E network.host=0.0.0.0 -E node.master=true
bin/elasticsearch -E node.name=node3 -E cluster.name=geektime -E path.data=node3_data -E http.port=9202 -E network.host=0.0.0.0 -E node.master=true

Cerebro 下载地址

  • https://github.com/lmenezes/cerebro/releases

访问cerobro

  • http://192.168.163.131:9000/

elasticsearch — 分布式特性及分布式搜索的机制

 创建索引 test 分片数设置3 副本数设置为1

elasticsearch — 分布式特性及分布式搜索的机制

 elasticsearch — 分布式特性及分布式搜索的机制

 Data Node

可以保存数据的节点,叫做 Data Node 

  • 节点启动后,默认就是数据节点。可以设置 node.data: false 禁⽌

Data Node的职责

  • 保存分⽚数据。在数据扩展上起到了⾄关重要的作⽤(由 Master Node 决定如何把 分⽚分 发到数据节点上)

通过增加数据节点

  • 可以解决数据⽔平扩展和解决数据单点问题

Master Node

Master Node 的职责

  • 处理创建,删除索引等请求 /决定分⽚被分配到哪个节点 / 负责索引的创建与删除

  • 维护并且更新 Cluster State

Master Node 的最佳实践

  • Master 节点⾮常重要,在部署上需要考虑解决单点的问题

  • 为⼀个集群设置多个 Master 节点 / 每个节点只承担 Master 的单⼀⻆⾊

Master Eligible Nodes & 选主流程

⼀个集群,⽀持配置多个 Master Eligible 节点。这些节点可以在必要时(如 Master 节点出 现故障,⽹络故障时)参与选主流程,成为 Master 节点

每个节点启动后,默认就是⼀个 Master eligible 节点

  • 可以设置 node.master: false 禁⽌

当集群内第⼀个 Master eligible 节点启动时候,它会将⾃⼰选举成 Master 节点

集群状态

集群状态信息(Cluster State),维护了⼀个集群中,必要的信息

  • ○ 所有的节点信息

  • ○ 所有的索引和其相关的 Mapping 与 Setting 信息

  • ○ 分⽚的路由信息

在每个节点上都保存了集群的状态信息

但是,只有 Master 节点才能修改集群的状态信息,并负责同步给其他节点,因为,任意节点都能修改信息会导致 Cluster State 信息的不⼀致

Master Eligible Nodes & 选主的过程

● 互相 Ping 对⽅,Node Id 低的会成为被选举的节点

● 其他节点会加⼊集群,但是不承担 Master 节点的⻆⾊。⼀旦发现被选中的主节点丢失, 就会选举出新的 Master 节点

elasticsearch — 分布式特性及分布式搜索的机制

 脑裂问题

Split-Brain,分布式系统的经典⽹络问题,当出现⽹络问题,⼀个节点和其他节点⽆法连接

  • Node 2 和 Node 3 会重新选举 Master

  • Node 1 ⾃⼰还是作为 Master,组成⼀个集群,同时更新 Cluster State

  • 导致 2 个 master,维护不同的 cluster state。当⽹络恢复时,⽆法选择正确恢复 node 1 node 2 node 3 ⽹络断开

elasticsearch — 分布式特性及分布式搜索的机制

 如何避免脑裂问题

限定⼀个选举条件,设置 quorum(仲裁),只有在 Master eligible 节点数⼤于 quorum 时,才能 进⾏选举

  • Quorum = (master 节点总数 /2)+ 1

  • 当 3 个 master eligible 时,设置 discovery.zen.minimum_master_nodes 为 2,即可避免脑裂

从 7.0 开始,⽆需这个配置

  • 移除 minimum_master_nodes 参数,让Elasticsearch⾃⼰选择可以形成仲裁的节点

  • 典型的主节点选举现在只需要很短的时间就可以完成。集群的伸缩变得更安全、更容易,并且可能造成丢 失数据的系统配置选项更少了

  • 节点更清楚地记录它们的状态,有助于诊断为什么它们不能加⼊集群或为什么⽆法选举出主节点

配置节点类型

⼀个节点默认情况下是⼀个 Master eligible,data and ingest node

elasticsearch — 分布式特性及分布式搜索的机制

 分⽚与集群的故障转移

Primary Shard (主分片)- 提升系统存储容量

分⽚是 Elasticsearch 分布式存储的基⽯

  • 主分⽚ / 副本分⽚

通过主分⽚,将数据分布在所有节点上

  • Primary Shard,可以将⼀份索引的数据,分散在多个 Data Node 上,实现存储的⽔平扩展

  • 主分⽚(Primary Shard)数在索引创建时候指定,后续默认不能修改,如要修改,需重建索引

Replica Shard (副本分片)- 提⾼数据可⽤性

数据可⽤性

  • 通过引⼊副本分⽚ (Replica Shard) 提⾼数据的可⽤性。⼀旦主分⽚丢失,副本分⽚可以 Promote 成主分 ⽚。副本分⽚数可以动态调整。每个节点上都有完备的数据。如果不设置副本分⽚,⼀旦出现节点硬件故 障,就有可能造成数据丢失

提升系统的读取性能

  • 副本分⽚由主分⽚(Primary Shard)同步。通过⽀持增加 Replica 个数,⼀定程度可以提⾼读取的吞吐量

分⽚数的设定(默认一个主分片 0个副本分片)

如何规划⼀个索引的主分⽚数和副本分⽚数

  • 主分⽚数过⼩:例如创建了 1 个 Primary Shard 的 Index,如果该索引增⻓很快,集群⽆法通过增加节点实现对这个索引的数据扩展

  • 主分⽚数设置过⼤:导致单个 Shard 容量很⼩,引发⼀个节点上有过多分⽚,影响性能

  • 副本分⽚数设置过多,会降低集群整体的写⼊性能

集群健康状态

elasticsearch — 分布式特性及分布式搜索的机制

 ⽂档分布式存储

⽂档存储在分⽚上

⽂档会存储在具体的某个主分⽚和副本分⽚上:例如 ⽂档 1, 会存储在 P0 和 R0 分⽚上

⽂档到分⽚的映射算法

  • 确保⽂档能均匀分布在所⽤分⽚上,充分利⽤硬件资源,避免部分机器空闲,部分机器繁忙

  • 潜在的算法

    • 随机 / Round Robin。当查询⽂档 1,分⽚数很多,需要多次查询才可能查到 ⽂档 

    • 维护⽂档到分⽚的映射关系,当⽂档数据量⼤的时候,维护成本⾼

    • 实时计算,通过⽂档 1,⾃动算出,需要去那个分⽚上获取⽂档

⽂档到分⽚的路由算法

shard = hash(_routing) % number_of_primary_shards

  • Hash 算法确保⽂档均匀分散到分⽚中

  • 默认的 _routing 值是⽂档 id

  • 可以⾃⾏制定 routing数值,例如⽤相同国家的商品,都分配到指定的 shard

  • 设置 Index Settings 后, Primary 数,不能随意修改的根本原因

elasticsearch — 分布式特性及分布式搜索的机制

 更新⼀个⽂档

elasticsearch — 分布式特性及分布式搜索的机制

 删除⼀个文档

elasticsearch — 分布式特性及分布式搜索的机制

 分⽚及其⽣命周期

 分⽚的内部原理

 什么是 ES 的分⽚

  •  ES 中最⼩的⼯作单元 / 是⼀个 Lucene 的 Index

 ⼀些问题:

  •  为什么 ES 的搜索是近实时的(1 秒后被搜到)

  •  ES 如何保证在断电时数据也不会丢失

  •  为什么删除⽂档,并不会⽴刻释放空间

 倒排索引不可变性

 倒排索引采⽤ Immutable Design,⼀旦⽣成,不可更改

  •  不可变性,带来了的好处如下:

  •  ⽆需考虑并发写⽂件的问题,避免了锁机制带来的性能问题

  •  ⼀旦读⼊内核的⽂件系统缓存,便留在哪⾥。只要⽂件系统存有⾜够的空间,⼤部分请求就会直接请求内 存,不会命中磁盘,提升了很⼤的性能

  •  缓存容易⽣成和维护 / 数据可以被压缩

 不可变更性,带来了的挑战:如果需要让⼀个新的⽂档可以被搜索,需要重建整个索引。

 Lucene Index

 elasticsearch — 分布式特性及分布式搜索的机制

 什么是 Refresh

 elasticsearch — 分布式特性及分布式搜索的机制

 什么是 Transaction Log

 elasticsearch — 分布式特性及分布式搜索的机制

 什么是 Flush

 elasticsearch — 分布式特性及分布式搜索的机制

 Merge

Segment 很多,需要被定期被合并

  • 减少 Segments / 删除已经删除的⽂档

ES 和 Lucene 会⾃动进⾏ Merge 操作

  • POST my_index/_forcemerge

 剖析分布式查询及相关性算分

 分布式搜索的运⾏机制

Elasticsearch 的搜索,会分两阶段进⾏

  • 第⼀阶段 - Query

  • 第⼆阶段 - Fetch

Query-then-Fetch

Query 阶段

elasticsearch — 分布式特性及分布式搜索的机制

 Fetch 阶段

elasticsearch — 分布式特性及分布式搜索的机制

 Query Then Fetch 潜在的问题

性能问题

  • 每个分⽚上需要查的⽂档个数 = from + size

  • 最终协调节点需要处理:number_of_shard * ( from+size )

  • 深度分⻚

相关性算分

  • 每个分⽚都基于⾃⼰的分⽚上的数据进⾏相关度计算。这会导致打分偏离的情况,特别是 数据量很少时。相关性算分在分⽚之间是相互独⽴。当⽂档总数很少的情况下,如果主分 ⽚⼤于 1,主分⽚数越多 ,相关性算分会越不准
解决算分不准的⽅法

数据量不⼤的时候,可以将主分⽚数设置为 1

  • 当数据量⾜够⼤时候,只要保证⽂档均匀分散在各个分⽚上,结果⼀般就不会出现 偏差

使⽤ DFS Query Then Fetch

  • 搜索的URL 中指定参数 “_search?search_type=dfs_query_then_fetch”

  • 到每个分⽚把各分⽚的词频和⽂档频率进⾏搜集,然后完整的进⾏⼀次相关性算分, 耗费更加多的 CPU 和内存,执⾏性能低下,⼀般不建议使⽤

POST message/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "term": {
      "content": {
        "value": "good"
      }
    }
  }
}

排序及 Doc Values & Field Data  

排序 

  • Elasticsearch 默认采⽤相关性算分对结果进⾏ 降序排序

  • 可以通过设定 sorting 参数,⾃⾏设定排序

  • 如果不指定_score,算分为 Null

POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "order_date": {
        "order": "desc"
      }
    }
  ]
}
View Code
推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
author-avatar
乌瑞文
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有