Tiga Konsep Kegagalan yang Layak Diketahui
Selamat Datang
Sistem terdistribusi gagal dalam pola. Setelah Anda belajar pola-pola itu, setiap postmortem menjadi latihan pengenalan bukan misteri.
Tiga konsep ini menutupi sebagian besar yang penting dalam analisis kegagalan produksi:
Titik Kegagalan tunggal (SPOF): komponen yang gagalnya mengakibatkan sistem yang lebih besar turun. Sering tersembunyi: server DNS yang semua orang bergantung pada; sertifikat yang segala sesuatu direnovasikan melawan; master database tunggal.
Kegagalan berturut-turut: kegagalan komponen yang memicu kegagalan yang lain, yang kemudian memicu kegagalan yang lain lagi. Basis lambat menyebabkan waktu tunggu di lapisan API, yang menyebabkan ulang coba, yang memuat basis data lebih lanjut, yang menyebabkan lebih banyak waktu tunggu. Ledakan menyebar.
Jangkauan Ledakan: seberapa banyak dari sistem yang mati ketika satu bagian gagal. Pilihan arsitektural yang satu atau lainnya mengikat atau melepaskan jangkauan. SPOF memiliki jangkauan ledakan yang tidak terbatas. Layanan yang diblokir memiliki jangkauan terbatas.
Setelah menyelesaikan pelajaran ini Anda akan:
- Mengidentifikasi SPOF dalam arsitektur dengan pemeriksaan
- Mengenali pola kegagalan berturut-turut: gempuran herde, badai ulang coba, antrian kematian
- Membaca timeline nyata & memisahkan trigger dari kecacatan laten yang trigger mengungkapkan
- Menulis item tindakan tanpa membenarkan yang target sistem bukan orang, menutupi pencegahan / deteksi / pemulihan
- Berpikir tentang bulkhead & breaker sirkuit sebagai alat batasi jangkauan
Temukan Titik Kegagalan tunggal
Pemeriksaan Arsitektur Berlapis
Sertakan arsitektur web kecil:
- DNS: api.example.com -> IP nameserver tunggal 203.0.113.10 yang dihosting oleh satu penyedia DNS
- CDN: satu vendor CDN di depan api.example.com
- Ingress: dua mesin reverse proxy di balik load balancer
- Backend: enam replika API di dua zona ketersediaan (tiga per zona)
- Database: satu primer + satu replika baca, di zona ketersediaan yang sama
- Cache: Redis cluster, tiga node yang tersebar di dua zona ketersediaan yang sama
Pertanyaan: komponen-komponen mana yang merupakan SPOF? Tip: SPOF bukan selalu 'komponen tunggal' yang jelas. Kluster tiga mesin semua di satu zona ketersediaan adalah SPOF untuk kegagalan zona ketersediaan itu.
Tiga Pola Cascade Klasik
Kecelakaan Melintasi Ketergantungan
Polanya 1: Guntur herd. Sumber daya bersama (cache, kunci, database) gagal atau restart. Setiap klien yang tergantung padanya mencoba lagi secara bersamaan. Banjir menggumpal melebihi apa yang kembali hidup; ulang cubaan menumpuk lebih cepat dari pemulihan yang dapat menampungnya; pemulihan tidak pernah selesai.
Polanya 2: Badai ulang cubaan. Layanan turunan lambat. Pemanggil atas, bukan gagal, mencoba ulang. Ulang cubaan menggandakan beban asli. Layanan lambat semakin lambat, mengaktifkan lebih banyak ulang cubaan. Akhirnya, beban melebihi bahkan versi sehat layanan.
Polanya 3: Antrian kematian. Antrian pengolahan tanpa tekanan belakang menerima lebih cepat daripada yang diproses. Antrian tumbuh tak terbatas. Memori habis; konsumen mengalami kegagalan; restart; menemukan antrian yang lebih besar; mengalami kegagalan lagi.
Benang umum: gangguan kecil mengaktifkan pola balik positif. Respons sistem sendiri memperkuat kegagalan daripada menguranginya.
Mekanisme Dampak
Belakang mundur eksponensial dengan kegoyahan. Klien yang mencoba ulang menunggu lebih lama setiap kali, dengan offset acak. Mencegah gelombang ulang cubaan yang disinkronkan.
Pemutus sirkuit. Pemanggil yang mencoba melacak tingkat kegagalan turunan. Melebihi ambang batas, pemanggil berhenti menghubungi selama periode pendinginan & segera gagal permintaan sendiri alihnya. Mencegah kerja yang sia-sia, membiarkan turunan pulih.
Bulkhead. Isolasi sumber daya per ketergantungan. Kolam koneksi A untuk database, kolam koneksi terpisah B untuk cache. Database lambat tidak dapat menggagalkan semua koneksi; panggilan cache terus berlanjut.
Menurunkan beban. Ketika terisi penuh, tolak permintaan di tepi daripada menerima & gagal perlahan. 429 dalam 1 ms lebih baik daripada 500 dalam 30 detik.
Tekanan belakang. Produsen lambat ketika konsumen tidak dapat menangkapnya. Antrian menjadi terbatas; pengirim blokir; sumber asli kerja merasakan gesekan.
![Kecelakaan berantai: pemicu -> penguatan -> runtuh, dengan mekanisme pengurang)
Diagnosis Pola Cascade
Tiers API tim mengalami runtuh selama failover basis data rutin. Kronologi:
- 14:00:00 — operator meningkatkan basis data standby. Keterjangkauan yang diharapkan: ~10 detik.
- 14:00:08 — primer tidak tersedia. Error koneksi basis data pada tiers API mulai bermunculan.
- 14:00:08 — Tiers API mencoba kembali (konfigurasi bawaan: 5 kali ulangan, tanpa backoff, 100ms apart).
- 14:00:11 — standby dinaikkan, menerima koneksi baru.
- 14:00:11 — Tiers API membuka ribuan koneksi basis data baru secara bersamaan (setiap klon × setiap permintaan koncurrent × setiap ulangan).
- 14:00:13 — Kolom koneksi pool baru primer habis; koneksi baru ditolak.
- 14:00:13-14:05:00 — Replicas tiers API menghabiskan kolom koneksi pool, melemparkan pengecualian, mengalami kacau balak, mulai ulang, ulangi.
- 14:05:00 — Operator menghentikan secara manual lalu lintas tiers API; basis data stabil.
- 14:10:00 — Restorasi lalu lintas bertahap selesai. Total outage: ~10 menit (vs yang diharapkan ~10 detik).
SERVFAIL DNS: Dua Defek Menggandakan
Postmortem Bentuk Nyata
Yang mengikutinya adalah versi disanitasi dari insiden nyata. Nama-nama vendor diubah, IP-anonim; bentuk, kronologi, dan pelajaran yang nyata.
Ringkasan
Situs example.com mengembalikan SERVFAIL dari semua resolver DNS publik selama kira-kira 3-4 jam. Zona lain 46 di master DNS tidak terpengaruh. Penyebab: dua defek menggandakan.
1. Vendor A (sebuah penyedia DNS sekunder) menambahkan IP sinkron internal baru yang tidak ada di dalam daftar allow-axfr-ips yang diizinkan primer.
2. Zona example.com memiliki konflik CNAME yang melanggar RFC (demo.example.com memiliki CNAME & MX/TXT record di label yang sama) yang telah ada selama tahun yang menyebabkan Vendor A menolak zona pada AXFR baru.
Kronologi (UTC)
- ~15:00 — Vendor A menambahkan IP sinkron baru 198.51.100.42 ke infrastruktur mereka
- 15:02 — pertama kali AXFR-out denied untuk 198.51.100.42 muncul dalam log DNS utama (tidak ada pemberitahuan pada sinyal ini)
- ~18:00 — jendela kedaluwarsa SOA tiba; Vendor A mengeluarkan zona example.com dari cache
- ~18:30 — SERVFAIL deteksi dari luar
- ~19:45 — penyebab utama diidentifikasi
- 20:00 — 198.51.100.42 ditambahkan ke allow-axfr-ips; primary diulang
- 20:05 — NOTIFY dikirim; AXFR dimulai; zona MASIH SERVFAIL (konflik CNAME)
- 20:07 — check-zone mengungkap 1 kesalahan: konflik CNAME pada demo.example.com
- 20:09 — CNAME digantikan dengan record A; cek zona bersih (0 kesalahan)
- 20:10 — NOTIFY dikirim; AXFR selesai; Vendor A mulai menyediakan zona
- 20:11 — dig @8.8.8.8 example.com A kembali IP yang benar — DITANGANI
Mengapa Hanya example.com?
Semua 47 zona menggunakan primary yang sama. Blok IP AXFR yang mempengaruhi semua zona. Namun, hanya example.com yang memiliki konflik CNAME, & hanya example.com yang membutuhkan AXFR segar pada saat deny diterapkan. Zona lain telah diperbarui sebelum deny atau belum perlu diperbarui.
Defek laten
Konflik CNAME di demo.example.com telah ada selama bertahun-tahun. Hal ini berfungsi karena primary menyajikan zona dari database-nya (longgar tentang pelanggaran RFC) & Vendor A menyajikan data dari data cache yang ketinggalan zaman sebelum pelanggaran diperkenalkan. Ketika Vendor A mengeluarkan cache-nya & membutuhkan data segar, pelanggaran muncul.
Pemicu
Vendor A menambahkan IP sinkron baru secara diam-diam. Primary tidak memiliki daftar yang mencakupnya. AXFR ditolak. Tiga jam kemudian (SOA kedaluwarsa), Vendor A mengeluarkan zona. Defek laten muncul ketika sistem mencoba kembali.
Tulis Aksi Tanggung Jawab Tanpa Membebani
Tanpa Membebani: Target Sistem, Bukan Orang
Aksi tanggung jawab yang tidak membebani menamai sesuatu yang sistem harus lakukan berbeda, bukan sesuatu yang seorang harus lakukan berbeda. 'Latih operator' adalah membebankan. 'Tambahkan pemeriksa otomatis yang menangkap hal ini sebelum di-deploy' adalah tidak membebankan.
Aksi tanggung jawab yang baik berkumpul dalam tiga dimensi:
- Pencegahan: membuat hal buruk lebih sulit atau mustahil
- Deteksi: mengenali lebih cepat jika hal itu terjadi
- Pemulihan: membatasi kerugian saat terjadi
Setiap item harus menamai (1) perubahan sistem spesifik, (2) tim pemilik, & (3) dimensi yang dilayani.
Kamar yang Tenggelam Tanpa Kapal
Dipinjam dari Teknik Kapal
Kapal membawa dinding kedap air: dinding vertikal yang membagi lambung menjadi kamar. Satu kamar bisa terendam tanpa tenggelamnya kapal; kamar lain bisa gagal tanpa mempengaruhi yang lain.
Sistem terdistribusi meminjam kata yang sama & ide yang sama.
Polanya Bulkhead: isolasi sumber daya per ketergantungan. Layanan yang memanggil tiga API turunan menggunakan tiga kolam koneksi terpisah, tiga anggaran ulang thread terpisah, tiga anggaran ulang terpisah. API turunan yang lambat atau gagal tidak bisa mengonsumsi sumber daya yang dialokasikan untuk yang lain.
Tanpa bulkhead: satu ketergantungan lambat menghabiskan pool thread yang bersama; panggilan ke ketergantungan lain menunggu thread; layanan menjadi tidak responsif secara keseluruhan.
Dengan bulkhead: satu ketergantungan lambat menghabiskan poolnya sendiri; panggilan kepadanya gagal cepat; panggilan ke ketergantungan lain terus berjalan normal; jangkauan ledakan tetap terbatas pada ketergantungan yang gagal.
Breaker Sirkuit
Polanya breaker sirkuit: penutup berstatus yang diletakkan di sekitar ketergantungan turunan yang menghitung tingkat kegagalan. Tiga status:
- Tutup (normal): panggilan melewati. Kegagalan dihitung.
- Buka (terjepit): melebihi ambang batas kegagalan (misalnya, 50% kegagalan dalam 30 detik terakhir), breaker membuka. Panggilan gagal segera tanpa mencoba ketergantungan. Menghemat pengguna bekerja; menghemat ketergantungan dari menerima beban sementara tidak sehat.
- Setengah buka (tes): setelah periode pendinginan, breaker membolehkan sejumlah kecil panggilan melalui. Jika mereka sukses, ia menutup kembali ke normal. Jika mereka gagal, ia kembali terbuka untuk waktu pendinginan lain.
Insight kunci: breaker sirkuit mencegah usaha yang sia-sia selama periode yang tidak sehat, & memberi ketergantungan turunan kesempatan untuk pulih tanpa beban terus menerus.
Bulkheads mengikat jangkauan ledakan. Breaker sirkuit mencegah ledakan terus berlangsung.
Ikat Jangkauan Ledakan
Panggilan API Anda menghubungkan empat layanan turunan: User Service, Recommendation Service, Notification Service, dan API Pembayaran pihak ketiga. Tim telah mendengar 'Rekomendasi Service agak flaky' dan ingin memastikan bahwa ketika layanan tersebut gagal, sistem lain tetap sehat.
Hari ini layanan ini menggunakan satu pool thread bersama yang memiliki 200 thread dan satu pool koneksi HTTP bersama. Semua empat turunan bersaing untuk sumber daya ini. Tidak ada pembatas sirkuit.
Rancang Ulang Tinjauan Kegagalan
Sinopsis
Anda telah belajar mengenali SPOFs dengan pemeriksaan, mengenali pola kegagalan yang menyebar, memisahkan pemicu dari kecacatan laten saat membaca postmortem, menulis aksi yang tidak bersalah di seluruh pencegahan / deteksi / pemulihan, dan membatasi jangkauan ledakan dengan bulkhead + pembatas sirkuit + degradasi halus.
Terapkan semua lima.
Tim Anda meluncurkan layanan baru search.example.com yang tergantung pada tiga layanan turunan: indeks pencarian utama (index.example.com), layanan analitik (analytics.example.com), dan layanan rekomendasi (recs.example.com). Tim ingin Anda memimpin 'tinjauan kegagalan' sebelum peluncuran.
Di Mana Kursus Ini Berikutnya
Di Mana Kursus Ini Berikutnya
Anda sekarang dapat mengenali SPOF, mengenali gelombang kegagalan, membaca postmortem dengan cara yang produktif, menulis aksi yang tidak bersalah, dan membatasi jangkauan ledakan oleh desain.
Lesi terakhir dalam kursus ini (cs_distsys_observability_and_capacity) mengajarkan apa yang harus diukur agar Anda mengetahui bahwa masalah terjadi sebelum pengguna melakukannya. Pengecekan kesehatan, endpoint versi, empat sinyal emas di lapisan proxy, dan bagaimana keputusan kapasitas surut kembali ke data yang diamati.
Lesi teman sekelas: geometry_of_failure_modes_and_blast_radius menggali antara sentralitas antara (nod graf yang botolan) dan potong minimum (batas pada jangkauan ledakan).
Baik sekali. Terus maju.