Cabut dan Jalan — Topologi Hub-Spoke, Promosi Peran, dan Failover Lima Menit di xGrid
Blog/
||||||

Cabut dan Jalan — Topologi Hub-Spoke, Promosi Peran, dan Failover Lima Menit di xGrid

Setiap Spoke dapat menjadi Hub dalam hitungan menit. Hub yang gagal diganti dalam lima menit. Setiap Raspberry Pi dikirim dengan seluruh stack terinstal — perannya hanya sebuah file konfigurasi. Begini cara xGrid menangani perubahan topologi di lingkungan terputus.

Pola yang Sudah Anda Kenal

Anda mungkin belum pernah mendengar istilah "topologi Hub-Spoke," tetapi Anda menggunakannya setiap hari.

Buka peta rute maskapai manapun. Beberapa node besar -- Jakarta, Surabaya, Denpasar -- memancarkan puluhan koneksi ke kota-kota lebih kecil. Node besar adalah Hub. Kota kecil adalah Spoke. Alih-alih terbang langsung dari setiap kota ke semua kota lainnya (yang membutuhkan 435 rute untuk 30 kota), semua lalu lintas mengalir melalui beberapa hub. Lebih sedikit rute, lebih banyak koordinasi, jauh lebih efisien.

Comparison of point-to-point network (top) versus hub-and-spoke network (bottom) — the hub-spoke model reduces the number of connections by routing through a central node

Point-to-point (atas) vs Hub-and-spoke (bawah): routing melalui hub pusat mengurangi koneksi secara drastis. Sumber: Wikipedia (domain publik)

Logistik bekerja dengan cara yang sama. FedEx mengarahkan semuanya melalui Memphis. Sebuah paket dari Taipei ke Kaohsiung mungkin terbang melewati Memphis dulu -- terlihat absurd, tetapi penyortiran terpusat lebih efisien daripada relay titik ke titik.

Tetapi Hub-Spoke tradisional memiliki asumsi fatal: Hub selalu online. Penerbangan bisa menunggu bandara hub dibuka kembali. Paket bisa menunggu pusat penyortiran. Tetapi dalam insiden korban massal, jika Hub down, pasien tidak bisa menunggu.

Hub-Spoke xGrid membuat dua modifikasi kritis: setiap Spoke adalah sistem lengkap, bukan hanya terminal. Dan -- setiap Spoke dapat mempromosikan dirinya menjadi Hub baru dalam hitungan menit.

Tata Letak Fisik: Satu Tulang Punggung, Banyak Satelit

Deployment xGrid adalah topologi yang dapat diskalakan dibangun di sekitar switch Ethernet:

                 ┌─────────────────────┐
                 │  Hub A               │
                 │  CIRS + MIRS + HIRS  │
                 │  WiFi Hotspot        │
                 │  mDNS broadcast      │
                 └──────────┬──────────┘
                            │
                  ┌─────────┴─────────┐
                  │  Ethernet Switch   │
                  └──┬────┬────┬────┬─┘
                     │    │    │    │
                  ┌──┴┐┌──┴┐┌──┴┐┌──┴┐
                  │ B ││ C ││ D ││ E │  ← Spokes
                  └───┘└───┘└───┘└───┘
                  Masing-masing punya WiFi hotspot sendiri
                  Masing-masing menjalankan MIRS penuh
                  Masing-masing menyimpan snapshot CIRS terbaru

Hub menjalankan sistem sumber daya (CIRS), sistem klinis (MIRS), dan inventaris (HIRS). Spoke terhubung ke Hub melalui switch Ethernet, masing-masing menjalankan MIRS untuk mengelola inventaris stasiun sendiri.

Dua lapisan jaringan terpisah, secara desain: Ethernet untuk sinkronisasi data antar stasiun. WiFi untuk operasi klinis di setiap stasiun. Satu bisa gagal tanpa memengaruhi yang lain.

Setiap RPi Adalah Sistem Lengkap — Golden Image

Ini adalah keputusan desain paling penting dalam seluruh arsitektur: setiap Raspberry Pi dikirim dengan semuanya terinstal.

CIRS (sumber daya), MIRS (klinis), HIRS (inventaris) — semuanya ada di setiap kartu SD. Peran tidak ditentukan oleh perangkat keras. Ditentukan oleh satu file konfigurasi: /etc/xgrid/role.conf. Ubah satu field dan Spoke menjadi Hub.

Ini berarti Anda tidak menyimpan stok "unit Hub" dan "unit Spoke." Anda menyimpan suku cadang identik. Unit manapun bisa menggantikan unit manapun.

