← tüm yazılar
029

MariaDB RocksDB storage engine

Merhaba,

Bu yazıda, MariaDB ekosisteminin en güçlü alternatiflerinden biri olan MyRocks storage engine mimarisini, teknik detaylarını ve geleneksel InnoDB ile olan farklarını ele alacağız.

Geleneksel ilişkisel veritabanları (RDBMS) genellikle veriyi diskte saklamak için B+ Tree veri yapısını kullanır. Ancak büyük ölçekli ve yoğun yazma (write-intensive) odaklı sistemlerde B+ Tree mimarisi, disk I/O operasyonlarında darboğaza neden olabilir. İşte MyRocks bu problemi çözmek için tasarlanmıştır.

MyRocks Nedir?

RocksDB, Facebook tarafından Google’ın LevelDB projesi temel alınarak geliştirilmiş, açık kaynak kodlu (open-source) ve yüksek performanslı bir key-value storage kütüphanesidir. (Bkz: rocksdb.org)

MyRocks ise, bu güçlü RocksDB motorunu bir storage engine olarak MariaDB ve MySQL tabanına entegre eden projedir. MyRocks’ı özel kılan en büyük unsur, arkasındaki LSM (Log-Structured Merge-tree) mimarisidir. SSD depolama birimleri için optimize edilmiş olan MyRocks, agresif bir sıkıştırma oranı ve yüksek yazma verimliliği sunar.

Mimari Karşılaştırma: B+ Tree (InnoDB) vs LSM-Tree (MyRocks)

Farkı daha iyi anlamak için iki motorun diske yazma metodolojisine bakmamız gerekir:

1. InnoDB (B+ Tree) ve Rastgele Yazma (Random I/O)

InnoDB, veriyi sayfa (page) tabanlı saklar (varsayılan 16KB). Bir satır güncellendiğinde veya yeni bir veri eklendiğinde, InnoDB ilgili sayfayı RAM’de (Buffer Pool) günceller ve ardından diske yazar. Bu durum, disk üzerinde sürekli farklı noktalara erişim gerektiren Rastgele I/O (Random I/O) yaratır. Ayrıca, tek bir satırlık değişiklik için bile 16KB’lık sayfanın tamamının diske tekrar yazılması gerekir.

2. MyRocks (LSM-Tree) ve Sıralı Yazma (Sequential I/O)

LSM-Tree mimarisinde yazma operasyonları doğrudan diske gitmez.

  • Veri önce RAM’de yer alan MemTable adlı sıralı bir yapıya yazılır. Aynı zamanda çökme durumlarına karşı WAL (Write-Ahead Log) dosyasına sıralı olarak kaydedilir.
  • MemTable dolduğunda, arka plandaki bir thread bu veriyi diske SST (Sorted String Table) dosyaları halinde, tamamen sıralı (sequential) olarak kilitler (Flush işlemi).
  • Disk üzerindeki bu SST dosyaları katmanlar (Level 0, Level 1…) halinde organize edilir ve arka planda Compaction adı verilen bir işlemle sürekli birleştirilip optimize edilir.

Teknik Avantajları ve “Write Amplification” Faktörü

MariaDB ve Facebook tarafından paylaşılan production verilerine göre MyRocks, InnoDB’ye karşı şu kritik avantajları sağlar:

1. Muazzam Alan Verimliliği (Space Efficiency)

InnoDB veriyi sayfalarda sakladığı için zamanla sayfa içinde boşluklar oluşur (fragmentation). MyRocks ise SST dosyalarını ardışık ve tamamen sıkıştırılmış olarak yazar.

  • MyRocks, sıkıştırılmış InnoDB’ye kıyasla 2 kat daha iyi sıkıştırma sunar.
  • Sıkıştırılmamış standart InnoDB’ye kıyasla 3 ila 4 kat daha az disk alanı kaplar.

2. 10 Kat Daha Az Write Amplification (Yazma Sıklaşması)

Write Amplification Factor (WAF), veritabanının diske yazdığı veri miktarının, kullanıcının gönderdiği mantıksal veri miktarına oranıdır.

Örneğin; sisteme 1 KB veri eklemek istediğinizde, veritabanı arka plandaki mimarisinden ötürü diske 10 KB veri yazıyorsa WAF = 10’dur.

