179 lines
8.9 KiB
Markdown
179 lines
8.9 KiB
Markdown
# Rollback — Merge Eksperimen `airflow332` ke `deploy/` (BATCH B / review R18)
|
|
|
|
> **Dibuat**: 2026-10-01 · **Oleh**: langkah **B1** dari `reviews/sicabe-18-merge-airflow332-plan.md`
|
|
> **Status**: 🟢 **Backup siap & TERBUKTI DAPAT DIPULIHKAN.** BATCH B **belum dijalankan**.
|
|
> ⚠️ **Berkas ini adalah satu-satunya jalan pulang** untuk langkah B4 (migrasi OpenMetadata
|
|
> bersifat **satu arah** — lihat `docs/sicabe-install-phases-detail.md` §8.11.2).
|
|
|
|
---
|
|
|
|
## 1. Keadaan yang dibekukan (baseline sebelum BATCH B)
|
|
|
|
| Item | Nilai |
|
|
|---|---|
|
|
| Tanggal baseline | 2026-10-01 |
|
|
| Airflow | **3.3.1** (`sicabe/airflow:3.3.1-om202`) |
|
|
| OpenMetadata | **2.0.2** (`openmetadata/server:2.0.2`) |
|
|
| OpenSearch | `opensearchproject/opensearch:3.8.0` |
|
|
| Gate `test-verification.sh` | **60 PASS / 0 FAIL / 2 SKIP** |
|
|
| Container produksi | 20 (Airflow webserver/scheduler/dag-processor, OM, OpenSearch, dst) |
|
|
|
|
---
|
|
|
|
## 2. Berkas backup
|
|
|
|
Lokasi: `deploy/output/merge-airflow332-backup/` — **gitignored** (berisi data produksi).
|
|
|
|
| Berkas | Isi | Ukuran | MD5 |
|
|
|---|---|---|---|
|
|
| `openmetadata_db.dump` | dump `openmetadata_db` (format `-Fc`) | 1.9 MB | `a8495339165cfbc286ea7e90490c12bb` |
|
|
| `airflow.dump` | dump `airflow` (format `-Fc`) | 248 KB | `4a834cc43307b296b58c250909749d2a` |
|
|
| `environment.defaults.sh.before-B` | salinan `deploy/config/environment.defaults.sh` | 22 KB | `2d341e008af43a7b` |
|
|
|
|
Ukuran DB saat baseline: `openmetadata_db` = **36 MB**, `airflow` = **12 MB**.
|
|
|
|
---
|
|
|
|
## 3. Bukti backup DAPAT DIPULIHKAN (dua kali diuji)
|
|
|
|
| Uji | Hasil |
|
|
|---|---|
|
|
| Restore `openmetadata_db` → DB coretan `_restorecheck_om` | **204 tabel** asli = **204 tabel** hasil restore ✅ |
|
|
| Restore `airflow` → DB coretan `_restorecheck_af` | **5 DAG** asli = **5 DAG** hasil restore ✅ |
|
|
| DB coretan setelah uji | dihapus ✅ (produksi tidak tersentuh: 20 container, OM HTTP 200) |
|
|
|
|
Perintah yang dipakai (nilai persis):
|
|
```bash
|
|
# contoh untuk openmetadata_db
|
|
docker exec -e PGPASSWORD=<dari deploy/.env> sicabe-postgres \
|
|
psql -U sicabe_admin -d postgres -c "CREATE DATABASE _restorecheck_om OWNER openmetadata;"
|
|
docker cp deploy/output/merge-airflow332-backup/openmetadata_db.dump sicabe-postgres:/tmp/check.dump
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres \
|
|
pg_restore -U sicabe_admin -d _restorecheck_om --no-owner --no-privileges /tmp/check.dump
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres \
|
|
psql -U sicabe_admin -d postgres -c "DROP DATABASE _restorecheck_om;"
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Digest image (untuk kembali ke versi lama)
|
|
|
|
| Image | Image ID (sha256, dipotong) |
|
|
|---|---|
|
|
| `sicabe/airflow:3.3.1-om202` (produksi saat ini) | `afc0421a0490…` |
|
|
| `sicabe/airflow:3.3.1-om202-presqlalchemy` (tag rollback A1) | `afc0421a0490…` (identik — A1 tidak rebuild) |
|
|
| **`sicabe/airflow:3.3.2-om203`** (target BATCH B — Python 3.11, hasil B2 revisi) | `a02620e1d0a8…` (3.2 GB) |
|
|
| ~~`sicabe/airflow:3.3.2-om203-py313`~~ — **DITOLAK** di B3 (dbt mati di Python 3.13) | `33990a6c2b88…` (tidak dipakai) |
|
|
| `openmetadata/server:2.0.2` | `3b6f52aeb30f…` |
|
|
| `openmetadata/server:2.0.3` (target BATCH B) | `5f4d52bca2d7…` |
|
|
| `opensearchproject/opensearch:3.8.0` | `fafe3fc35870…` |
|
|
|
|
---
|
|
|
|
## 5. PROSEDUR ROLLBACK
|
|
|
|
### 5.1 Kasus paling umum — B4/B5 gagal, skema OM masih sehat
|
|
|
|
Cukup kembalikan versi, tanpa menyentuh DB:
|
|
|
|
```bash
|
|
cd /home/broto/sicabe-doc/deploy
|
|
|
|
# (1) kembalikan versi ke baseline
|
|
# AIRFLOW_IMAGE -> sicabe/airflow:3.3.1-om202
|
|
# OPENMETADATA_VERSION -> 2.0.2
|
|
# (atau pulihkan berkas utuh: cp output/merge-airflow332-backup/environment.defaults.sh.before-B \
|
|
# config/environment.defaults.sh)
|
|
|
|
# (2) jalankan ulang
|
|
docker compose up -d airflow-webserver airflow-scheduler airflow-dag-processor \
|
|
openmetadata-server openmetadata-migrate
|
|
|
|
# (3) verifikasi
|
|
./test-verification.sh # harapan: 60 PASS / 0 FAIL / 2 SKIP
|
|
```
|
|
|
|
### 5.2 Kasus berat — migrasi OM 2.0.3 merusak skema
|
|
|
|
⚠️ **Urutannya penting**: OM produksi harus **berhenti** dulu sebelum restore, kalau tidak
|
|
koneksi aktif akan mengganggu `DROP/CREATE DATABASE`.
|
|
|
|
```bash
|
|
cd /home/broto/sicabe-doc/deploy
|
|
|
|
# (1) HENTIKAN OpenMetadata (wajib, sebelum menyentuh DB-nya)
|
|
docker stop sicabe-openmetadata
|
|
|
|
# (2) pulihkan versi image di config (OPENMETADATA_VERSION=2.0.2)
|
|
cp output/merge-airflow332-backup/environment.defaults.sh.before-B config/environment.defaults.sh
|
|
|
|
# (3) restore openmetadata_db dari dump
|
|
docker exec -e PGPASSWORD=<dari deploy/.env> sicabe-postgres \
|
|
psql -U sicabe_admin -d postgres -c "DROP DATABASE IF EXISTS openmetadata_db;"
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres \
|
|
psql -U sicabe_admin -d postgres -c "CREATE DATABASE openmetadata_db OWNER openmetadata;"
|
|
docker cp output/merge-airflow332-backup/openmetadata_db.dump sicabe-postgres:/tmp/om.dump
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres \
|
|
pg_restore -U sicabe_admin -d openmetadata_db --no-owner --no-privileges /tmp/om.dump
|
|
|
|
# (4) mulai ulang dengan image LAMA
|
|
docker compose up -d openmetadata-server
|
|
|
|
# (5) verifikasi
|
|
curl -s http://localhost:12085/api/v1/system/version # harapan: {"version":"2.0.2",...}
|
|
```
|
|
|
|
### 5.3 Bila metadata Airflow perlu dipulihkan (mis. migrasi DB Airflow bermasalah)
|
|
|
|
```bash
|
|
docker stop sicabe-airflow-webserver sicabe-airflow-scheduler sicabe-airflow-dag-processor
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres psql -U sicabe_admin -d postgres \
|
|
-c "DROP DATABASE IF EXISTS airflow;" -c "CREATE DATABASE airflow OWNER airflow;"
|
|
docker cp output/merge-airflow332-backup/airflow.dump sicabe-postgres:/tmp/af.dump
|
|
docker exec -e PGPASSWORD=<…> sicabe-postgres \
|
|
pg_restore -U sicabe_admin -d airflow --no-owner --no-privileges /tmp/af.dump
|
|
docker compose up -d airflow-webserver airflow-scheduler airflow-dag-processor
|
|
```
|
|
|
|
### 5.4 Yang TIDAK perlu di-rollback
|
|
|
|
- **OpenSearch** — indeksnya **derived**: OM membangun ulang isinya. Tidak ada dump khusus
|
|
untuk itu, dan itu memang disengaja.
|
|
- **`deploy-legacy/`** — di luar lingkup (K6).
|
|
- **Image** — tidak dihapus; dua versi hidup berdampingan, jadi rollback hanya soal menunjuk
|
|
tag lama.
|
|
|
|
---
|
|
|
|
## 6. Setelah rollback
|
|
|
|
1. Catat penyebab kegagalan di berkas ini (bagian bawah) atau di `reviews/sicabe-18…`.
|
|
2. Jangan jalankan B4 lagi sebelum penyebabnya dipahami.
|
|
3. Indeks/tabel OM hasil migrasi yang tertinggal **tidak** dibiarkan: pastikan restore
|
|
benar-benar menggantikan `openmetadata_db` (bukan menumpuk).
|
|
|
|
---
|
|
|
|
## 7. Catatan keamanan
|
|
|
|
⚠️ Berkas dump berisi **data produksi** (termasuk baris `user_entity` — hash kredensial, dan
|
|
mungkin data pribadi). Perlakuan:
|
|
- **gitignored** (`deploy/output/merge-airflow332-backup/`) — jangan pernah di-commit;
|
|
- hapus setelah BATCH B dinyatakan stabil (dan simpan hanya bila memang diperlukan sebagai
|
|
arsip, di lokasi terbatas akses).
|
|
|
|
---
|
|
|
|
## Riwayat
|
|
|
|
| Tanggal | Kejadian |
|
|
|---|---|
|
|
| 2026-10-01 | B1 dijalankan: dump dibuat, **diuji pulih (204=204 tabel; 5=5 DAG)**, digest & config dicatat, dokumen ini dibuat. BATCH B belum dimulai. |
|
|
| 2026-10-01 | **B2** dijalankan: image `sicabe/airflow:3.3.2-om203-py313` dibangun **dari `deploy/`** (berdampingan — `Dockerfile.332` + `requirements.332.{in,lock}`), ID `33990a6c2b88…`. Seluruh verifikasi fatal lolos: 5 klien DB, `mysqlclient` benar-benar termuat, `sqlalchemy 2.0.54` (pin A1), **plugin OM dapat dimuat**, `pip check` bersih. Produksi **tetap** `3.3.1-om202` — belum tersentuh. |
|
|
| 2026-10-01 | **B3 (go/no-go) = NO-GO** untuk Python 3.13: `dbt debug`/`dbt compile` gagal (mashumaro → `Annotated.__class_getitem__`). Tidak ada versi `mashumaro` yang memenuhi batas dependensi kita **dan** berfungsi di 3.13. Bukti: `b3-hasil-uji.md` |
|
|
| 2026-10-01 | **B2 revisi**: base dikembalikan ke **Python 3.11**; lock di-resolve ulang dengan lock 3.3.1 sebagai constraint **tersaring** (`^apache-airflow`, `^openmetadata-`, `^collate-` dibuang) → hanya **44 baris** berbeda dari produksi. Image baru: **`sicabe/airflow:3.3.2-om203`** ID `a02620e1d0a8…` (3.2 GB) |
|
|
| 2026-10-01 | **B3 ULANG = GO** 🟢: `dbt debug` **"All checks passed"**, `dbt compile` OK, DAG produksi impor bersih, plugin `/pluginsv2/` **200**, Trino/MinIO/MySQL OK, OPA utuh. Bukti: `b3r-hasil-uji.md`. Produksi tetap `3.3.1-om202` — siap untuk **B4** |
|
|
| 2026-10-02 | **B4 dijalankan (produksi naik)**: migrasi OM 2.0.3 **exit 0**; `airflow-init` (DB migrate 3.3.2) **exit 0**; OM server + 3 service Airflow di-recreate ke versi baru — semuanya **healthy**. Image: `sicabe/airflow:3.3.2-om203`, `openmetadata/server:2.0.3` |
|
|
| 2026-10-02 | **B5 verifikasi = LOLOS** ✅: `airflow version` **3.3.2**; OM API **2.0.3**; plugin `/pluginsv2/…health-auth` **200**; **0 error impor** DAG; `MySQLdb` + provider mysql tersedia di produksi; **GATE 60 PASS / 0 FAIL / 2 SKIP** (identik baseline). **B6 (rollback) tidak diperlukan.** |
|
|
| — | ⚠️ **Dump DISIMPAN** sampai dinyatakan stabil. Bila beberapa hari produksi berjalan normal: hapus `deploy/output/merge-airflow332-backup/` (§7) — atau arsipkan di lokasi terbatas akses |
|