分布式搜索4-ElasticSearch的分布式架构原理(吐血整理!)

1、前言:
(1)在搜索这块,lucene 是最流行的搜索库。几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 ES。
(2)现在分布式搜索已经成为大部分互联网行业Java 系统的标配,其中尤为流行的就是 ES,前几年 ES 没火的时候,大家一般用 solr。但是这两年基本大部分企业和项目都开始转向 ES 了。所以互联网面试,肯定会跟你聊聊分布式搜索引擎,也就一定会聊聊 ES,如果你确实不知道,那你真的就 out 了。
(3)Lucene是公认的迄今为止的最好用的搜索引擎库,但是他所提供的API对于我们使用者来说,是非常苦恼的,常要花费大量时间去熟悉学习。ES的出现就很好的解决了这个问题,良好的封装,易用的API,链式书写方式,开瓶即饮。

2、ElasticSearch的分布式架构原理
(1)ElasticSearch就是分布式搜索引擎,底层是基于lucene。核心思想就是在多台机器上启动多个 ES 进程实例,组成了一个 ES 集群。
(2)ES 中存储数据的基本单位是索引,比如说你现在要在 ES 中存储一些订单数据,你就应该在 ES 中创建一个索引 order_idx,所有的订单数据就都写到这个索引里面去,一个索引差不多就是相当于是 mysql 里的一张表。

index (类别表)-> type(一个表) -> mapping (表结构)-> document (一条数据/一行)->
field(一条数据中的字段)。

(3-1)很多情况下,一个 index 里可能就一个 type,index 相当于 mysql 里的一张表。而 type 没法跟 mysql 里去对比,一个 index 里可以有多个 type,每个 type 的字段都是差不多的,但是有一些略微的差别。假设有一个 index,是订单 index,里面专门是放订单数据的。就好比说你在 mysql 中建表,有些订单是实物商品的订单,比如一件衣服、一双鞋子;有些订单是虚拟商品的订单,比如游戏点卡,话费充值。两种订单大部分字段是一样的,但少部分字段可能有略微的一些差别。所以就会在订单索引里,建两个 type,一个是实物商品订单 type,一个是虚拟商品订单 type,这两个 type 大部分字段是一样的,少部分字段是不一样的。
(3-2)如果一个index 里有多个 type 的情况,你可以认为 index 是一个类别的表,具体的每个 type 代表了 mysql 中的一个表。每个 type 有一个 mapping,mapping 就是这个 type 的表结构定义,你在 mysql 中创建一个表,肯定是要定义表结构的,里面有哪些字段,每个字段是什么类型。实际上你往 index 里的一个 type 里面写的一条数据,叫做一条document,一条 document 就代表了 mysql 中某个表里的一行,每个 document 有多个 field,每个 field 就代表了这个 document 中的一个字段的值。
(3-3)在7.0之后的版本,type被废除,type直接可以自定义、就是直接添加到属性中,而不是原来的在索引之后添加type,所以在添加数据时就可以更灵活,所以我认为一个索引可以理解为一个数据库,索引的下个级别type可以理解为一张表
1-put 索引/type/id 添加一条数据(document),数据中的字段就是filed。
2-Mapping 来定义每个字段的类型:字符串类型—Keyword 类型是不会分词的,直接根据字符串内容建立反向索引,字符串类型—Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立反向索引。
3-为什么要取消type:
第一、我们说索引“类似于数据库”和type“相当于表”,但是严格来说,这是一个错误的类比,导致了错误的假设。在SQL数据库中,表是相互独立的,一个表中的列与另一个表中具有相同名称的列没有关系。但在Elasticsearch索引中,不同映射类型中具有相同名称的字段在内部由相同的Lucene字段支持,当您想要删除一个type中的日期字段和同一个索引中的另一个type中的布尔字段时,这可能会导致失败。
第二、存储在同一索引中具有很少或没有共同字段的不同实体会导致数据稀疏。
在这里插入图片描述
(4)你先建立一个索引,这个索引可以拆分成多个分片(shard),每个分片(shard)存储部分数据。每个分片(shard) 有一个主分片(primary shard),负责写入数据,还有几个复制分片(replica shard)。ES客户端在主分片(primary shard)写入数据之后,会将数据同步到其他几个复制分片(replica shard)上去。ES客户端取数据的时候就会在主分片或者复制分片中去读。(类似Kafka)
通过这个复制replica 方案实现高可用:每个分片(shard)的数据都有多个备份,如果某个机器宕机了,没关系,还有别的数据副本在别的机器上 。
在这里插入图片描述
1-ES 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 主分片(primary shard) 和 复制分片(replica shard)身份等。要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。
2-如果某个非 master 节点宕机了,那么此节点上的 primary shard 就没了,那么master 会让 primary shard 对应的 replica shard(注在其他机器上的replica)切换为 primary shard。如果宕机的机器修复了,能让集群恢复正常,但修复后的节点也不再是 primary shard,而是 replica shard。(上述就是 ElasticSearch 作为一个分布式搜索引擎最基本的架构设计)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值