Postmortem gangguan 73 jam Roblox tahun lalu
(blog.roblox.com)Ringkasan gangguan
-
Gangguan berlangsung selama 72 jam
-
Ada 2 akar penyebab
-
Saat fitur streaming baru Consul diaktifkan dalam kondisi beban baca/tulis yang sangat tinggi, terjadi contention berlebihan dan penurunan performa
-
Dalam kondisi beban tertentu, timbul masalah performa pada BoltDB open source yang digunakan Consul untuk mengelola write-ahead-log bagi pemilihan leader dan replikasi data
-
-
Satu cluster Consul tunggal memperparah dampak masalah ini
-
Gangguan memanjang karena perlu menemukan dua masalah yang tampak tidak saling terkait ini, yang tersembunyi di implementasi Consul
-
Lebih sulit ditemukan karena sistem monitoring yang seharusnya memberi visibilitas lebih baik terhadap penyebab gangguan bergantung pada sistem yang terdampak seperti Consul
Lingkungan cluster dan HashiStack
-
Roblox mengoperasikan 18.000 server dan 170.000 container
-
Menggunakan Nomad, Consul, dan Vault yang biasanya disebut HashiStack
Saat itu Roblox meng-upgrade Consul dari 1.9 ke 1.10 untuk menggunakan fitur streaming.
Deteksi awal (10/28 13:37)
Pada 18 Oktober sore, performa Vault menurun dan beban CPU pada satu server Consul meningkat.
Klasifikasi awal (10/28 13:37 – 10/29 02:00)
-
Latensi tulis meningkat pada metrik cluster Consul
-
Penurunan performa hardware dicurigai sebagai penyebab, dan salah satu node cluster Consul mulai diganti
-
Karyawan HashiCorp ikut bergabung dan mulai bekerja bersama
-
Setelah penggantian hardware pun performa Consul terus menurun, dan pada 16:35 jumlah pemain turun menjadi 50% dari biasanya
-
Karena Consul digunakan untuk service discovery dan Nomad serta Vault juga bergantung pada Consul, maka Consul menjadi SPoF.
-
Saat ini muncul hipotesis baru bahwa trafik adalah penyebabnya. Diperkirakan Consul tidak lagi mampu menangani beban akibat trafik tinggi
-
Semua node cluster Consul diganti dengan sistem yang lebih kuat. (jumlah core 2x lipat, NVME SSD lebih cepat)
-
Migrasi Consul hampir selesai, tetapi cluster tidak kembali normal
Upaya pemulihan layanan #1 (10/29 02:00 – 04:00)
-
Diputuskan untuk kembali ke snapshot cluster Consul sebelum gangguan
-
Data pengguna aman dan diperkirakan sebagian data sistem akan hilang, tetapi dianggap tidak masalah
-
Setelah pemulihan snapshot, akses diblokir dengan iptables karena dikhawatirkan beban dari sistem yang terus berkomunikasi dengan Consul akan kembali menimbulkan masalah setelah pemulihan
-
Setelah snapshot dipulihkan, indikator terlihat membaik, tetapi ketika blokir iptables dibuka kembali, kondisi kembali ke status gangguan semula
Upaya pemulihan layanan #2 (10/29 04:00 – 10/30 02:00)
-
Trafik eksternal diblokir dan penggunaan yang tidak esensial dihapus, sehingga layanan yang sebelumnya berjalan dalam ratusan instance berkurang menjadi satu digit
-
Pemulihan layanan dicoba lagi, tetapi Consul kembali menjadi tidak normal
-
Disadari bahwa selain faktor penurunan performa yang semula diperkirakan, ada hal lain juga, sehingga fokus beralih dari sudut pandang Roblox terhadap Consul ke bagian internal Consul sendiri
Analisis contention (10/30 02:00 – 10/30 12:00)
-
Hasil analisis tambahan selama 10 jam menunjukkan bahwa penulisan Consul terblokir dalam waktu lama
-
Penyebab contention belum diketahui, tetapi diperkirakan perubahan CPU awal dari 64 core ke 128 core justru memperparah contention
-
Diputuskan untuk kembali ke 64 core, tetapi tidak membantu
Penemuan akar penyebab (10/30 12:00 – 10/30 20:00)
-
Fitur streaming Consul sudah diaktifkan sejak beberapa bulan sebelumnya dan sedang diperkenalkan secara bertahap karena menurunkan penggunaan CPU dan bandwidth jaringan.
-
Sehari sebelum gangguan, pada tanggal 27 pukul 14:00, fitur ini diaktifkan pada backend routing trafik.
-
Karena sudah diaktifkan sehari sebelumnya dan tampak berjalan baik, fitur ini tidak dianggap sebagai penyebab
-
Setelah analisis performa, ditemukan bukti bahwa kode streaming menyebabkan penggunaan CPU tinggi
-
Setelah streaming dinonaktifkan dan deployment selesai, terlihat bahwa latensi penulisan KV pada Consul menurun (akhirnya!)
-
Menurut HashiCorp, streaming lebih efisien, tetapi dalam implementasinya digunakan lebih sedikit elemen kontrol konkurensi (channel Go) dibanding long polling -> dalam beban tinggi hal ini memperparah contention pada satu channel Go dan menurunkan efisiensi
-
Terobosan mulai terlihat, tetapi masih ditemukan pemilihan leader yang terjadi sesekali, dan beberapa leader menunjukkan masalah latensi serupa seperti sebelumnya
-
Dengan asumsi cluster normal selama leader tertentu tidak terpilih, fokus diarahkan untuk mengembalikan layanan ke kondisi normal
-
Setelah itu HashiCorp terus menyelidiki akar penyebab dan menemukan bahwa masalah lambat pada sebagian leader disebabkan oleh BoltDB
Pemulihan layanan cache (10/30 20:00 – 10/31 05:00)
-
Setelah 54 jam gangguan, layanan siap dipulihkan
-
Selama gangguan database tetap baik, tetapi sistem cache yang menangani 1 miliar request per detik berada dalam kondisi tidak normal.
-
Setelah cache ini dipulihkan dan dipastikan normal, waktu sejak gangguan mencapai 61 jam.
Kembalinya pengguna (10/31 05:00 – 10/31 16:00)
-
Persiapan pemulihan layanan dimulai pukul 5 tanggal 31 dan selesai pukul 10.
-
Jumlah pemain yang mengakses melalui DNS dikelola dan ditingkatkan sambil dimonitor
-
Setelah 73 jam, semua pemain akhirnya bisa mengakses.
Analisis tambahan dan perubahan akibat gangguan
-
HashiCorp dan Roblox mengembangkan proses "compression" untuk mengatasi masalah performa
-
Peningkatan telemetry: ada ketergantungan siklik antara sistem telemetry dan Consul, sehingga saat Consul bermasalah data menjadi kurang. Ketergantungan siklik dihapus agar sistem telemetry tidak bergantung pada sistem yang dimonitornya
-
Perluasan availability zone dan data center
-
Membersihkan data KV yang disimpan di Consul secara tidak perlu, padahal ada storage lain.
-
Sedang menguji versi baru Consul yang mengganti BoltDB dengan penerusnya, bbolt
-
Proses pemulihan terlambat karena proses bootstrap, sehingga otomatisasi untuk hal ini sedang dilakukan dan alat serta proses baru sedang dikembangkan
1 komentar
Wow, terima kasih atas terjemahannya.
Gangguan selama 72 jam pada skala sebesar itu benar-benar terasa menakutkan.