İçeriğe geç

Sharding ve Shard Anahtarı — Veriyi Bölmenin Tek Önemli Kararı

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Replikasyon ve Okuma Replikaları — Yazdım Ama Göremiyorum

30 saniyede özet

Sharding veriyi birden çok veritabanına böler. Hangi satırın nereye gideceğini shard anahtarı seçer ve bu seçim hangi sorgunun ucuz, hangisinin her shard'a sorulacağını, yazmaların dağılıp dağılmayacağını belirler.

Bir kütüphane büyüdükçe kitaplar tek binaya sığmaz ve dört şube açılır. Şimdi her kitabın hangi şubeye gideceğine karar vermek gerekir. Bu kararın kendisi, kütüphanenin geri kalan bütün hayatını belirler.

  1. Bayt: Ödemeler tablosu tek veritabanına sığmıyor. Aylara göre dört veritabanına böldüm, çok düzenli.

  2. Sen: Bugün gelen ödemeler hangisine yazılıyor?

  3. Bayt: Hepsi... dördüncüye. Öteki üçü boş boş duruyor!

  4. Bayt: Bölmenin kuralı, yükün nereye gideceğini de seçmiş. Kuralı birlikte inceleyelim.

Bölmek ve anahtar

shardingBir tablonun satırlarını birden çok veritabanına bölmek. Her shard verinin bir parçasını taşır; yazma ve depolama yükü bölünür.Sözlükte gör →, bir tablonun satırlarını birden çok veritabanına dağıtmaktır. Her veritabanı verinin yalnızca bir parçasını taşır, böylece yazma ve depolama yükü bölünür.

Hangi satırın hangi shard’a gideceğini shard keyBir satırın hangi shard'a gideceğini belirleyen kolon. Sorgu onu içeriyorsa tek shard'a, içermiyorsa hepsine gider.Sözlükte gör → belirler. Bu anahtar bir kez seçilir ve sonradan değiştirmek bütün veriyi taşımak demektir.

Kafam karıştı, daha basit anlat

Sharding veriyi parçalara böler. Hangi satırın nereye gideceğini tek bir kural, shard anahtarı seçer.

Hızlı kontrolBaşlangıç

Sharding ile replikasyon arasındaki temel fark nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Shard anahtarı neyi belirler?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Hangi soru ucuz?

Ödemeler müşteri numarasının hash'ine göre dört shard'a bölündü. Muhasebe geçen haftanın bütün ödemelerini istiyor. Sorgu kaç shard'a gider? Cevabı göster

Dördüne de. Tarih shard anahtarında değil; geçen haftanın ödemeleri her shard’a dağılmış. Her shard’a sorulur ve sonuçlar birleştirilir.

Kitapları şubelere bölen kural, hangi sorunun ucuz olacağını seçer.
Adım adım oku
  1. Kitaplar dört şubeye bölündü.
  2. Aya göre bölünce bütün yeni kitaplar tek şubeye gidiyor; orası boğuluyor.
  3. Üye numarasına göre bölünce yük eşit dağılıyor.
  4. Bölme kuralını, en sık sorulan soruya göre seç.

Sorgu shard anahtarını içeriyorsa yön bellidir ve tek shard’a gidilir. İçermiyorsa her shard’a sorulur; buna scatter-gather denir ve en yavaş shard kadar yavaştır.

Yazmalar da aynı kurala uyar. Tarih gibi sürekli artan bir anahtar, “şimdi”yi tek bir shard’a koyar ve bütün yeni yazmalar oraya yığılır.

Kafam karıştı, daha basit anlat

Sorgu anahtarı biliyorsa tek shard, bilmiyorsa hepsi. Sürekli artan bir anahtar yazmaları tek yere yığar.

Hızlı kontrolOrta