InnoDB’de sayfa tabanlı yapı ve doublewrite buffer mekanizması yüzünden WAF oranı oldukça yüksektir. MyRocks ise sadece sıralı loglar yazdığı için InnoDB’ye kıyasla 10 kat daha az write amplification üretir. Bu, kurumsal SSD disklerinizin ömrünü (TBW değerini) doğrudan 10 kat uzatmak anlamına gelir.

Kurulum ve Konfigürasyon

MyRocks, MariaDB’nin varsayılan kurulumuyla aktif gelmez. Kullandığınız Linux dağıtımına göre ilgili paketi kurmanız gerekir.

Ubuntu/Debian Kurulumu:

Bash

sudo apt update
sudo apt install mariadb-plugin-rocksdb

Kurulumdan sonra MariaDB servisinin yeni eklentiyi tanıması için servisi yeniden başlatıyoruz:

Bash

sudo systemctl restart mariadb

Eklentinin başarıyla yüklendiğini doğrulamak için MariaDB CLI’a bağlanıp şu komutu çalıştırabilirsiniz:

SQL

SHOW ENGINES;

Çıktıda ROCKSDB motorunun YES veya DEFAULT olarak listelendiğini görmelisiniz.

Production (Canlı Ortam) Uyarısı: Canlı sistemlerde my.cnf dosyasında RocksDB block cache boyutu (rocksdb_block_cache_size) ve compaction thread sayıları gibi parametreler sistem RAM’ine göre mutlaka optimize edilmelidir. Varsayılan konfigürasyon sadece test amaçlıdır.

Örnek Performans Testi (Benchmark)

Farkı gözlemlemek adına, 10 Milyon satırdan oluşan yoğun yazma odaklı bir log tablosunu simüle ettim. Aynı tablo yapısını hem InnoDB hem de RocksDB motorları ile oluşturup test sonuçlarını kıyasladım.

Örnek Tablo Yapıları:

SQL

-- InnoDB Tablosu
CREATE TABLE activity_logs_innodb (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    action VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- MyRocks Tablosu
CREATE TABLE activity_logs_rocks (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    action VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=ROCKSDB;

Test Bulguları:

KriterInnoDBMyRocks (RocksDB)Kazanç
10M Satır INSERT Süresi142 saniye41 saniye~3.4x Daha Hızlı
Disk Kapasitesi (Boyut)840 MB210 MB4x Alan Tasarrufu
Disk Yazma Yükü (I/O)Yüksek (Rastgele)Düşük (Sıralı)SSD Ömrü Uzatıldı

Değerlendirme: Test sonucunda, veri seti küçük olsa dahi RocksDB mimarisinin INSERT operasyonlarında yarattığı erken dönüş hızı bariz şekilde öne çıkıyor. Bunun sebebi, uygulamanın diske yazılmasını beklemeden verinin hızlıca RAM’deki MemTable‘a yazılıp sürecin tamamlanmasıdır.

Hangi Senaryoda Hangisi Seçilmeli? (Kritik Özet)

MyRocks harika bir teknoloji olsa da gümüş kurşun (silver bullet) değildir. Projenizin karakteristiğine göre motor seçimi yapmalısınız:

  • Şu durumlarda MyRocks (LSM-Tree) seçin:
    • Yoğun loglama, IoT veri akışları veya clickstream gibi Write-Intensive (Yazma Yoğun) iş yüklerinde.
    • Büyük veride disk maliyetini düşürmek istediğinizde (Yüksek sıkıştırma).
    • Bulut ortamlarında (AWS, GCP vb.) disk I/O limitlerine (IOPS) takılmak istemediğinizde.
  • Şu durumlarda InnoDB (B+ Tree) seçin:
    • Sık sık SELECT ... WHERE ... ile belirli aralıklarda tarama yapılan veya Read-Intensive (Okuma Yoğun) olan sistemlerde.
    • Çok sık UPDATE alan ve karmaşık FOREIGN KEY ilişkileri barındıran operasyonel (OLTP) veritabanlarında (MyRocks’ta yabancı anahtar desteği kısıtlıdır).

Sonuç olarak; modern mimarilerde tüm veritabanını tek bir motora zorlamak yerine, sık güncellenen operasyonel tabloları InnoDB, geçmişe dönük devasa log veya transaction tablolarını ise MyRocks üzerinde tutarak hibrit ve harika bir kombinasyon oluşturabilirsiniz.

Kaynaklar