目錄
-
-
- 概述
- 搭建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過濾器,處理分詞得到的詞項