自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別再說你不會(huì)ElasticSearch調(diào)優(yōu)了,都給你整理好了!

開發(fā) 架構(gòu)
很多同學(xué)可能從來沒接觸過這個(gè)東西,所以本文我們就以現(xiàn)在最火最流行的Elasticsearch為例,來聊一下分布式搜索引擎的核心架構(gòu)原理。

?這篇文章,我們來聊一下最近這一兩年行業(yè)內(nèi)Java高級(jí)工程師面試的時(shí)候尤為常見的一個(gè)問題:談?wù)勀銓Ψ植际剿阉饕娴睦斫?,聊聊他的架?gòu)原理?

很多同學(xué)可能從來沒接觸過這個(gè)東西,所以本文我們就以現(xiàn)在最火最流行的El?asticsearch為例,來聊一下分布式搜索引擎的核心架構(gòu)原理。

一、倒排索引到底是啥?

要了解分布式搜索引擎,先了解一下搜索這個(gè)事兒吧,搜索這個(gè)技術(shù)領(lǐng)域里最入門級(jí)別的一個(gè)概念就是倒排索引。

我們先簡單說一下倒排索引是個(gè)什么東西。

假如說你現(xiàn)在不用搜索引擎,單純使用數(shù)據(jù)庫來存放和搜索一些數(shù)據(jù),比如說放了一些論壇的帖子數(shù)據(jù)吧,那么這個(gè)數(shù)據(jù)的格式大致如下:

id

title

content

1

Java好用嗎?

Java是非常非常好的一門語言。。。。

2

大家一起來學(xué)Java

我這兒有一些很好的Java學(xué)習(xí)資源,比如說。。。

3

一次Java面試經(jīng)驗(yàn)

去年這個(gè)時(shí)候,我學(xué)了Java,今年開始了面試。。。

很簡單吧,假設(shè)有一個(gè)id字段標(biāo)識(shí)了每個(gè)帖子數(shù)據(jù),然后title字段是帖子的標(biāo)題,content字段是帖子的內(nèi)容。

那么這個(gè)時(shí)候,比如我們要是用數(shù)據(jù)庫來進(jìn)行搜索包含“Java”這個(gè)關(guān)鍵字的所有帖子,大致SQL如下:

咱們姑且不論這個(gè)數(shù)據(jù)庫層面也有支持全文檢索的一些特殊索引類型,或者數(shù)據(jù)庫層面是怎么執(zhí)行的,這個(gè)不是本文討論的重點(diǎn),你就看看數(shù)據(jù)庫的數(shù)據(jù)格式以及搜索的方式就好了。

但是如果你通過搜索引擎類的技術(shù)來存放帖子的內(nèi)容,他是可以建立倒排索引的。

也就是說,你把上述的幾行數(shù)據(jù)放到搜索引擎里,這個(gè)倒排索引的數(shù)據(jù)大致看起來如下:

關(guān)鍵詞 id

  • Java [1, 2, 3]
  • 語言 [1]
  • 面試 [3]
  • 資源 [2]

所謂的倒排索引,就是把你的數(shù)據(jù)內(nèi)容先分詞,每句話分成一個(gè)一個(gè)的關(guān)鍵詞,然后記錄好每個(gè)關(guān)鍵詞對應(yīng)出現(xiàn)在了哪些id標(biāo)識(shí)的數(shù)據(jù)里。

那么你要搜索包含“Java”關(guān)鍵詞的帖子,直接掃描這個(gè)倒排索引,在倒排索引里找到“Java”這個(gè)關(guān)鍵詞對應(yīng)的那些數(shù)據(jù)的id就好了。

然后你可以從其他地方根據(jù)這幾個(gè)id找到對應(yīng)的數(shù)據(jù)就可以了,這個(gè)就是倒排索引的數(shù)據(jù)格式以及搜索的方式,上面這種利用倒排索引查找數(shù)據(jù)的方式,也被稱之為全文檢索。

二、什么叫做分布式搜索引擎?

其實(shí)要知道什么叫做分布式搜索引擎,你首先得知道,假如我們就用一臺(tái)機(jī)器部署一個(gè)搜索引擎系統(tǒng),然后利用上述的那種倒排索引來存儲(chǔ)數(shù)據(jù),同時(shí)支持一些全文檢索之類的搜索功能,那么會(huì)有什么問題?

其實(shí)還是很簡單,假如說你現(xiàn)在要存儲(chǔ)1TB的數(shù)據(jù),那么放在一臺(tái)機(jī)器還是可以的。

但是如果你要存儲(chǔ)超過10TB,100TB,甚至1000TB的數(shù)據(jù)呢?你用一臺(tái)機(jī)器放的下嗎?

當(dāng)然是放不下的了,你的機(jī)器磁盤空間是不夠的。

