Sharding ve replikasyon: veritabanını çoğaltma ve bölme yöntemleri
Replikasyon veriyi birden çok sunucuda kopyalar, sharding veriyi sunucular arasında böler. İkisinin farkı, işleyişi ve birlikte kullanımı burada.
Replikasyon nedir?
Replikasyon (çoğaltma), aynı verinin birden çok sunucuda tutulması ve değişikliklerin bu kopyalara yayılmasıdır. En yaygın düzen birincil-yedek (primary-replica) modelidir: yazmalar birincil sunucuya gider, değişiklikler yedek sunuculara aktarılır. Yedekler okuma yükünü paylaşabilir ve birincil sunucu arızalandığında biri onun yerini alabilir.
Replikasyon şu sorunları çözer: erişilebilirlik (bir sunucu düşse de sistem çalışır) ve okuma ölçeklemesi (okuma istekleri birden çok kopyaya dağıtılır). Ama her sunucu verinin tamamını taşıdığı için depolama ve yazma kapasitesi büyümez.
Sharding nedir?
Sharding (parçalama), veriyi bir anahtara göre parçalara bölüp farklı sunuculara dağıtmaktır. Her parçaya shard denir ve verinin yalnızca bir bölümünü tutar. Örneğin müşteri kayıtlarını müşteri kimliğine göre bölerseniz her shard farklı bir müşteri grubunu barındırır.
Sharding hem depolamayı hem yazma yükünü yatay olarak büyütür; tek sunucuya sığmayan veri ya da tek sunucunun taşıyamadığı yazma hızı bu yolla aşılır. Bedeli ise karmaşıklıktır: sorgunun hangi shard'a gideceği bilinmeli, birden çok shard'ı kapsayan sorgu ve işlemler zorlaşır.
İkisinin farkı
Replikasyon aynı veriyi çoğaltır, sharding farklı veriyi dağıtır. Bu yüzden amaçları da farklıdır:
- Replikasyon: erişilebilirlik, felaket toparlama, okuma ölçekleme.
- Sharding: depolama ve yazma ölçekleme.
- Replikasyon her sunucuda tüm veriyi tutar; sharding her sunucuda verinin bir kısmını tutar.
- Büyük sistemlerde ikisi birlikte kullanılır: veri shard'lara bölünür ve her shard kendi içinde replikalarla korunur.
Shard anahtarı ve replikasyon gecikmesi
Sharding'in en kritik kararı shard anahtarıdır. Hash tabanlı dağıtım yükü eşit yayar ama aralık sorgularını zorlaştırır; aralık tabanlı dağıtım aralık sorgularına uygundur ama belirli bir aralık aşırı yüklenirse sıcak nokta (hotspot) oluşur. Kötü seçilmiş bir anahtar tüm yatay ölçekleme faydasını yok edebilir ve sonradan değiştirmek pahalıdır.
Replikasyonda ise asenkron aktarım, yedeklerin birincil sunucunun biraz gerisinde kalmasına (replikasyon gecikmesi) yol açar. Kullanıcı yeni yazdığı veriyi hemen okumaya çalışırsa eski cevap alabilir. Senkron replikasyon bu riski azaltır ama yazma gecikmesini artırır. Bu denge, tutarlılık ile erişilebilirlik arasındaki klasik ödünleşimin bir parçasıdır.
Örnek senaryo
Örneğin bir e-ticaret sitesi, sipariş tablosu büyüdüğünde ve kampanya günlerinde yazma yükü arttığında önce okuma raporlarını yedek sunuculara kaydırır. Bu yetmediğinde siparişleri müşteri kimliğine göre shard'lara böler. Her shard için ayrıca yedekler tutulur; bir sunucu düşerse ilgili shard'ın yedeği devralır. Müşteri bazlı sorgular tek shard'a gider, tüm siparişleri kapsayan raporlar ise ayrı bir analiz kopyasında çalıştırılır.
Sık yapılan hatalar
Erken sharding en pahalı hatalardan biridir: önce indeks, sorgu ve donanım iyileştirmesi, sonra replikasyon, en son sharding düşünülmelidir. Replikasyonu yedekleme sanmak da yaygın bir yanılgıdır; yanlışlıkla silinen veri kopyalara da silinmiş olarak yayılır, bu yüzden ayrı bir yedek ve geri dönüş planı gerekir.
Diğer hatalar: yük devretmeyi hiç tatbik etmemek, replikasyon gecikmesini izlememek, shard'lar arası işlemlerin maliyetini hesaba katmamak ve yeni shard eklerken veriyi yeniden dağıtma planı yapmamak.
Mindset programlarında nerede işlenir?
Mindset'in Veritabanı Replikasyonu ve Sharding eğitimi replikasyon modelleri, yüksek erişilebilirlik ve yük devretme, okuma ölçekleme, bölümleme ve shard anahtarı tasarımı ile dağıtık sorgu ve işlem yönetimini içerir. MongoDB İşletimi ve Sharding Stratejileri ile PostgreSQL Yüksek Erişilebilirlik ve Replikasyon eğitimleri ise bu kavramları ilgili veritabanı üzerinde uygular.
İlgili Mindset programı
Veritabanı Replikasyonu ve Sharding
Sık sorulan sorular
Replikasyon yedekleme yerine geçer mi?
Hayır. Replikasyon erişilebilirlik sağlar, yedekleme değildir. Yazılan her değişikliği kopyalara taşır; yanlışlıkla silinen ya da bozulan veri de kopyalarda bozulur. Yedekleme geçmiş bir ana dönüşü sağlar. Üretim sistemlerinde ikisi birlikte kullanılır.
Sharding ne zaman gerekir?
Veri ya da yazma yükü tek bir güçlü sunucunun kaldırabileceğini aştığında. Öncesinde indeks iyileştirme, sorgu düzeltme, önbellek ve replikalarla okuma ölçekleme gibi daha basit adımlar tüketilmelidir, çünkü sharding işletim karmaşıklığını belirgin biçimde artırır.
İyi bir shard anahtarı nasıl seçilir?
Yükü eşit dağıtan, sık kullanılan sorgularda filtre olarak geçen ve zamanla değişmeyen bir alan aranır. Örneğin kullanıcı kimliği çoğu zaman uygundur; yalnızca tarih gibi sürekli artan bir değer ise yeni kayıtları tek shard'a yığabilir.
Replikasyon gecikmesi neden sorun olur?
Yedek sunucu birincil sunucunun gerisindeyse, kullanıcı az önce yazdığı veriyi okuyunca eski hali görebilir. Uygulama, kritik okumaları birincile yönlendirerek ya da gecikmeyi izleyip eşik aşılınca yedeği devre dışı bırakarak bunu yönetir.