Menengah8 menit baca

Partisi Panas DynamoDB: Cara Menemukan dan Memperbaikinya

DynamoDB menyebarkan data Anda ke banyak partisi fisik, yang masing-masing memiliki partisi tersendiri sepotong throughput. Partisi panas adalah ketika salah satu kunci draws jauh lebih banyak membaca atau menulis daripada yang bisa dilayani oleh irisannya — jadi mintalah kunci itu melalui throttle sementara sisanya meja duduk diam.

Apa itu partisi panas DynamoDB?

Partisi panas DynamoDB terjadi ketika salah satu menyerap jauh lebih banyak pembacaan atau penulisan daripada yang dapat dilayani oleh potongan throughputnya, sehingga meminta kunci tersebut ke throttle sementara sisa tabel tidak digunakan. Penyebabnya adalah desain kunci — item selebriti, kunci berkardinalitas rendah, tanggal hari ini — bukan ukuran meja. Obatnya menyebar menulis.

  • Penyebabnya adalah desain kunci, bukan ukuran meja. Satu berkonsentrasi lalu lintas — pengguna selebriti, bendera status="OPEN", tanggal hari ini — adalah jebakannya.
  • Kapasitas adaptif membantu, namun ini bukan solusi. DynamoDB menyeimbangkan kembali panas secara otomatis, namun satu item atau satu kunci masih bisa melebihi apa yang ada partisi dapat berfungsi.
  • Obatnya adalah menyebarkan penulisan. Tambahkan entropi ke kunci (tulis sharding) atau pindahkan jalur baca panas ke pola akses yang lebih terdistribusi.
  • Berasal dari SQL, ini tidak ada padanannya. Tabel relasional tidak memiliki pengertian "nilai indeks satu baris terlalu populer" - model throughput per kunci datar DynamoDB melakukan.

Mengapa ada partisi

DynamoDB adalah pewaris produksi kertas Amazon Dynamo tahun 2007, yang memperdagangkan model SQL node tunggal untuk model yang dipartisi dan berskala horizontal. Data dipecah dengan hash kunci partisi di seluruh node penyimpanan fisik.

Setiap partisi menampung jumlah data yang terbatas dan melayani jumlah data yang terbatas keluaran. AWS mendokumentasikan batas maksimum 3.000 RCU dan 1.000 WCU per partisi, per detik — batas lunak yang sama untuk masuk yang disediakan dan sesuai permintaan us-east-1 (AWS — perilaku partisi). Mode penagihan tidak menaikkan batas fisika; ini hanya mengubah cara pembelanjaan di tingkat tabel diukur. Gunakan kalkulator harga untuk biaya tingkat tabel dan Wawasan Kontributor untuk melihat apakah throttles benar terbatas partisi vs terbatas tabel.

Langit-langit itu adalah keseluruhan cerita. Throughput tabel Anda adalah jumlahnya di semua partisi. Pengumpulan item kunci dimulai pada satu partisi dan split-for-heat dapat mengukirnya di beberapa batas kunci penyortiran — kecuali tabelnya memiliki LSI atau kunci pengurutan terus meningkat, yang menyematkannya ke satu.

Beri nama jebakannya: lalu lintas yang bertumpuk pada satu tombol

Throughput dibagikan secara merata hanya jika akses Anda tersebar merata di seluruh kunci. Saat satu kunci mendapat lalu lintas yang tidak proporsional, kunci itu hanya melakukan throttles sementara itu kapasitas keseluruhan tabel tidak terpakai.

Bentuk tombol pintas klasik:

  • Item selebriti — satu pengguna, produk, atau penyewa yang dibaca semua orang.
  • Kunci partisi berkardinalitas rendahstatus, country, type. Hanya sedikit yang berbeda nilai berarti beberapa partisi melakukan semua pekerjaan.
  • Kunci berdasarkan waktuPK = "2026-06-23". Setiap tulisan hari ini menghasilkan satu tulisan partisi; hari kemarin dingin selamanya.

