概述

在搜索这块,lucene 是最流行的搜索库。几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es。而现在分布式搜索基本已经成为大部分互联网行业的 Java 系统的标配,其中尤为流行的就是 es,前几年 es 没火的时候,大家一般用 solr。但是这几年基本大部分企业和项目都开始转向 es 了。所以互联网面试,肯定会跟你聊聊分布式搜索引擎,也就一定会聊聊 es。

今天主要从一道面试题(es 是如何实现分布式的)入手,对ES的分布式架构原理做个探讨。


es分布式架构原理

elasticsearch设计的理念就是分布式搜索引擎,底层实现还是基于Lucene的,核心思想是在多态机器上启动多个es进程实例,组成一个es集群。以下是es的几个概念:

  1. 接近实时
  2. es是一个接近实时的搜索平台,这就意味着,从索引一个文档直到文档能够被搜索到有一个轻微的延迟
  3. 集群(cluster)
  4. 一个集群有多个节点(服务器)组成,通过所有的节点一起保存你的全部数据并且通过联合索引和搜索功能的节点的集合,每一个集群有一个唯一的名称标识
  5. 节点(node)
  6. 一个节点就是一个单一的服务器,是你的集群的一部分,存储数据,并且参与集群和搜索功能,一个节点可以通过配置特定的名称来加入特定的集群,在一个集群中,你想启动多少个节点就可以启动多少个节点。
  7. 索引(index)
  8. 一个索引就是还有某些共有特性的文档的集合,一个索引被一个名称唯一标识,并且这个名称被用于索引通过文档去执行搜索,更新和删除操作。
  9. 类型(type)
  10. type 在6.0.0已经不赞成使用
  11. 文档(document)
  12. 一个文档是一个基本的搜索单元

面试题剖析

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 中的一个字段的值。

es-index-type-mapping-document-field

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

es-cluster

通过这个 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 作为一个分布式搜索引擎最基本的一个架构设计,大家有什么好的想法也可以在下方留言一起探讨哦~

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!

es 创建索引_从一道面试题来看ES的分布式架构原理相关推荐

  1. es创建索引设置字段不分词_java整合es指定字段不分词搜索

    二.问题 在做一个需求的时候,需要按照电话号码查询用户关系,所以我这边先讲相关信息同步到es,但是电话号码是加密的,所以显示的字符串是杂乱的,既有字母,又有斜杠等号等字符,在进行分词查询的时候匹配不到 ...

  2. ES 的分布式架构原理能说一下么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://8rr.co/Gs9a 面试题 ...

  3. PHP递归创建多级目录(一道面试题的解题过程)

    今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...

  4. es 创建索引_es的基本原理和操作文档

    来源:https://blog.csdn.net/wanbf123/article/details/81504097 一.背景知识 1.搜索的分类 我们想要寻找某些信息的时候,一般会直接去百度.谷歌. ...

  5. mongo 创建索引_索引系列:2dsphere索引

    MongoDB Manual (Version 4.2)> Indexes > 2dsphere Indexes No 1 概述 2dsphere索引支持计算类似地球的球体上的几何形状的查 ...

  6. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  7. es创建索引数量多了好还是少了好_Elasticsearch性能优化总结

    Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化.下面就把我对于ES使 ...

  8. es创建索引和mapping

    一.索引和type分开创建 1.创建index 1.创建索引 http://127.0.0.1:9200/ negative/ put {"settings": {"in ...

  9. ES 创建索引设置(setting)基础

    1.创建索引 PUT /my_index {"settings": { ... any settings ... },"mappings": {"ty ...

最新文章

  1. 全网最全 Python 操作 Excel 教程,建议收藏!
  2. mysql左连接_MySQL left join 左连接的通俗理解
  3. (双指针、二分Binary Search) leetcode 658. Find K closest Elements
  4. Hql 中 dao 层 以及daoimpl 层的代码,让mvc 模式更直观简洁
  5. gets与fgets,puts与fputs区别
  6. 电脑显示没有被指定在上运行_游戏编年史:这也许是世界上第一款可运行的电脑游戏...
  7. php界面设置编码格式,php设置编码格式的方法
  8. 教你玩转CSS 媒体类型
  9. 专家观点:你必须了解的嵌入式Linux特性
  10. DES和AES加密:指定键的大小对于此算法无效
  11. [Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
  12. Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore
  13. 《实用python程序设计》练习题:向量点积计算
  14. open-drain和push-pull的上拉速度
  15. 用 emacs 浏览 C/C++ 项目
  16. 激光雷达进入「规模化」上车周期?最大变数是什么?
  17. nodejs npm报错 重装 解决方法
  18. js 通过传入 开始时间和结束时间 算出相差多少秒 分钟 相差时间
  19. idea指定maven的settings文件不生效
  20. Public Private Protect Inheritance and access specifiers

热门文章

  1. python80行代码写一个文件整理软件
  2. python函数做n_【python】定义函数、参数、递归(n!)
  3. 室内定位程序_基于增强现实的室内导航系统如何设计架构
  4. Unity编辑器扩展之EditorWindow
  5. db2 dec函数oracle,DB2常用函数和Oracle的比较
  6. Vray-3.0 开箱宝典
  7. [DirectX11]Gerstner波 实现简单的水面模拟
  8. 寒冬之下,移动开发没人要了, iOS 开发者该 何去何从?
  9. 4. Spring Boot 过滤器、监听器
  10. Nginx使用教程(八):使用Nginx缓存之Memcached缓存