Jepsen’in TigerBeetle 0.16.11 doğrulaması
(jepsen.io)- Çift taraflı muhasebe için OLTP veritabanı TigerBeetle, güvenlik ve hızı öne çıkarıyor; Jepsen, 0.16.11~0.16.30 serisini 3~6 makinelik Debian kümelerinde hata enjeksiyonuyla birlikte doğruladı
- Testler, açık zaman damgası sıralaması ile dokümantasyon tabanlı tek iş parçacıklı durum makinesi modelini birleştirerek Strong Serializability ile hesap, transfer ve sorgu semantiklerini birlikte kontrol etti
- Başlıca güvenlik hataları, çoklu filtre sorgu sonuçlarında eksik kayıtlar ve Java istemcisinde header zaman damgası hatasıydı; 0.16.26 ve sonrasında çeşitli hata kombinasyonlarında da Strong Serializability iddiasıyla uyumlu sonuçlar gözlemlendi
- Kullanılabilirlik tarafında istemcinin sonsuz yeniden denemesi, oturum eviction sırasında süreç çökmesi, tek düğüm arızasında gecikmenin keskin artması, disk bit flip’i ve yükseltme sırasında sunucu panic’i, tek düğüm disk kaybı için kurtarma yolunun olmaması ortaya çıktı
- TigerBeetle 0.16.43, bildirilen sorunların çoğunu yansıtarak tek düğüm arızası gecikmesini azaltmayı ve
tigerbeetle recoverkomutunu içeriyor; operatörlerin 0.16.43’e yükseltme ve 0.16.26+ sürümlerine geçiş sırasında sürüm notlarını kontrol etmesi gerekiyor
TigerBeetle’ın tasarımı ve test kapsamı
- TigerBeetle, çift taraflı muhasebe için bir OLTP veritabanıdır; keyfi satırlar, nesneler, graflar veya blob’lar yerine yalnızca hesapları (accounts) ve transferleri (transfers) saklar
- Viewstamped Replication (VR) temelinde Strong Serializable tutarlılık sağlama sözü verir ve finansal işlemler, envanter, biletleme, kamu hizmeti ölçümü gibi modellere uygun olarak tasarlanmıştır
- Yüksek çekişmeli ve yüksek işlem hacimli iş yükleri için tüm yazmaları birincil VR düğümünün tek çekirdeğinden geçirir; scale-out yerine scale-up yaklaşımına odaklanır
- Performans için toplu işleme, I/O paralelleştirme, sabit şema ve sabit boyutlu, cache hizalı veri yapıları kullanır
- Hata modeli bellek, süreç, saat, depolama ve ağı açıkça ele alır
- Süreçler durabilir veya çökebilir
- Saatler ileri ya da geri sıçrayabilir
- Diskler yalnızca tamamen arızalanmakla kalmaz, kısmi yazma bozulması ve veri kirlenmesi de yaşayabilir
- Ağ gecikme, paket düşürme, çoğaltma, yanlış teslimat ve mesaj bozulmasına yol açabilir
- TigerBeetle deterministik simülasyon testi kullanır; VOPR testi tüm kümeyi ve saat, disk, ağ arayüzlerini simüle eder
Veri modeli ve istek semantiği
- Veri modeli iki tür kayıttan oluşur: accounts ve transfers
- Hesap; kullanıcı tanımlı 128 bit
id,ledger,flags,timestamp,code,user_data_32,user_data_64,user_data_128vb. alanlara sahiptir - Transfer;
debit_account_id,credit_account_id,amount,ledger,flags, kullanıcı tanımlı alanlar vb. içeren değişmez bir kayıttır
- Hesap; kullanıcı tanımlı 128 bit
- Transfer tek adımda anında post edilebilir; pending ve post/void olarak ayrılan 2 aşamalı transfer de mümkündür
- Pending transfer, debit ve credit hesaplarının kapasitesini rezerve eder
- Daha sonra pending amount değerine kadar post edilebilir veya void edilebilir
timeoutalanı otomatik süre dolumunu kontrol eder
- Hesaplar,
closedbayrağı ve dört bakiye alanı dışında değişmezdir; transferler ise her zaman değişmezdir- Bir transferi değiştirmek veya geri almak için yeni bir dengeleme transferi oluşturmak gerekir
- İstekler tek bir mantıksal işlem türünü temsil eder ve genellikle en fazla 8190 event içeren bir batch barındırır
create_accounts,create_transfersyazma istekleridirlookup_accounts,lookup_transfers,query_accounts,query_transfers,get_account_transfers,get_account_balancesokuma istekleridir
- Her istek veritabanı açısından tek bir transaction’dır; ancak commit edilmiş bir istekteki bazı event’ler mantıksal olarak başarısız olup hata kodu döndürebilir
- Event’ler arasında koşullu atomiklik gerekiyorsa, aynı chain içindeki event’lerin ya tamamının başarılı ya da tamamının başarısız olması için chain kullanılır
Jepsen test yöntemi
- Jepsen test paketi, Jepsen testing library kullanarak özellik tabanlı testleri hata enjeksiyonuyla birleştirir
- Test hedefi TigerBeetle 0.16.11’den 0.16.30’a kadar olan sürümlerdir; çeşitli geliştirme build’leri de dahildir
- Küme 3~6 Debian düğümünden oluşur
- Hem LXC container’larında hem de EC2 VM’lerinde çalıştırılmıştır
- TigerBeetle’ın resmi istemcisi tüm düğümlere bağlanan bir smart client olduğu için eşzamanlılık hatalarını gizleyebilir
- Jepsen normal smart-client davranışını da test eder
- Aynı zamanda her istemciyi tek bir düğümle sınırlayan bir yöntem de kullanır
- Doğrulayıcı iki aşamada çalışır
- Başarılı isteklerin yürütme zaman damgalarını okur; başarısız veya timeout’a düşen yazmalar için zaman damgasını daha sonra gözlemlenen etkilerden çıkarır
- Çıkarılan zaman damgası sırasına göre dokümantasyon tabanlı TigerBeetle durum makinesi modelini çalıştırarak sonuçları ve hata kodlarını doğrular
- Durum makinesi modeli 1.600 satırdan fazla Clojure ile yazılmıştır; hesap ve transfer map’leri, indeksler, transient error’lar, iç istatistikler, saat akışı vb. içerir
- Yinelenen ID’leri, monoton olmayan zaman damgalarını, bakiye kısıtlarını, uyumsuz bayrakları, chain’in speculative execution ve rollback davranışlarını işler
- Yüksek performanslı kalıcı veri yapısı kütüphanesi Bifurcan kullanılır
Hata enjeksiyonu ve dosya bozulması testi
- Jepsen süreçlere
SIGKILL,SIGSTOP, çeşitli ağ bölünmesi biçimleri, milisaniyelerden yüzlerce saniyeye kadar saat değişiklikleri ve hızlı ileri-geri saat değişimleri enjekte etti - Test sırasında birden fazla sürüme düğüm yükseltmeleri de yapıldı
- Yeni dosya bozulması nemesis’iyle çeşitli depolama hataları oluşturuldu
- Rastgele bit flip ile kozmik ışın etkisi benzeri bozulmalar simüle edildi
- Yanlış yönlendirilmiş yazmayı simüle etmek için dosya chunk’ları başka chunk’larla değiştirildi
- Kayıp yazmayı simüle etmek için dosya chunk snapshot’ları daha sonra geri yüklendi
- TigerBeetle düğümlerinin tek bir veri dosyası vardır; dosya, öngörülebilir offset’lerdeki zone’lara ayrılır
- WAL header, superblock zone’daki yinelenen copy’ler gibi yalnızca belirli zone’ları bozan testler yapıldı
- Birden fazla zone’u veya tüm dosyayı bozan testler de dahil edildi
- “helical” disk hatası, tüm düğümlerdeki dosyaları bozarken her düğümde farklı bir chunk’ı bozan bir yöntemdir
- TigerBeetle’ın güncel replica dosya yerleşimi genellikle bit-for-bit aynı olduğundan, tek bir kaydın tüm replica’larda kurtarılamaz biçimde bozulduğu durumdan kaçınmayı amaçlar
- WAL’in head’i düğüme göre farklı konumda olabildiği için istisna oluşturur
Bulunan güvenlik sorunları
- 0.16.13’te
query_accounts,query_transfers,get_account_transfersyanıtlarının bazı ya da tüm sonuçları atlaması sık sık görüldü- Atlanan sonuçlar her zaman yanıtın son kısmındaydı ve yanıt, doğru sonuçların bir prefix’iydi
- Tek filtreli sorgularda görülmedi;
ledgervecodegibi çoklu filtre kombinasyonlarında ortaya çıktı - Nedeni, birden çok indeks arasındaki zig-zag merge join işleminde bounds check hatasıydı
- #2544 ile izlendi ve 0.16.17’de düzeltildi
- Jepsen testlerini desteklemek için 0.16.13’e eklenen Java istemcisi header API’si hatalı veya yinelenen yürütme zaman damgaları döndürüyordu
- Nedeni, Java istemcisindeki mutable singleton yanıt nesnesi
Batch.EMPTYidi - Başarılı yanıt boş batch olarak temsil edildiğinden, birden çok yanıt aynı nesnenin header’ının üzerine yazıyordu
- #2495 ile düzeltildi ve 0.16.14’e dahil edildi
- Gerçek veri tutarlılığını etkilemez; yalnızca Java istemcisi header API’sindeki istek zaman damgalarını etkiler
- Nedeni, Java istemcisindeki mutable singleton yanıt nesnesi
- 0.16.26 ve sonrasında gözlemlenen sonuçlar, TigerBeetle’ın Strong Serializability iddiasıyla uyumludur
- Process pause, crash, ağ partition, clock error, disk corruption ve upgrade kombinasyonlarında da bu özellik korunur
İstemci ve istek işleme sorunları
- TigerBeetle dokümantasyonu, isteklerin timeout’a düşmediğini ve istemcinin yanıt alana kadar retry etmeye devam ettiğini açıklar
- Java asenkron metodu
CompletableFuturedöndürür ve.get(timeout, timeUnit)veya.orTimeout(...)gibi timeout API’leri kullanılabilir - .NET istemcisinin
Taskyapısı da timeout tabanlıWait()sağlar
- Java asenkron metodu
- Sonsuz retry, hem definite error hem de indefinite error durumlarını gizleyebilir
- Örneğin TCP bağlantısı
ECONNREFUSEDile başarısız olursa, ilgili ilk isteğin yürütülemeyeceği anlamına gelen definite failure’dır - Ancak istemci bunu çağırana bildirmeyip yalnızca içeride retry etmeye devam ederse, çağıran açısından timeout veya kesinti gibi indefinite failure’a dönüşür
- Örneğin TCP bağlantısı
- Bu sorun #206 içinde tartışılıyor ve rapor tarihi itibarıyla çözülmemiş durumda
- Jepsen, definite error ve indefinite error durumlarının birinci sınıf kavramlar olarak ifade edilip çağırana döndürülmesini önerir
- Otomatik retry korunabilir, ancak yapılandırılabilir olmalı; bağlantı başlatma ve yanıt bekleme için azami sürelerin seçenek olarak sunulması önerilir
- 0.16.11 Java istemcisinde, timeout işlemek için senkron çağrı thread’ini interrupt etmek veya asenkron çağrıdan sonra client’ı close etmek tüm JVM’in segfault ile çökmesine yol açabiliyordu
- Nedeni, request data structure içinde unset field bulunmasıydı
- İstemci, request oluşturma ile gönderme arasında kapatılırsa Zig’in varsayılan
0xaaa...adresi dereference ediliyordu - #2435 ile düzeltildi ve 0.16.12’ye dahil edildi
- Resmî istemciler, sunucu session eviction bildirdiğinde tüm process’i crash ettiriyordu
- TigerBeetle varsayılan olarak concurrent session sayısını 64 ile sınırlar
- Sunucudan daha yeni bir istemci sürümü kullanıldığında da eviction gerçekleşir
- #2484 sonrasında, 0.16.13’ten itibaren eviction durumunda process crash yerine çağırana error döndürülür
Tek düğüm arızasında gecikmenin keskin artması
- Tek düğüm arızalarında client latency’nin 3–5 basamağa kadar arttığı örnekler tekrarlandı
- 5 düğümlü bir kümede tek düğüm öldürüldüğünde minimum latency 1 ms’nin altından 10 saniyeye çıktı
- 3 düğümlü kümede bir düğümün öldürüldüğü testte 1–50 ms olan latency istek başına yaklaşık 100 saniyeye kadar yükseldi ve düğüm yeniden başlatılana kadar neredeyse 1000 saniye sürdü
- Neden, TigerBeetle’ın prepare yayma yöntemiyle ilgilidir
- Geleneksel VR’de primary tüm secondary’lere prepare gönderir ve ack’leri doğrudan alır
- TigerBeetle düğümleri ring olarak yerleştirir; primary bir sonraki secondary’ye prepare gönderdiğinde her secondary bunu sonraki düğüme iletir
- Bu yöntem tek bir düğümün bandwidth gereksinimini azaltır, ancak ring’deki sonraki
freplica’dan biri başarısız olursa commit engellenebilir
- Bu sorun #2739 ile izleniyor
- 0.16.30, prepare mesajlarının yarısını ring’in ters yönüne göndererek bunu hafifletti
- Bazı prepare mesajları arızalı düğümün etrafından dolaşabilir
- Jepsen testlerinde 100 saniyeler düzeyindeki latency 1–30 saniye seviyesine düştü
- 0.16.43 ek performans iyileştirmeleri içerir
- Düğümler ring’in iki yönünde de replicate eder
- Ring topology dinamik olarak değişir; küme, ağ koşullarına ve arızalara göre düğüm sırasını ayarlar
Disk bozulması ve sunucu crash’i
- 0.16.20’de superblock, WAL ve grid zone’da tek bitlik bozulmanın startup crash’e yol açtığı durumlar vardı
- Loglar
panic: reached unreachable codeçıktısını verip kapanıyordu - Nedeni, sector padding kontrolündeki hataydı
- Loglar
- TigerBeetle checksum, chunk’ın verisini kapsar ancak padding’i hariç tutar
- Padding’deki 0 bit 1’e dönerse checksum geçer
- Daha sonra padding’in hâlâ 0 olup olmadığını kontrol eden assertion başarısız olur ve sunucu crash eder
- Padding bozulması safety’yi zedelemez; tekrar 0 yapılabilir veya başka bir replica’dan onarılabilir
- VOPR daha önce sector’ün tamamını bozduğu için bu hatayı bulamadı
- Sector bozulması checksum başarısızlığına ve repair yoluna neden oluyor, padding assertion’a kadar ulaşmıyordu
- TigerBeetle, #2681 kapsamında VOPR’a single-byte error ekledi
- 0.16.26’dan itibaren padding’i bozulmuş sector, crash yerine repair edilir
- Superblock copy number bit flip’i de aynı panic’e yol açabiliyordu
- Superblock’un dört kopyasının her biri farklı 2 baytlık
copynumarasına sahiptir ve checksum bu numarayı atlar - Diskte bozulan copy number belleğe okunduktan sonra write sırasında 0–3 aralığı assertion’ını başarısız kılıyordu
- 0.16.26’da copy number reset edilerek çözüldü
- Superblock’un dört kopyasının her biri farklı 2 baytlık
Yükseltmeyle ilgili sorunlar
- 0.16.25 ve altından 0.16.26 veya üstüne yükseltme yapılırken
panic: checkpoint divergedçökmesinin tekrar tekrar gözlemlendiği görüldü- Nedeni, 0.16.26’daki
CheckpointStateyapısının değişmesiydi - Yeni sürüm released blocks kümesini içeriyordu, ancak eski sürümle uyumlu durum aktarımı sırasında bu bilgi boş olabiliyordu
- Sonrasında bir düğüm 0.16.26 ile yeniden başlatıldığında, diğer replikaların bildiği released blocks bilgisini kaybetmiş durumda kalabiliyordu
- Assertion divergence’ı algılayıp çökerek istemcinin tutarsız veri gözlemlemesini engelledi
- Nedeni, 0.16.26’daki
- Bu sorun #2745 ile changelog’da belgelendi
- TigerBeetle yamalı bir 0.16.26 sürümü yayımlamadı
- Operatörler 0.16.26 veya üstüne yükseltmeden önce client’ı durdurmalı ve replica catch-up’ın tamamlanmasını beklemeli
- 0.16.16’dan 0.16.28’e birden fazla upgrade yaklaşık 20 saniye içinde art arda yapıldığında veya upgrade sırasında düğüm pause/crash olduğunda
release_transitionassertion failure oluştu- Çalışmakta olan düğüm yeni binary’yi
memfdile açıpexec()ile değiştiriyor, ancak bu arada diskteki binary daha yeni bir sürümle değiştirilmiş olabiliyor - Kod, diskteki version header’ın da o anda çalışan sürümle aynı olduğunu assert ettiği için başarısız oluyor
- #2758 ile 0.16.29’da assertion warning’e dönüştürüldü
- Çalışmakta olan düğüm yeni binary’yi
- 0.16.26’dan 0.16.27’ye yükseltme sırasında deprecated message type nedeniyle
panic: switch on corrupt valueoluştu- Yeni düğümdeki
switchifadesinde eski mesaj tipi için case bulunmadığından crash oluyordu - #2763 ile 0.16.29’da deprecated message type yeniden case’e eklenip yok sayılacak şekilde düzeltildi
- Yeni düğümdeki
Tek düğüm disk kaybından kurtarma
- TigerBeetle dosya bozulmalarına karşı dayanıklı olsa da disk arızası, yangın, EBS volume error, operatör hatası gibi nedenlerle bir düğümün veri dosyasının tamamı kaybolabilir veya kurtarılamayacak şekilde bozulabilir
- Raporun yazıldığı dönemde belgelerde arızalı düğümü değiştirme yöntemi yoktu; undocumented recovery prosedürü olarak
tigerbeetle formatçalıştırılıp boş bir veri dosyasıyla başlatma ve ardından repair bekleme yöntemi vardı - Jepsen, reformat’ın çoğunlukla çalıştığını ancak güvenli olmayabileceğini doğruladı
- 3 düğümden 2’sinde committed operation
opvarken bunlardan biri reformat edilirse,opyi gözlemlememiş 2/3 majority bir view change gerçekleştirip operation’ın kaybolmasına yol açabilir - Gerçek testte acknowledged transfer’lardan 5’inin kaybolduğu bir run oldu
- Upgrade sırasında newer binary ile formatlanan bir düğümün cluster version transition tamamlanmadan startup crash yaşadığı örnekler de vardı
- 3 düğümden 2’sinde committed operation
- Bu sorun #2767 ile takip ediliyor
- Daha sonra TigerBeetle 0.16.43, catastrophic data loss yaşayan düğümleri kurtarmak için
tigerbeetle recoverkomutunu içerdi
Jepsen’in sonucu ve önerileri
- Bulunan güvenlik sorunları iki taneydi
- 0.16.17 öncesinde çoklu filtre sorgu sonuçlarının eksik dönmesi
- Jepsen testlerinde kullanılan Java istemcisinin debugging API’sindeki hatalı ve yinelenen timestamp’ler
- Crash sorunları toplam 7 adetti
- Java istemcisi 2 adet: uninitialized memory access, eviction sırasında process crash
- Sunucu 5 adet: disk bozulmasıyla ilgili 2 panic, upgrade ile ilgili 3 panic
- #2745 belgelendi, kalan crash’ler ise 0.16.29’a kadar çözüldü
- 0.16.43, rapordaki sorunlardan biri dışında kalanların tamamını çözdü
- unresolved madde, client request’lerin tasarım gereği sürekli retry edilmesi sorunu
- Kullanıcılara yönelik öneriler net
- 0.16.43’e yükseltin
- 0.16.26’ya veya sonraki sürümlere geçerken release note’ları kontrol edin
- Test ortamında tek düğüm arızasını simüle edin ve uygulamanın artan latency’ye nasıl tepki verdiğini ölçün
- TigerBeetle’ın mimarisi sound görünüyor; VR, flexible quorum ve protocol-aware recovery entegrasyonunun Strong Serializability’nin temel invariant’larını bozmadığı gözlemlendi
- Ancak Jepsen doğrulaması deneysel bir yaklaşım olduğundan, bug’ların varlığını kanıtlayabilir ama yokluğunu kanıtlayamaz
1 yorum
Hacker News yorumları
Birlikte okunabilecek yazı: Fuzzer Blind Spots (Meet Jepsen!) – https://tigerbeetle.com/blog/2025-06-06-fuzzer-blind-spots-m...
Bu rapor gerçekten etkileyici. TigerBeetle’ın güvenilirlik ve ölçeklenebilirlik iddialarını her gördüğümde “tamam, Jepsen raporunu bekleyelim” diye düşünüyordum
Raporda birkaç sorun ortaya çıktı ve bunlar endişe yaratabilir; ama yalnızca düzeltmekle kalmayıp, gelecekte benzer hataları yakalamak için iç test paketlerini genişletmiş olmaları olumlu. Bu mühendislik yaklaşımıyla TigerBeetle, 10 yıl sonra finans uygulamaları nişinde “sadece Postgres kullan yeter” seviyesinde varsayılan veritabanı haline gelebilir gibi görünüyor
aphyr’in işi de harikaydı; raporu okurken çok şey öğrendiğimi hissettim
Bunun dışında, Jepsen denetimine yardımcı olmak için yalnızca Java istemcisine eklenen dahili test işlevindeki küçük bir doğruluk hatası hariç, Jepsen’in bulduğu yalnızca bir doğruluk hatası vardı ve dayanıklılığı etkilemiyordu. İlgili yazı burada: https://tigerbeetle.com/blog/2025-06-06-fuzzer-blind-spots-m...
Adil olmak gerekirse TigerBeetle, Postgres’e kıyasla daha fazla arıza türüne dayanacak şekilde tasarlanıp test edildi. Çünkü açık bir depolama arızası modeli var ve Postgres’in 1996’da çıktığı dönemde mevcut olmayan araştırmalardan yararlanıyor. TB’nin arıza modeli deterministik simülasyon testleriyle ayrıca doğrulanıyor; NASA’nın Safety-Critical Code için Power of Ten Rules’ına uygun statik bellek ayırma gibi teknikler de kullanılıyor. Literatürde Postgres’in veri kaybettiği bilinen senaryolar var, ancak TigerBeetle bunları tespit edip kurtarabiliyor
Daha fazlası için Kyle’ın raporundaki helical fault injection bölümüne bakabilirsiniz. Çoğu Raft ve Paxos uygulaması buna dayanacak şekilde tasarlanmamıştır; QCon London sunumu da var: https://m.youtube.com/watch?v=_jfOk4L7CiY
aphyr’in doğrulaması sonucunda TigerBeetle’ın kendi iddialarıyla uyumlu bir görüntü sergilemesini görmek gerçekten sevindirici. Doğru yaklaşımı seçince doğru sonuçların geldiğini görmek güzel
TigerBeetle’ın pratikte nasıl kullanılacağını merak ediyorum. Account veya Transfer olmayan her şey için TigerBeetle kurulumunun etrafında dış sistemler ve başka veritabanları çok olacak; bu daha az güvenilir sistemlerin TigerBeetle ile uyum içinde çalışması için tipik kalıplar neler, özellikle ikisi arasında tutarlılık sorunu oluştuğunda nasıl toparlanılıyor merak ediyorum
Kullanıcı bilgileri (ad, adres, parola vb.) ve ürün bilgileri (açıklama, fiyat vb.) bir “dosya dolabı” olarak OLGP’ye konur
Black Friday’de kullanıcının ürünü stok hesabından sepet hesabına, oradan da ödeme ve gönderim hesaplarına taşıdığı tüm işlemler ise bir “kasa” olarak OLTP’ye konur. TigerBeetle, her hesap veya transfer için en fazla 3 kullanıcı veri tanımlayıcısı saklamanıza izin verir; böylece varlıklar arasındaki olaylar, bu varlıkları tanımlayan OLGP veritabanıyla ilişkilendirilebilir
Bu mimari [1], temiz bir sorumluluk ayrımı sağlayarak farklı iş yüklerinin bağımsız ölçeklenmesini ve yönetilmesini mümkün kılar. Bir banka için, müşteri kayıtlarının bulunduğu dosya dolabında tüm nakdi saklamak yerine; performans, mevzuata uyum ve saklama özellikleri farklı olan nakdi kasada tutmak daha mantıklıdır
Bu kalıbın doğru olmasının nedeni, kullanıcıların adını veya e-posta adresini değiştirme sıklığının (OLGP), işlem yapma sıklığından (OLTP) çok daha düşük olmasıdır
Tutarlılığı korumak için yazma yolunda TigerBeetle’ı OLTP veri düzlemi ve “kayıtların kaynağı” olarak ele alın. “Sepete taşı” veya “ödeme” işlemi geldiğinde önce gerekli veri bağımlılıklarını OLGP’ye yazın; ilgili blob verisi varsa S3 gibi bir yere de yazın; ardından en son TigerBeetle’a yazarak işlemi commit edin. Okuma yolunda ise katı serileştirilebilirliği korumak için önce kayıtların kaynağını sorgulayın
[1] https://docs.tigerbeetle.com/coding/system-architecture/
TigerBeetle’ın fuzzer kör noktaları yazısını okuduktan sonra özellikle ilginç gelen bir Jepsen raporu
JNI tarafındaki segfault, Rust veya başka bir bellek güvenli dil kullanılmış olsaydı bile engellenemeyecek gibi görünüyor. Bellek güvenliği hatalarının çok az olması, TigerBeetle’ın Zig programlama yaklaşımının, hatırladığım kadarıyla TigerStyle’ın amaçladığı rolü oldukça iyi yerine getirdiğinin kanıtı gibi duruyor
Yine de doğru. TigerStyle olmasaydı nasal demonsa yakalanırdı
Harika derecede ayrıntılı raporu beğendim. Jepsen tarafından test edilip imzalanmış olması TigerBeetle için muazzam bir güvence. Henüz v1.0’a bile ulaşmadı; bundan sonraki yeni kilometre taşlarını merakla bekliyorum.
Bu başlıkta iyi içgörüler paylaşan kuruculara da ayrıca alkış
Yakında Amsterdam’daki SD25 sunumunda da yeni şeyler paylaşacak, onu da sabırsızlıkla bekliyorum.
“Panic! At the Disk 0” bölüm başlığı küçük de olsa hoşuma gitti.
Test edilen dağıtık sistemin, duvar saati zamanını kullanmak yerine sistemin dış modeliyle doğru biçimde doğrulanabilmesi için olayların gerçekten gerçekleştiği zamanı ve sırayı raporlaması gerektiği sonradan bakınca bariz ama ilginç.
Daha zor bir işi başardığınızda sistemin tersine basitleşmesi ilginç bir meta örüntü.
Bir başka örnek olarak, diskin arızalanabileceğini varsayıp bir kurtarma protokolü eklemek gerektiğinden, geride kalmış replikaların durum senkronizasyonunu fiilen “bedavaya” elde ediyorsunuz. Çünkü bu, tüm diskin bozulduğu durumla tam olarak aynı problem.
Yazıdaki “Viewstamped Replication” makalesine giden bağlantı ne yazık ki bozuk. https://pmg.csail.mit.edu/papers/vr-revisited.pdf bağlantısı reddediliyor.
Muhtemelen http://pmg.csail.mit.edu/papers/vr-revisited.pdf gibi https değil http şeması olmalı.
Artık cuma akşamı okuyacak bir şeyim var.
VSR 2012 makalesi en sevdiğim makalelerden biri; “Protocol-Aware Recovery for Consensus-Based Storage” da gerçekten çok güçlü.
Keyifli okumalar.
Sırf öğrenmek istediğim için soruyorum; yanlış anlaşılmasını istemem. Dağıtık sistemleri yeni öğreniyorum ve deterministik simülasyon testleri beni büyülüyor.
TigerBeetle hakkındaki Jepsen raporuna, ilgili blog yazılarına ve GitHub workflow’undaki Antithesis entegrasyon koduna kısaca baktıktan sonra test kapsamını daha iyi anlamak istedim.
Temel sorum şu: Jepsen test paketinin bulduğu bu hataları Antithesis entegrasyonu da bulabilir miydi?
Bu soru bazı varsayımlardan geliyor ve yanlış olabilirler. TigerBeetle’ın zaten kendi iç test paketi ve Antithesis ürünüyle kapsamlı biçimde test edildiğini sanıyordum; ayrıca Antithesis test paketinin Jepsen’den daha güçlü olduğunu anladığım için Jepsen’in Antithesis’in bulamadığı sorunları keşfetmesi bana şaşırtıcı geldi.
Anlayışımın yanlış olup olmadığını merak ediyorum. Örneğin 1) Antithesis test paketinin bu belirli hata sınıfını algılayıp algılayamadığını, 2) sistemin bu bölümünün henüz Antithesis testleriyle kapsanıp kapsanmadığını, 3) Jepsen ve Antithesis test paketlerinin farklı güçlü yanlarını ve hedeflerini yanlış anlayıp elmalarla portakalları mı karşılaştırdığımı bilmek isterim.
Jepsen test üreticisinde de neredeyse kesin olarak kör noktalar vardır. Bu yüzden farklı üreticiler tasarlamak faydalı.
Antithesis esas olarak 1. problemi ele alır ve sanal makinelerle deterministik simülasyon ortamı sağlar. Jepsen aynı problemi gerçek makineler kullanıp işletim sistemi seviyesinde arıza enjekte ederek ele alır; TigerBeetle’ın kendi VOPR’ı ise veritabanıyla birlikte tasarlanmıştır ve tüm kümeyi tek bir iş parçacığında çalıştırabilir. Bu üç yaklaşım birbirini tamamlar ve her birinin iyi olduğu alanlar farklıdır.
Bu hatada belirleyici olan kısım 2 ve 3’tü: yani hatayı gerçekten tetikleyebilen workload doğrulayıcıları ve denetçileri yazmak. Burada aphyr’nin yazdığı TigerBeetle’a özel 1.600 satırlık Clojure kodu hatayı tetikledi ve tespit etti; ardından TigerBeetle tarafındaki eşdeğer test de bunu tetikleyecek şekilde yamalandı. Aslında burada hatalı olan veritabanından çok VOPR. Veritabanında hata olması olağan bir şey; sadece iradeyle hatalardan kaçınılamaz. Bu yüzden çoğu hatayı tetikleyebilecek bir test stratejisine ihtiyaç var; kaçan hatalar ise workload üreticisindeki kusurlara işaret eder.
Antithesis’i de kullanıyoruz, ancak deterministik simülasyon testlerinin ikinci katmanı olarak.
Sorgu motoru hatasının neden kaçtığı için buraya bakın: https://tigerbeetle.com/blog/2025-06-06-fuzzer-blind-spots-m...
Büyük bankaların ya da borsaların TigerBeetle kullanıp kullanmadığını merak ediyorum
Şirket ölçeğinde ise TigerBeetle, hâlihazırda ayda 100 milyondan fazla işlemi işleyen müşterilerin üretim ortamlarında kullanılıyor; yakın zamanda Avrupa’nın 2 milyar dolarlık fintech unicorn’larından biriyle ilk sözleşmesini imzaladı ve ABD’de de birkaç anlaşmanın yakında tamamlanması bekleniyor. Dünya genelinde gerçek zamanlı işlem işlemeye geçiş eğilimi [2] nedeniyle, daha yüksek performans için TigerBeetle’a geçmek isteyen şirketlerden epey ilgi var.
Soruyu yanıtlamak gerekirse, Wall Street’in oldukça büyük aracı kurumlarından Clear Street’in bazı kurucuları TigerBeetle’a yatırım yaptı [3].
[1] https://mojaloop.io/how-mojaloop-enables-rndps-2-0-ekash/
[2] https://tigerbeetle.com/blog/2024-07-23-rediscovering-transa...
[3] https://tigerbeetle.com/company