Berkeley DB, bir sunucu süreci yerine doğrudan uygulamanın içine gömülen (embedded) bir anahtar-değer (key-value) veritabanı kütüphanesidir. SQL çözen bir ilişkisel motor değil; kayıtları anahtar ve değer çiftleri olarak saklayan, çok yüksek verimle okuma-yazma yapan bir depolama katmanıdır. Bugün Oracle çatısı altında geliştirilir ve gömülü sistemlerden masaüstü yazılımlara, ağ altyapısından mobil uygulamalara kadar çok geniş bir alanda kullanılır.

Berkeley DB Nedir?

Berkeley DB (kısaca BDB), verileri diske kalıcı olarak yazan, işlem (transaction) desteği sunabilen ve ayrı bir veritabanı sunucusu gerektirmeyen bir C kütüphanesidir. Uygulamanız kütüphaneyi kendi süreç adres alanında çalıştırır; veriye erişim ağ üzerinden değil, doğrudan fonksiyon çağrılarıyla olur. Bu, ağ gidiş-dönüş gecikmesini ortadan kaldırdığı için gömülü senaryolarda ciddi bir avantajdır.

BDB, klasik SQL veritabanlarından farklı olarak sabit bir veri modeli veya sorgu dili dayatmaz. Uygulama, anahtarları ve değerleri ham bayt dizileri olarak verir; yorumu tamamen geliştiriciye bırakılır. Bu yalınlık, kütüphanenin hem çok hafif olmasını hem de çok farklı iş yüklerine uyarlanmasını sağlar.

Kısa Tarihçe

Berkeley DB'nin kökeni, California Üniversitesi Berkeley'deki BSD Unix çalışmalarına dayanır; ismini de buradan alır. Kütüphane sonradan Sleepycat Software adlı şirket tarafından ticarileştirilip geliştirilmeye devam etmiştir. Sleepycat Software 2006 yılında Oracle tarafından satın alınmış ve BDB o günden bu yana Oracle ürün ailesinin bir parçası olarak sürdürülmektedir.

Zaman içinde tek bir üründen çok, ilişkili bir aile ortaya çıkmıştır: klasik anahtar-değer deposu olan Berkeley DB, Java ile yazılmış Berkeley DB Java Edition (JE) ve XML belgelerini saklayıp XQuery ile sorgulamaya olanak tanıyan Berkeley DB XML. Hepsi gömülü ve sunucusuz felsefeyi paylaşır.

Gömülü (Embedded) Mimari Ne Anlama Gelir?

Geleneksel bir veritabanında istemci, ağ soketi üzerinden ayrı çalışan bir sunucu sürecine bağlanır. Berkeley DB'de böyle bir sunucu yoktur. Kütüphane, uygulamanın çalıştırılabilir dosyasına derlenerek bağlanır ve veri dosyaları doğrudan yerel disk üzerinde tutulur.

  • Ayrı kurulum, servis yönetimi veya port açma ihtiyacı yoktur.
  • Veriye erişim ağ değil, in-process fonksiyon çağrısıdır; gecikme çok düşüktür.
  • Dağıtım basittir: uygulamanız ile birlikte bir veya birkaç dosya taşınır.
  • Ölçek, tek makine ve tek uygulama sınırları içinde düşünülür; çok istemcili merkezi bir sunucu modeli değildir.

Bu yaklaşım, SQLite ile aynı ailededir: her ikisi de sunucusuz, gömülü ve tek dosyaya yakın çalışma modeline sahiptir. Fark, SQLite'ın ilk sıradan bir SQL motoru olması, Berkeley DB'nin ise temelde bir anahtar-değer deposu olmasıdır.

Depolama Yapıları (Access Methods)

Berkeley DB, aynı anahtar-değer API'sini farklı dahili veri yapıları üzerinde sunar. Uygulama, veriyi açarken hangi erişim yönteminin kullanılacağını seçer. Başlıca yöntemler şunlardır:

