首页 > 其他分享 >es 的分布式架构原理能说一下么( es 是如何实现分布式的啊) ?

es 的分布式架构原理能说一下么( es 是如何实现分布式的啊) ?

时间:2023-09-26 14:34:12浏览次数:33  
标签:index 架构 shard master type 节点 es 分布式


ElasticSearch 设计的理念就是分布式搜索引擎, 底层其实还是基于 lucene 的。 核心思想就是在多台机器上启动多个 es 进程实例, 组成了一个 es 集群。

es 中存储数据的基本单位是索引, 比如说你现在要在 es 中存储一些订单数据, 你就应该在 es 中创建一个索引 order_idx, 所有的订单数据就都写到这个索引里面去, 一个索引差不多就是相当于是 mysql 里的一张表。

index -> type -> mapping -> document -> field。

这样吧, 为了做个更直白的介绍, 我在这里做个类比。 但是切记, 不要划等号, 类比只是为了便于理解。

index 相当于 mysql 里的一张表。 而 type 没法跟 mysql 里去对比, 一个 index 里可以有多个 type,每个 type 的字段都是差不多的, 但是有一些略微的差别。 假设有一个 index, 是订单 index, 里面专门是放订单数据的。 就好比说你在 mysql 中建表, 有些订单是实物商品的订单, 比如一件衣服、 一双鞋子;

有些订单是虚拟商品的订单, 比如游戏点卡, 话费充值。 就两种订单大部分字段是一样的, 但是少部分字段可能有略微的一些差别。

所以就会在订单 index 里, 建两个 type, 一个是实物商品订单 type, 一个是虚拟商品订单 type, 这两个 type 大部分字段是一样的, 少部分字段是不一样的。

很多情况下, 一个 index 里可能就一个 type, 但是确实如果说是一个 index 里有多个 type 的情况( 注意, mapping types 这个概念在 ElasticSearch 7.X 已被完全移除, 详细说明可以参考官方文档) , 你可以认为 index 是一个类别的表, 具体的每个 type 代表了 mysql 中的一个表。 每个 type 有一个mapping, 如果你认为一个 type 是具体的一个表, index 就代表多个 type 同属于的一个类型, 而mapping 就是这个 type 的表结构定义, 你在 mysql 中创建一个表, 肯定是要定义表结构的, 里面有哪些字段, 每个字段是什么类型。 实际上你往 index 里的一个 type 里面写的一条数据, 叫做一条document, 一条 document 就代表了 mysql 中某个表里的一行, 每个 document 有多个 field, 每个field 就代表了这个 document 中的一个字段的值。
你搞一个索引, 这个索引可以拆分成多个 shard, 每个 shard 存储部分数据。 拆分多个 shard 是有好处的, 一是支持横向扩展, 比如你数据量是 3T, 3 个 shard, 每个 shard 就 1T 的数据, 若现在数据量增加到 4T, 怎么扩展, 很简单, 重新建一个有 4 个 shard 的索引, 将数据导进去; 二是提高性能, 数据分布在多个 shard, 即多台服务器上, 所有的操作, 都会在多台机器上并行分布式执行, 提高了吞吐量和性能。

接着就是这个 shard 的数据实际是有多个备份, 就是说每个 shard 都有一个 primary shard, 负责写入数据, 但是还有几个 replica shard。 primary shard 写入数据之后, 会将数据同步到其他几个 replicashard 上去。

通过这个 replica 的方案, 每个 shard 的数据都有多个备份, 如果某个机器宕机了, 没关系啊, 还有别的数据副本在别的机器上呢。 高可用了吧。

es 集群多个节点, 会自动选举一个节点为 master 节点, 这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、 负责切换 primary shard 和 replica shard 身份等。 要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。

如果是非 master 节点宕机了, 那么会由 master 节点, 让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。 接着你要是修复了那个宕机机器, 重启了之后, master 节点会控制将缺失的 replica shard 分配过去, 同步后续修改的数据之类的, 让集群恢复正常。

说得更简单一点, 就是说如果某个非 master 节点宕机了。 那么此节点上的 primary shard 不就没了。

那好, master 会让 primary shard 对应的 replica shard(在其他机器上) 切换为 primary shard。如果宕机的机器修复了, 修复后的节点也不再是 primary shard, 而是 replica shard。

其实上述就是 ElasticSearch 作为分布式搜索引擎最基本的一个架构设计。

标签:index,架构,shard,master,type,节点,es,分布式
From: https://blog.51cto.com/u_4172728/7608430

相关文章

  • 在Spring Boot API Gateway中实现Sticky Session
    文章目录小结问题在APIGateway中实现StickySession在同一个APIGateway中同时支持StickySession和RoundRobinLoadBalancer参考小结在Kubernetes微服务的云环境中,如何在SpringBootAPIGateway中实现StickySession,当服务请求被某一个服务器处理后,所有后续的请求都被转发到被......
  • json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及by
    json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。importsysimportzlibimportjsonimportmathKAFKA_MAX_SIZE=1024*1024CONTENT_MIN_MAX_SIZE=KAFKA_MAX_SIZE*0.9defsplit_data(data):""":param......
  • Standard E-96 series Resistance Value code (for 0603≤±1% marking)
     ValueCodeValueCodeValueCodeValueCode10001178253164956273102021822632450576741050318727332515907510704191283405260476110051962934853619771130620030357546347811507205313655564979118082103237456......
  • 解析es6中let和const并模拟实现私有变量
    使用let和const声明变量早已经习以为常了。笔者作为面试官面试过上百人,能准确理解let/const块级作用域以及的候选人不足一二。本文将深入研究let和const的实现原理,以及多种方式来模拟私有变量,希望本文能给初中级前端小伙伴们一点帮助。一、let和const的实现原理1.1......
  • Codeforces Round 899 (Div. 2)
    CodeforcesRound899(Div.2)A.IncreasingSequence解题思路:从左往右一个个看,从1开始,如果当前位相同\(+2\),否则\(+1\)。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;constintM=2*M;constintmod=1e9+......
  • 8.4 ProcessHeap
    ProcessHeap是Windows进程的默认堆,每个进程都有一个默认的堆,用于在进程地址空间中分配内存空间。默认情况下ProcessHeap由内核进行初始化,该堆中存在一个未公开的属性,它被设置为加载器为进程分配的第一个堆的位置(进程堆标志),ProcessHeap标志位于PEB结构中偏移为0x18处,第一个堆头......
  • Service mesh 学习03 Istio安装
    一、Kubernetes环境......
  • 基于 COLA 架构的 Spring Cloud Alibaba(六) Spring Cloud Gateway
    在之前的篇章中,我们访问账户服务、商品服务、订单服务时,都要分别指定服务对应的端口进行访问。在实际应用中,服务的实际端口是不对外暴露的。如果要搭建更多的服务,那么我们对服务的访问将要维护更多的端口和访问路径。对此,本篇将介绍使用SpringCloudGateway对服务入口进行统一管......
  • 网安工具 | Windows便携式渗透测试环境PentestBox入门到进阶使用指南
    [点击......
  • 使用 Spring Integration 实现基于 Redis 的分布式锁以及踩坑
    背景分布式锁的应用场景应该还是蛮多的,这里就不赘述了。之前在开发中实现分布式锁都是自己基于Redis造轮子,虽然也不复杂并且自己实现一次能对分布式锁有更深的了解,但是终归有些麻烦。尤其是新项目需要的时候还得CV一次。然后在查询过程中(毫不意外地)发现Spring有现成的组......