Geçen Haftaki Kagi Olayına Dair Sonradan Analiz
(status.kagi.com)Kagi.com hizmetindeki kararsızlık sorununun çözümü
- İnceleniyor - Dağıtımdan sonra bir sorun ortaya çıktı ve ekip çözüm üzerinde çalışıyor. (12 Ocak 16:45 UTC)
- İzleme - Sorunun nedeni olduğu düşünülen yapılandırma değişikliği geri alındı ve hizmetin normale dönmesi sürekli olarak izleniyor. (12 Ocak 18:30 UTC)
- Güncelleme - Kararlılığı tamamen geri kazanmak için trafiği kısa süreliğine durdurup kullanıcıları bu sayfaya yönlendireceğiz. Hizmete yükü kontrollü biçimde geri verirken durum ilerledikçe ek ayrıntılar paylaşacağız. (12 Ocak 20:26 UTC)
- İzleme - Trafik geri yüklendi ve hizmetin tamamen normale dönmesi izlenmeye devam ediyor. (12 Ocak 21:14 UTC)
- Çözüldü - Tüm hizmetler normal şekilde çalışıyor. Sorunun çözülmesini bekleyen kullanıcılara teşekkür edildi.
Sonradan analiz
- Kagi’nin teknik lideri Zac, geçen haftaki hizmet kesintisine dair ayrıntılı bir sonradan analiz paylaştı.
- Bu olaya müdahale kapsamında kıdemli mühendis Seth ve DevOps mühendisi Luan birlikte çalıştı.
- Hizmeti kötüye kullanan ve altyapı darboğazlarını istismar eden aktörler vardı; buna karşı anında hafifletici önlemler alındı ve kod ile iletişimin çeşitli alanlarında iyileştirme çalışmaları sürüyor.
Olayın gelişimi
- 12 Ocak saat 17:30 civarında, iç izleme ve kullanıcıların sorun bildirimleri sayesinde bir altyapı sorunu yaşandığı fark edildi.
- Sorun, çeşitli bölgelerdeki kullanıcılar için yavaş yükleme veya sayfa zaman aşımına yol açtı.
- Sorunun çözümü önemli ölçüde zaman aldı; bu yüzden arka plan, süreç ve bundan sonraki planlar açıklandı.
Teknik sorun giderme süreci
- Başlangıçta sorun, tesadüfen VM’e ek RAM kaynağı yükseltmesi yapılmasıyla aynı anda ortaya çıktı.
- İzleme, yüksek gecikme ve uygulamanın veritabanı bağlantı havuzunda sorunlar olduğunu bildirdi.
- Bağlantı havuzu doygunluğa ulaştı; bu da toplam bağlantı sayısının yapılandırılmış azami bağlantı sınırını aştığı anlamına geliyordu.
- Veritabanının iç sağlığı ve sorgu performansı değerlendirilirken, bazı instance’lar değiştirilerek sıkışıklığın azaltılıp azaltılamayacağı test edildi.
- Instance’ların bir kısmını değiştirmenin yardımcı olduğu görüldü; bunun üzerine tüm bağlantı havuzlarını tek seferde tamamen sıfırlamak için kullanıcı trafiği geçici olarak durduruldu.
- Veritabanı durumu incelendiğinde, kullanıcı tablosundaki satırlara yönelik yüksek çekişmenin kök neden olduğu netleşti.
- Bu çekişme, yazma gecikmesini keskin biçimde artırdı; uygulamanın bağlantı havuzunda backpressure oluşturdu ve sonunda kullanılabilir tüm bağlantılar tükendi.
- Kagi şimdiye kadar GCP üzerinde kullanılabilen en ucuz tek çekirdekli veritabanını kullanıyordu; bu da veritabanının kolayca felç olma riskini beraberinde getiriyordu.
- Kötü niyetli aktörler tespit edilerek 24 saat içinde oluşturulmuş hesaplar ve kısa sürede 60.000’den fazla arama yapan tek bir kullanıcı hesabı belirlendi.
- Söz konusu hesabın arama özelliği kaldırıldı ve soruna yol açan belirli yazmayı devre dışı bırakan bir hotfix yayımlandı.
- Gece yarısına kadar sorun tamamen çözüldü ve aktörlerin geri döndüğüne dair işaretler yakından izlenmeye devam edildi.
Gelecek adımlar
- Bu olaydan çok şey öğrenildi; sistemi daha da güçlendirmek ve olay anındaki iletişim sürecini iyileştirmek için acil planlar şimdiden yürürlüğe alındı.
- İlk olarak, durum sayfası güncellemelerinin yeterince hızlı olmadığı kabul edildi.
- Kullanıcılara otomatik iç izlemeyi daha kolay görünür kılabilecek bir durum sayfası platformuna geçilecek; böylece platformun sağlık durumu gerçek zamanlı görülebilecek.
- Soruna yol açan sorgular doğrudan hafifletiliyor ve benzer zayıflıklar olup olmadığını görmek için yük testleri yürütülüyor.
- Altyapıda doğru noktayı daha hızlı işaret edecek ek izleme kurulacak; böylece bu olayda olduğu gibi yanlış sinyallerin peşinden giderek zaman kaybedilmeyecek.
- Bu tür kötüye kullanımları tespit eden sistemler güçlendiriliyor; çünkü bunlar yalnızca performans etkisi yaratmıyor, doğrudan maliyet de doğuruyor ve bu yüzden otomatik sınırlar konulup uygulanması gerekiyor.
- Yeni sınırlar bu yazı yayımlandığı sırada zaten devreye alınmıştı; etkileri izlenecek ve gerektiğinde ayarlanmaya devam edilecek.
- Kagi’ye erişimin yanlışlıkla engellendiğini düşünenlerin support@kagi.com ile iletişime geçmesi istendi.
GN⁺ görüşü
- Kagi, kullanıcı tablosundaki satır çekişmesinden kaynaklanan bir yazma gecikmesi sorunu yaşadı; bu durum uygulamanın bağlantı havuzunda backpressure oluşturarak hizmet kesintisine yol açtı.
- Bu sorunlar, Kagi’nin GCP’de en ucuz tek çekirdekli veritabanını kullanmasının doğurduğu riskin bir sonucu oldu.
- Kagi ekibi, bu olayın ardından sistemi güçlendirme, kullanıcılarla iletişimi iyileştirme ve kötüye kullanımı önlemek için otomatik sınırlar koyma gibi adımlarla hizmetin kararlılığını ve şeffaflığını artırma çabasını gösterdi. Bu çabalar, kullanıcılara daha güvenilir bir hizmet sunma yönündeki Kagi iradesini yansıtıyor.
1 yorum
Hacker News yorumları
Başta VM'e RAM ekleme şeklindeki altyapı yükseltmesi ile kesintinin tam olarak aynı anda gerçekleşmesinin tamamen tesadüf olduğu ortaya çıktı; ancak bu tür “tesadüfler” gerçekten çok sık olur ve sorunu izlerken varlıklarından bile şüphe etmenize yol açar.
O durumda paniğe kapılırsanız sonunda başka bir şeyi bozan bir acil düzeltmeyi (hotfix) devreye alırsınız; işte o noktadan sonra süreç çok daha acı verici hâle gelir.
Murphy Kanunları sistem yöneticileri ve geliştiriciler için acımasızdır.
Sevdiğim bir söz var: “Neyi neden/nasıl düzelttiğini bilmiyorsan, aslında düzeltmemiş olabilirsin.”
“Neyse ki” benim sorgumla ilgisi yoktu, ama bu tür iki tesadüf üst üste gelince gerçekten korkutucu oluyor.
Bu tür şeyleri yeterince yaşadıktan sonra daha fazla varsayımdan şüphe etmeyi ve henüz doğrulanmamış şeyleri doğrulanmış veri olarak işaretlememeyi alışkanlık edindim.
Önyargıları ve aceleci sonuçları tamamen ortadan kaldıramadım ama yardımcı oldu; açık fikirli kalmak epey zor bir iş.
Bir mühendis için önemli beceri, kesinti müdahalesi kapsamındaki değişiklikleri eleştirel biçimde akıl yürüterek değerlendirebilmek, debug edebilmek ve “izole edip test edebilmek”tir. Göründüğünden çok daha zordur ve genelde senior seviyeye yakın bir yetkinliktir.
Bu sorunu Discord'da bildiren kullanıcılardan biriydim. Kagi'yi seviyorum, ancak durum sayfasının her şeyin normal olduğunu göstermesi epey hayal kırıklığı yarattı.
Gerçek kullanıcıları etkileyen bir kesinti sırasında bile durum sayfasının öncelik değilmiş gibi görünmesi endişe vericiydi; umarım bundan sonra doğru şekilde güncellenir.
Geçmişte çok güvendiğim servisler, örneğin GitHub, durum sayfasını hemen güncellerdi; böylece sorunun benim cihazımda değil, servis tarafında bilinen bir sorun olduğunu anlayıp rahatlayabiliyordum.
Bu sefer o gün kar yağmadan önce yakındaki açık bir marketi bulmam gerekiyordu; sonunda Google'a gitmek zorunda kalınca biraz hayal kırıklığına uğradım.
Yine de Kagi'yi kullandığım zamanların %99,9'unda Google'dan daha iyiydi; bu yüzden kullanmaya devam edeceğim ve olay sonrası analizde söylendiği gibi durum sayfası kodunu başka bir servis/platforma taşımalarını umuyorum.
Sonunda durum sayfasına bir şey koymak başlı başına bir konuşmaya dönüşüyor; bu konuşma mühendis zamanını ve dikkatini tüketiyor, dolayısıyla kesintinin çözümü de o kadar gecikiyor.
İletişim ile gerçek kurtarma arasında denge kurmak gerekiyor; doğru cevap her zaman net olmuyor.
Yeterince insan varsa Technical Incident Manager iletişimi üstlenebilir ve iletişim tarafına daha fazla mühendis ayrılabilir, ama bu her zaman mümkün değil. Bazı sistemler özeldir, dokümantasyonu yetersizdir ve enstrümantasyonu da eksiktir.
Kişisel olarak, sorun belirtisi görülür görülmez “olası bir sorunu araştırıyoruz” şeklinde büyük ve muğlak bir duyuru yayınlayıp, ayrıntıları daha sonra doldurmayı veya duyuruyu geri çekmeyi tercih ederim. Ancak çalıştığım şirketler bu fikri pek sevmedi.
O anda Kagi'ye ciddi şekilde çekildim ve bazı sorgularda gidip gelerek kullandım; ancak LLM'ler, Perplexity ve Google'ın arama sayfasında doğrudan yanıt verdiği durumlar arttıkça Kagi'ye kalan sorgu sayısı fazla olmuyor.
Kagi bir şekilde Perplexity ile birleşirse oldukça ilginç olabilir.
Çoğu zaman sonuna kadar hiç göstermiyorlar.
Bu kesintinin bu kadar tanıdık gelmesi şaşırtıcı.
Kişisel olarak kabul etmek istemeyeceğim kadar çok kez bununla birebir aynı türde kesintilerle uğraştım; Kagi ekibi gibi veritabanı bağlantı havuzu durumu tavşan deliğine girip yeni instance'lar eklemek veya trafiği “sıfırlamak”la çözüleceğine inanmak gibi aynı hafifletme yollarını denedim, ama hepsi boşa çıktı.
Bu tür kesintilerde veritabanının tipik doygunluk metrikleri olan CPU kullanımı, IOPS vb. metriklerin pek kıpırdamaması da yardımcı olmuyor. Sorgu gecikmesi yüksek görünür, ama “CPU ve IOPS'ta boşluk var…” diye düşünürken, her zamanki gibi arka planda kilit çekişmesinin saklı olduğunu kaçırırsınız.
Deneyimime göre DB bağlantı havuzundaki anormalliklerin %98'i DB'nin kendisindeki anormalliklerden kaynaklanır. Kagi'nin hangi ilişkisel veritabanını kullandığını bilmiyorum, ancak DB'nin global I/O bekleme süresini (saniye/saniye), global kilit edinme süresini (saniye/saniye) ve normalize edilmiş sorgu başına çalışma süresini (saniye/saniye) grafiklemelerini şiddetle öneririm.
Buna CPU kullanım grafiğini de eklerseniz, büyük ölçekli performans sorunlarının çoğunu hızlıca belirleyebilen bir dashboard elde edersiniz.
Ayrı olarak, arama sorgusunun ilişkisel veritabanına yazmayı tetiklemesi biraz şaşırtıcı. İlişkisel veritabanının yalnızca kullanıcı ayarları, oturum açma yönetimi gibi yerlerde kullanılacağını düşünmüştüm.
Kagi kullanım toplama işini, örneğin sayaç artırmayı ilişkisel veritabanında yapıyorsa, bu ölçek büyüdüğünde patlayan çok tipik bir hata modudur.
Arama sonuçlarını engelleme durumunda olduğu gibi arama nedeniyle dolaylı yazmalar olabilir; ziyaret geçmişi veya analiz de elbette vardır.
Yine de her bir aramada yazma kilidi çekişmesi yaratabilecek şeyin ne olduğu net değil.
Her startup’ın bir gün yaşayacağı türden bir şey. Ben de yaşadım ve gerçekten acı vericiydi
Böyle sorunları önleyecek yetkinliği geliştirmek için zaman ya da kaynak yetersiz olabiliyor; bazen de belirli bir sorunun gerçekten yaşanabileceğini aklınıza bile getirmeden hazırlıksız yakalanıyorsunuz
Şeffaflık da önemli, öğrenmek de önemli; ama bazen telafi de önemlidir. Kagi, hizmetin kullanılamadığı süre için arama kredisi vermeyi değerlendirmeli
Özellikle gerçek zamanlı müdahalenin yetersiz kaldığını kendileri kabul etmişken
Ücretli bir hizmetteki kesinti, “kullanıcının ürün olduğu” bir hizmetteki kesintiyle aynı şey değil
İç sistemlerdeki gözlemlenebilirlik düzeyi hakkında çok şey gösteriyor
Daha erken fark etmeleri gerektiğini söylemek kolay; ama uygun Datadog panelleri ve Splunk sorguları olsaydı durum çok daha hızlı ve net biçimde ortaya çıkardı
Umarım bunu bir öğrenme fırsatı olarak görür ve daha iyi izlemeye yatırım yaparlar
Bu olay %100 bir öğrenme deneyimiydi, ama gözlemlenebilirlik konusunda biraz daha bağlam verebilirim
Kagi küçük bir ekip; bu tür olaylara müdahale edebilecek kişi sayısı fiilen 3 ve 3 farklı saat dilimine dağılmış durumdayız. Ben ve çekirdek geliştirici için bu, web kariyerimizin ilk aşaması; yani bunları zaten yaşamış Silikon Vadisi veteranları değiliz
Öğrenecek çok şeyimiz olduğu açık; ama Kagi’yi sıfırdan inşa ettiğimiz için şimdiye kadar geldiğimiz yol ve bundan sonra gideceğimiz yönle gurur duyuyorum
Gözlemlenebilirlik konusunu yaklaşık son 6 aydır daha ciddiye almaya başladık. Şu anda çok sayıda panelimiz ve şirket sohbet kanalına doğrudan düşüp ilgili kişiyi çağıran uyarılarımız var
DB’nin birincil sorumlusu olarak GCP’nin Query Insights aracı çok yardımcı oluyor. Kesinti sırasında izleme sistemleri alarm verdi ve Query Insights da “suçlu” sorguyu gösterdi; ama dünyadaki tüm izleme sistemlerine sahip olsanız bile kök nedeni ya da en verimli hafifletme adımını yorumlayacak deneyiminiz eksik olabilir
Başka bir deyişle, dikkatli olmazsak kendi sistemimizin bize gösterdikleri tarafından gaslighting’e uğramayacak bilgeliğe henüz tam sahip değiliz. Geriye dönüp bakınca GCP Query Insights’ın %100 doğru olduğunu ve bunun uygulama alanındaki bir bug olmadığını söyleyebilirim
Büyüme sayesinde artık ekibi epey genişletebilecek durumdayız; daha önce SRE danışmanlığı da aldık ve bundan sonra da tam zamanlı ya da yarı zamanlı destek alarak iyileştirmeye devam etmek istiyoruz
Yani tek bir kullanıcı scraper çalıştırıp hizmeti 7 saat boyunca mı düşürdü? Dışarıdan “bunu öngörmeliydiniz” demenin kolay olduğunu biliyorum, ama testlerde kimsenin “Çok fazla arama olursa ne olur?” diye sormamış olması tuhaf
https://news.ycombinator.com/item?id=39019936
Özetle çekirdek kadromuz çok küçük ve genç bir ekip; herkes aynı anda birden fazla rol üstleniyor. Henüz özel bir SRE ekibimiz yok
“Çok fazla arama olursa ne olur?” konusuna gelirsek, https://kagi.com/stats sayfasına bakarsanız zaten “çok sayıda arama” olduğunu ve günde 400 bine yaklaştığımızı görebilirsiniz. Günlük kullanımda sistem yeterli kapasite payıyla çalışıyor ve bazı otomatik ölçekleme önlemlerimiz de var
Sorun, bazı kullanıcıların patolojik bir vakayı kötüye kullanmasına yol açan ayrıntılardaydı. Deneyim eksikliğimiz nedeniyle hangi doğal trafiği ya da patolojik trafiği önceden öngörüp simüle edebileceğimizi bilmiyorduk
Aynı anda arama yapan 20 bin kullanıcıyı yük simülasyonuna sokmak başlangıçta yapılabilir bir deney gibi geliyor; buna benzer şeyler de yaptık. Ama bu kesintiye bakınca, yine de bu sorunu yakalayamayacaktı
Şimdiye kadar çalışan hizmet üzerinde güvenlik tarayıcısı çalıştıran yaklaşık 10 kişi oldu ve o zaman oluşan trafik bu kesintidekinden fazlaydı
Bir yandan özellik de geliştirmemiz gerekirken bu tür geliştirme dengesini kurmak çok zor; kesinlikle daha fazlasını yapmalıydık. Başka bir yazıda söylediğim gibi, yakın zamanda ekibi büyüterek bu tür çabalara gereğinden fazla ince yayılmamaya çalışacağız
Geriye dönüp bakınca söylenecek çok şey var; umarım buraya nasıl geldiğimizi biraz daha şeffaf biçimde aktarabilmişimdir
Özellikle de biri ilk kez o şekilde vurduysa
Karşılaştırmak gerekirse benim ilgilendiğim sistem FAANG ölçeğinde değil, ama istek oranı açısından kesinlikle Kagi’den büyük. Kagi de hızlı öğrenecektir; bu arada böyle sorunlar tekrar yaşansa bile bunun bir ölçüde iyi olduğunu düşünüyorum. Doğru yönde ilerlediklerinin de bir işareti
Kagi’nin ücretli kullanıcısı olarak kesinti yaşayınca Google’ın güvenilirliğini ne kadar kanıksadığımı fark ettim
Google son 20 yılda, bir kez dışında, benim için hiç çökmemişti. Bir arama motoruna erişimi kaybetmek epey kritik
Kagi’yi gerçekten seviyorum ve para ödüyorum; ama kullanımımın ikinci ayında kesinti yaşamam oldukça rahatsız ediciydi. Olay sonrası analizleri sevsem de, keşke okumak zorunda kalmasam
Yine de bu deneyimle Kagi’nin daha dayanıklı ve güvenilir bir hizmete dönüşmesini umuyorum
Arama motoru, e-posta sağlayıcısı ya da ISP gibi kilitleme etkisi olan bir hizmet değil
Kagi’nin hızlı olmasına ve her yerde iyi çalışmasına kesinlikle bel bağlamıştım
Bir müşteride yeni bir ağ aracının kavram kanıtını çalıştırdığımız zaman aklıma geldi. Çalıştırdıktan yaklaşık 2 dakika sonra müşterinin tüm ağı çöktü
İzole bir sandbox bölgesindeydik, bu yüzden ürünümüzün tüm ağda kesintiye yol açmasının bir yolu yoktu; ama kafamın içinde “İmkânı yok, değil mi… değil mi?!?!” diye geçiriyordum
“Daha sonra engellediğimiz hesapla iletişime geçtik; hesap, sonuçlarımızı otomatik olarak scrape etmek için kullanıldığını iddia etti ve bu, kullanım şartlarımızın izin vermediği bir şey.”
Olası tüm giriş RPC/API/HTTP isteklerine, özellikle de herkese açık isteklere QPS sınırı koymak gerekir
Otomatik tamamlama özelliği olan bir arama fonksiyonumuz vardı; hızlı yazan kullanıcıları desteklemek için o endpoint’in hız sınırını bilerek kaldırmıştık
Bir gün sabah 6 civarında Tennessee’de biri işe gelip cüzdanını klavyenin üstüne bırakmış; cüzdan bir tuşa basılı kalmış ve her tuş girdisinde API’ye istek atmaya başlamış
Doğal olarak yaklaşık 15 dakika sonra DB çok kararsız hale geldi; DB gecikmesi o kadar büyüdü ki web sunucularından biri çöktü. Zincirleme arızalar devam etti ve tüm operasyon kümesi düştü
O gün hız sınırının yeniden eklendiğini söylemeye gerek yok