大家看一下下面的圖:

所以這個(gè)時(shí)候,你就得用分布式搜索引擎了,也就是要使用多臺(tái)機(jī)器來部署搜索引擎集群。

比如說,假設(shè)你用的是Elasticsearch(后面簡寫為:ES)。

現(xiàn)在你總共有3TB的數(shù)據(jù),那么你搞3臺(tái)機(jī)器,每臺(tái)機(jī)器上部署一個(gè)ES進(jìn)程,管理那臺(tái)機(jī)器上的1TB數(shù)據(jù)就可以了。

這樣不就可以把3TB的數(shù)據(jù)分散在3臺(tái)機(jī)器上來存儲(chǔ)了?這不就是索引數(shù)據(jù)的分布式存儲(chǔ)嗎?

而且,你在搜索數(shù)據(jù)的時(shí)候,不就可以利用3臺(tái)機(jī)器來對分布式存儲(chǔ)后的數(shù)據(jù)進(jìn)行搜索了?每臺(tái)機(jī)器上的ES進(jìn)程不都可以對一部分?jǐn)?shù)據(jù)搜索?這不就是分布式的搜索?

是的,這就是所謂的分布式搜索引擎:把大量的索引數(shù)據(jù)拆散成多塊,每臺(tái)機(jī)器放一部分,然后利用多臺(tái)機(jī)器對分散之后的數(shù)據(jù)進(jìn)行搜索,所有操作全部是分布在多臺(tái)機(jī)器上進(jìn)行,形成了完整的分布式的架構(gòu)。

同樣,我們來看下面的圖,直觀的感受一下。

三、Elasticsearch的數(shù)據(jù)結(jié)構(gòu)

如果你要是使用Elasticsearch這種分布式搜索引擎,必須要熟悉他的一些專業(yè)的技術(shù)名詞,描述他的一些數(shù)據(jù)結(jié)構(gòu)。

比如說“index”這個(gè)東西,他是索引的意思,其實(shí)他有點(diǎn)類似于數(shù)據(jù)庫里的一張表,大概對應(yīng)表的那個(gè)概念。

比如你搞一個(gè)專門存放帖子的索引,然后他有id、title、content幾個(gè)field,這個(gè)field大致就是他的一個(gè)字段。

然后還有一個(gè)概念,就是document,這個(gè)就代表了index中的一條數(shù)據(jù)。

下面就是一個(gè)document,這個(gè)document可以寫到index里去,算是index里的一條數(shù)據(jù)。

而且寫到es之后,這條數(shù)據(jù)的內(nèi)容就會(huì)拆分為倒排索引的數(shù)據(jù)格式來存儲(chǔ)。

id

title

content

1

Java好用嗎?

Java是非常非常好的一門語言。。。。

四、Shard數(shù)據(jù)分片機(jī)制

那么這個(gè)時(shí)候大家考慮一下,比如說你有一個(gè)index,專門存放論壇里的帖子,現(xiàn)在論壇里的帖子有1億,占用了1TB的磁盤空間,這個(gè)還好說。

如果這個(gè)帖子有10億,100億,占用了10TB、甚至100TB的磁盤空間呢?

那你這個(gè)index的數(shù)據(jù)還能在一臺(tái)機(jī)器上存儲(chǔ)嗎?答案明顯是不能的。

?這個(gè)時(shí)候,你必須得支持這個(gè)index的數(shù)據(jù)分布式存儲(chǔ)在多臺(tái)機(jī)器上,利用多臺(tái)機(jī)器的磁盤空間來承載這么大的數(shù)據(jù)量。

而且,需要保證每臺(tái)機(jī)器上對這個(gè)index存儲(chǔ)的數(shù)據(jù)量不要太大,因?yàn)榭刂茊闻_(tái)機(jī)器上這個(gè)index的數(shù)據(jù)量,可以保證他的搜索性能更高。

所以這里就引入了一個(gè)概念:Shard數(shù)據(jù)分片結(jié)構(gòu)。每個(gè)index你都可以指定創(chuàng)建多少個(gè)shard,每個(gè)shard就是一個(gè)數(shù)據(jù)分片,會(huì)負(fù)責(zé)存儲(chǔ)這個(gè)index的一部分?jǐn)?shù)據(jù)。

比如說index里有3億帖子,占據(jù)3TB數(shù)據(jù)。然后這個(gè)index你設(shè)置了3個(gè)shard。

那么每個(gè)shard就可以包含一個(gè)1TB大小的數(shù)據(jù)分?片,每個(gè)shard在集群里的一臺(tái)機(jī)器上,這樣就形成了利用3臺(tái)機(jī)器來分布式存儲(chǔ)一個(gè)index的數(shù)據(jù)的效果了。

大家看下面的圖:

現(xiàn)在index里的3TB數(shù)據(jù)分布式存儲(chǔ)在了3臺(tái)機(jī)器上,每臺(tái)機(jī)器上有一個(gè)shard,每個(gè)shard負(fù)責(zé)管理這個(gè)index的其中1TB數(shù)據(jù)的分片。

而且,另外一個(gè)好處是,假設(shè)我們要對這個(gè)index的3TB數(shù)據(jù)運(yùn)行一個(gè)搜索,是不是可以發(fā)送請求到3臺(tái)機(jī)器上去?

3臺(tái)機(jī)器上的shard直接可以分布式的并行對一部分?jǐn)?shù)據(jù)進(jìn)行搜索,起到一個(gè)分布式搜索的效果,大幅度提升海量數(shù)據(jù)的搜索性能和吞吐量。

五、Replica多副本數(shù)據(jù)冗余機(jī)制

但是現(xiàn)在有一個(gè)問題,假如說3臺(tái)機(jī)器中的其中一臺(tái)宕機(jī)了,此時(shí)怎么辦呢?

是不是這個(gè)index的3TB數(shù)據(jù)的1/3就丟失了?因?yàn)樯厦嬗?TB的數(shù)據(jù)分片沒了。

所以說,還需要為了實(shí)現(xiàn)高可用使用Replica多副本數(shù)據(jù)冗余機(jī)制。

在Elasticsearch里,就是支持對每個(gè)index設(shè)置一個(gè)replica數(shù)量的,也就是每個(gè)shard對應(yīng)的replica副本的數(shù)量。

比如說你現(xiàn)在一個(gè)index有3個(gè)shard,你設(shè)置對每個(gè)shard做1個(gè)replica副本,那么此時(shí)每個(gè)shard都會(huì)有一個(gè)replica shard。

這個(gè)初始的shard就是primary shard,而且primary shard和replica shard是絕對不會(huì)放在一臺(tái)機(jī)器上的,避免一臺(tái)機(jī)器宕機(jī)直接一個(gè)shard的副本也同時(shí)丟失了。

我們再來看下面的圖,感受一下:

在上述的replica機(jī)制下,每個(gè)primary shard都有一個(gè)replica shard在別的機(jī)器上,任何一臺(tái)機(jī)器宕機(jī),都可以保證數(shù)據(jù)不會(huì)丟失,分布式搜索引擎繼續(xù)可用。

Elasticsearch默認(rèn)是支持每個(gè)index是5個(gè)primary shard,每個(gè)primary shard有1個(gè)replica shard作為副本。

六、文末總結(jié)

好了,本文到這兒就結(jié)束了,再來給大伙簡單小結(jié)。

我們從搜索引擎的倒排索引開始,到單機(jī)無法承載海量數(shù)據(jù),再到分布式搜索引擎的存儲(chǔ)和搜索。

然后我們以優(yōu)秀的分布式搜索引擎ES為例,闡述了ES的數(shù)據(jù)結(jié)構(gòu),shard數(shù)據(jù)分片機(jī)制,replica多副本機(jī)制,解釋了一下分布式搜索引擎的架構(gòu)原理。

最后還是強(qiáng)調(diào)一下,在Java面試尤其是高級(jí)Java面試中,對于分布式搜索引擎技術(shù)的考察越來越重,所以這塊技術(shù)的重要性,還是不容小覷的!

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2020-11-09 07:34:49

JVM性能監(jiān)控

2019-01-16 10:55:08

Python 開發(fā)編程語言

2022-12-27 08:01:09

設(shè)計(jì)模式https://mp

2020-01-15 08:52:40

RabbitMQSpringMybatis

2020-12-18 09:45:33

DockerLinux命令

2020-11-24 11:30:51

SpringJava代碼

2020-06-19 09:01:48

Python開發(fā)工具

2020-10-23 09:50:20

鏈表Java代碼

2022-05-27 21:56:55

索引存儲(chǔ)MySQL 存儲(chǔ)引擎

2021-02-24 07:38:50

Redis

2022-08-12 15:58:34

Docker

2021-06-16 00:57:16

JVM加載機(jī)制

2022-06-18 23:03:05

Seata分布式事務(wù)

2025-04-23 09:21:10

2023-12-08 08:01:29

分布式IM即時(shí)通訊系統(tǒng)架構(gòu)設(shè)計(jì)

2020-11-30 07:54:46

ElasticSear開源分布式

2020-12-11 09:24:19

Elasticsear存儲(chǔ)數(shù)據(jù)

2022-03-11 12:31:04

Vue3組件前端

2021-05-25 13:45:29

數(shù)據(jù)設(shè)計(jì)師vivo

2021-11-04 09:08:39

項(xiàng)目JS 解構(gòu)知識(shí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)