Redundansi dan Domain Kegagalan

Titik kegagalan tunggal, blast radius, dan penataan redundansi lintas domain kegagalan.

Daftar isi

Topik ini membahas cara menyusun redundansi sehingga benar-benar menambah ketahanan, yaitu mengenali titik kegagalan tunggal (single point of failure), menilai luas dampak atau blast radius satu kegagalan, dan menempatkan replika pada domain kegagalan (failure domain) yang terpisah. Simulasi pada bagian akhir memperlihatkan kegagalan berkorelasi (correlated failure) yang membatalkan redundansi meskipun jumlah replikanya banyak. Setelah membacanya, penilaian atas sebuah arsitektur dapat dilakukan dengan dua pertanyaan tetap, yaitu komponen apa yang mati bersamaan dan seberapa luas dampak yang ditimbulkannya.

Titik kegagalan tunggal#

Titik kegagalan tunggal adalah komponen yang kegagalannya menghentikan seluruh layanan karena tidak ada komponen lain yang siap mengambil alih perannya. Contoh yang paling sering dijumpai adalah satu server aplikasi tanpa cadangan, satu instansi basis data utama tanpa replika, satu load balancer tunggal di depan semua server, dan satu pendaftar konfigurasi yang harus hidup sebelum layanan apa pun bisa dijalankan. Komponen seperti ini boleh saja ada pada masa awal, tetapi keberadaannya harus diketahui dan dicatat, bukan ditemukan pada saat kejadian.

Cara menemukannya adalah menelusuri satu permintaan dari ujung ke ujung, lalu menandai setiap komponen yang wajib dilalui permintaan tersebut. Komponen bertanda yang tidak memiliki cadangan merupakan titik kegagalan tunggalnya. Pemeriksaan ini perlu diulang setiap kali arsitektur berubah, karena komponen baru sering membawa ketergantungan yang tidak terlihat dari diagram. Penanganan utamanya adalah redundansi, yaitu penggandaan komponen sehingga tersedia cadangan yang aktif, tetapi redundansi hanya berguna bila replikanya tidak mati bersamaan, dan syarat itulah yang dibahas pada bagian berikutnya.

Luas dampak kegagalan#

Blast radius menyatakan luas dampak satu kegagalan, mulai dari satu permintaan, satu kelompok pengguna, sampai seluruh layanan. Dua kegagalan pada komponen yang sama dapat memiliki blast radius yang berbeda tergantung pada penataannya. Kerusakan satu server pada kumpulan delapan server setara hanya menyingkirkan seperdelapan kapasitas, sedangkan kerusakan satu basis data yang digunakan semua server menghentikan semuanya. Selisih luas dampak itulah yang membuat dua arsitektur dengan jumlah server sama dapat berbeda jauh keandalannya.

Desain yang baik membatasi blast radius secara sengaja, bukan menerima dampak apa adanya. Pembagian data menjadi partisi yang lebih kecil membuat kerusakan satu partisi hanya menimpa pengguna yang datanya berada di sana. Pemisahan layanan per fungsi membuat kerusakan satu layanan tidak merambat ke layanan yang tidak bergantung padanya. Prinsipnya, setiap kegagalan harus punya batas yang sudah dirancang, dan pertanyaan “apa yang ikut mati” dapat dijawab dengan tepat sebelum kegagalan terjadi.

Domain kegagalan dan penempatan replika#

Domain kegagalan adalah himpunan komponen yang dapat ikut berhenti karena satu kejadian kegagalan yang sama. Satu rak server dengan catu daya dan switch bersama merupakan satu domain kegagalan, demikian pula satu zona pada pusat data atau satu rilis perangkat lunak yang diterapkan serentak. Kegagalan di dalam satu domain bersifat menular ke anggotanya, sedangkan kegagalan antardomain diharapkan saling bebas. Batas domain tidak selalu bersih, misalnya satu layanan yang kuotanya habis dapat mengganggu layanan lain yang berada pada domain berbeda, sehingga penentuannya perlu dinyatakan secara eksplisit.

Penempatan replika menentukan apakah redundansi bekerja. Tiga replika yang ditempatkan pada satu rak redundan terhadap kerusakan satu server saja, tetapi lenyap seketika ketika listrik raknya padam. Replika yang sama pada tiga domain yang berbeda tetap tersisa dua bila satu domain mengalami kegagalan total. Diagram berikut membandingkan kedua penataan. Di sebelah kiri, ketiga replika berbagi listrik dan switch pada satu domain, sedangkan di sebelah kanan, tiga replika tersebar pada tiga domain sehingga satu kegagalan hanya mengambil satu replika.

