Ana içeriğe geç

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ı oku

Veritabanı 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ı oku

Sharding ve Veritabanı Replikasyonu karşılaştırması

ÖzellikShardingVeritabanı Replikasyonu
Ne yaparVeriyi ayrı parçalara bölerAynı veriyi birkaç sunucuya kopyalar
Her sunucunun tuttuğuYalnızca kendi satır alt kümesiVerinin tam bir kopyası
Neyi ölçeklerDepolamayı, yazmaları ve okumalarıYalnızca okumaları; yazmalar yine birincile gider
Hata toleransıKendi başına yok; bir shard'ı kaybetmek verisini kaybetmektirYüksek; bir replika başarısız bir birincilin yerini alabilir
KarmaşıklıkYüksek: shard anahtarları, shard'lar arası sorgular, yeniden dengelemeOrta: replikasyon gecikmesi ve yük devretme
Tutarlılık sorunuShard'lar arası işlemler zordurReplikalar birincilin kısa süre gerisinde kalabilir
En uygun olduğu yerTek bir makine için çok büyük veri kümeleri veya yazma yükleriYü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

Shardingjavascript
// 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");
Veritabanı Replikasyonujavascript
// 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.

Daha fazla

Ayarlar