Deployment Berjenjang — Dari Pos Depan hingga Pusat Medis

TingkatKonfigurasiKonektivitasTablet bersamaan
Pusat Medis1 Hub + 4 SpokeSwitch 8 port~75
Rumah Sakit Regional1 Hub + 3 SpokeSwitch 5 port~60
Rumah Sakit Kabupaten1 Hub + 1 SpokeKabel langsung~30
Pos Depan1 MandiriTidak diperlukan~15

Golden Image yang sama bekerja di semua tingkat. Perbedaannya adalah berapa unit yang Anda deploy dan peran apa yang Anda tetapkan — bukan software yang mereka bawa.

Terputus Bukan Kegagalan — Itu Kondisi yang Diharapkan

Di xGrid, kehilangan koneksi jaringan tidak memicu apapun yang terlihat oleh staf klinis. Kedua sistem terus beroperasi dengan fungsionalitas penuh — basis data sendiri, antarmuka klinis sendiri, stasiun tablet sendiri.

Prinsip desain fundamental: setiap Spoke adalah sistem lengkap. Hub menyediakan koordinasi, bukan kapabilitas. Ketika koordinasi hilang, satu-satunya yang berubah adalah waktu sinkronisasi.

Sinkronisasi Tiga Fase

Fase 1 — Verifikasi: Hub memeriksa kesehatan setiap Spoke. Tidak ada respons dalam 30 detik — lewati. Pemeriksaan keselarasan jam memastikan kedua perangkat sepakat tentang waktu saat ini. Jika berbeda lebih dari 30 detik, sinkronisasi ditolak untuk mencegah korupsi timestamp.

Fase 2 — Push (Hub ke Spoke): Event klinis mengalir keluar. Hub mendorong snapshot penuh CIRS ke setiap Spoke setiap lima menit. Snapshot ini disimpan secara lokal di setiap Spoke — 12 salinan terbaru, jendela cadangan bergulir selama satu jam.

Fase 3 — Pull (Spoke ke Hub): Event sumber daya mengalir masuk: perubahan inventaris, operasi bank darah, catatan bedah, log dispensasi.

Enam Strategi Resolusi Konflik

StrategiTipe dataLogika
Tambahkan keduanyaTanda vital, serah terima, dispensasiEvent imutabel — simpan kedua versi
Terbaru menangDemografi pasienBandingkan timestamp, pembaruan terbaru berlaku
Hub menangPendaftaran, resep, bedahCIRS (Hub) bersifat otoritatif
Jumlahkan keduanyaKuantitas inventarisJumlahkan konsumsi kedua sisi
Selalu blokirProduk darah, zat terkontrolTidak pernah auto-resolve — memerlukan verifikasi manusia
Di tempat menangStatus peralatanOperator yang hadir secara fisik diutamakan

Jumlahkan keduanya untuk inventaris: Hub mengonsumsi 5 perban, Spoke mengonsumsi 3. Jawaban yang benar adalah 5 + 3 = 8 dikonsumsi.

Selalu blokir untuk produk darah: Unit darah yang ditandai "dikeluarkan" di kedua stasiun secara bersamaan tidak bisa diselesaikan oleh aturan otomatis manapun. Seseorang harus memverifikasi secara fisik di mana unit darah itu sebenarnya berada.

Cabut dan Jalan — Spoke Dipromosikan Menjadi Hub

Ini adalah kemampuan paling kuat dalam arsitektur.

Anda menjalankan deployment 1 Hub + 3 Spoke di insiden korban massal. Dua jam kemudian, komandan melaporkan titik pengumpulan korban kedua sepuluh kilometer jauhnya. Anda butuh stasiun medis yang berfungsi di sana sekarang.

Anda berjalan ke salah satu Spoke. Cabut kabel Ethernet. Masukkan ke tas dengan baterai dan iPad. Berkendara ke lokasi baru. Sambungkan daya. SSH dan jalankan satu perintah:

sudo xgrid-promote

Proses promosi adalah mesin state atomik. Jika langkah manapun gagal, seluruh operasi di-rollback — unit kembali ke mode Spoke.

Ketika berhasil, iPad terhubung ke jaringan WiFi baru, membuka PWA, dan Anda melihat stasiun medis yang sepenuhnya beroperasi dengan data pasien dari Hub asli — paling lama lima menit yang lalu.

Hub Down — Pengambilalihan dalam Lima Menit

Setiap Spoke terus memantau heartbeat Hub — setiap 30 detik. Tiga kegagalan berturut-turut (90 detik tanpa respons) memicu banner merah: "Hub offline."

