Elasticsearch Reindex İşlemi
Elasticsearch'te tutulan verilerin mapping type değerinin değişmesi gerektiğinde (Bkz: Apinizer 2022.12.01) doğru arama sonuçlarının gelmesi için eski indexlerin reindeks yapılarak mapping type'larının güncellenmesi gerekir.
Yeni indexler yeni mapping type kullanacağından bir sorun olmaz.
Bu dökümanda mapping type değişmesi durumunda reindex işleminin nasıl gerçekleştirileceği anlatılmaktadır.
Apinizer'ın güncel index ve mapping type'larına bu sayfadan erişebilirsiniz.
Yapılacaklar
1) Mapping'de Field Type Görüntülemek için:
curl --location --request GET 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-<XXXX>/_field_caps?fields=hr1ra'
2) Yeni template oluşturulması:
Not: Apinizer'da bu işlem 2022.12.01 versiyonunda kod ile yapıldı, bu düzenlemeyi manuel yapmak için lütfen şu adresi inceleyiniz:
https://www.elastic.co/guide/en/elasticsearch/reference/7.9/indices-templates-v1.html
3) Yeni template'in geçerli olabilmesi için ILM'nin kriterinin ekrandan değiştirilmesi ve yeni indekse geçmesi için arkaplanda servis trafiğinin akmaya devam etmesi gerekmektedir. Bunun da hemen yansıması için aşağıdaki kod ile poll_interval'in düşürülmesi işleri hızlandıracaktır:
curl --location --request PUT 'http://<ELASTICSEARCH_IP>:9200/_cluster/settings' \
--header 'Content-Type: application/json' \
--data-raw '{"persistent":{"indices.lifecycle.poll_interval":"10s"}}'
4) Değişiklik yansıyıp yeni index oluştuktan sonra ILM'nin ve poll_interval'in eski haline alınması gerekmektedir:
curl --location --request PUT 'http://<ELASTICSEARCH_IP>:9200/_cluster/settings' \
--header 'Content-Type: application/json' \
--data-raw '{"persistent":{"indices.lifecycle.poll_interval":null}}'
5) Reindeks işlemi ile datastreamdeki eski mapping type'da kalan indexin "reindexed" olarak başka bir indexe taşınması:
(Reindekste yeni mapping kullanılacak.Yeni mapping template'den alınacağı için template'in geçerli olabilmesi için yeni indexin adının "apinizer-log-apiproxy-<env adi:test>-" içermesi gerekli )
curl --location --request POST 'http://<ELASTICSEARCH_IP>:9200/_reindex' \
--header 'Content-Type: application/json' \
--data-raw '{
"conflicts": "proceed",
"source": {
"index": ".ds-apinizer-log-apiproxy-test-000001"
},
"dest": {
"index": ".ds-apinizer-log-apiproxy-test-000001-reindexed",
"op_type": "create"
}
}'
6) Eski mapping type'da kalan indexin silinmesi:
curl --location --request DELETE 'http://<ELASTICSEARCH_IP>:9200/.ds-apinizer-log-apiproxy-test-000001'
Eğer yeni indeksi mevcut sistemden farklı bir isim ile oluşturursanız aşağıdaki adımlarla devam etmeniz gerekmektedir.
Aşağıdaki adımlarda, yukarıdaki isimlemenin ".ds" ifadesini kapsamadığı varsayılarak devam edilmiştir.
7)"apinizer-log-apiproxy-test-000001-reindexed" isimli indexe taşınan verilerin manager üzerinde görüntülenebilmesi için isminin değiştirilmesi gerekmektedir.
# Yeni index'i read-only moda almak:
curl --location --request PUT 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-test-000001-reindexed/_settings' \
--header 'Content-Type: application/json' \
--data-raw '{
"settings": {
"index.blocks.write": "true"
}
}'
# Yeni indexi orijinal isme klonlamak ve read-only moddan çıkarmak:
curl --location --request PUT 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-test-000001-reindexed/_clone/.ds-apinizer-log-apiproxy-test-000001' \
--header 'Content-Type: application/json' \
--data-raw '{
"settings": {
"index.blocks.write": null
}
}'
# Hedef indeksin durumu green olana kadar beklenir:
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s
# Normalde hızlıca gerçekleşen bu işlem uzun süre alıyorsa aşağıdaki komutlar ile sorun var mı diye kontrol yapılır:
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain
# Eski indeks silinir:
curl --location --request DELETE 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-test-000001-reindexed'
# Reindeks yapsaydık templateden dolayı ilm otomatik yakalanır ve eklenirdi, fakat clone yaptığımızda sadece adı değişti diğer tüm ayarlar olduğu gibi yenisine geçti.
# ilm kontrol ettiğimizde boş olduğunu göreceğiz:
curl -X GET "http://<ELASTICSEARCH_IP>:9200/.ds-apinizer-log-apiproxy-test-000001/_ilm/explain?pretty"
# Bu yüzden yeni indekse ilm'nin eklenmesi gerekli:
curl -X PUT "http://<ELASTICSEARCH_IP>:9200/.ds-apinizer-log-apiproxy-test-000001/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"lifecycle": {
"name": "apinizer-log-ilm-policy-test"
}
}
}
'
Reindeks işlemi için detaylı bilgi: https://www.elastic.co/guide/en/elasticsearch/reference/7.9/docs-reindex.html