Domain kegagalan A (satu rak)Replika 1Replika 2Replika 3listrik dan switch bersamaDomain AReplikaDomain BReplikaDomain CReplika
Tiga replika pada satu domain kegagalan dibandingkan tiga replika yang tersebar pada tiga domain

Kegagalan berkorelasi membatalkan redundansi#

Rumus 1−(1−p)n1-(1-p)^n pada topik Matematika Ketersediaan berlaku hanya bila kegagalan tiap replika saling bebas. Kegagalan berkorelasi, yaitu kegagalan yang dipicu satu kejadian sehingga banyak replika gagal sekaligus, melanggar syarat itu. Contohnya adalah padamnya listrik rak, pembaruan firmware switch yang menimpa semua replika, satu rilis yang diterapkan serentak, dan lonjakan trafik yang menyambar semua replika pada waktu yang sama.

Simulasi berikut menguji kedua keadaan tersebut dengan 100000 percobaan, tiga replika, dan peluang gagal 10% per replika. Kasus pertama mengundi kegagalan tiap replika secara acak dan saling bebas, sedangkan kasus kedua menempatkan ketiganya pada satu domain kegagalan sehingga satu undian menentukan nasib semua replika.

python simulasi_kegagalan.py
import random

random.seed(7)
jumlah_simulasi = 100_000
replika = 3
p_gagal = 0.10

# Kasus 1: tiga replika, kegagalan tiap replika saling bebas
selamat_bebas = 0
for _ in range(jumlah_simulasi):
    hidup = 0
    for r in range(replika):
        if random.random() > p_gagal:
            hidup += 1
    if hidup > 0:
        selamat_bebas += 1

# Kasus 2: tiga replika di satu domain kegagalan yang sama,
# sehingga satu kegagalan mematikan ketiganya sekaligus
selamat_bersama = 0
for _ in range(jumlah_simulasi):
    if random.random() > p_gagal:
        selamat_bersama += 1

persen_bebas = selamat_bebas / jumlah_simulasi * 100
persen_bersama = selamat_bersama / jumlah_simulasi * 100
print(f"Replika saling bebas  : selamat {persen_bebas:.2f}% dari simulasi")
print(f"Satu domain kegagalan : selamat {persen_bersama:.2f}% dari simulasi")
text Keluaran
Replika saling bebas  : selamat 99.91% dari simulasi
Satu domain kegagalan : selamat 89.97% dari simulasi

Keluaran menunjukkan selisih yang jauh lebih besar daripada yang diperkirakan sebagian orang. Pada kegagalan yang saling bebas, peluang selamat teoretis adalah 99,9% dan hasil simulasi 99,91% cocok dengannya. Pada satu domain kegagalan, peluang selamat turun menjadi peluang satu replika saja, yaitu 90%, dan hasil simulasi 89,97% juga cocok. Artinya, tiga replika pada satu domain tidak lebih baik daripada satu replika tanpa redundansi terhadap kegagalan domain, padahal biayanya tiga kali. Redundansi tidak pernah dihitung dari jumlah mesinnya, melainkan dari jumlah domain yang menaunginya.

Kesalahan umum#

  1. Menghitung redundansi dari jumlah replika saja. Tiga replika pada satu rak memberikan ketahanan sebesar satu replika terhadap kegagalan rak, sehingga ketersediaan yang dijanjikan tidak pernah tercapai. Perbaikannya, daftarkan kegagalan bersama yang ditanggung setiap replika sebelum menghitung ketersediaan gabungan.
  2. Membiarkan komponen tunggal di luar lapisan aplikasi. Layanan yang direplikasi penuh tetap memiliki titik kegagalan tunggal berupa satu basis data utama, satu pendaftar sertifikat, atau satu akun layanan yang kuotanya habis. Perbaikannya, telusuri permintaan sampai ke penyimpanannya, bukan berhenti pada gateway.
  3. Menaruh semua replika di belakang satu jalur jaringan. Blast radius switch inti mencakup seluruh replika, sehingga redundansi yang dibangun tidak pernah benar-benar teruji. Perbaikannya, pisahkan jalur jaringan setidaknya pada tingkat rak atau zona.

Ringkasan#

  • Titik kegagalan tunggal adalah komponen tanpa cadangan yang kegagalannya menghentikan seluruh layanan, dan penemuannya dilakukan dengan menelusuri permintaan dari ujung ke ujung.
  • Blast radius menyatakan luas dampak satu kegagalan, dan pembagian partisi serta pemisahan layanan adalah alat pembatasnya.
  • Redundansi hanya bekerja bila replika berada pada domain kegagalan yang berbeda, dan simulasi memperlihatkan selisih 99,91% berbanding 89,97% pada jumlah replika yang sama.

Referensi#