Erişim YöntemiDahili YapıUygun Olduğu Durum
BtreeDengeli B-ağacıSıralı erişim, aralık sorguları, anahtarlar arasında yakınlık önemliyse
HashGenişletilebilir hash tablosuÇok büyük veri kümelerinde eşitlik (tam anahtar) aramaları
QueueSabit uzunluklu kayıtlarHızlı kuyruk işlemleri, baştan/sondan ekleme-çıkarma
RecnoKayıt numarasına dayalıDeğişken/sabit uzunluklu, sıra numarasıyla erişilen kayıtlar

İşlemler, Kilitleme ve ACID

Berkeley DB, yalnızca basit bir depo olmakla kalmaz; isteğe bağlı olarak tam işlem desteği de sunabilir. Transactional Data Store yapılandırmasında BDB, ACID özelliklerini (atomiklik, tutarlılık, izolasyon, kalıcılık) sağlayabilir.

  • Atomiklik: Bir işlem ya bütünüyle uygulanır ya da hiç uygulanmaz.
  • Kalıcılık: Onaylanan (commit) veriler, çökme sonrası da write-ahead logging (WAL) sayesinde kurtarılabilir.
  • İzolasyon: Kilitleme alt sistemi, eşzamanlı işlemlerin birbirini bozmadan çalışmasını sağlar.
  • Kurtarma: Beklenmedik kapanmalardan sonra loglar üzerinden tutarlı bir duruma dönülebilir.

BDB, farklı ihtiyaçlar için katmanlı yapılandırma sunar: yalnızca tek erişim (Data Store), eşzamanlı okuyucu-yazıcı (Concurrent Data Store) ve tam işlemli (Transactional Data Store). Uygulama yalnızca ihtiyaç duyduğu karmaşıklığı ödemek üzere uygun seviyeyi seçer.

Çoğaltma ve Yüksek Erişilebilirlik

Berkeley DB, birden çok düğüm arasında veri çoğaltmayı (replication) destekleyen bir çerçeve içerir. Tipik model, bir yazma düğümü (master) ile ona bağlı okuma kopyalarından (replica) oluşur; master düğüm devre dışı kaldığında kalan düğümler arasında yeni bir master seçilebilir.

Bu özellik, gömülü olsa bile hizmetin sürekliliğinin kritik olduğu ağ ekipmanı, dizin (directory) hizmetleri ve mesajlaşma altyapıları gibi senaryolarda kullanılır. İlişkisel sistemlerdeki çoğaltma yaklaşımlarıyla kavramsal olarak benzer, ancak burada da her şey kütüphane içinde, sunucusuz biçimde gerçekleşir.

Basit Bir Kullanım Örneği

Aşağıdaki C benzeri sözde kod, bir Btree veritabanı açıp bir anahtar-değer çifti yazmayı ve geri okumayı gösterir. Gerçek API ayrıntıları sürüme göre değişebilir; buradaki amaç akışı göstermektir.

c
DB *db;
DBT key, data;

/* Ortam olmadan basit bir veritabani ac */
db_create(&db, NULL, 0);
db->open(db, NULL, "kayitlar.db", NULL, DB_BTREE, DB_CREATE, 0664);

/* Anahtar-deger ciftini hazirla */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = "kullanici:42";
key.size = strlen("kullanici:42");
data.data = "Ayse Yilmaz";
data.size = strlen("Ayse Yilmaz");

/* Yaz */
db->put(db, NULL, &key, &data, 0);

/* Geri oku */
DBT out;
memset(&out, 0, sizeof(out));
db->get(db, NULL, &key, &out, 0);

/* Kapat */
db->close(db, 0);

Python, Java, C++ ve başka dillerden de BDB'ye erişmek mümkündür. BDB'nin SQL katmanı kullanıldığında ise SQLite'a çok yakın bir SQL sözdizimiyle çalışılır; bu, ekiplerin öğrenme eğrisini azaltır.

sql
-- Berkeley DB SQL katmani (SQLite uyumlu sozdizimi)
CREATE TABLE kullanicilar (
  id    INTEGER PRIMARY KEY,
  ad    TEXT NOT NULL,
  eposta TEXT UNIQUE
);

INSERT INTO kullanicilar (ad, eposta)
VALUES ('Ayse Yilmaz', 'ayse@ornek.com');

SELECT ad FROM kullanicilar WHERE id = 1;

