ElasticSearch學習文檔

@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é)點
集群狀態(tài)示意圖

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中的原子類;

寫數據流程

image-20210121112939821
  1. 客戶端向NODE1發(fā)送寫請求赖晶。
  2. NODE1使用文檔ID來確定文檔屬于分片0律适,通過集群狀態(tài)中的內容路由表信息獲知分片0的主分片位于NODE3,因此請求被轉發(fā)到NODE3上遏插。
  3. NODE3上的主分片執(zhí)行寫操作捂贿。如果寫入成功,則它將請求并行轉發(fā)到 NODE1和NODE2的副分片上胳嘲,等待返回結果厂僧。當所有的副分片都報告成功,NODE3將向協調節(jié)點報告成功了牛,協調節(jié)點再向客戶端報告成功
詳細流程
image-20210121113357715

在客戶端收到成功響應時颜屠,意味著寫操作已經在主分片和所有副分片都執(zhí)行完成

建立索引流程
image

讀數據流程

查詢分為兩階段:QUERY_THEN_FETCH查詢與獲取,Query階段知道了要取哪些數據鹰祸,但是并沒有取具體的數據甫窟,Fetch階段獲取具體的數據

Query階段
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階段
image-20210121114352581

Fetch階段由以下步驟構成:
(1)協調節(jié)點向相關NODE發(fā)送GET請求径玖。
(2)分片所在節(jié)點向協調節(jié)點返回數據。
(3)協調節(jié)點等待所有文檔被取得颤介,然后返回給客戶端梳星。

分布式系統搜索執(zhí)行流程
image

刪數據流程

刪除方式為標記刪除赞赖,只會對文檔進行標記為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的版本是完全一致的

  1. 啟動
/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
  1. 訪問

啟動成功后悼枢,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'

任務管理API

分片狀態(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)化

  1. 關閉swap玩敏,調整max open files
  2. http://dockone.io/article/505
  3. 調整shard數,replica數
  4. elasticsearch三個重要的優(yōu)化 https://zhaoyanblog.com/archives/319.html

4. 結構優(yōu)化

不需要排序聚合质礼,不需要在腳本中訪問的字段可以禁用doc_valus字段節(jié)省存儲空間

建議周期性的建立新索引

5. 寫入速度優(yōu)化

  1. 加大 Translog Flush 旺聚,目的是降低 Iops(每秒讀寫數)、Writeblock眶蕉。但是會降低實時性砰粹,需要接受一定概率的數據丟失(服務器斷電)
  2. 增加 Index Refresh 間隔,目的是減少 Segment Merge 的次數造挽。
  3. 增長索引刷新時間碱璃,默認為1s,index_refresh_interval:120s
  4. 調整 Bulk 線程池和隊列。
  5. 優(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寫入數據過慢原因

  1. 隨著寫入索引數據增多,單個shard數據量太大(超過50GB)乾忱,導致寫入速度變慢

  2. 隨著數據寫入讥珍,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

解決:查看集群設置是否自動分配衔掸,是否為未設置自動分配烫幕,設置為自動分配

參考及推薦

ES中文使用向導

Elasticsearch學習之集群常見狀況處理(干貨)

elasticsearch 百億級數據檢索案例與原理

Elasticsearch 集群內應該設置多少個分片

《Elasticsearch 源碼解析與優(yōu)化實戰(zhàn)》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
禁止轉載,如需轉載請通過簡信或評論聯系作者敞映。
  • 序言:七十年代末较曼,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子振愿,更是在濱河造成了極大的恐慌捷犹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冕末,死亡現場離奇詭異萍歉,居然都是意外死亡,警方通過查閱死者的電腦和手機档桃,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門枪孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藻肄,你說我怎么就攤上這事蔑舞。” “怎么了仅炊?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵斗幼,是天一觀的道長。 經常有香客問我抚垄,道長,這世上最難降的妖魔是什么谋逻? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任呆馁,我火速辦了婚禮,結果婚禮上毁兆,老公的妹妹穿的比我還像新娘浙滤。我一直安慰自己,他們只是感情好气堕,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布纺腊。 她就那樣靜靜地躺著,像睡著了一般茎芭。 火紅的嫁衣襯著肌膚如雪揖膜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天梅桩,我揣著相機與錄音壹粟,去河邊找鬼。 笑死宿百,一個胖子當著我的面吹牛趁仙,可吹牛的內容都是我干的洪添。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼雀费,長吁一口氣:“原來是場噩夢啊……” “哼干奢!你這毒婦竟也來了?” 一聲冷哼從身側響起盏袄,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤忿峻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伸但,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年偎巢,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责蝠。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出克握,到底是詐尸還是另有隱情,我是刑警寧澤枷踏,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布菩暗,位于F島的核電站,受9級特大地震影響旭蠕,放射性物質發(fā)生泄漏停团。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一掏熬、第九天 我趴在偏房一處隱蔽的房頂上張望佑稠。 院中可真熱鬧,春花似錦旗芬、人聲如沸舌胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幔嫂。三九已至,卻和暖如春誊薄,著一層夾襖步出監(jiān)牢的瞬間履恩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工暇屋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留似袁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像昙衅,于是被迫代替她去往敵國和親扬霜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容