Ödemeler müşteri numarasının hash'ine göre bölündü. 'Geçen haftanın ödemeleri' sorgusu kaç shard'a gider?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Ödemeler aya göre bölündü. Bugünün yazmaları nasıl dağılır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Shard eklemek

Anahtarı shard’a hash mod N ile eşlersen, N değişince kalanların çoğu değişir. Dörtten beşe geçerken her beş anahtardan dördü başka shard’a gider.

consistent hashingAnahtarları ve shard'ları bir halkaya dizen eşleme. Shard eklenince yalnızca yeni shard'ın payı taşınır, hash mod N'deki gibi çoğu değil.Sözlükte gör → anahtarları bir halkaya dizer; yeni shard yalnızca kendi payını alır. Bir başka yaygın yol, baştan çok sayıda sanal shard açıp onları fiziksel makinelere dağıtmaktır.

Kafam karıştı, daha basit anlat

mod N ile shard eklemek neredeyse her şeyi taşır. Consistent hashing yalnızca yeni shard’ın payını taşır.

Hızlı kontrolOrta

hash(müşteri) mod 4 ile çalışan sisteme beşinci shard eklenip mod 5'e geçildi. Satırların yaklaşık ne kadarı başka shard'a taşınmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Shard anahtarı neyi ucuzlatır?

Tohum 275257
  1. shard 1…
  2. shard 2…
  3. shard 3…
  4. shard 4…

Oynat ya da adımla.

Hız
Adım 0

Şu an ne oldu?

Tarih aralığı (ay) · Bugünün yazmaları

Shard anahtarı, bir satırın hangi shard'da duracağına karar verir. Her anahtar bir işi ucuzlatır, bir başkasını pahalılaştırır.

Görevler0/3

  • Bütün yazmaları tek bir shard'a yığaçık

    İpucu

    Varsayılan ayarlar yeter.

  • Tek bir müşterinin ödemeleri için dört shard'a birden soraçık

    İpucu

    Müşteri numarası anahtarda değilse ne olur?

  • Hash anahtarıyla beşinci shard'ı verinin yalnızca beşte birini taşıyarak ekleaçık

    İpucu

    Anahtarları shard'lara eşlemenin başka bir yolu var.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Tarih anahtarında bugünün bütün yazmaları dördüncü shard’a gitti.
  2. Anahtarı hash yap. Yazmalar dörde eşit bölündü.
  3. İşi “bir müşterinin ödemeleri” yap. Hash’te tek shard; tarih ve ülkede dört shard.
  4. “Beşinci shard ekle”, hash anahtarı. Verinin yüzde 80’i taşındı.
  5. Consistent hashing’i aç. Yalnızca beşte biri taşındı.
Hızlı kontrolOrta

Consistent hashing, shard eklerken neden daha az veri taşır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Erken sharding. Tek veritabanı, indeksler, okuma replikaları ve önbellek çoğu zaman yeter. Sharding’in bedeli her sorguda ve her şema değişikliğinde ödenir.

Shard’lar arası transaction. İki farklı shard’daki satırı tek transaction’da değiştirmek artık dağıtık bir transaction’dır. Birlikte değişen veriyi aynı shard anahtarı altında tut.

Ünlü müşteri. Hash bile kurtarmaz: tek bir dev müşteri bütün yazmaların yarısını yapıyorsa, onun shard’ı yine sıcak olur.

Kafam karıştı, daha basit anlat

Gerekmeden bölme, birlikte değişeni aynı yerde tut, tek bir dev anahtara dikkat et.

Hızlı kontrolOrta

Hesaptan hesaba transferde gönderen ve alıcı farklı shard'larda. Ne değişir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıdaki örnek bir ödeme sisteminden: ödemeler müşteri numarasına göre sanal shard’lara, sanal shard’lar da fiziksel veritabanlarına dağıtılıyor.

Derinleş · Ödemeler: müşteri numarasıyla sharding, sanal shard'larla büyüme 4 dosya · ~65 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/payment/shard/ ShardRouter.java Yönlendirici: müşteri numarası sabit 1024 sanal shard'dan birine, sanal shard da bir veritabanına eşleniyor.