Berkeley DB Nerelerde Kullanılır?

BDB, doğrudan son kullanıcı gözüyle görünmese de birçok yaygın yazılımın içinde çalışan sessiz bir bileşendir. Tipik kullanım alanları şunlardır:

  • Dizin ve kimlik hizmetlerinin (ör. LDAP sunucularının) arka uç deposu olarak.
  • E-posta ve mesajlaşma sistemlerinde kuyruk ve indeks deposu olarak.
  • Ağ ekipmanlarında (yönlendirici, güvenlik duvarı) yapılandırma ve durum saklama için.
  • Masaüstü ve gömülü uygulamalarda yerel önbellek veya ayar deposu olarak.
  • Yüksek hacimli anahtar-değer erişimi gereken, ancak tam bir SQL sunucusunun aşırı olduğu servislerde.

Avantajları ve Sınırları

Berkeley DB'nin güçlü ve zayıf yanları, gömülü tasarımının doğrudan sonucudur. Aşağıdaki tablo dengeli bir özet sunar:

Güçlü YönlerSınırlar / Dikkat Edilecekler
Sunucusuz, düşük gecikmeli in-process erişimMerkezi çok istemcili sunucu modeli sunmaz
İsteğe bağlı ACID işlemleri ve kurtarmaSQL ve ilişkisel özellikler ayrı katman gerektirir
Farklı erişim yöntemleriyle iş yüküne uyarlanabilirlikŞema/ilişki yönetimini uygulama üstlenir
Düşük kaynak tüketimi, gömülü sistemlere uygunlukLisans koşulları kapalı kaynak kullanımını kısıtlayabilir
Olgun ve uzun süredir sahada kanıtlanmış kod tabanıOperasyonel araç ekosistemi büyük sunuculara göre dardır

Diğer Veritabanlarıyla Karşılaştırma

Berkeley DB'yi doğru konumlandırmak için onu farklı veritabanı sınıflarıyla kıyaslamak yardımcı olur. En yakın akrabası gömülü SQL motoru SQLite'tır. Buna karşılık PostgreSQL ve MySQL gibi sistemler, ağ üzerinden çok istemciye hizmet veren, tam SQL ve ilişkisel model sunan sunucu tabanlı çözümlerdir.

  • BDB'yi seçin: Gömülü, sunucusuz, çok hızlı anahtar-değer erişimi istiyor ve veri modelini kendiniz yönetmeye razıysanız.
  • SQLite'ı seçin: Gömülü çalışmayı isteyip yine de standart SQL ve ilişkisel tablolarla çalışmak istiyorsanız.
  • PostgreSQL / MySQL seçin: Ağdan erişilen, çok kullanıcılı, zengin sorgu ve ilişki gerektiren merkezi bir veritabanına ihtiyacınız varsa.

Bu ürünlerin ve daha fazlasının bütünsel bir haritası için ana rehberimize göz atabilirsiniz: Veritabanı Türleri Rehberi.

Sık Sorulan Sorular

Berkeley DB bir SQL veritabanı mı?

Temelde hayır; o bir anahtar-değer deposudur. Ancak SQLite uyumlu bir SQL katmanı ile birlikte kullanıldığında SQL sorguları da çalıştırabilir. Yani hem anahtar-değer hem de SQL modunda kullanılabilir.

Berkeley DB ile SQLite arasındaki temel fark nedir?

İkisi de gömülü ve sunucusuzdur. SQLite en baştan bir ilişkisel SQL motoru olarak tasarlanmıştır; Berkeley DB ise temelde bir depolama motorudur ve SQL, üzerine eklenen bir katmandır. İş yükü anahtar-değer ağırlıklıysa BDB, ilişkisel/SQL ağırlıklıysa SQLite genellikle daha doğal bir seçimdir.

Berkeley DB hâlâ geliştiriliyor mu?

Berkeley DB, Oracle çatısı altında bakımı sürdürülen olgun bir üründür. Uzun yıllardır sahada kullanıldığı için kararlı kabul edilir; yeni bir projede tercih ederken güncel sürüm ve lisans koşullarını doğrulamanız önerilir.