天天看點

ElasticSearch 叢集搭建、工作原理

目錄

      • 概述
      • 搭建es叢集
      • kibana連接配接es叢集
      • 分片管理
      • 檢視叢集資訊
      • 文檔讀寫過程
        • 寫操作
        • 讀操作
      • es中的樂觀鎖
      • 反向索引
      • analyzer 分詞器

es為什麼要叢集?(叢集的作用)

  • 高可用。高可用(High Availability)是分布式系統必須考慮的因素之一,實質是減少系統不能提供服務的時間。eg. 系統每運作100個時間機關,會有1個時間機關無法提供服務,則該系統的可用性是99%。
  • 負載均衡:将流量分散到多個節點上,減輕單個節點的壓力
  • 提高整個系統的性能

es天生就是分布式的,就算隻有一個節點,也是以叢集方式部署的。

es叢集的分布式優勢

  • 自動配置設定分片,自動确定文檔的存儲位置
  • 自動同步資料至副分片(資料備援),以防止硬體故障導緻的資料丢失
  • 叢集擴容時可以無縫整合新節點,自動重新配置設定分片

一個es節點可以同時具有多種角色,常見的角色有2種

  • master:master備選節點,有被選舉為master的資格,預設具有此角色
  • data:資料存儲節點,用于存儲資料,預設具有此角色

一個es叢集可以有多個master節點,但實際隻有一個master節點,其餘都是備胎。

當叢集中一半以上的master正常時,叢集才對外提供服務,否則叢集不可用。這個數值可調,預設為 master數量/2+1 。

分片可分為

  • 主分片( primary shard):每個主分片隻存儲索引的部分資料,也就是說一個索引的資料是分散存儲在多個分片上的,多個分片構成全樣資料。
  • 副本分片(replica shard):主分片的副本,用于備份主分片上的資料

1、elasticsearch.yml

#叢集名稱
cluster.name: es

#節點名稱
node.name: node-1

#自動綁定本機實際ip,允許外網通路
network.host: 0.0.0.0

#es對外提供服務使用的端⼝,預設9200
#http.port: 9200

#es節點之間通信使用的端口,預設9300
#transport.tcp.port: 9300

#指定叢集節點(ip+通信端口)
discovery.seed_hosts: ["192.168.1.2:9300","192.168.1.3:9300","192.168.1.4:9300"]

#初始主節點,叢集啟動時會從裡面選出一個真正的master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
           

如果是本地模拟叢集,需修改 http.port 、transport.tcp.port、discovery.seed_hosts 使用的端口。

2、jvm.options

#設定jvm的最小、最大堆記憶體
-Xms10g
-Xmx10g
           

3、如果data目錄下有内容,清空data目錄

4、其它系統配置參考:

防火牆要開啟es對外提供服務使用的9200端口、叢集内部節點之間通信的9300端口。

5、啟動各節點,通路任意一個節點的 /_cat/nodes?v ,如果節點數正确,則叢集搭建成功。*号标出的是真正的master節點。

如果每個節點都是真正的master,組成的都是單獨的叢集,檢查

  • discovery.seed_hosts配置是否正确
  • 啟動之前是否未清空data目錄

kibana.yml

