Video kiskirtici bir tabloyla aciliyor: 2 milyar kullaniciya Postgres ile hizmet veren Instagram'in yaninda Reddit, Notion, Discord ve Strava da yuklerinin onemli bir kismini Postgres'te tutuyor. Hepsi alternatifleri incelemis, hepsi kalmayi secmis. Soru da buradan doguyor: bu ekipler neyi biliyor da 'Postgres olceklenmez' ezberine uymuyor?

Hikaye 2010'da basliyor: uc muhendis, kiralanmis sanal sunucular, fotograflarin durdugu nesne deposu ve geri kalan her sey (hesaplar, meta veriler, yorumlar, begeniler, takip grafigi) icin tek bir Postgres. 2011'de 10 milyon kullanicida bile tablo ayni. 2012'de 1 milyar dolarlik satin almada 27 milyon kullanici ve 2 terabaytilik tek veritabani var. Videonun sonuna sakladigi ders burada filizleniyor: iyi isletilen sikici teknoloji, kotu isletilen yeni teknolojiyi yener.

2012'de tek makine tavana vuruyor: donemin kiralanabilir en buyuk sunucusunun bellegi dolmak uzere, disk hizi doygun, dikey buyuyecek yer kalmamis. Videonun onerdigi refleks onemli: panikle veritabani degistirmek yerine tam olarak neyin tikandigini bul ve onu duzelt. Ilk tikanan sey de herkesin tahmin ettiginden farkli cikiyor.

Ilk duvar veri boyutu degil, baglantilar. Her baglanti 1,3 megabayt bellek tutuyor; onlarca uygulama sunucusunun her biri kendi kucuk havuzunu acinca (ornek hesapta 50 sunucu carpi 30 baglanti) ortaya 1500 baglanti ve tek satir is yapmadan yenen 2 gigabayt bellek cikiyor. Cozum PgBouncer: uygulama ile veritabani arasina giren hafif bir vekil, binlerce gelen baglantiyi birkac duzine gercek baglanti uzerinde cokluyor. Bellek onbellegi, siralamaya ve sorgu planlamaya geri donuyor. Videonun iddiasi sert: havuzlayicisi olmayan her ciddi Postgres kurulumunun bu hafta yapacagi en yuksek kaldiractli is bu.

Havuzlama nefes aldiriyor ama yuk buyumeye devam ediyor ve klasik koro devreye giriyor: 'artik NoSQL zamani.' Video bu receteyi reddediyor; gerekcesi, bolumlendirme derdinin Cassandra'ya gecince yok olmadigi, sadece baska bir soyutlamanin arkasina saklandigi. Ustelik donus bileti yok: bir kez gectin mi geri gelmek neredeyse imkansiz. Instagram bunun yerine Postgres'i yatay hale getirmeye karar veriyor.

Sharding karari veriliyor ama asil kaderi shard anahtari belirliyor. Dogal aday kullanici kimligi: bir kullanicinin fotograflari ve begenileri ayni shard'da duruyor, 'profilimi goster' tek shard'a gidiyor, hizli ve temiz. Fakat sosyal agin gercek sorgusu 'takip ettiklerimin fotograflarini goster' ve 200 takipci 50 shard'a dagilmissa tablo kabusa donuyor: 50 veritabanina fanout, uygulamada birlestirme ve siralama, en yavas shard kadar yavas akis, yeni ariza modlari. Bu takas kalici; ekip bunu onbellekleme, akilli dagitim ve onceden hesaplanmis akislarla uygulama katmaninda cozmeyi goze aliyor.

Videonun 'mimarinin kendisi' dedigi fikir burada geliyor: verinin nasil bolundugu ile nerede durdugunu ayirmak. Ekip birkac bin mantiksal shard tanimliyor (Postgres'te ayni tablolara sahip semalar), baslangicta hepsi tek fiziksel makinede. Uygulama sadece 'bu kullanici hangi mantiksal shard'da' diye bakiyor. Makine dolunca veri yeniden yazilmiyor; mantiksal shard'lar yerlesik akis replikasyonuyla yeni makineye kopyalanip esleme tablosu guncelleniyor (ornekte dolmak uzere olan dugumun shard araliginin yarisi yeni dugume tasiniyor, iki dugum de yariya iniyor). Shard sayisini koda gommeyen bu tasarimda buyume bir yapilandirma degisikligine iniyor.

Dagitik duzende klasik otomatik artan sayaclar aninda carpasiyor: her shard kendi 1-2-3 serisini uretirse ayni kimlikte iki farkli fotograf doguyor. Rastgele 128-bit kimlikler devasa ve sirasiz oldugu icin zaman sorgularini pahalilastiriyor; bilet dagitan merkezi sunucu tek hata noktasi; harici kartanesi servisi ise izlenecek yeni parca demek. Instagram'in cozumu uc parcali 64-bit sayi: 41 bit ozel baslangicli milisaniye damgasi (41 yillik alan), 13 bit shard kimligi (8 bine kadar shard), 10 bit milisaniye ici sayac (shard basina saniyede yuz binlerce kimlik). Kucuk bir Postgres fonksiyonu olarak her shard'da calisiyor, koordinasyon yok, dis bagimlilik yok; damga ust bitlerde oldugu icin kimlige gore siralamak 'en yeniler' demek, ayri zaman indeksi gerekmiyor. Kalip daha sonra Discord ve Slack dahil tum sektore yayiliyor; videonun uyarisi pratik: bu duzene milyar satirdan sonra degil, ilk gunden gecin.

Video, Postgres'in icinde durup da az kullanilan uc ozelligi ayrica parlatiyor. Kismi indeksler: milyar satirlik tabloda sadece son 30 gunu indeksleyip indeksi onda bire indirmek, eski veri yaslandikca indeksin kucuk kalmasi. Fonksiyonel indeksler: 64 karakterlik jetonun tamami yerine ilk 8 karakterini indeksleyip benzer hizi onda bir alanda almak. Mantiksal replikasyon: ekleme-guncelleme-silme akisini arama indeksine, onbellek gecersizlemeye ve analitik ambara gercek zamanli yayinlamak; uygulamada cift yazim ve kuyrukla elle kurulan duzenin veritabaninda hazir gelmesi.

Durustluk notu: anlatilan hikaye 2010-2015 doneminin; satin alma sonrasi Meta altyapisina tasinan Instagram'in takip grafigi bugun TAO adli dagitik graf sisteminde. Ama videonun bes kurali gecerliligini koruyor: mecbur kalmadan shard'lama (ekip 27 milyon kullaniciya kadar bekledi), mantiksal ile fizikseli ayir, kartanesi kimlige ilk gunden gec, once baglanti havuzunu kur, yeni altyapiyi ancak gercekten yeni bir problemde (vektor arama, zaman serisi, graf) satin al. Son cumle videonun teziyle kapaniyor: darbogaz veritabani degil, etrafindaki mimari.

AI yorumu

"Benim cikardigim ders net: olcek sorunu neredeyse hic veritabaninin sucu degil, etrafindaki mimarinin sucu; sikici teknolojiyi iyi isletmek, heyecanli teknolojiye gecmekten cogu zaman daha ucuza geliyor."

Kaynaklar

postgres · sharding · pgbouncer · kartanesi id · instagram