Penerapan Server Ticketing
Environment Variable
Konfigurasi server dilakukan sepenuhnya lewat environment variable. Key tidak peduli huruf besar/kecil, nilai kosong dianggap tidak diset, dan nilai bertipe flag hanya bernilai true untuk 1/true/yes/on. Image Docker berbasis scratch, jadi konfigurasi disuntikkan murni lewat environment variable tanpa file konfigurasi.
| Environment variable | Default | Deskripsi |
|---|---|---|
PORT | 5225 | Port listen di mode single. Diabaikan di mode cluster, di mana port dari CLUSTER_SELF dipakai sebagai gantinya |
SOCKET_BIND | 0.0.0.0 | Alamat listen |
CLIENT_TOKENS | (tidak ada) | Daftar token auth klien dipisah koma. Jika tidak diset, token kosong diizinkan |
CLUSTER_SELF | (tidak ada) | Alamat yang diiklankan node ini, host:port. Kehadirannya mengaktifkan mode cluster |
CLUSTER_PEERS | (tidak ada) | Daftar alamat yang diiklankan semua node, dipisah koma. Persis 3 atau 5, urutan sama di setiap node, harus menyertakan self |
CLUSTER_TOKENS | (tidak ada) | Daftar token auth antar-peer dipisah koma |
TLS_CERT / TLS_KEY | (tidak ada) | Path file PEM sertifikat/private key — set keduanya bersamaan untuk mengaktifkan TLS |
TLS_CA | (tidak ada) | CA untuk memverifikasi sertifikat peer — kembali ke system trust store jika tidak diset |
TLS_SKIP_VERIFY | false | Lewati verifikasi sertifikat peer — khusus test |
DOCKER | false | Mengunci port listen internal ke 5225/6225 di mode cluster — diset default di image resmi |
DEBUG | Tergantung build | 1/true mengaktifkan logging debug |
Untuk aturan lengkap (penurunan port, alamat yang diiklankan, rotasi token tanpa downtime, dll.) lihat Konfigurasi (Env Var).
Single vs. Cluster
- Single (1 node): tanpa
CLUSTER_*, node berjalan mandiri. Paling cepat, tapi ada blip singkat saat restart, dan status ada di in-memory sehingga hilang saat restart (leaseadalah jaring pengamannya). - Cluster (non-stop): 3 atau 5 node. Node berbagi satu status lock lewat konsensus Raft — hanya leader yang menangani request, dan setiap perubahan status hanya difinalisasi setelah commit mayoritas. Jika leader mati, yang baru terpilih dalam 0,5-1 detik, dan selama mayoritas tetap hidup, status lock dan layanan terus berjalan. Lihat Cara Kerja dan Protokol (Cluster) untuk penjelasan lengkap.
- Setiap node cluster listen di port klien ditambah port Raft (port klien + 1000) — buka kedua port di firewall kamu.
Deployment cluster Kubernetes memakai StatefulSet + headless Service. Beri setiap pod nama DNS yang stabil (
ticketing-0.ticketing…,ticketing-1.ticketing…), masukkan nama-nama itu keCLUSTER_PEERS, dan auto-injectCLUSTER_SELFtiap pod lewat downward API (metadata.name).
Restart Non-Stop (Rolling)
Ada satu aturan inti — mayoritas harus selalu tetap hidup (paling banyak 1 dari 3 mati sekaligus).
- Restart follower dulu, satu per satu. Setelah node yang di-restart mengejar lewat replikasi atau snapshot, lanjut ke node berikutnya.
- Terakhir, matikan leader — yang baru terpilih dalam 0,5-1 detik, dan klien beralih secara transparan.
- Menyalakan kembali node yang mati membuatnya bergabung sebagai follower.
Lihat Prosedur Rolling Restart untuk langkah-langkah detailnya.
Referensi
- Image:
sarolab/ticketing· Github: saro-lab/ticketing - Daftarkan setiap alamat node ke klien (broker) agar failover otomatis. Lihat Libraries untuk penggunaan spesifik-bahasa.