1. 程式人生 > >ElasticSearch最佳入門實踐(六十五)基於scoll+bulk+索引別名實現零停機重建索引

ElasticSearch最佳入門實踐(六十五)基於scoll+bulk+索引別名實現零停機重建索引

1、重建索引

一個field的設定是不能被修改的,如果要修改一個Field,那麼應該重新按照新的mapping,建立一個index,然後將資料批量查詢出來,重新用bulk api寫入index中

批量查詢的時候,建議採用scroll api,並且採用多執行緒併發的方式來reindex資料,每次scoll就查詢指定日期的一段資料,交給一個執行緒即可

(1)一開始,依靠dynamic mapping,插入資料,但是不小心有些資料是2017-01-01這種日期格式的,所以title這種field被自動對映為了date型別,實際上它應該是string型別的
在這裡插入圖片描述

(2)當後期向索引中加入string型別的title值的時候,就會報錯
在這裡插入圖片描述

(3)如果此時想修改title的型別,是不可能的
在這裡插入圖片描述

(4)此時,唯一的辦法,就是進行reindex,也就是說,重新建立一個索引,將舊索引的資料查詢出來,再匯入新索引

(5)如果說舊索引的名字,是old_index,新索引的名字是new_index,終端java應用,已經在使用old_index在操作了,難道還要去停止java應用,修改使用的index為new_index,才重新啟動java應用嗎?這個過程中,就會導致java應用停機,可用性降低

(6)所以說,給java應用一個別名,這個別名是指向舊索引的,java應用先用著,java應用先用goods_index alias來操作,此時實際指向的是舊的my_index
在這裡插入圖片描述

(7)新建一個index,調整其title的型別為string
在這裡插入圖片描述

(8)使用scroll api將資料批量查詢出來
在這裡插入圖片描述

(9)採用bulk api將scoll查出來的一批資料,批量寫入新索引
在這裡插入圖片描述

(10)反覆迴圈8~9,查詢一批又一批的資料出來,採取bulk api將每一批資料批量寫入新索引

(11)將goods_index alias切換到my_index_new上去,java應用會直接通過index別名使用新的索引中的資料,java應用程式不需要停機,零提交,高可用
在這裡插入圖片描述

(12)直接通過goods_index別名來查詢,是否ok
在這裡插入圖片描述

2、基於alias對client透明切換index

PUT /my_index_v1/_alias/my_index

client對my_index進行操作

reindex操作,完成之後,切換v1到v2

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}