突破Java面试(14)-分布式搜索引擎的架构

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 在搜索这块,曾经lucene 是最流行的搜索库. 几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗? 但现在不问了,因为现在项目基本都是采用基于 lucene 的分布式搜索引擎—— ElasticSearch. 现在分布式搜索基本已经成为互联网系统的标配,其中尤为流行的就是 ES,前几年一般用 solr。

以下用ES表Elastic Search

0 Github

1 面试题

说说ES的分布式架构原理

2 考点分析

在搜索这块,曾经lucene 是最流行的搜索库.
几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?
但现在不问了,因为现在项目基本都是采用基于 lucene 的分布式搜索引擎—— ElasticSearch.

现在分布式搜索基本已经成为互联网系统的标配,其中尤为流行的就是 ES,前几年一般用 solr。但是最近基本大部分企业和项目都开始转向 ES.

所以互联网面试,肯定会跟你聊聊分布式搜索引擎,就一定会聊到ES!

如果面试官问你第一个问题,确实一般都会问你 es 的分布式架构设计能介绍一下么?就看看你对分布式搜索引擎架构的一个基本理解。

3 详解

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

3.1 基本单位

ES 中存储数据的基本单位索引.
比如说你现在要在 ES 中存储一些订单数据,应该在 ES 中创建一个索引 order_idx,所有的订单数据就会写到该索引中.
一个索引概念上差不多就相当于MySQL 中的一张表.

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

3.2 实例

为便于理解,我在这里做个类比.切记,仅仅是类比!绝不等同!

index 相当于 MySQL 里的一张表;
而 type 没法跟 MySQL 里去类比;
一个 index 里可以有多个 type,每个 type 的字段都是差不多的,也有略微差别.

假设有一个订单 index,专门存放订单数据.
就好比说你在 MySQL 中建表

  • 有些订单是实物商品的订单,比如一件衣服、一双鞋子
  • 有些订单是虚拟商品的订单,比如游戏点卡,话费充值

这两种订单大部分字段是一样的,但是少部分字段还是有略微差别.

类似地,ES就会在订单 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 中的一个字段的值.

3.3 结构原理

你建立一个索引,该索引又可拆分成多个 shard,每个 shard 存储部分数据.
拆分成多个 shard 是有好处的

  • 支持横向扩展
    比如你数据量 3T,3 个 shard,每个 shard 就 1T 的数据,若现在数据量增到 4T,怎么扩展?

so easy!新建一个有 4 个 shard 的索引,将数据导入

  • 提高性能
    数据分布在多个 shard,即多台服务器上,所有的操作,都会在多台机器上并行分布式执行,提高了系统的吞吐量和性能.

接着就是这个 shard 的数据实际是有多个备份,即每个 shard 都有一个 primary shard负责写入数据,还有几个 replica shard.
primary shard 写入数据后,会将数据同步到其他几个 replica shard 中.


通过 replica 方案,每个 shard 数据都有多个备份.
即使某个节点宕机,其他节点上还有数据,满足高可用性.

3.4 主从特性

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 作为分布式搜索引擎最基本的架构设计.

参考

《Java工程师面试突击第1季-中华石杉老师》

更多干货资源请关注JavaEdge公众号

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
13天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
18天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
14天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
25天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
68 10
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
91 1
Java面试题之Java集合面试题 50道(带答案)
|
27天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
54 5
|
26天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
20 1
|
1月前
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。

热门文章

最新文章

下一篇
无影云桌面