#指定es叢集節點
elasticsearch.hosts: ["http://192.168.1.2:9200","http://192.168.1.3:
9200","http://192.168.1.4:9200"]
           

查詢資料時隻使用其中某個節點,該節點故障時自動使用另一個節點。

分片是針對index而言的,es是分布式的搜尋引擎,index通常會分解成不同部分(分片)分布在不同的資料節點上。es會自動配置設定、管理分片,在需要的時候會自動重新配置設定分片,無需使用者手動管理分片。

從7.x開始,如果建立index時不指定分片數量,預設會建立1個主分片、⼀個副分片;7.x之前則是預設建立5個主分片。

可以在建立index時指定分片數量

PUT /mall
{
    "settings": {
        "number_of_shards": 1,  #主分片
        "number_of_replicas": 2   #副分片
    },
    "mappings": {
        "properties": {
            "goods_name": {
                "type": "keyword"
            },
            "goos_price": {
                "type": "float"
            },
            "goods_description": {
                "type": "text"
            }
        }
    }
}
           

可以修改分片數量

PUT /mall/_settings
{
    "number_of_replicas": 3  #修改副分片數量
}
           

GET /_cat  #檢視選項

GET /_cat/shards?v   #檢視所有分片的資訊。?v會顯示每一項的名稱
GET /_cat/shards/mall?v  #指定index的分片
 
GET /_cat/nodes?v  #所有節點
GET /_cat/master?v  #主節點

GET /_cat/indices?v  #所有索引
GET /_cat/indices/mall?v  #指定索引

GET /_cat/count?v #文檔總數
GET /_cat/count/mall?v  #指定index的文檔數

GET /_cat/health?v  #叢集健康狀況

GET /_cat/plugins?v  #啟用的插件
           

shards是分片,pri是主分片(primary shards)。

叢集狀态

  • red:叢集不可用。至少缺失一個主分片以及它的全部副分片,缺失部分資料,搜尋隻能傳回部分資料,而配置設定到這個分片上的寫請求會傳回一個異常。
  • yellow:叢集可用但仍存在問題。所有的主分片都已配置設定,但缺失了至少一個副分片。資料是完整的,讀寫正常,但可用性降低了。
  • green:正常。所有的主分片、副分片都已配置設定。

master負責維護叢集狀态,在有新節點加入或離開時重新配置設定分片。

由主分片執行寫操作,再同步到副分片。主分片往往分散在多個節點上,不一定在master上。(這一點和zk不同)

  • 用戶端向es叢集發送文檔寫請求
  • 叢集的某個節點接收到請求,通過路由算法确定該文檔所屬的主分片,将請求轉發給該主分片所在節點
  • 主分片執行寫請求,成功後将請求轉發給對應副分片所在節點
  • 副本分片執行請求,将執行結果通知主分片所在節點
  • 如果所有副分片都執行(同步)成功,主分片節點通知接受請求的接待您操作成功,接收請求的節點向用戶端傳回操作成功

  • 用戶端向es叢集發送文檔讀請求
  • 叢集的某個節點接收到請求,根據路由算法确定文檔所在分片的節點清單,再根據負載均衡算法(預設輪詢)确定轉發給其中的某個節點
  • 分片所在節點将資料傳回給接收到請求的節點,接收到請求的節點将資料傳回給用戶端

es叢集中的概念和普通叢集不同

  • 普通叢集:master處理寫請求,master、slave都可以處理讀請求
  • es叢集:master負責叢集的分片管理,寫請求由主分片處理,讀請求主分片、副分片都可以處理。分工不同。

  • 悲觀鎖:每次操作時都認為别⼈會修改資料,是以操作時會先加鎖。eg. 關系資料庫的行鎖、表鎖,都是在做操作之前先上鎖。
  • 樂觀鎖:每次操作時都認為别⼈不會修改資料,不上鎖,但送出更新時會檢測操作期間資料是否已被修改。

悲觀鎖适合寫多讀少、并發量小的場景,樂觀鎖适合讀多寫少、并發量大的場景。

es讀多寫少,常使用樂觀鎖解決并發問題,使用樂觀鎖也可以提⾼系統吞吐量。

#讀文檔時會傳回該文檔的版本号_version,假設傳回的是版本号是9
GET /mall/_doc/1999

#更新文檔時校驗版本号(+1)。如果更新後版本号為10則傳回成功,否則傳回失敗
POST /mall/_doc/1999?version=10&version_type=external
{
 "goods_price": 12.00
}
           

反向索引記錄詞項(分詞得到的詞)資訊,包括含有該詞的文檔id、字段名、出現次數(頻率)等。

搜尋時,并非周遊所有文檔、從前往後比對關鍵字,而是在反向索引中檢索關鍵字,直接定位比對的文檔。

添加、更新文檔時,會先把字段值中的大寫字母轉成小寫字母,再分詞,更新反向索引中的詞項資訊。

分詞器又叫做分析器,有2個作用時間點

  • 全文檢索時對搜尋關鍵字進行分詞
  • 插入、更新文檔時給字段值分詞,以更新反向索引中的詞項統計資訊

這也是es計算相關性(score)中的重要依據。

  • char filter:以字元流的形式接收文本,并對文本進行預處理
  • tokenizer : 分詞器,對文本進行分詞
  • token filter :token過濾器,處理分詞得到的詞項

繼續閱讀