參考:https://blog.csdn.net/chang384915878/article/details/86747419
一、准備知識
這里只是簡單的介紹,詳情可以看我的另一篇博客:https://www.cnblogs.com/JimShi/p/11309651.html
elasticsearch設計的理念就是分布式搜索引擎,底層實現還是基於Lucene的,核心思想是在多態機器上啟動多個es進程實例,組成一個es集群。了解幾個概念:
1、接近實時
es是一個接近實時的搜索平台,這就意味着,從索引一個文檔直到文檔能夠被搜索到有一個輕微的延遲
2、集群(cluster)
一個集群有多個節點(服務器)組成,通過所有的節點一起保存你的全部數據並且通過聯合索引和搜索功能的節點的集合,每一個集群有一個唯一的名稱標識
3、節點(node)
一個節點就是一個單一的服務器,是你的集群的一部分,存儲數據,並且參與集群和搜索功能,一個節點可以通過配置特定的名稱來加入特定的集群,在一個集群中,你想啟動多少個節點就可以啟動多少個節點。
4、索引(index)
一個索引就是還有某些共有特性的文檔的集合,一個索引被一個名稱唯一標識,並且這個名稱被用於索引通過文檔去執行搜索,更新和刪除操作。
5、類型(type)
type 在6.0.0已經不贊成使用
為什么不使用?https://www.cnblogs.com/JimShi/p/11309651.html
6、文檔(document)
一個文檔是一個基本的搜索單元
二、如何實現分布式
1、分片
Elasticsearch 也是會對數據進行切分,同時每一個分片會保存多個副本,其原因是為了保證分布式環境下的高可用,同時也擴大了存儲空間。es也是master-slave架構,在 es 中,節點是對等的,節點間會通過自己的一些規則選取集群的 Master,Master 會負責集群狀態信息的改變,並同步給其他節點。值得注意的是,只有建立索引和類型需要經過 Master,數據的寫入有一個簡單的 Routing 規則,可以 Route 到集群中的任意節點,所以數據寫入壓力是分散在整個集群的。
具體就是你先建立一個索引,這個索引可以拆分成多個 shard
,每個 shard 存儲部分數據。這個shard 的數據實際是有多個備份,就是說每個 shard 都有一個 primary shard
,負責寫入數據,但是還有幾個 replica shard
。primary shard
寫入數據之后,會將數據同步到其他幾個 replica shard
上去。
通過這個 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 作為分布式搜索引擎最基本的一個架構設計。