Yan yana
ShardingvsVeritabanı Replikasyonu
Sharding ile replikasyon (replication) arasındaki fark nedir?
Güncellendi 2 dk okuma7 fark
Kısaca
Sharding veritabanını böler, her sunucu verinin yalnızca bir kısmını saklar; replikasyon ise aynı veriyi yedeklilik ve okuma için birkaç sunucuya kopyalar.
Sharding
Sharding, bir veritabanının verisini shard adı verilen birkaç sunucuya bölerek ölçeklendirme yöntemidir; her biri toplamın yalnızca bir kısmını saklar ve işler.
Sharding sayfasını okuVeritabanı Replikasyonu
Veritabanı replikasyonu, verinin bir sunucudan diğerlerine sürekli kopyalanmasıdır; böylece birkaç sunucu güvenilirlik ve ölçek için aynı veriyi tutar.
Veritabanı Replikasyonu sayfasını okuSharding ve Veritabanı Replikasyonu karşılaştırması
| Özellik | Sharding | Veritabanı Replikasyonu |
|---|---|---|
| Ne yapar | Veriyi ayrı parçalara böler | Aynı veriyi birkaç sunucuya kopyalar |
| Her sunucunun tuttuğu | Yalnızca kendi satır alt kümesi | Verinin tam bir kopyası |
| Neyi ölçekler | Depolamayı, yazmaları ve okumaları | Yalnızca okumaları; yazmalar yine birincile gider |
| Hata toleransı | Kendi başına yok; bir shard'ı kaybetmek verisini kaybetmektir | Yüksek; bir replika başarısız bir birincilin yerini alabilir |
| Karmaşıklık | Yüksek: shard anahtarları, shard'lar arası sorgular, yeniden dengeleme | Orta: replikasyon gecikmesi ve yük devretme |
| Tutarlılık sorunu | Shard'lar arası işlemler zordur | Replikalar birincilin kısa süre gerisinde kalabilir |
| En uygun olduğu yer | Tek bir makine için çok büyük veri kümeleri veya yazma yükleri | Yüksek erişilebilirlik ve okuma ağırlıklı iş yükleri |
Fark, açıklamalı
Sharding, yatay bölümlemedir: satırlar, kullanıcı kimliği ya da bölge gibi bir shard anahtarı kullanılarak shard denen birkaç veritabanı sunucusuna dağıtılır. Replikasyon ise aynı verinin kopyalarını birden çok sunucuda tutar; genellikle yazmaları kabul eden bir birincil (primary) sunucu ve onun değişikliklerini izleyen replikalar vardır.
Farklı sınırları çözerler. Sharding, tek bir makine için çok fazla veri ya da çok fazla yazma olduğunda yardımcı olur, çünkü her shard yalnızca kendi dilimini işler. Replikasyon erişilebilirlik ve okuma ölçeklemesi sağlar: birincil bozulursa bir replika devralabilir ve okuma ağırlıklı iş yükleri sorguları kopyalara yayabilir.
Büyük sistemler neredeyse her zaman ikisini de kullanır: veri shard'lanır ve her shard, tek bir arızanın veri kümesinin bir kısmını kaybettirmemesi için replike edilir. Birçok dağıtık veritabanı bunu kendiliğinden yapar; veriyi aralıklara ya da bölümlere ayırır ve her birinin birkaç kopyasını tutar.
Sık yapılan bir yanlış, replikasyonun yazmaları ölçeklediği düşüncesidir. Her yazma yine birincile gider ve her replikaya kopyalanmalıdır; bu yüzden replikasyon okuma kapasitesini çoğaltır ama yazma kapasitesini değil. Sharding yazmaları ölçekler, ama shard'lar arası sorgular, shard'lar arası işlemler ve verinin yeniden dengelenmesi onu çok daha karmaşık kılar; bu yüzden genellikle daha sonraki bir adımdır.
Hangisini kullanmalısınız?
Sharding şu durumlarda doğru seçim:
- Verileriniz artık tek bir sunucuya sığmıyor.
- Yazma trafiği tek bir birincilin kaldırabileceğini aşıyor.
- Veri, müşteri veya bölge gibi bir anahtara göre temiz biçimde ayrışıyor.
Veritabanı Replikasyonu şu durumlarda doğru seçim:
- Veritabanı bir sunucu arızasından sağ çıkmalı.
- Okumalar yazmalardan çok daha fazla.
- Kopyaları diğer bölgelerdeki kullanıcılara yakın ya da analitik için istiyorsunuz.
Her kurulumda sorguların gittiği yer
// Sharding: each user's data lives on exactly one shard
const shards = [db0, db1, db2, db3];
function shardFor(userId) {
return shards[hash(userId) % shards.length];
}
await shardFor(42).query("INSERT INTO orders (user_id, total) VALUES (42, 99)");
await shardFor(42).query("SELECT * FROM orders WHERE user_id = 42");// Replication: every server holds all the data
// Writes go to the primary, which copies them to the replicas
await primary.query("INSERT INTO orders (user_id, total) VALUES (42, 99)");
// Reads can use any replica (it may lag slightly behind)
const replica = replicas[Math.floor(Math.random() * replicas.length)];
await replica.query("SELECT * FROM orders WHERE user_id = 42");Sık sorulan sorular
Sharding ve replikasyon birlikte kullanılabilir mi?
Evet ve büyük sistemler genellikle böyle yapar: veri shard'lara bölünür ve her shard replike edilir; böylece tek bir sunucunun arızası verinin bir kısmını kaybettirmez ya da engellemez.
Replikasyon bir yedek midir?
Kendi başına değil. Replikalar, kazara silmeler ve bozulmuş veri dahil her değişikliği neredeyse anında kopyalar; bu yüzden yine de belirli bir ana dönüş (point-in-time) yedeklerine ihtiyacınız vardır.
Shard anahtarı nedir?
Shard anahtarı, bir satırın hangi shard'a ait olduğuna karar vermek için kullanılan sütun ya da değerdir, örneğin bir kullanıcı kimliği. İyi bir shard anahtarı veriyi ve trafiği eşit dağıtır ve ilişkili satırları bir arada tutar.