Panduan Operasi

Reindex Tanpa Downtime Memakai Alias

Tipe field di Elasticsearch bersifat immutable — Anda tidak bisa mengubahnya di tempat. Solusinya: bangun index baru dengan mapping benar, salin data lewat _reindex, lalu tukar alias secara atomik. Aplikasi tidak pernah tahu ada pergantian di belakang layar.

Kenapa Mapping Tak Bisa Diubah

  • Tipe field memetakan ke struktur Lucene yang dibekukan saat index dibuat.
  • Anda boleh menambah field baru, tetapi tidak mengubah tipe field lama.
  • Perubahan analyzer, jumlah shard, atau tipe field memerlukan index baru.
Mencoba PUT mapping untuk mengubah tipe field yang ada akan ditolak dengan error mapper [field] cannot be changed. Reindex adalah jalan resmi.

Pola Alias

Aplikasi selalu menulis dan membaca ke alias, bukan index fisik. Index fisik diberi nama bertanggal/berversi.

# alias logis  ->  index fisik
pages_current  ->  pages_2026_05   # sebelum reindex
pages_current  ->  pages_2026_06   # setelah swap
Jika sejak awal Anda memakai alias, migrasi mapping di masa depan jadi mulus. Mulailah membuat index baru selalu dengan alias menunjuknya.

Langkah 1 — Index Baru dengan Mapping Benar

PUT /pages_2026_06
{
  "settings": { "number_of_shards": 3, "number_of_replicas": 1 },
  "mappings": {
    "properties": {
      "title":     { "type": "text" },
      "slug":      { "type": "keyword" },          # diperbaiki dari text
      "views":     { "type": "long" },
      "published": { "type": "date" }
    }
  }
}

Langkah 2 — Jalankan _reindex

# jalankan asinkron untuk dataset besar
POST /_reindex?wait_for_completion=false
{
  "source": { "index": "pages_2026_05" },
  "dest":   { "index": "pages_2026_06" }
}

# pantau progres task
GET /_tasks/<task_id>
Untuk dataset besar, gunakan slices: "auto" di body agar reindex berjalan paralel dan lebih cepat. Index lama tetap melayani trafik sepanjang proses.

Langkah 3 — Atomic Alias Swap

Inilah inti zero-downtime. Satu request _aliases melepas alias dari index lama dan menambahkannya ke index baru secara atomik.

POST /_aliases
{
  "actions": [
    { "remove": { "index": "pages_2026_05", "alias": "pages_current" } },
    { "add":    { "index": "pages_2026_06", "alias": "pages_current" } }
  ]
}
Karena kedua aksi dieksekusi dalam satu transaksi, tidak ada momen di mana pages_current tidak menunjuk ke index mana pun. Klien tidak pernah melihat error.

Langkah 4 — Verifikasi

  1. Cek alias

    GET /_alias/pages_current harus menunjuk ke pages_2026_06.

  2. Bandingkan jumlah dokumen

    GET /pages_current/_count sama dengan count index lama.

  3. Uji query nyata

    Jalankan query aplikasi melalui alias dan pastikan hasil sesuai.

  4. Pantau error

    Awasi log aplikasi beberapa saat sebelum menghapus index lama.

Rollback & Pembersihan

# ROLLBACK: tukar alias kembali ke index lama
POST /_aliases
{
  "actions": [
    { "remove": { "index": "pages_2026_06", "alias": "pages_current" } },
    { "add":    { "index": "pages_2026_05", "alias": "pages_current" } }
  ]
}

# bila sudah yakin, hapus index lama
DELETE /pages_2026_05
Jangan menghapus index lama sampai Anda yakin index baru sehat. Index lama adalah jaring pengaman rollback termurah Anda.

Kesimpulan

  • Tipe field immutable; ubah mapping lewat index baru + reindex.
  • Selalu akses data via alias agar pergantian index transparan bagi aplikasi.
  • Atomic swap dengan satu request _aliases memberi zero-downtime.
  • Simpan index lama sampai verifikasi tuntas untuk rollback instan.

FAQ Reindex Tanpa Downtime

Kenapa mapping field tidak bisa diubah langsung?

Tipe sebagian besar field bersifat immutable setelah index dibuat, karena struktur Lucene di balik field sudah ditetapkan. Anda hanya bisa menambah field baru, bukan mengubah tipe field yang sudah ada (mis. dari text ke keyword). Untuk perubahan semacam itu, buat index baru dengan mapping benar lalu reindex.

Apa keuntungan memakai alias?

Alias adalah nama logis yang menunjuk ke satu atau lebih index fisik. Aplikasi cukup memakai alias (mis. pages_current) dan tidak perlu tahu index fisik di belakangnya. Saat reindex, Anda menukar alias secara atomik ke index baru tanpa mengubah konfigurasi aplikasi.

Apakah _reindex menyebabkan downtime?

Tidak, bila dilakukan dengan benar. Index lama tetap melayani trafik selama _reindex berjalan ke index baru. Downtime nol dicapai karena pergantian alias bersifat atomik: dalam satu request, alias dilepas dari index lama dan ditambahkan ke index baru.

Bagaimana cara rollback bila ada masalah?

Karena index lama tidak dihapus segera, rollback semudah menukar alias kembali ke index lama dengan operasi _aliases yang sama (remove dari baru, add ke lama). Tunggu beberapa saat sebelum menghapus index lama untuk berjaga-jaga.

Backup Sebelum Operasi Besar

Amankan data dengan snapshot sebelum reindex skala besar agar selalu ada titik pulih.

Backup Snapshot ke S3