Roblox'un geçen yılki 73 saatlik kesintisinin postmortem'i
(blog.roblox.com)Kesinti özeti
-
Kesinti 72 saat sürdü
-
İki temel neden vardı
-
Anormal derecede yüksek okuma/yazma yükü altında Consul'un yeni streaming özelliği etkinleştirildiğinde aşırı contention ve performans düşüşü oluştu
-
Belirli yük koşullarında, Consul'un lider seçimi ve veri replikasyonu için write-ahead-log'u yönetmekte kullandığı açık kaynak BoltDB'de performans sorunu ortaya çıktı
-
-
Tek bir Consul kümesi bu sorunların etkisini daha da ağırlaştırdı
-
Consul uygulamasında gizli olan ve birbiriyle ilgisiz gibi görünen bu iki sorunun bulunması zaman aldığı için kesinti uzadı
-
Kesintinin nedenine dair daha iyi görünürlük sağlaması gereken izleme sistemi de Consul gibi etkilenen sistemlere bağımlı olduğu için tespiti daha da zorlaştırdı
Küme ortamı ve HashiStack
-
Roblox 18.000 sunucu ve 170.000 container işletiyor
-
Genellikle HashiStack olarak adlandırılan Nomad, Consul ve Vault kullanılıyor
O sırada Roblox, streaming özelliğini kullanmak için Consul'u 1.9'dan 1.10'a yükseltti.
İlk tespit (10/28 13:37)
18 Ekim öğleden sonra Vault performansı düştü ve bir Consul sunucusunun CPU yükü yükseldi.
İlk sınıflandırma (10/28 13:37 – 10/29 02:00)
-
Consul kümesi metriklerinde yazma gecikmesi arttı
-
Nedeni donanım performans düşüşü olabilir diye düşünüldü ve Consul kümesi düğümlerinden birinin değişimine başlandı
-
Birlikte çalışmak için HashiCorp çalışanları sürece katıldı
-
Donanım değişiminden sonra da Consul performansı düşmeye devam etti ve 16:35'te oyuncu sayısı normalin %50'sine indi
-
Consul servis keşfi için kullanılıyor, Nomad ve Vault da Consul'a bağlı olduğundan Consul bir SPoF idi.
-
Bu noktada yeni bir hipotez olarak trafiğin neden olduğu düşünüldü. Yüksek trafik nedeniyle Consul'un artık yükü kaldıramadığı varsayıldı
-
Consul kümesindeki tüm düğümler daha güçlü sistemlerle değiştirildi. (çekirdek sayısı 2 katına çıkarıldı, daha hızlı NVME SSD kullanıldı)
-
Consul geçişi neredeyse tamamlandı ama küme normale dönmedi
Hizmeti geri getirme denemesi #1 (10/29 02:00 – 04:00)
-
Kesintiden önceki Consul kümesi snapshot'ına geri dönmeye karar verildi
-
Kullanıcı verilerinin iyi durumda olduğu, sistem verilerinde kısmi kayıp olsa da bunun kabul edilebilir olduğu değerlendirildi
-
Snapshot geri yüklendikten sonra Consul ile sürekli haberleşen sistemlerin oluşturacağı yükün yeni sorunlara yol açmaması için erişim iptables ile engellendi
-
Snapshot geri yüklendikten sonra göstergeler iyi görünüyordu ancak iptables engeli kaldırılınca sistem tekrar aynı arıza durumuna döndü
Hizmeti geri getirme denemesi #2 (10/29 04:00 – 10/30 02:00)
-
Dış trafik engellendi ve zorunlu olmayan kullanımlar kaldırıldı; yüzlerce instance ile çalışan servisler tek haneli sayılara indirildi
-
Hizmeti yeniden ayağa kaldırma denendi ancak Consul tekrar anormal duruma geçti
-
Başta düşünülen performans düşüşü etkenlerinin dışında başka bir şey daha olduğu anlaşıldı ve Roblox açısından Consul'a bakmak yerine Consul'un içi incelenmeye başlandı
Contention analizi (10/30 02:00 – 10/30 12:00)
-
10 saatlik ek analiz sonucunda Consul yazmalarının uzun süre bloklandığı anlaşıldı
-
Contention'ın nedeni bilinmiyordu ancak ilk CPU değişikliğinin 64 çekirdekten 128 çekirdeğe çıkarılmasının contention'ı daha da kötüleştirdiği düşünüldü
-
64 çekirdeğe geri dönmeye karar verildi ve dönüldü ama fayda etmedi
Kök nedenin bulunması (10/30 12:00 – 10/30 20:00)
-
Consul'un streaming özelliği birkaç aydır etkin durumdaydı ve CPU kullanımıyla ağ bant genişliğini düşürdüğü için kademeli olarak devreye alınıyordu.
-
Kesintiden bir gün önce, 27'sinde saat 14:00'te trafik yönlendirme backend'inde bu özellik etkinleştirildi.
-
Bir gün önce etkinleştirilmiş ve düzgün çalışmış olduğu için neden olarak düşünülmedi
-
Performans analizinden sonra streaming kodunun yüksek CPU kullanımına yol açtığına dair kanıt görüldü
-
Streaming devre dışı bırakılıp dağıtım tamamlandıktan sonra Consul'un KV yazma gecikmesinin azaldığı doğrulandı (nihayet!)
-
HashiCorp, streaming'in daha verimli olduğunu ancak uygulamada long polling yerine daha az sayıda eşzamanlılık kontrol öğesi (Go channel) kullandıklarını belirtti -> bu da yüksek yük altında tek bir Go channel üzerindeki contention'ı artırarak verimliliği düşürdü
-
Bir çıkış yolu görünmüştü ama hâlâ aralıklı lider seçimi gözleniyordu ve bazı liderlerde öncekiyle benzer gecikme sorunları vardı
-
Belirli liderler seçilmediği sürece kümenin normal çalıştığı değerlendirilerek odağın hizmeti normal duruma döndürmeye verilmesi kararlaştırıldı
-
Sonrasında HashiCorp kök nedeni incelemeye devam etti ve bazı liderlerin yavaş olmasının BoltDB'den kaynaklandığını buldu
Cache hizmetinin geri gelmesi (10/30 20:00 – 10/31 05:00)
-
Kesintinin 54. saatinde hizmeti geri getirmek için hazır hale gelindi
-
Kesinti sırasında veritabanı iyiydi ancak saniyede 1 milyar isteği işleyen cache sistemi anormal durumdaydı.
-
Bu cache geri yüklenip normal olduğu doğrulandığında kesintinin üzerinden 61 saat geçmişti.
Kullanıcıların geri dönüşü (10/31 05:00 – 10/31 16:00)
-
31'inde saat 05:00'te hizmeti geri döndürme hazırlıkları başladı ve 10:00'da tamamlandı.
-
DNS üzerinden erişen oyuncu sayısı kontrollü biçimde artırıldı ve süreç izlenerek yönetildi
-
73 saat sonra tüm oyuncular yeniden erişebilir hale geldi.
Ek analiz ve kesinti sonrası yapılan değişiklikler
-
HashiCorp ve Roblox performans sorununu çözmek için bir "sıkıştırma" süreci geliştirdi
-
Telemetri iyileştirmesi: telemetri sistemi ile Consul arasında döngüsel bağımlılık vardı, bu yüzden Consul'da sorun olduğunda veri yetersiz kalıyordu. Telemetri sisteminin izlediği sistemlere bağımlı olmaması için bu döngüsel bağımlılık kaldırıldı
-
Kullanılabilirlik bölgeleri ve veri merkezleri genişletildi
-
Başka depolama seçenekleri varken Consul'da tutulan veya gereksiz olan KV verileri temizlendi.
-
BoltDB'nin halefi olan bbolt'u kullanan yeni bir Consul sürümü test ediliyor
-
Bootstrap süreci nedeniyle toparlanma geciktiği için bunun otomasyonu ile yeni araçlar ve süreçler geliştiriliyor
1 yorum
Çeviri için teşekkürler.
O ölçekte 72 saatlik bir kesinti gerçekten korkutucu görünüyor.