src/main/java/com/bank/payment/shard/ShardRouter.java
@Component
class ShardRouter {
// Fixed forever: changing it would move every row.
static final int VIRTUAL_SHARDS = 1024;
private final ShardMap map;
ShardRouter(ShardMap map) {
this.map = map;
}
DataSource forCustomer(long customerId) {
int virtualShard = Math.floorMod(Long.hashCode(customerId), VIRTUAL_SHARDS);
return map.physicalFor(virtualShard);
}
}

src/main/java/com/bank/payment/shard/ ShardMap.java Eşleme tablosu: yeni veritabanı eklemek, yalnızca bazı sanal shard'ların satırını değiştirmek.

src/main/java/com/bank/payment/shard/ShardMap.java
// virtual shard ranges -> physical database. Adding a database means moving a
// few ranges to it and updating this map, not rehashing every customer.
@Component
class ShardMap {
private final NavigableMap<Integer, DataSource> byRangeStart;
ShardMap(Map<Integer, DataSource> rangeStarts) {
this.byRangeStart = new TreeMap<>(rangeStarts);
}
DataSource physicalFor(int virtualShard) {
return byRangeStart.floorEntry(virtualShard).getValue();
}
}

src/main/java/com/bank/payment/ PaymentService.java Servis: her sorgu müşteri numarasıyla başlıyor, yani tek shard'a gidiyor.

src/main/java/com/bank/payment/PaymentService.java
@Service
class PaymentService {
private final ShardRouter router;
PaymentService(ShardRouter router) {
this.router = router;
}
// Every customer-facing query carries the shard key: one shard per call.
List<Payment> recentFor(long customerId) {
JdbcClient db = JdbcClient.create(router.forCustomer(customerId));
return db.sql("select * from payments where customer_id = ? order by created_at desc limit 50")
.param(customerId)
.query(Payment.class)
.list();
}
}

src/main/java/com/bank/report/ WeeklyReport.java Rapor: tarih sorgusu her shard'a gidiyor ve bilerek ayrı bir okuma deposundan yapılıyor.

src/main/java/com/bank/report/WeeklyReport.java
// A date-range report cannot use the shard key, so it would ask every shard.
// It reads from the analytics store that the payments stream feeds instead.
@Service
class WeeklyReport {
private final AnalyticsStore analytics;
WeeklyReport(AnalyticsStore analytics) {
this.analytics = analytics;
}
BigDecimal totalFor(LocalDate weekStart) {
return analytics.sumPayments(weekStart, weekStart.plusDays(7));
}
}

Kendini sına

Şimşek turu1/4

Sorgu shard anahtarını içermiyorsa her shard'a sorulması gerekir.

Soru 1/3İleri

Shard anahtarı hash(müşteri). Tek bir kurumsal müşteri bütün yazmaların yarısını yapıyor. Sonuç?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Shard anahtarı, bir satırın hangi shard'da duracağını belirler. Sorgu bu anahtarı içeriyorsa tek shard'a gider; içermiyorsa her shard'a sorulur ve sonuçlar birleştirilir.
  2. 2 Tarih gibi sürekli artan bir anahtar, bütün yeni yazmaları tek bir shard'a yığar. Yazma yükünü dağıtmak için çeşitliliği yüksek bir anahtar seçilir.
  3. 3 hash mod N ile shard eklemek verinin büyük kısmını taşır (4'ten 5'e geçişte yüzde 80'i). Consistent hashing yalnızca yeni shard'ın payını taşır.
Sonraki kapı Müşterinin telefonunu güncelledin. Üç havaleden ikisinde hâlâ eski numara yazıyor. Nasıl? Normalizasyon — Aynı Bilgi Neden Tek Yerde Durmalı? · 8 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı