lz4 ve zstd: Modern ve Hızlı Sıkıştırma Araçları

Yıllarca gzip ve bzip2 kullandıktan sonra bir gün production sunucuda 50GB’lık bir log arşivi oluştururken saatlerce beklemek zorunda kaldım. O gün hayatıma lz4 ve zstd girdi. Eğer siz de sıkıştırma işlemlerinde hız ile oran arasında sürekli bir denge arayışındaysanız, bu iki araç tam olarak aradığınız şey olabilir. Modern sistemlerin ihtiyaçlarına yönelik tasarlanmış bu araçlar, özellikle büyük dosyalar ve yüksek I/O gerektiren senaryolarda geleneksel alternatiflerin önüne geçiyor.

lz4 Nedir ve Neden Bu Kadar Hızlı?

lz4, Yann Collet tarafından geliştirilen ve hız odaklı bir sıkıştırma algoritmasıdır. Temel tasarım felsefesi şudur: sıkıştırma oranını biraz feda et, ama karşılığında inanılmaz hız kazan. Özellikle RAM’e sığmayan büyük veri setlerini işlerken veya gerçek zamanlı sıkıştırma gerektiren durumlarda lz4 rakipsizdir.

lz4’ün öne çıkan özellikleri:

  • Sıkıştırma hızı: Tipik donanımda saniyede 500 MB ile 700 MB arasında
  • Açma hızı: Saniyede 2 GB ile 3 GB arasında, bu neredeyse RAM bant genişliğiyle yarışır
  • Düşük bellek kullanımı: Hem sıkıştırma hem açma sırasında minimal RAM tüketir
  • Çok iş parçacıklı destek: lz4 komutu tek thread kullanır ama plz4 ile paralel işlem yapılabilir

lz4 Kurulumu

Çoğu modern Linux dağıtımında lz4 ya kurulu gelir ya da paket deposunda hazır bekler.

# Debian/Ubuntu
sudo apt install lz4

# RHEL/CentOS/Rocky Linux
sudo dnf install lz4

# Arch Linux
sudo pacman -S lz4

# Kurulumu doğrula
lz4 --version

Temel lz4 Kullanımı

# Tek dosya sıkıştırma
lz4 dosya.log dosya.log.lz4

# Sıkıştırılmış dosyayı açma
lz4 -d dosya.log.lz4 dosya.log

# Orijinal dosyayı koruyarak sıkıştır (varsayılan orijinali siler)
lz4 --keep dosya.log

# Çıktıyı stdout'a yönlendir
lz4 -c dosya.log > dosya.log.lz4

# Mevcut dosyanın üzerine yaz
lz4 -f dosya.log dosya.log.lz4

# Sıkıştırma istatistiklerini göster
lz4 -v dosya.log dosya.log.lz4

Önemli parametreler:

  • -d: Dosyayı açar (decompress)
  • -k veya –keep: Orijinal dosyayı silmez
  • -f: Hedef dosyanın üzerine zorla yazar
  • -c: Çıktıyı standart çıkışa yazar
  • -v: Ayrıntılı çıktı (verbose)
  • -1: En hızlı sıkıştırma seviyesi (varsayılan)
  • -9: En yüksek sıkıştırma oranı (daha yavaş ama hâlâ çok hızlı)
  • –rm: İşlem başarılı olursa kaynak dosyayı sil

lz4 ile tar Kombinasyonu

tar komutunun lz4 desteği doğrudan yoktur ama pipe ile kolayca entegre edilebilir:

# Dizini lz4 ile sıkıştırılmış arşive al
tar -cf - /var/log/nginx | lz4 > nginx_logs.tar.lz4

# Arşivi aç
lz4 -d nginx_logs.tar.lz4 | tar -xf -

# Daha kısa yazım
tar -I lz4 -cf arsiv.tar.lz4 /hedef/dizin

# lz4 ile tar arşivi açma
tar -I lz4 -xf arsiv.tar.lz4

zstd: Hız ile Oranı Dengeleyen Modern Çözüm

zstd (Zstandard), Facebook tarafından 2016’da açık kaynak olarak yayınlandı. Yine Yann Collet imzasını taşıyan bu algoritma, lz4 ile gzip arasındaki boşluğu doldurmak için tasarlandı. Hem hız hem de oran açısından olağanüstü bir denge sunar ve bugün Linux çekirdeği dahil pek çok kritik projede varsayılan sıkıştırma formatı olarak benimsenmiştir.

zstd’nin öne çıkan özellikleri:

  • Geniş sıkıştırma seviyesi aralığı: -1’den 22’ye kadar
  • Çok iş parçacıklı sıkıştırma: --threads parametresi ile paralel işlem
  • Sözlük desteği: Küçük benzer dosyalar için muhteşem oranlar sağlar
  • Akış modu: Gerçek zamanlı veri akışlarını işleyebilir
  • Geniş platform desteği: Kernel, Docker, Arch Linux paketleri ve daha fazlası zstd kullanır

zstd Kurulumu

# Debian/Ubuntu
sudo apt install zstd

# RHEL/CentOS/Rocky Linux
sudo dnf install zstd

# Arch Linux
sudo pacman -S zstd

# Sürümü kontrol et
zstd --version

Temel zstd Kullanımı

# Dosya sıkıştırma (varsayılan seviye 3)
zstd dosya.log

# Belirli sıkıştırma seviyesi ile
zstd -5 dosya.log

# En yüksek sıkıştırma oranı
zstd -19 dosya.log

# Ultra mod (22. seviye, çok yavaş ama maksimum oran)
zstd --ultra -22 dosya.log

# Çok iş parçacıklı sıkıştırma
zstd -T4 dosya.log        # 4 thread
zstd -T0 dosya.log        # tüm CPU çekirdeklerini kullan

# Dosya açma
zstd -d dosya.log.zst

# Orijinal dosyayı koru
zstd --keep dosya.log

# İlerleme bilgisi göster
zstd --progress dosya.log

Önemli parametreler:

  • -d: Dosyayı açar
  • -k veya –keep: Orijinal dosyayı korur
  • -T[N]: N thread kullan, 0 ise tüm çekirdekler
  • -[1-19]: Sıkıştırma seviyesi, varsayılan 3
  • –ultra -22: Maksimum sıkıştırma
  • –fast[N]: Negatif seviyeler, son derece hızlı ama düşük oran
  • -r: Dizin içindeki tüm dosyaları özyinelemeli işle
  • –rm: Başarılı işlem sonrası kaynak dosyayı sil
  • -c: Stdout’a yaz
  • -v: Ayrıntılı çıktı

zstd ile tar Kombinasyonu

Modern tar sürümleri zstd’yi doğrudan destekler:

# zstd ile tar arşivi oluştur
tar --zstd -cf arsiv.tar.zst /hedef/dizin

# Kısa yazım (GNU tar 1.31+)
tar -acf arsiv.tar.zst /hedef/dizin

# Çok iş parçacıklı zstd ile tar
tar -cf - /hedef/dizin | zstd -T0 -o arsiv.tar.zst

# Arşivi aç
tar --zstd -xf arsiv.tar.zst

# Arşiv içeriğini listele
tar --zstd -tf arsiv.tar.zst

Gerçek Dünya Senaryoları

Senaryo 1: Log Rotasyon Sistemi

Production sunucularda log dosyaları hızla birikiyor. Geleneksel logrotate konfigürasyonunda gzip kullanılır ama yüksek hacimli sistemlerde bu ciddi CPU yükü oluşturabilir.

#!/bin/bash
# /usr/local/bin/fast_log_rotate.sh
# Nginx log dosyalarını lz4 ile hızlıca arşivle

LOG_DIR="/var/log/nginx"
ARCHIVE_DIR="/data/log_archives"
DATE=$(date +%Y%m%d)

mkdir -p "$ARCHIVE_DIR"

# Dünün loglarını bul ve lz4 ile sıkıştır
find "$LOG_DIR" -name "*.log.1" -type f | while read logfile; do
    basename=$(basename "$logfile" .1)
    lz4 --keep "$logfile" "$ARCHIVE_DIR/${basename}_${DATE}.lz4"
    if [ $? -eq 0 ]; then
        echo "Arşivlendi: $logfile -> $ARCHIVE_DIR/${basename}_${DATE}.lz4"
        rm "$logfile"
    fi
done

Bu script ile gzip kullanan geleneksel yaklaşıma kıyasla log rotasyon süresi büyük sistemlerde 5 kat ile 8 kat arasında kısalır.

Senaryo 2: Veritabanı Yedekleme

PostgreSQL veya MySQL dump işlemlerinde sıkıştırma ciddi yer tasarrufu sağlar. Ama büyük veritabanlarında gzip ile saatlerce beklemek yerine zstd ile hem hız hem de iyi bir oran elde edebilirsiniz:

#!/bin/bash
# Veritabanı yedekleme scripti

DB_NAME="production_db"
BACKUP_DIR="/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
THREADS=$(nproc)

mkdir -p "$BACKUP_DIR"

# PostgreSQL dump ve anlık zstd sıkıştırma
echo "Yedekleme başlıyor: $DB_NAME"
pg_dump -U postgres "$DB_NAME" | 
    zstd -T$THREADS -5 -o "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.zst"

echo "Yedek boyutu: $(du -sh "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.zst" | cut -f1)"

# 30 günden eski yedekleri temizle
find "$BACKUP_DIR" -name "*.sql.zst" -mtime +30 -delete
echo "Eski yedekler temizlendi."

Senaryo 3: Büyük Veri Transferi

Sunucular arası büyük dosya transferlerinde bant genişliği darboğaz olabilir. Sıkıştırarak transfer etmek mantıklıdır, ama sıkıştırma CPU darboğazı yaratmamalıdır:

# Yerel sıkıştırma sonra transfer
tar -cf - /data/büyük_dizin | zstd -T0 -3 | ssh kullanici@hedef "zstd -d | tar -xf - -C /hedef/yol"

# Alternatif: Önce sıkıştır, sonra rsync ile aktar
zstd -T0 -3 --keep büyük_dosya.tar
rsync -avP büyük_dosya.tar.zst kullanici@hedef:/hedef/yol/

# Çok parçalı büyük arşivler için split ile kombinasyon
tar -cf - /data/büyük_dizin | zstd -T0 | split -b 4G - arsiv.tar.zst.part

Senaryo 4: Docker Image Optimizasyonu

Docker’ın yeni sürümleri zstd destekli image katmanlarını destekler. Containerfile veya build süreçlerinde zstd kullanmak image transfer sürelerini ciddi ölçüde kısaltabilir:

# Docker buildx ile zstd destekli image oluştur
docker buildx build --output type=oci,dest=image.tar 
    --compression=zstd --compression-level=3 .

# OCI image'ı zstd ile manuel sıkıştırma
docker save myapp:latest | zstd -T0 -5 -o myapp_latest.tar.zst

# Image'ı geri yükle
zstd -d myapp_latest.tar.zst -c | docker load

lz4 vs zstd: Hangisi Ne Zaman?

Bu iki araç birbirinin rakibi değil, birbirini tamamlayan araçlardır. Doğru aracı doğru senaryoda kullanmak gerekir.

lz4 tercih edin:

  • Gerçek zamanlı veri akışlarında sıkıştırma gerektiğinde
  • SSD performansının CPU hızından yavaş olduğu durumlarda
  • Çok sık okunan ve açılması gereken arşivlerde
  • Sistem belleği kısıtlıysa
  • Log akışlarını anlık işlerken

zstd tercih edin:

  • Uzun süreli saklama gerektiren yedeklemelerde
  • Ağ transferi yapılacak ve bant genişliği kısıtlıysa
  • CPU kaynakları yeterliyse ve daha iyi oran isteniyorsa
  • Birbirine benzer küçük dosyaları toplu sıkıştırırken
  • Veritabanı dump’larında ve büyük log arşivlerinde

Sıkıştırma Seviyesi ve Performans Dengesi

zstd’nin geniş seviye aralığı başta kafa karıştırıcı olabilir. İşte pratik bir rehber:

# Hız testi - aynı dosyayı farklı seviyelerde sıkıştır
time zstd -1 büyük_dosya.log -o /dev/null
time zstd -3 büyük_dosya.log -o /dev/null
time zstd -9 büyük_dosya.log -o /dev/null
time zstd -19 büyük_dosya.log -o /dev/null

# Sıkıştırma oranını karşılaştır
for level in 1 3 5 9 12 19; do
    zstd -$level --keep büyük_dosya.log -o /tmp/test_$level.zst
    echo "Seviye $level: $(du -sh /tmp/test_$level.zst | cut -f1)"
    rm /tmp/test_$level.zst
done

Genel pratik önerim: Çoğu durumda zstd için seviye 3 (varsayılan) mükemmel bir başlangıç noktasıdır. Uzun vadeli arşivler için seviye 9-12 arası genellikle hız-oran dengesinin en iyi noktasıdır. Seviye 19 ve üstü sadece gerçekten kritik depolama tasarrufu gerektiğinde mantıklı olur.

Zstd ile Sözlük Kullanımı

zstd’nin en güçlü özelliklerinden biri sözlük desteğidir. Benzer yapıdaki çok sayıda küçük dosyayı sıkıştırırken sözlük oluşturmak sıkıştırma oranını dramatik biçimde artırır:

# Örnek JSON log dosyalarından sözlük oluştur
zstd --train /var/log/app/*.json -o uygulama_sozluk.dict

# Sözlük kullanarak sıkıştır
zstd -D uygulama_sozluk.dict log_dosyasi.json

# Sözlükle açma
zstd -D uygulama_sozluk.dict -d log_dosyasi.json.zst

# Sözlük boyutunu ayarla (varsayılan 112KB)
zstd --train --maxdict=64KB /var/log/app/*.json -o kucuk_sozluk.dict

Bu özellik özellikle mikro servis ortamlarında her biri küçük ama benzer yapıdaki binlerce log dosyasını arşivlerken inanılmaz sonuçlar verir.

Paralel İşlem ve Büyük Dosyalar

Çok çekirdekli sunucularda zstd’nin paralel işlem kapasitesini tam kullanmak için:

# Tüm CPU çekirdeklerini kullan
zstd -T0 -5 devasa_dosya.bin

# İlerleme çubuğu ile izle
zstd -T0 -5 --progress devasa_dosya.bin

# Pipe içinde çok iş parçacıklı kullanım
find /data -name "*.log" -print0 | 
    xargs -0 -P4 -I{} zstd -T2 -5 --keep {}

# Paralel açma
find /backup -name "*.zst" -print0 | 
    xargs -0 -P4 -I{} zstd -d -k {}

Sistem Entegrasyonu ve Otomatik Sıkıştırma

/etc/logrotate.d/ konfigürasyonlarında zstd kullanımı:

# /etc/logrotate.d/nginx dosyası
/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    compresscmd /usr/bin/zstd
    compressoptions -5 --rm
    compressext .zst
    uncompresscmd /usr/bin/unzstd
    missingok
    notifempty
    sharedscripts
    postrotate
        nginx -s reopen
    endscript
}

Systemd journal’ı da zstd ile sıkıştırılabilir. /etc/systemd/journald.conf dosyasında:

# journald.conf içinde zstd sıkıştırma
[Journal]
Compress=yes
# Yeni systemd sürümlerinde zstd varsayılan olarak kullanılır

Pratik Karşılaştırma Scripti

Kendi sisteminizde farklı araçları karşılaştırmak için kullanabileceğiniz bir script:

#!/bin/bash
# sıkıştırma_karsilastir.sh
# Kullanım: ./sıkıştırma_karsilastir.sh büyük_dosya.log

DOSYA="$1"
BOYUT=$(du -sh "$DOSYA" | cut -f1)
echo "Test dosyası: $DOSYA ($BOYUT)"
echo "-----------------------------------"

# gzip
echo -n "gzip -6:    "
time gzip -6 --keep -c "$DOSYA" > /tmp/test.gz
echo "Boyut: $(du -sh /tmp/test.gz | cut -f1)"

# lz4
echo -n "lz4:        "
time lz4 -q "$DOSYA" /tmp/test.lz4
echo "Boyut: $(du -sh /tmp/test.lz4 | cut -f1)"

# zstd varsayılan
echo -n "zstd -3:    "
time zstd -3 -q --keep "$DOSYA" -o /tmp/test3.zst
echo "Boyut: $(du -sh /tmp/test3.zst | cut -f1)"

# zstd yüksek
echo -n "zstd -9:    "
time zstd -9 -q --keep "$DOSYA" -o /tmp/test9.zst
echo "Boyut: $(du -sh /tmp/test9.zst | cut -f1)"

# Temizlik
rm -f /tmp/test.gz /tmp/test.lz4 /tmp/test3.zst /tmp/test9.zst

Sonuç

lz4 ve zstd, modern sistem yöneticisinin araç kutusunda mutlaka yer alması gereken iki önemli araçtır. Eski alışkanlıklarla gzip kullanmaya devam etmek yanlış değildir, ancak işin boyutu büyüdükçe bu araçların getirileri çok daha belirgin hale gelir.

Kendi deneyimlerimden konuşmak gerekirse: yüksek trafikli bir web sunucusunda log rotasyonunu lz4’e geçirdikten sonra rotasyon süresi 8 dakikadan 45 saniyeye düştü. Veritabanı yedeklemelerini zstd ile seviye 5’te yapınca hem gzip’e kıyasla yüzde 15 daha küçük dosyalar elde ettim hem de işlem süresi yarı yarıya azaldı.

Genel öneri olarak: anlık ve sık erişilen veriler için lz4, uzun vadeli saklama ve transfer için zstd kullanın. İkisi de mükemmel belgelenmiş, aktif olarak geliştirilen ve kurumsal düzeyde güvenilir araçlardır. man lz4 ve man zstd komutlarıyla detaylı dokümantasyona ulaşabilirsiniz. Kendi senaryolarınız için yukarıdaki karşılaştırma scriptini çalıştırıp hangi aracın sisteminize daha uygun olduğunu bizzat gözlemlemenizi şiddetle tavsiye ederim.

Yorum yapın