elasticsearch7.x索引併發控制

Elasticsearch是分佈式的。在創建、更新或刪除文檔時,必須將文檔的新版本複製到集羣中的其他節點。同時Elasticsearch是異步併發的,也就是說複製請求是並行發送的,並且不能保證順序。Elasticsearch需要確保新版的文檔不會被舊版本覆蓋。爲了達到這個目的,對文檔執行的每個操作,都由協調這個更改操作的主分片分配一個序列號。序列號隨着操作遞增,所以新操作的序列號一定大於舊操作的序列號。這樣Elasticsearch就可以通過操作的序列號來確保文檔的新版本不會被舊版本覆蓋。

Elasticsearch跟蹤每個文檔保存的最後更改操作的序列號和主項。序列號和主項可以唯一標識一個更改操作。通過記錄返回的序列號和主項,可以確保只在檢索後沒有其他更改的情況下更改文檔。

在創建一個新文檔時,會爲其分配一個初始化的序列號(_seq_no)和主項(_primary_term)。在此之後如果對文檔有新的變更,序列號會遞增。通過GET api可查看指定文檔當前的序列號和主項。在調用INDEX、UPDATE、DELETE api時,通過在url傳遞參數if_seq_no和if_primary_term來分別指定序列號和主項,這樣只有在要操作的文檔的序列號和主項爲指定值時纔會對文檔執行指定操作,否則會返回version_conflict_engine_exception異常和狀態碼409。

如索引中有如下文檔:

試圖執行以下更新:

POST user/_update/dGuQgm0BTkzY5ivQV2rk?if_seq_no=12&if_primary_term=1
{
  "doc":{
    "date":"2019-10-01T00:23:42"
  }
}

則會返回如下錯誤:

 這樣就保證了不會丟失序列號爲11,主項爲1的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章