Sıfırdan bir zaman serisi veritabanı yapmak
(nakabonne.dev)-
Go ile yazılmış olsa da neredeyse dilden bağımsız
-
Zaman serisi verisi, zaman damgası eklenmiş birden çok değerden oluşan bir koleksiyondur. Her öğe bir veri noktasıdır
→ Miktarı çok fazladır. Anlamlı olabilmesi için de çok olması gerekir. Saniyede milyonlarca kez yakalanan durumlar da yaygındır
→ Sadece ekleme (append-only), zamana göre sıralama, yakın tarihli veriye öncelik
→ Belirli zaman birimlerinde toplu okuma
→ Yüksek kardinalite (küme birimi çok büyüktür)
→ Çoğunlukla yakın tarihli veriler okunup kullanılır
-
Zaman serisi verilerinde genellikle yazma işlemlerinin yoğun olmasını yansıtacak şekilde, TStorage DB engine kütüphanesi Go diliyle geliştirildi
-
Veri modeli
→ Doğrusal veri modeli
→ Veri noktalarını zaman birimine göre bölümlendirme
→ Her bölüm, o zaman aralığındaki tüm verileri içeren ayrı ve bağımsız bir DB gibi çalışır
→ Yalnızca head ve bir sonraki bölümün heap üzerinde tutulan bellek bölümü olacak şekilde değiştirilebilir
→ Veri kaybını önlemek için yazmadan önce WAL'e (Write Ahead Log) yazılır
→ Daha eski bölüm verileri diskte tek bir dosya olarak saklanır. Disk bölümleri salt okunurdur
- Bellek bölümü
→ Veri noktalarının listesi heap üzerinde bir dizi olarak gösterilir (Go'nun slice yapısına benzer)
→ Gecikme ve senkronizasyon nedeniyle out-of-order durumu sık görülür. Aynı bölüm içindeyse tamponlama ile kaydederken yeniden sıralanabilir; farklı bölümlerdeyse head olmayan önceki bölümün sonuna eklenerek mümkün olur
→ WAL'e fiilen yazılanla tamamen aynı veri saklanır; böylece hata durumunda da kurtarma mümkün olur
- Disk bölümü
→ Her bölüm için tek bir dizinde meta veriler ve sıkıştırılmış gerçek veri saklanır (Prometheus V3 Storage'ın küçültülmüş bir sürümü)
→ Memory-Mapped veri biçimi (çekirdek tarafından mmap ile önbelleğe alınabilir)
→ Meta veriler JSON biçiminde indeks oluşturur
- Zaman damgası ve değer demetlerinden oluşan veri kodlamasında, Facebook'un Gorilla makalesinde önerilen kodlama yöntemi kullanılır
→ Zaman damgası ve değerler farklı yöntemlerle kodlanır
→ timestamp, unsigned 64-bit integer değerdir ve Delta-of-delta kodlaması kullanılır
→ Delta kodlama: Yalnızca önceki değer ile mevcut değer arasındaki farkı kaydetme yöntemi
→ Delta-of-Delta kodlama: Genellikle sabit zaman aralıklarında oluştuğu için yalnızca deltaların deltasını kaydeder
→ Değişken uzunlukta kodlandığı için Delta-of-Delta en az alanı kullanır
→ values, signed 64-bit floating-point değerdir ve XOR kodlaması kullanılır
→ İlk değer doğrudan saklanır
→ Sonraki değer XOR'lanır ve sonuç 0 ise önceki değerle aynı olduğu için yalnızca tek bir 0 biti saklanır
→ 0 değilse diğer bitlere göre hesaplanır (Meaningful Bit)
→ Baştaki/sondaki 0'lar hesaplanır; 0 sayısı aynıysa 0'lar ve anlamlı bitler saklanır, farklıysa baştaki sıfır sayısı, Meaningful Bit sayısı ve bitlerin kendisi saklanır
Henüz yorum yok.