Operator mengambil keputusan: Spoke mana yang mengambil alih? Script promosi memuat snapshot latest.good — symlink yang selalu menunjuk ke cadangan terverifikasi terbaru.

Kehilangan data pasien maksimum adalah lima menit — interval antara push snapshot.

Mengapa tidak mempromosikan secara otomatis? Karena di lingkungan terputus, Anda tidak bisa membedakan "Hub hancur" dari "kabel Ethernet longgar." Promosi otomatis berisiko menciptakan dua Hub yang keduanya merasa bertanggung jawab — kondisi split-brain. Promosi harus merupakan keputusan manusia.

Perlindungan Split-Brain — Epoch, Bukan Kepercayaan

Setiap kali Spoke dipromosikan menjadi Hub, penghitung epoch bertambah. Epoch tertanam di setiap snapshot, setiap broadcast mDNS, setiap handshake sinkronisasi.

Deteksi zombie. Hub A (epoch 1) crash dan Spoke B dipromosikan (epoch 2). Seseorang mencolokkan Hub A kembali. Saat startup, ia memindai jaringan dan menemukan Hub yang menyiarkan epoch 2 — lebih tinggi dari epoch 1 miliknya. Hub A otomatis menurunkan diri menjadi Spoke.

Validasi Spoke. Jika Spoke menemukan dua Hub dengan epoch berbeda, ia memunculkan peringatan oranye dan menolak auto-reconnect sampai manusia menyelesaikan ambiguitas.

Isolasi kluster. Setiap deployment membawa cluster_id unik. Spoke hanya menerima Hub dengan cluster_id yang cocok.

Penemuan Layanan — Tanpa IP Hardcode

xGrid menggunakan mDNS (multicast DNS) melalui avahi-daemon. Ketika Hub dimulai, ia menyiarkan _xgrid-hub._tcp di jaringan lokal. Spoke mendengarkan siaran ini. Ketika mendeteksi Hub baru dengan cluster ID valid dan epoch lebih tinggi, mereka memperbarui target koneksi secara otomatis.

Tidak perlu memperbarui file konfigurasi. Tidak perlu mengingat alamat IP. Jaringan mendeskripsikan dirinya sendiri.

Headless — iPad Anda Adalah Panel Kontrol

RPi xGrid tidak pernah memiliki monitor. Tidak pernah memiliki keyboard. Semua pekerjaan klinis terjadi melalui PWA di WiFi. Administrasi sistem melalui SSH.

Total hardware per stasiun: satu Raspberry Pi, satu kabel daya, satu kabel Ethernet (jika tidak mandiri). Jejak deployment cukup kecil untuk muat di ransel.

Konsolidasi Stasiun — Ketika Lokasi Dievakuasi

Empat mode penggabungan menangani skenario berbeda:

  • Penggabungan penuh: Semua data mengalir ke stasiun tujuan
  • Penggabungan parsial: Hanya kategori sumber daya terpilih yang ditransfer
  • Import cadangan: Pulihkan dari cadangan portabel
  • Penutupan darurat: Shutdown stasiun dengan preservasi data lengkap

Setiap penggabungan mencatat persis apa yang dipindahkan. Jejak audit ini menjawab pertanyaan yang selalu muncul setelah bencana: "Ketika stasiun itu dievakuasi, ke mana semuanya pergi?"

Mendesain untuk Ketidaktersambungan

Sebagian besar sistem terdistribusi dimulai dari premis "jaringan dapat diandalkan" dan menambahkan penanganan pengecualian untuk saat tidak.

xGrid dimulai dari premis "jaringan tidak dapat diandalkan" dan mengoptimalkan untuk saat kebetulan berfungsi.

Inversi ini menghasilkan desain yang secara fundamental berbeda:

  • Setiap node adalah sistem lengkap (bukan thin client yang bergantung pada server)
  • Setiap unit dikirim dengan semua software terinstal (peran adalah file konfigurasi)
  • Spoke manapun bisa dipromosikan menjadi Hub
  • Sinkronisasi adalah batch periodik (bukan streaming real-time)
  • Resolusi konflik adalah perilaku default (bukan penanganan pengecualian)
  • Hub usang menurunkan diri sendiri (karena epoch counter adalah fakta, bukan kebijakan)

Kabel akan tertendang. Switch akan jatuh dari meja. Hub akan terkena.

Tidak satu pun dari ini adalah mode kegagalan. Semuanya adalah transisi topologi.


Terkait: Offline-First Is Not a Fallback · ISBAR Is More Than a Handoff Format