一、反向索引
搜尋這個技術領域裡最入門級别的一個概念——反向索引。
我們先簡單說一下反向索引是個什麼?
比如我們不用索引,用資料庫存放和搜尋一些資料,比如說放了一些論壇的文章資料吧,那麼這個資料的格式大緻如下:
id | title | content |
---|---|---|
1 | Java好用嗎? | Java是非常非常好的一門語言。。。。 |
2 | 大家一起來學Java | 我這兒有一些很好的Java學習資源,比如說。。。 |
3 | 一次Java面試經驗 | 去年這個時候,我學了Java,今年開始了面試。。。 |
如果我們要是用資料庫來進行搜尋包含“Java”這個關鍵字的所有文章,大緻SQL如下:
但是如果通過搜尋引擎類的技術來存放文章的内容,他是可以建立反向索引的。
這個反向索引的資料大緻看起來如下:
關鍵詞 id
Java [1, 2, 3]
語言 [1]
面試 [3]
資源 [2]
所謂的反向索引,就是把你的資料内容先分詞,每句話分成一個一個的關鍵詞,然後記錄好每個關鍵詞對應出現在了哪些id辨別的資料裡。
那麼你要搜尋包含“Java”關鍵詞的文章,直接掃描這個反向索引,在反向索引裡找到“Java”這個關鍵詞對應的那些資料的id就好了
然後你可以從其他地方根據這幾個id找到對應的資料就可以了,這個就是反向索引的資料格式以及搜尋的方式,上面這種利用反向索引查找資料的方式,也被稱之為全文檢索。
二、什麼叫做分布式搜尋引擎
假如說你現在要存儲1TB的資料,那麼放在一台機器還是可以的。
但是如果你要存儲超過10TB,100TB,甚至1000TB的資料呢?你用一台機器放的下嗎?
當然是放不下的了,你的機器磁盤空間是不夠的。
大家看一下下面的圖:
是以這個時候,就得用分布式搜尋引擎了,也就是要使用多台機器來部署搜尋引擎叢集。
分布式搜尋引擎:把大量的索引資料拆散成多塊,每台機器放一部分,然後利用多台機器對分散之後的資料進行搜尋,所有操作全部是分布在多台機器上進行,形成了完整的分布式的架構。
三、Elasticsearch的資料結構
index:索引,類似于資料庫裡的一張表,大概對應表的那個概念。
field:字段
比如建立一個專門存放文章的索引,然後他有id、title、content幾個field,這個field大緻就是他的一個字段。
document:代表了index中的一條資料。
下面就是一個document,這個document可以寫到index裡去,算是index裡的一條資料。
而且寫到es之後,這條資料的内容就會拆分為反向索引的資料格式來存儲。
id | title | content |
---|---|---|
1 | Java好用嗎? | Java是非常非常好的一門語言。。。。 |
四、Shard資料分片機制
比如說你有一個index,專門存放論壇裡的文章,現在論壇裡的文章有1億,占用了1TB的磁盤空間。
但随着業務增漲,這個文章有10億,100億,占用了10TB、甚至100TB的磁盤空間。
這時Index資料就無法在一台機器上存儲了。
這時,必須得支援這個index的資料分布式存儲在多台機器上,利用多台機器的磁盤空間來承載這麼大的資料量。
而且,需要保證每台機器上對這個index存儲的資料量不要太大,因為控制單台機器上這個index的資料量,可以保證他的搜尋性能更高。
于是就有了:Shard資料分片結構。每個index你都可以指定建立多少個shard,每個shard就是一個資料分片,會負責存儲這個index的一部分資料
比如說index裡有3億文章,占據3TB資料。然後這個index你設定了3個shard。
現在index裡的3TB資料分布式存儲在了3台機器上,每台機器上有一個shard,每個shard負責管理這個index的其中1TB資料的分片。
現在如果要對這個Index的3TB資料搜尋,那麼可以發送請求到3台機器上去,
3台機器上的shard直接可以分布式的并行對一部分資料進行搜尋,起到一個分布式搜尋的效果,大幅度提升海量資料的搜尋性能和吞吐量。
五、Replica多副本資料備援機制
但是現在有一個問題,假如說3台機器中的其中一台當機了,此時怎麼辦呢?
是不是這個index上的1/3資料丢失了,是以為了保證高可用,使用Replica多副本資料備援機制。
在Elasticsearch裡,就是支援對每個index設定一個replica數量的,也就是每個shard對應的replica副本的數量。
這個初始的shard就是primary shard,而且primary shard和replica shard是絕對不會放在一台機器上的,避免一台機器當機直接一個shard的副本也同時丢失了。
在上述的replica機制下,每個primary shard都有一個replica shard在别的機器上,任何一台機器當機,都可以保證資料不會丢失,分布式搜尋引擎繼續可用。
Elasticsearch預設是支援每個index是5個primary shard,每個primary shard有1個replica shard作為副本。
六、總結
從搜尋引擎的反向索引開始,到單機無法承載海量資料,再到分布式搜尋引擎的存儲和搜尋。
然後我們以優秀的分布式搜尋引擎ES為例,闡述了ES的資料結構,shard資料分片機制,replica多副本機制,解釋了一下分布式搜尋引擎的架構原理。
原文:
https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247484455&idx=1&sn=f806d141d43cd870782fbae311b77958&chksm=fba6ec24ccd1653280a337c6be565d9e09c2e6d27662a06711974c67dcf9777212723db5b8fe&scene=21#wechat_redirect