深入淺出spring-data-elasticsearch之ElasticSearch架構初探(一).md
阿新 • • 發佈:2018-12-12
- Elasticsearch基本術語
-
- 文件(Document)、索引(Index)、型別(Type)文件三要素
- 文件(Document):文件,在面向物件觀念就是一個物件。在 ES 裡面,是一個大 JSON 物件,是指定了唯一 ID 的最底層或者根物件。文件的位置由 _index、_type 和 _id 唯一標識。
- 索引(Index):索引,用於區分文件成組,即分到一組的文件集合。索引,用於儲存文件和使文件可被搜尋。比如專案存索引 project 裡面,交易存索引 sales 等。
- 型別(Type):型別,用於區分索引中的文件,即在索引中對資料邏輯分割槽。比如索引 project 的專案資料,根據專案型別 ui 專案、插畫專案等進行區分。
和關係型資料庫 MySQL 做個類比:
Document 類似於 Record
Type 類似於 Table
Index 類似於 Database
-
- 叢集(Cluster)、節點(Node)、分片(Shard)分散式三要素
- 叢集(Cluster):多個 ElasticSearch 執行例項(節點)組合的組合體是 ElasticSearch 叢集。ElasticSearch 是天然的分散式,通過水平擴容為叢集新增更多節點。 叢集是去中心化的,有一個主節點(Master)。主節點是動態選舉,因此不會出現單點故障。
- 節點(Node):一個ElasticSearch執行例項就是節點。順著叢集來,任何節點都可以被選舉成為主節點。主節點負責叢集內所以變更,比如索引的增加、刪除等。所以叢集不會因為主節點流量的增大成為瓶頸。因為任何節點都會成為主節點。
- 分片(Shard):分片,是ES節點中最小的工作單元。分片僅僅儲存全部資料的一部分,分片的集合是ES的索引。分片包括主分片和副分片,主分片是副分片的拷貝。主分片和副分片的工作基本沒有大的區別。在索引中全文搜尋,然後會查詢到每個分片,將每個分配的結果進行全域性地收集處理,並返回。
- Elasticsearch 工作原理
-
- 文件儲存的路由
當索引到一個文件(如:報價系統),具體的文件資料(如:報價資料)會儲存到一個分片。具體文件資料會被切分,並分別儲存在分片 1 或者 分片 2 … 那麼如何確定存在哪個分片呢?
儲存路由過程由下面地公式決定: shard = hash(routing) % number_of_primary_shards routing 是可變值,支援自定義,預設文件 _id。 hash 函式生成數字,經過取餘演算法得到餘數,那麼這個餘數就是分片的位置。
-
- 如何健康檢查:叢集名,叢集的健康狀態
GET http://127.0.0.1:9200/_cluster/stats
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
active_primary_shards 叢集中的主分片數量
active_shards 所有分片的彙總值
relocating_shards 顯示當前正在從一個節點遷往其他節點的分片的數量。通常來說應該是 0,不過在 Elasticsearch 發現叢集不太均衡時,該值會上漲。比如說:添加了一個新節點,或者下線了一個節點。
initializing_shards 剛剛建立的分片的個數。
unassigned_shards 已經在叢集狀態中存在的分片。
status 欄位是需要我們關心的。狀態可能是下列三個值之一:
green
所有的主分片和副本分片都已分配。你的叢集是 100% 可用的。
yellow
所有的主分片已經分片了,但至少還有一個副本是缺失的。不會有資料丟失,所以搜尋結果依然是完整的。高可用會弱化把 yellow 想象成一個需要及時調查的警告。
red
至少一個主分片(以及它的全部副本)都在缺失中。這意味著你在缺少資料:搜尋只能返回部分資料,而分配到這個分片上的寫入請求會返回一個異常。
-
- 如何水平擴容
主分片在索引建立已經確定。讀操作可以同時被主分片和副分片處理。因此,更多的分片,會擁有更高的吞吐量。自然,需要增加更多的硬體資源支援吞吐量。說明,這裡無法提高效能,因為每個分片獲得的資源會變少。動態調整副本分片數,按需伸縮叢集,比如把副本數預設值為 1 增加到 2:
PUT /blogs/_settings
{
"number_of_replicas" : 2
}