從 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
相關文章
相關標籤/搜索