Berasal dari SQL, semua ini tidak menjadi masalah. Indeks B-tree pada nilai populer adalah baiklah. Di DynamoDB, nilai populer adalah unit penempatan fisik, jadi popularitas menjadi jurang keluaran.

Contoh yang berhasil: papan peringkat selebriti

Katakanlah Anda menjalankan papan peringkat game global. Skor langsung dalam tabel dengan kunci seperti ini:

PK = "BOARD#global"
SK = "PLAYER#<playerId>"

Membaca meraih N teratas berdasarkan skor; menulis menabrak currentScore pemain setelah masing-masing pertandingan. Setiap baris di papan global berbagi satu kunci partisi — BOARD#global — jadi setiap baca dan tulis berada di satu partisi.

Tambahkan streamer dengan dua juta pemirsa langsung yang mengirim spam ke tombol segarkan peringkatnya sendiri, dan satu partisi itu melewati 3.000 unit baca. Anda mengerti ProvisionedThroughputExceededException di papan global sementara yang lainnya papan di meja menganggur.

Footgunnya adalah keruntuhan BOARD#global: Anda memodelkan satu papan logis sebagai a kunci fisik tunggal.

Sebarkan tulisan: sharding kuncinya

Cara mengatasinya adalah dengan memproduksi kardinalitas. Tambahkan shard suffix ke partisi kunci sehingga satu papan logis menyebar ke N partisi fisik:

PK = "BOARD#global#<shard>"  -- shard = playerId mod 10
SK = "PLAYER#<playerId>"

Penulisan sekarang tersebar di sepuluh partisi, bukan satu — sepuluh kali penulisan ruang kepala. Biaya: pembacaan seluruh papan harus mencapai sepuluh pecahan dan digabungkan, karena tidak ada satu pun Query yang menjangkau batas shard. Anda menukar kesederhanaan membaca menulis distribusi.

Lihat sendiri perbedaannya. Tempelkan satu kunci berulang ke dalam visualisator di bawah dan setiap penulisan dimasukkan ke dalam satu keranjang — partisi panas. Tambahkan akhiran pecahan (BOARD#global#0#9) dan tulisan yang sama menyebar secara merata:

Distribusi partition key

Satu nilai partition key per baris. Ulangi sebuah nilai untuk mensimulasikan hot key.

8 bucket8 key
  • #0
    0
  • #1
    1
  • #2
    1
  • #3
    0
  • #4
    2
  • #5
    2
  • #6
    0
  • #7
    2

Ini adalah hash pengajaran yang disederhanakan, bukan hash internal DynamoDB yang sebenarnya. DynamoDB menggunakan fungsi internal yang tidak terdokumentasi dan jumlah partisi yang bertambah seiring tabel Anda — gunakan ini hanya untuk membangun intuisi tentang bagaimana key yang berbeda tersebar dan satu hot key menumpuk.

Ini adalah hash pengajaran untuk intuisi, bukan hash internal DynamoDB yang sebenarnya — itu fungsi sebenarnya dan batas partisi adalah internal AWS. Bacalah sebagai "bahkan menyebar vs skew", bukan sebagai prediksi di partisi fisik mana kunci berada.

AWS menyebutnya write sharding dan merekomendasikannya secara tepat untuk kecepatan tinggi, kunci kardinalitas rendah (AWS — menggunakan sharding tulis).

Ini adalah naluri yang sama di belakangnya desain meja tunggal — Anda membentuk kunci untuk pola akses, bukan untuk bagaimana data berada "secara alami".

Biarkan kapasitas adaptif melakukan bagian yang mudah

DynamoDB mengirimkan kapasitas adaptif, yang dibahas dalam sesi re:Invent 2018 "Amazon DynamoDB Di Balik Terpal" (DAT401). Itu terus mendistribusikan ulang tabel throughput menuju partisi mengambil panas, dan akan mengisolasi secara terus-menerus hot key ke partisinya sendiri (isolasi tingkat kunci, AWS — kapasitas yang sangat besar & adaptif).

Ini instan dan gratis — tetapi dibatasi oleh fisika (cara kerja kapasitas adaptif). Kapasitas adaptif bisa bergerak panaskan antara tombol, dan split-for-heat bahkan dapat membagi koleksi item panas di a batas kunci sortir. Plafon per partisi tetap mutlak hanya untuk satu kali panas item, kunci pengurutan yang terus bertambah, atau tabel dengan LSI — tempat kunci selebriti masih melalui throttles. Sharding adalah perbaikan deterministik; split-for-heat lambat dan oportunistik, jadi jangan menunggu.

Jalur keputusan setelah Anda melihat throttles pada kunci sibuk:

YaTidak, banyak kunciawalan yang samaYaTIDAKThrottling padasatu kunci?Satu itemterlalu panas?Pecahkan kuncinyaatau cache pembacaannyaKunci partisikardinalitas rendah?Tulis pecahanawalanKapasitas adaptifkemungkinan dapatmenanganinya

Sebagian besar partisi panas memutuskan untuk "memecah kunci" atau "membiarkan kapasitas adaptif seraplah" - diagramnya menunjukkan di cabang mana Anda berada.

Diagnosis sebelum Anda mendesain ulang

Anda tidak dapat memperbaiki apa yang tidak dapat Anda lihat. Throttling muncul sebagai ProvisionedThroughputExceededException (disediakan) atau sebagai ThrottledRequests, ReadThrottleEvents/WriteThrottleEvents, dan ReadThrottleEventsForKeyRange/WriteThrottleEventsForKeyRange — itu jumlah spesifik batas partisi — di CloudWatch (AWS — metrik CloudWatch).

Pasangkan hal tersebut dengan CloudWatch Contributor Insights untuk DynamoDB, yang memberi peringkat pada Anda kunci yang paling banyak diakses secara langsung — cara tercepat untuk mengonfirmasi kunci selebriti berdasarkan nama (AWS — Wawasan Kontributor). Dan jika Anda belum yakin hot key adalah penyebabnya — DynamoDB throttles for empat alasan berbeda — mulai dari panduan throttling dan biarkan metrik menamainya batas yang benar-benar Anda capai.

Saat Anda menguji jalur baca yang dipecah, Anda akan membuat sendiri KeyConditionExpression untuk setiap pecahan. Hasilkan itu tanpa kesalahan ketik dengan DynamoDB Expression Builder — ini memancarkan bentuk PK = :pk AND begins_with(SK, :sk) yang tepat per pecahan.

Jebakan yang harus dihindari

  • Kunci pengurutan yang terus bertambah. Kunci pengurutan monoton (stempel waktu, urutan nomor) memaksa setiap penulisan baru ke akhir yang sama dari satu kumpulan item, dan split-for-heat tidak dapat membantu — koleksinya tetap dibatasi pada 1.000 unit tulis. Tambahkan entropi ke kunci pengurutan atau pecahkan kunci partisi.
  • Membuang jalur yang banyak membaca secara sia-sia. Jika bacaan mendominasi dan itemnya mendominasi kecil, cache atau GSI dengan kunci yang didistribusikan lebih baik sering kali mengalahkan biaya baca pengumpulan-pencar sharding.
  • Membingungkan partisi panas dengan Scan yang lambat. Karena itu, Scan lambat membaca semuanya; partisi panas throttles karena satu kunci kelebihan beban. Masalah yang berbeda — lihat Kueri vs Pemindaian.

Langkah selanjutnya

Buat sketsa kunci pecahan, lalu buktikan jalur bacanya dengan data sebenarnya. Membangun kondisi per pecahan di Pembuat Ekspresi DynamoDB, dan unduh DynoTable untuk menjalankannya di tabel Anda sendiri dan lihat yang mana partisi sebenarnya mengambil panas.

Diperbarui