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 rendah —
status,country,type. Hanya sedikit yang berbeda nilai berarti beberapa partisi melakukan semua pekerjaan. - Kunci berdasarkan waktu —
PK = "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:
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:
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
Scanyang lambat. Karena itu,Scanlambat 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.