从 Lucene 到 Elasticsearch

做者:靠发型吃饭的柳树算法

原文地址:https://mp.weixin.qq.com/s/223b7xAABBtplpAv5OjAIgsql

食谱的故事

那一年,伦敦,Shay Banon 在找工做,他老婆在烹饪学校学习厨艺。数据库

Shay 发现,老婆天天都要在大量的食谱中找本身想要的那份食谱,因而在找工做之余,开始给老婆作一个食谱搜索的工具。api

市面上的搜索引擎,彷佛没什么选择,只有 Lucene,可是 Lucene 又很难用,因而 Shay 在外面又抽象了一层,屏蔽了 Lucene 底层的复杂逻辑。bash

Shay 开源了这套给老婆搜索食谱用的系统,叫 Compass.restful

后来, Shay 找到了工做,他发现以前写的那套系统,在追求高性能、高可用的生产环境,实在太脆弱,因而又从新写了一套,Compass 也更名为了 Elasticsearch.架构

Shay 在把 Compass 重写为 Elasticsearch 时,面对的问题,其实就是:nosql

你已经拥有了 Lucene,拥有了倒排索引,如何用它们来创造一个,让用户用起来特别爽、又特别可靠的搜索引擎?工具

Now,让咱们跟着 Shay 的脚步,一块儿设计一个高性能高可靠的 Elasticsearch 吧!性能

开始

Shay 如今拥有的一切:

  • Lucene:一个开源的搜索库
  • Engine:屏蔽 Lucene 操做细节的抽象层
  • Http:对外提供 restful api,让不一样开发语言的应用均可以接入

简单画个图:

从 Lucene 到 Elasticsearch

空节点

如今咱们屏蔽 Elasticsearch 的底层实现,其实一个 Elasticsearch 实例对于咱们来讲,就是一个节点,一个能够提供数据搜索和探寻能力的节点:

从 Lucene 到 Elasticsearch

一开始,里面空空如也,什么都没有。

加点东西

Mysql 往数据库插入数据以前,须要先建立表,指定字段、主键等等,Elasticsearch 也须要建立“表”。

在 Elasticsearch 的领域语言里,「表」被称为「索引」,「行数据」被称为「文档」。

如今咱们往节点里面定义一个「索引」blog:

PUT /blogs{ "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 }}复制代码

你会发现,和 Mysql 不一样,咱们并无定义这个“表”里有什么字段,这就是 nosql 的好处,你能够在以后插入的文档里,随时给这个“表”添加新的字段。

咱们定义的是两个配置:

  • number_of_shards:主分片数。shards,分片,分片有「主分片」和「副本分片」,这里指的是「主分片」,默认是 5 个主分片,这里指定为 3,即 blog 索引的数据,会被分散到 3 个分片里面,起到控制每一个分片里文档数量个数的做用,提供查询和搜索效率,能够理解为 Mysql 里的分表。
  • number_of_replicas:副本分片数。replicas,副本,也就是上面说的「副本分片」。副本分片只是一个主分片的拷贝,做为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操做提供服务。

如今咱们的节点,再也不是空空如也,而是这样:

从 Lucene 到 Elasticsearch

P0、P一、P2 就是 blog 索引的 3 个主分片。

为何没有副本分片?

由于对于单节点的架构来讲,进行冗余备份就毫无心义的,只会浪费内存和磁盘。

再加个节点

如今咱们往集群里添加第二个节点,很简单,只要它和第一个节点有一样的 cluster.name 配置,它就会自动发现集群并加入到其中:

从 Lucene 到 Elasticsearch

原先被雪藏起来的三个副本分片,如今都在这个新增的节点上,被激活了。

水平扩容

这套架构,用着用着,咱们发现两个节点的 CPU 、RAM 等硬件资源都十分紧张,随时可能奔溃,怎么办?

没有什么是加一套机器不能解决的,若是有,那就加两套:

从 Lucene 到 Elasticsearch

甚至你还能把副本分片的数量调整到 2:

从 Lucene 到 Elasticsearch

固然,上面那句话是句玩笑话,若是没有把单机的性能发挥到极限,不去思考如何提高单机的性能和算法的优点,一味的依靠拓机器数量,是十分愚蠢的。

在咱们加了一个节点进去后,Elasticsearch 集群自动的帮咱们从新平均分布全部的数据。

Elasticsearch 前面的这个 elastic,果真名不虚传。

故障处理

这套架构是高可靠的,假设 Master 节点 Node1 忽然奔溃了,这时候集群会选举出一个新的节点。

这还不够,咱们失去 Node 的同时,也失去了原来 Node 1 上的两个主分片,P1 和 P2,幸运的是,Node 2 和 Node 3 上有对应的副本分片,集群会把对应的副本分片提高为主分片:

从 Lucene 到 Elasticsearch

经过本身封装的 Engine 层,屏蔽了 Lucene 的底层复杂的操做;

经过集群架构,构建了一套高性能、高可靠的搜索系统;

Shay 把本来复杂、上手难度极大的 搜索库 Lucene,打造为了对使用者很是友好的 Elasticsearch。

尾声

又后来,Shay 和他的伙伴们建立了一家公司,Elastic.

这家公司围绕 Elasticsearch ,对外界提供数据搜索和探索的服务。

对于一家公司来讲,它能够直接使用 Elastic 提供好的现成的搜索服务,好比日志搜索、监控、站点搜索等等,来给本身的应用集成搜索功能,这是 Elastic 的 SAAS 业务;

固然,若是你是一家有开发能力的公司,能够直接使用 Elasticsearch,来赋予应用数据搜索和探寻的能力,这是 Elastic 的 PAAS 业务。

从 Lucene 到 Elasticsearch
相关文章
相关标签/搜索