mirror of
https://github.com/doocs/advanced-java.git
synced 2025-03-24 10:50:06 +08:00
docs(es): add es-architecture.md
ElasticSearch分布式架构实现原理
This commit is contained in:
parent
6f8ea560ca
commit
b4114119a0
@ -12,7 +12,6 @@
|
||||
|
||||
### 系统拆分
|
||||
- [为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?](/docs/distributed-system/why-dubbo.md)
|
||||
- Dubbo 和 Thrift 有什么区别?
|
||||
|
||||
### 分布式服务框架
|
||||
- [说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?](/docs/distributed-system/dubbo-operating-principle.md)
|
||||
@ -50,7 +49,7 @@
|
||||
- [如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。](/docs/high-concurrency/mq-design.md)
|
||||
|
||||
### 搜索引擎
|
||||
- es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
|
||||
- [es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?](/docs/high-concurrency/es-architecture.md)
|
||||
- es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
|
||||
- es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
|
||||
- es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
|
||||
|
45
docs/high-concurrency/es-architecture.md
Normal file
45
docs/high-concurrency/es-architecture.md
Normal file
@ -0,0 +1,45 @@
|
||||
## 面试题
|
||||
es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
|
||||
|
||||
## 面试官心理分析
|
||||
在搜索这块,lucene 是最流行的搜索库。几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es。
|
||||
|
||||
而现在分布式搜索基本已经成为大部分互联网行业的 Java 系统的标配,其中尤为流行的就是 es,前几年 es 没火的时候,大家一般用 solr。但是这两年基本大部分企业和项目都开始转向 es 了。
|
||||
|
||||
所以互联网面试,肯定会跟你聊聊分布式搜索引擎,也就一定会聊聊 es,如果你确实不知道,那你真的就 out 了。
|
||||
|
||||
如果面试官问你第一个问题,确实一般都会问你 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 的情况,你可以认为 index 是一个类别的表,具体的每个type 代表了具体的一个 mysql 中的表。每个 type 有一个 mapping,如果你认为一个 type 是一个具体的一个表,index 代表多个 type 的同属于的一个类型,mapping 就是这个 type 的**表结构定义**,你在 mysql 中创建一个表,肯定是要定义表结构的,里面有哪些字段,每个字段是什么类型。实际上你往 index 里的一个 type 里面写的一条数据,叫做一条 document,一条 document 就代表了 mysql 中某个表里的一行,每个 document 有多个 field,每个 field 就代表了这个 document 中的一个字段的值。
|
||||
|
||||

|
||||
|
||||
接着你搞一个索引,这个索引可以拆分成多个 `shard`,每个 shard 存储部分数据。
|
||||
|
||||
|
||||
接着就是这个 shard 的数据实际是有多个备份,就是说每个 shard 都有一个 `primary shard`,负责写入数据,但是还有几个 `replica shard`。primary shard 写入数据之后,会将数据同步到其他几个 replica shard 上去。
|
||||
|
||||

|
||||
|
||||
通过这个 replica 的方案,每个 shard 的数据都有多个备份,如果某个机器宕机了,没关系啊,还有别的数据副本在别的机器上呢。高可用了吧。
|
||||
|
||||
es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。
|
||||
|
||||
如果是非 master节点宕机了,那么会由 master 节点,让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。接着你要是修复了那个宕机机器,重启了之后,master 节点会控制将缺失的 replica shard 分配过去,同步后续修改的数据之类的,让集群恢复正常。
|
||||
|
||||
其实上述就是 ElasticSearch 作为一个分布式搜索引擎最基本的一个架构设计。
|
BIN
img/es-cluster.png
Normal file
BIN
img/es-cluster.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
img/es-index-type-mapping-document-field.png
Normal file
BIN
img/es-index-type-mapping-document-field.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.9 KiB |
Loading…
Reference in New Issue
Block a user