一 序
本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。
本節繼續介紹es的基本概念。因爲pdf沒有下載,所以就是對着碼字,或者視頻截個圖。
二 分佈式
elasticsearch其實就是一個分佈式系統,需要滿足分佈式系統具備的高可用性和可擴展性
2.1分佈式系統的可用性與擴展性
- 高可用性
- 服務可用性-允許有節點停止服務
- 數據可用性-部分節點丟失,不會丟失數據
- 可擴展性
- 請求量提升/數據的不斷增長(將數據分佈到所有節點上)
2.2 分佈式特性
- elasticsearch的分佈式架構好處
- 存儲的水平擴容
- 提高系統的可用性,部分節停止服務,整個集羣的服務不受影響
- ElasticSearch的分佈式架構
3 節點
3.1 節點
- 是一個elasticsearch的實例
- 本質上是一個java進程
- 一臺機器上可以運行多個elasticsearch進程,但是生產環境一般建議一臺機器上運行一個elasticsearch實例
- 每一個節點都有名字,通過配置文件配置,或者啓動時候
-E node.name=node1
指定 - 每一個節點在啓動之後,會分配一個UID,保存在data目錄下
3.2 Master-eligible nodes和Master Node
- 每個節點啓動後,默認就是一個Master eligible節點
- 可以設置node.master:false禁止
- Master-eligible節點可以參加選主流程,成爲master節點
- 當第一個節點啓動時候,它會將自己選舉成Master節點
- 每個節點上保存了集羣的狀態,只有master節點才能修改集羣的狀態信息
- 集羣狀態(Cluster State),維護了一個集羣中,必要的信息
- 所有的節點信息
- 所有的索引和其相關的Mapping與Setting信息
- 分片的路由信息
- 任意節點都能修改信息會導致數據的不一致性
- 集羣狀態(Cluster State),維護了一個集羣中,必要的信息
3.3 Data Node & Coordinate Node
- Data Node
- 可以保存數據的節點,叫做Data Node,負責保存分片數據。在數據擴展上起到了至關重要的作用
- Coordinate Node
- 負責接受Client的請求,將請求分發到合適的節點,最終將結果彙集到一起
- 每個節點默認起到了Coordinate Node的職責
3.4其他的節點類型
- Hot & Warm Node
- 不同硬件配置的Data Node(冷節點配置低),用來實現Hot & Warm架構,降低集羣部署的成本
- Machine Learning Node
- 負責跑機器學習的 Job,用來做異常檢測
- Tribe Node
- 5.3開始使用Cross Cluster Search ,Tribe Node連接到不同的Elasticsearch集羣,並且支持將這些集羣當成一個單獨的集羣處理
3.5配置節點類型
- 開發環境中一個節點可以承擔多種角色
- 生產環境配置單一角色:更好性能,單一角色
4 分片(Primary Shard & Replica Shard)
-
主分片,用以解決數據水平擴展的問題。通過主分片,可以將數據分佈到集羣內的所有節點之上
- 一個分片是一個運行的 Lucene 的實例
- 主分片數在索引創建時指定,後續不允許修改,除非 通過Reindex方式進行
-
副本,用以解決數據高可用的問題,分片是主分片的拷貝
- 副本分片數,可以動態調整
- 增加副本數,還可以在一定程度上提高服務的可用性(讀取的吞吐)
一個例子:
4.1分片的設定
- 對於生成環境分片的設定,需要提前做好容量規劃(這個很重要)
- 分片數設置過小
- 導致後續無法增加節點實現水平擴展
- 單個分片的數據量太大,導致數據重新分配耗時
- 分片數設置過大,7.0開始,默認主分片設置爲1,解決了over-sharding的問題
- 影響搜索結果的相關性打分,影響統計結果的準確性
- 單個節點上過多的分片,會導致資源浪費,同時也會影響性能
- 分片數設置過小
5 查看集羣的健康狀況
再dev tools運行:GET _cluster/health
{
"cluster_name" : "geektime",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 5,
"active_shards" : 10,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
根據不同的狀態對應的顏色區分。
- Green-主分片與副本都正常分配
- Yellow-主分片全部正常分配,副本分片未能正常分配
- Red-有主分片未能分配
其他命令:查看節點: GET _cat/nodes
172.24.0.4 37 96 7 0.53 0.26 0.21 mdi * es72_02
172.24.0.5 33 96 7 0.53 0.26 0.21 mdi - es72_01
查看分片
使用cerebro ,訪問本地9000端口。
這個就是02是主的,
小結:
後面第三部分學完之後,自己應該大概有個判斷的尺度了。對生產環境中,分片設置很重要,需要最好容量評估與規劃.
有的同學諮詢的問題,老師有些寬泛的建議:
- 磁盤,推薦 SSD,JVM最大Xmx 不要超過30G。副本分片至少設置爲1。 主分片,單個存儲不要超過 30 GB(按照這個你推算出分片數,進行設定)。
- 集羣中磁盤快滿的時候,你再增加機器,確實可能導致新建的索引全部分配到新節點上去的可能性。最終導致數據分配不均。所以要記得監控集羣,到70%就需要考慮刪除數據或是增加節點.