@author Gandalf
介紹
ES是什么
Elasticsearch實時的分布式全文搜索分析引擎绎晃,內部使用Lucene做索引與搜索,開發(fā)語言為Java
全文:對全部的文本內容進行分析黎侈,建立索引,使之可以被搜索
實時:新增到 ES 中的數據在1秒后就可以被檢索到彪蓬,這種新增數據對搜索的可見性稱為“準實時/近實時搜索”瞻鹏。
分布式:可以動態(tài)調整集群規(guī)模悲立,彈性擴容
Github:https://github.com/elastic/elasticsearch
可以做什么
- 搜索:搭建搜索引擎(類似百度、谷歌新博、知乎等可搜索功能的實現)级历、日志收集分析系統
- 聚合分析:進行數據分析、統計叭披,生成指標數據寥殖。
- 適用場景:適合用于中等規(guī)模數據的應用場景,據官方描述涩蜘,集群規(guī)模支持“上百”個節(jié)點嚼贡,ES適合中等數據量的業(yè)務,不適合海量數據存儲
優(yōu)缺點
迭代快速同诫,目前每2周左右就會發(fā)布新版本
社區(qū)活躍且生態(tài)豐富
語法與關系型數據庫迥異粤策,語法學習成本高
基本概念
ES是面向文檔的。各種文本內容以文檔(document)的形式存儲到ES中误窖,文檔可以是一封郵件叮盘、一條日志,一條關系型數據庫的記錄霹俺,或者一個網頁的內容柔吼。使用 JSON 作為文檔的序列化格式,文檔可以有很多字段丙唧,創(chuàng)建索引的時候愈魏,同關系型數據庫創(chuàng)建表約束一樣,可指定各字段的數據類型(也可不指定,動態(tài)生成文檔)培漏,可指定不同字段不同的分詞器溪厘,指定字段是否被搜索到。
索引結構
存儲結構上牌柄,由_index
畸悬、_type
和_id
標識一個文檔
_index
:為指向一個或多個分片的物理存儲命名,存儲某一類型文檔的集合_type
:用于區(qū)分一個_index
中的不同細分珊佣,多個_type
的數據結構應是相似的蹋宦,如建立一個訂單類的索引,有不同_type
類型的訂單:物流訂單彩扔、采購訂單妆档、出庫訂單...,索引中的多個type,實際上是存放在一起的虫碉,一個index下贾惦,不能有多個字段重名但type不一致_id
:文檔唯一標識,可自行指定敦捧,ES自動生成的id须板,長度為20個字符,URL安全兢卵,base64編碼习瑰,GUID,分布式環(huán)境也不會發(fā)生沖突
分片
分片(Shard): ES利用分片解決單機無法存儲規(guī)模巨大的問題,將數據分為多個分片秽荤,分片就是一個lucene實例甜奄,會自動創(chuàng)建索引和處理請求,不同分片可存儲在不同的機器上窃款,通過路由策略找到分片所在的位置课兄;分布式存儲中還會把分片復制成多個副本,實現水平擴展能力以及高可用(HA)晨继,同時副本還可以執(zhí)行讀請求烟阐,分擔集群壓力,ES將數據副本分為主從兩部分紊扬,即主分片primary hard
和副分片replica shard
蜒茄,主數據作為權威數據,寫過程中先寫主分片餐屎,成功后再寫副分片檀葛,當集群規(guī)模擴大或縮小時,ES 會自動在各節(jié)點中遷移分片啤挎,使數據仍然均勻分布在集群里
primary shard不能和自己replica shad在同一節(jié)點驻谆,單節(jié)點創(chuàng)建primary shard和replica shard在同一臺機器上時卵凑,是不會分配給replica shard的庆聘。
Tip :分片一旦指定久可以修改胜臊,所以一開始就盡量規(guī)劃好主分片數量,先依據硬件情況定好單個分片容量伙判,然后依據業(yè)務場景預估數據量和增長量象对,再除以單個分片容量。
文檔結構
_mapping
:自動或者手動為ES中index的typet建立的一種數據結構和相關配置
_all
:ES會自動將多個field的值用串聯的方式鏈接起來宴抚,變成一個長的字符串勒魔,作為_all field的值,同時建立索引菇曲,在搜索的時候冠绢,沒有指定field的值時候,就默認搜索_all
倒排索引
建立倒排索引的時候常潮,會執(zhí)行一個操作弟胀,對各個拆分的各個單詞進行相應的處理(noralization)歸一化,搜索的時候也要進行分詞并歸一化喊式,提升搜索命中文檔的概率 likes-->like Tom-->tom
如不提前指定索引及類型孵户,es會自動建立index和type,不需要提前創(chuàng)建,會默認對每個field建立倒排索引岔留,讓其可以被搜索
各節(jié)點說明
-
master節(jié)點:管理ES的元數據夏哭,管理索引的創(chuàng)建和刪除,結點增加和移除献联,默認會選出一臺做master,不會處理所有的請求竖配,通過配置
node.master: true
(默認),使節(jié)點具有被選舉為 Master 的資格,主結點也可做數據節(jié)點里逆,生產環(huán)境盡量分離主節(jié)點與數據節(jié)點 - 數據節(jié)點(Data node):保存數據进胯、執(zhí)行數據相關操作:CRUD、搜索运悲、聚合等龄减。數據節(jié)點對CPU、內存班眯、I/O要求較高
- 預處理節(jié)點(Ingest node):在索引文檔之前希停,即寫入數據之前,通過定義好的一系列的processors(處理器)和pipeline(管道)署隘,對數據進行某種轉換宠能。processors和pipeline攔截bulk和index請求
- 協調節(jié)點(Coordinateing node):處理客戶端請求的節(jié)點,并將請求轉發(fā)給文檔所在的位置磁餐,在收集各節(jié)點的處理請求后违崇,合并數據并轉換為客戶端阿弃,每個節(jié)點都可以作為協調節(jié)點
ES讀請求與寫請求都是首先通過協調節(jié)點,由協調節(jié)點進行請求分發(fā)到對應的shard以及對應的node羞延,各node處理完后回復協調節(jié)點再向客戶端做響應
分詞
IK 分詞器簡介:ik有兩種分詞模式渣淳,ik_max_word,和ik_smart模式;
ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”伴箩,會窮盡各種可能的組合入愧;
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”嗤谚。
進階知識
集群健康狀態(tài)
從數據完整性的角度劃分棺蛛,集群健康狀態(tài)分為三種:
Green:所有的主分片和副分片都正常運行。
Yellow:所有的主分片都正常運行巩步,但不是所有的副分片都正常運行旁赊。這意味著存在單點故障風險
Red:有主分片沒能正常運行,不是所有的主分片都是active狀態(tài)椅野。
集群狀態(tài)是全局信息终畅,包括內容路由信息、配置信息鳄橘,描述了“哪個分片位于哪個節(jié)點”這種信息声离,
集群狀態(tài)發(fā)布流程:集群狀態(tài)由主節(jié)點負責維護,主節(jié)點更新后廣播到其它節(jié)點 瘫怜,該操作是一個不完全分布事務术徊,分為兩階段,commit與apply階段鲸湃, master變更集群信息后赠涮,廣播變更信息到各個子節(jié)點,多數節(jié)點確認后暗挑,集群狀態(tài)發(fā)布成功
主節(jié)點主分片選舉過程
當master節(jié)點掛掉后笋除,會自動選舉一個node成為新的maste,基于Bully算法炸裆,每個節(jié)點個ID垃它,選出各節(jié)點認為ID值最小的作為主節(jié)點
新主節(jié)點將丟失掉的primary shard的某個replica shard提升為primary shard, 此時cluster status會變?yōu)閥ellow烹看,因為primary全都變成active了国拇,但少了一個replica shard
重啟故障的node,主節(jié)點會將缺失的副本都cpy到該node上惯殊,而且該node會用之前已有的shard數據酱吝,只是同步一下掛掉后發(fā)生過的修改
之后cluster status狀態(tài)就變?yōu)間reen,因為primary shard和replica shard都屬于可用狀態(tài)
ES節(jié)點內部通信與數據傳輸都是基于TCP土思,基于netty务热,包括REST接口也是基于netty進行封裝路由
ES數據可被搜索流程
段合并
默認情況下索引的refresh_interval為1秒忆嗜,
ES并發(fā)控制
通過樂觀鎖實現并發(fā)控制,通過版本號的方式控制崎岂,每次更新之前先拿到版本號與ES中的版本號對比捆毫,如果不一致,則過去當前版本號中的最新數據该镣,再修改
悲觀鎖:每次獲取數據都會加鎖冻璃,悲觀的認為別人會修改數據响谓,其余線程想獲取數據必須等到該鎖被釋放后才能獲取到损合,悲觀適用于多寫,樂觀適用于多讀娘纷,樂觀鎖存在ABA問題
悲觀鎖可通過版本號與CAS實現嫁审,如Java中的原子類;
寫數據流程
- 客戶端向NODE1發(fā)送寫請求赖晶。
- NODE1使用文檔ID來確定文檔屬于分片0律适,通過集群狀態(tài)中的內容路由表信息獲知分片0的主分片位于NODE3,因此請求被轉發(fā)到NODE3上遏插。
- NODE3上的主分片執(zhí)行寫操作捂贿。如果寫入成功,則它將請求并行轉發(fā)到 NODE1和NODE2的副分片上胳嘲,等待返回結果厂僧。當所有的副分片都報告成功,NODE3將向協調節(jié)點報告成功了牛,協調節(jié)點再向客戶端報告成功
詳細流程
在客戶端收到成功響應時颜屠,意味著寫操作已經在主分片和所有副分片都執(zhí)行完成
建立索引流程
讀數據流程
查詢分為兩階段:QUERY_THEN_FETCH查詢與獲取,Query階段知道了要取哪些數據鹰祸,但是并沒有取具體的數據甫窟,Fetch階段獲取具體的數據
Query階段
QUERY_THEN_FETCH搜索類型的查詢階段步驟如下:
(1)客戶端發(fā)送search請求到NODE 3。
(2)Node 3將查詢請求轉發(fā)到索引的每個主分片或副分片中蛙婴。
(3)每個分片在本地執(zhí)行查詢粗井,并使用本地的Term/DocumentFrequency信息進行打分,添加結果到大小為from + size的本地有序優(yōu)先隊列中街图。
(4)每個分片返回各自優(yōu)先隊列中所有文檔的ID和排序值給協調節(jié)點浇衬,協調節(jié)點合并這些值到自己的優(yōu)先隊列中,產生一個全局排序后的列表台夺。
Fetch階段
Fetch階段由以下步驟構成:
(1)協調節(jié)點向相關NODE發(fā)送GET請求径玖。
(2)分片所在節(jié)點向協調節(jié)點返回數據。
(3)協調節(jié)點等待所有文檔被取得颤介,然后返回給客戶端梳星。
分布式系統搜索執(zhí)行流程
刪數據流程
刪除方式為標記刪除赞赖,只會對文檔進行標記為delete,不會真正物理刪除冤灾,等es存儲達到一定閾值時前域,才會自動刪除標記為delete的文檔,查詢時會過濾掉被標記為刪除的數據韵吨,或者lucene段合并時才會清除標記為刪除的數據
修改數據流程
ES配置
節(jié)點配置
創(chuàng)建獨立主節(jié)點的配置:
node.master: true
node.data: false
數據節(jié)點配置
node.master: false
node.data: true
node.ingest: false
預處理節(jié)點配置
node.master: false
node.data: false
node.ingest: true
協調節(jié)點配置
node.master: false
node.data: false
node.ingest: false
ES模板配置
{
"template": "*"匿垄,
"order" : 0,
"settings":
{
"index.merge.policy.max_merged_segment" : "2gb"归粉,
"index.merge.policy.segments_per_tier" : "24"椿疗,
"index.number_of_replicas" : "1",
"index.number_of_shards" : "24"糠悼,
"index.optimize_auto_generated_id" : "true"届榄,
"index.refresh_interval" : "120s",
"index.translog.durability" : "async"倔喂,
"index.translog.flush_threshold_size" : "1000mb"铝条,
"index.translog.sync_interval" : "120s",
"index.unassigned.node_left.delayed_timeout" : "5d"
}
}
配置修改
重要配置修改
https://www.elastic.co/guide/cn/elasticsearch/guide/current/important-configuration-changes.html
設置es堆內存
https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html
時間類型存儲:往 ES 寫入時間類型的數據的時候席噩,可以寫入不同的時間格式的值班缰,最終在 ES 中都會轉化成 long 類型用于查詢和排序。
ES使用
安裝使用
下載 https://www.elastic.co/cn/downloads/elasticsearch
java環(huán)境:確保服務器的jvm和運行程序的jvm的版本是完全一致的
- 啟動
/usr/java/jdk1.8.0_144/bin/java -Xms24g -Xmx24g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+Hepath.home=/usr/elasticsearch-5.5.2 -cp /usr/elasticsearch-5.5.2/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
- 訪問
啟動成功后悼枢,ES提供REST接口埠忘,http端口為9200,Java默認訪問端口為9300
集群運維管理
查詢集群狀態(tài)
-- 默認請求到主節(jié)點
curl -X GET "localhost:9200/_cluster/state
-- 接收請求的節(jié)點執(zhí)行萧芙,可用于驗證當前節(jié)點的集群狀態(tài)是否為最新
curl -X GET "localhost:9200/_cluster/state?local=true
查詢集群健康狀態(tài)
curl -X GET localhost:9200/_cat/health?v
curl -X GET localhost:9200/_cluster/health?pretty
集群節(jié)點信息
curl http://127.0.0.1:9200/_cat/nodes?v
查詢索引列表
curl -X GET "localhost:9200/_cat/indices?v"
節(jié)點監(jiān)控
-- 可以全面的查看集群各個節(jié)點的各種性能指標情況
curl -X GET "localhost:9200/_nodes/stats?pretty"
查詢節(jié)點信息
curl -X GET "localhost:9200/_nodes?pretty"
集群磁盤分布情況
curl http://127.0.0.1:9200/_cat/allocation?v
修改索引允許動態(tài)映射
-- 修改后插入文檔時索引遇到默認字段會自動修改mapping(表接口)
curl -XPUT "http://localhost:9200/index_name/type_name/_mapping" -H 'Content-Type: application/json' -d '{
"dynamic": true
}'
修改索引為一個副本
curl -XPUT "http://localhost:9200/index_name/_settings" -H 'Content-Type: application/json' -d '{"number_of_replicas":1}'
ES正在執(zhí)行的任務
curl -X GET 'localhost:9200/_tasks?pretty'
-- 取消正在執(zhí)行的任務
curl -X POST 'localhost:9200/_tasks/node_id:task_id/_cancel'
-- 過濾出正在執(zhí)行的查詢任務
curl -X GET 'localhost:9200/_tasks?actions=cluster:*&pretty'
curl -X GET 'localhost:9200/_tasks?actions=*&detailed&pretty'
分片狀態(tài)及管理
索引恢復進度
curl localhost:9200/_cat/recovery?pretty&v
-- 查詢某個具體索引的恢復過程
curl localhost:9200/index_name/_recovery?pretty&v
節(jié)點自動分配
查看是否自動副本分配
-- 如修改副本數量后给梅,索引為自動均衡,可通過用此配置查詢
curl -XGET 'localhost:9200/_cluster/settings?pretty' -d '{
"persistent": {},
"transient": {
"cluster": {
"routing": {
"allocation": {
"enable": "all"
}
}
}
}
}'
設置自動分配分片
curl -XPUT 'localhost:9200/_cluster/settings' -d'{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}'
分片分布情況
curl localhost:9200/_cat/shards
索引分片同步列表
curl 'localhost:9200/_cluster/state?filter_path=metadata.indices.index_name.in_sync_allocations.*,routing_table.indices.index_name.*&pretty'
問題定位
熱點線程查詢
curl -X GET "localhost:9200/_nodes/node_name1,node_name2/hot_threads"
查詢未分配索引的詳細解釋
curl localhost:9200/_cluster/allocation/explain
查詢節(jié)點線程池使用
curl -X GET "http://localhost:9200/_cat/thread_pool"
常用語法
ES查詢語法:QueryDSL
DSL:Domain specified language:特定領域的語言双揪,使用http構建復雜的請求體進行查詢
查詢返回語法解釋
GET /index_name/type_name/_search
took 耗費了多少毫秒
time_out 是否超時
_shards:數據拆分成了5個分片
hists.total:查詢結果的數量
hist.max_score:score的含義动羽,就是document對于一個search的相關度的匹配分數,分數越高渔期,相關度越高
hits.hits:包含了匹配搜索的數據
查詢排序
-- 查詢index_name索引运吓,按時間排序,默認取前20條
curl -i -XGET 'http://localhost:9200/index_name/_search?sort=createTime:asc?pretty'
批量查詢 mget
查詢不同index下的不同document
GET /_mget
{
"docs" :[
{
"_index":"index_name",
"_type":"type_name",
"_id":1
},{
"_index":"index_name2",
"_type":"type_name",
"_id":2
}
]
}
--查詢同一個index下的不同document
GET /index_name/_mget
{
"docs" :[
{
"_type":"type_name",
"_id":1
},{
"_type":"type_name",
"_id":2
}
]
}
bool查詢
bool查詢疯趟,組合查詢
復合子句可以合并多種子句為一個單一的查詢拘哨,無論是葉子子句還是其他的復合子句。
合并多子句
http://192.168.41.11:9200/index_name/type_name/_search
{
"query":{
"bool":{
"must":{"match":{"type":"1"} },
"must_not":{"match":{ "blockCode":"5201030003"}},
"should":{"match":{ "doorName":"Openai大模型"} }
}
}
}
分頁查詢
{
"query":{
"bool":{
"must":[
{
"match":{"blockCode":"5201030003"}
},
{
"match":{"type":"23"}
}
]
}
},
"size":"2",
"from":"0",
"sort":{
"createdDate":{
"order":"desc"
}
}
}
ES分頁from默認從0開始信峻,size默認為10
深分頁問題
deep paging:當集群節(jié)點眾多倦青,且分頁查詢的頁數過大時,會很消耗服務器資源盹舞,如分頁from1000,size10 的分頁請求過來后产镐,會將請求打到各個shard或者replica節(jié)點上隘庄,去取每個節(jié)點去10010條數據到coordinate結點上,10個節(jié)點共100100條進行排序選出10條癣亚。
超時查詢
返回在指定超時時間內查詢到的數據丑掺,有可能數據沒有查詢完畢
curl localhost:9200/index_name/index_name/_search?timeout=1s
精確值查詢
term過濾:term主要用于精確匹配哪些值,比如數字述雾,日期街州,布爾值或 not_analyzed的字符串,允許使用多個匹配條件
----條件查詢并排序
http://localhost:9200/index_name/type_name/_search
{
"query":{
:"match":{
"residentId":"1234123"
}
},
"sort":[{
"createdDate":"desc"
}]
}
-----全文檢索
http://localhost:9200/index_name/type_name/_search
{
"query": {
"match":{"photoLargeUuid":"84cb5b32 a195229e0a7d"}
}
}
全文搜索會將查詢條件分割進行組合查詢按權重排序
---phrase 查詢
短語全詞匹配
復合查詢
GET /item/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"brand": {
"query": "小米"
}
}
},
{
"term": {
"title": {
"value": "小米"
}
}
}
]
}
}
}
更新語法
post /index_name/type_name/1/update
{
"doc":{
"residentId":"341234123412"
}
}
刪除語法
-- delete post 刪除ID為796098575183802的記錄
curl -x delete http://localhost:9200/index_name/type_name/796098575183802
--delete post 刪除該索引index_name,謹慎執(zhí)行
curl -X DELETE "localhost:9200/index_name?pretty"
統計語法
統計索引條數
curl 'localhost:9200/index_name/_count?pretty'
curl 'localhost:9200/face_picture_index/_count?pretty'
curl 'localhost:9200/index_name/_count?pretty'
聚合統計
按類型進行統計
http://localhost:9200/index_name/type_name/_search
{
"size":0,
"aggs": {
"group_by_type": {
"terms": {
"field": "type"
}
}
}
}
-----聚合統計玻孟,按月分段唆缴,以開門方式為維度進行統計
{
"size":0,
"aggs":{
"group_by_date":{
"range":{
"field":"createdDate",
"ranges":[
{"from":1555261319001,
"to":1557853319000
},{
"from":1552582919001,
"to":1555261319000
},{
"from":1550163719000,
"to":1552582919000}
]
},
"aggs":{
"group_by_type":{
"terms":{
"field":"type"
}
}
}
}
}
}
ES優(yōu)化
1. 慢查詢配置
curl -XPUT "http://localhost:9200/index_name/_settings" -H 'Content-Type: application/json' -d'{
"index.search.slowlog.threshold.fetch.debug": "5s",
"index.search.slowlog.threshold.query.warn": "5s",
"index.indexing.slowlog.threshold.index.info": "5s",
"index.indexing.slowlog.threshold.index.warn": "10s"
}'
配置慢查詢日志,將索引中的慢查詢取募,慢索引打印出來
2. 索引配置優(yōu)化
數據量大的情況下:基于日期輪詢的索引可以每天生成一個索引琐谤,然后用別名關聯,或者使用索引通配符匹配
3. 系統層面優(yōu)化
- 關閉swap玩敏,調整max open files
- http://dockone.io/article/505
- 調整shard數,replica數
- elasticsearch三個重要的優(yōu)化 https://zhaoyanblog.com/archives/319.html
4. 結構優(yōu)化
不需要排序聚合质礼,不需要在腳本中訪問的字段可以禁用doc_valus字段節(jié)省存儲空間
建議周期性的建立新索引
5. 寫入速度優(yōu)化
- 加大 Translog Flush 旺聚,目的是降低 Iops(每秒讀寫數)、Writeblock眶蕉。但是會降低實時性砰粹,需要接受一定概率的數據丟失(服務器斷電)
- 增加 Index Refresh 間隔,目的是減少 Segment Merge 的次數造挽。
- 增長索引刷新時間碱璃,默認為1s,index_refresh_interval:120s
- 調整 Bulk 線程池和隊列。
- 優(yōu)化節(jié)點間的任務分布饭入。
6. 定位cup過高
查看節(jié)點hot_threads
curl -X GET "localhost:9200/_cat/thread_pool"
curl -X GET "localhost:9200/_nodes/node-241/hot_threads"
curl -X GET "localhost:9200/_nodes/node-241,node-131/hot_threads"
active:當前正在執(zhí)行任務的線程數量嵌器,queue:隊列中等待處理的請求數量,rejected:隊列已滿谐丢,請求被拒絕的次數爽航。
7. ES寫入數據過慢原因
隨著寫入索引數據增多,單個shard數據量太大(超過50GB)乾忱,導致寫入速度變慢
隨著數據寫入讥珍,segment合并變得頻繁,es節(jié)點負載變高
8.存儲優(yōu)化
強制段合并
elasticsearch刪除數據并未真正從磁盤進行刪除已窄瘟,而是將數據標記為刪除衷佃,等到段合并時才會清楚標記為刪除的數據,強制Elasticsearch進行段合并segment merging
蹄葱,Segment merging要消耗CPU氏义,以及大量的I/O資源衰腌,所以一定要在你的ElasticSearch集群處于維護窗口期間,并且有足夠的I/O空間的
curl -XPOST 'http://localhost:9200/索引名稱/_forcemerge?only_expunge_deletes=true'
9. 節(jié)點內存使用率過高原因
分段內存一個Lucene分段就是一個完整的倒排索引觅赊,倒排索引由單詞詞典和倒排列表組成右蕊。在 Lucene 中,單詞詞典中的 FST 結構會被加載到內存吮螺。因此每個分段都會占用一定的內存空間饶囚。可以通過下面的
API來查看所有節(jié)點上的所有分段占用的內存總量:
curl -X GET "localhost:9200/_cat/nodes?v&h=segments.memory"
也可以單獨查看每個分段的內存占用量:
curl -X GET "localhost:9200/_cat/segments?v&h=index,shard,segment,size.memory"
查詢分片緩存請求大小鸠补, 默認為堆1%大小
curl -X GET "localhost:9200/_stats/request_cache?pretty"
查詢節(jié)點查詢緩存占用大小,默認為堆10%大小
curl -X GET "localhost:9200/_cat/nodes?v&h=query_cache.memory_size"
故障處理
1. 如何安全重啟elasticsearch萝风?
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_rolling_restarts.html
2. 重啟節(jié)點后有部分索引分片未能恢復
生產環(huán)境中有兩臺節(jié)點,將主節(jié)點增加查詢最大限制數后重啟
indices.query.bool.max_clause_count: 10240
直接docker restart elasticsearch 后紫岩,重啟elasticsearch后规惰,有一個索引長期yellow,有兩個分片長期處于未分配狀態(tài),es日志出現以下關鍵錯誤日志
primary shard with sync id but number of docs differ: 7728586 (node-205-1, primary) vs 7728583(node-149-1)
直接重啟節(jié)點后出現兩個節(jié)點的某個分片的數據不一致
解決:
將這個有問題的索引修改副本數為0泉蝌,再修改為1歇万,待分配完后即可恢復
索引恢復(indices.recovery)是ES數據恢復過程,是集群啟動過程中最緩慢的過程勋陪。集群完全重啟贪磺,或者Master節(jié)點掛掉后,新選出的Master也有可能執(zhí)行索引恢復過程诅愚。
待恢復的是哪些數據寒锚?是客戶端寫入成功,但是未執(zhí)行刷盤(flush)的Lucene分段违孝。
索引恢復有哪些好處刹前?
保持數據完整性:當節(jié)點異常重啟時,寫入磁盤的數據先到文件系統的緩沖雌桑,未必來得及刷盤喇喉。如果不通過某種方式將未進行刷盤的數據找回,則會丟失一些數據筹燕。
數據副本一致性:由于寫入操作在多個分片副本上沒有來得及全部執(zhí)行轧飞,副分片需要同步成和主分片完全一致。
3. 生產環(huán)境某臺ES節(jié)點負載高原因:
未找到
4. profile定位查詢緩慢原因
curl -X GET "http://localhost:9200/index_name/type_name/_search?pretty" -d'{
"profile":true,
"query":{
"match":{
"blockCode":"5203210005"
}
}
}'
fielddata=true撒踪,以便通過取消倒排索引將fielddata加載到內存中
ES官方解釋為在es5.x以后过咬,聚合排序這種操作需使用指定數據結構fieldData進行單獨操作,需要單獨開啟制妄,ES排序field的類型只支持text類型
解決辦法如下兩步:
第二:mapping修改
PUT my_index/_mapping
{
"properties": {
"createTime": {
"type": "text",
"fielddata": true
}
}
}
5. 索引有多個副本但副本分片未自動分配
問題描述:新建索引時設置了0個副本掸绞,后來設置為1個,但是集群沒有自動分配分片,索引長期為yellow
解決:查看集群設置是否自動分配衔掸,是否為未設置自動分配烫幕,設置為自動分配
參考及推薦
《Elasticsearch 源碼解析與優(yōu)化實戰(zhàn)》