Partisi fisik DynamoDB
Partisi fisik adalah unit DynamoDB yang sebenarnya menyimpan data Anda: sepotong SSD, yang direplikasi di seluruh Availability Zone, menampung satu bagian ruang kunci Anda. Tabel Anda adalah hal yang logis. Partisi adalah tempat byte — dan throughput batas — benar-benar hidup.
Bagaimana cara kerja partisi DynamoDB?
DynamoDB menyimpan tabel Anda di seluruh partisi fisik — irisan SSD direplikasi di seluruh Availability Zone. Masing-masing dibatasi pada ~10 GB, 3.000 unit baca/detik, dan 1.000 unit tulis/detik. Hash Anda menentukan partisi mana yang akan ditempati item, dan DynamoDB membagi partisi secara otomatis saat partisi tersebut bertambah atau menjadi panas.
- Setiap partisi dibatasi pada penyimpanan ~10 GB, 3.000 unit baca/detik, dan 1.000 tulis satuan/detik. Batas atas tersebut per partisi, bukan per tabel.
- Hash Anda memilih partisi. Item dengan kunci yang sama mendarat bersama; satu panas — atau kunci pengurutan monotonik — adalah yang menyematkan satu partisi.
- DynamoDB membagi partisi untuk Anda — berdasarkan ukuran, dan panas berkelanjutan — termasuk memisahkan kumpulan item satu kunci pada batas kunci pengurutan, kecuali LSI atau kunci pengurutan yang terus meningkat memblokirnya.
- Throttling dengan kapasitas cadangan adalah jawabannya.
ProvisionedThroughputExceededkesalahan saat tabel Anda berada pada penggunaan 5% berarti satu partisi sudah maksimal.
Bagaimana suatu item menemukan partisinya
DynamoDB memasukkan nilai kunci partisi Anda melalui fungsi hash internal. hashnya output mengambil partisi fisik. Kunci masuk yang sama, partisi keluar yang sama — setiap saat.
Berasal dari SQL, tidak ada analog. Tidak ada pohon B indeks yang Anda sesuaikan, tidak ada kunci pecahan Anda menugaskan dengan tangan. Penempatannya adalah hash yang tidak Anda kendalikan dan tidak pernah Anda lihat.
Item yang berbagi kunci partisi membentuk , disimpan bersama dan
diurutkan berdasarkan kunci pengurutan. Itulah yang membuat Query dengan satu kunci menjadi murah — ia membaca satu kunci
dijalankan secara berdekatan pada satu partisi. (Lihat Kueri vs Pemindaian.)
Ambil toko acara pertandingan untuk sebuah game. Kunci tabelnya adalah arenaId (partisi) dan
eventKey (urutkan):
# Item
arenaId = "ARENA#7f3a"
eventKey = "EVT#1719100800#a91c"
playerTag = "Nightjar"
dmgDealt = 412
Setiap acara untuk arena 7f3a di-hash ke partisi yang sama dan ditumpuk dalam kunci pengurutan
memesan. Bagus untuk "membaca linimasa pertandingan ini". Sebuah tanggung jawab jika satu arena itu mendapat
semua lalu lintas.
Tiga langit-langit yang diterapkan setiap partisi
Sebuah partisi tunggal dirancang untuk memberikan paling banyak:
| Membatasi | Per partisi | Dihitung sebagai |
|---|---|---|
| Penyimpanan | ~10GB | byte item mentah |
| Kapasitas baca | 3.000 unit baca/detik | 1 RU = satu pembacaan 4 KB yang sangat konsisten |
| Kapasitas tulis | 1.000 unit tulis/detik | 1 WU = satu tulisan 1 KB |
Sumber: panduan AWS Praktik terbaik untuk mendesain kunci partisi.
Ukuran item menskalakan matematika. Item berukuran 20 KB berharga 5 unit baca per sangat konsisten dibaca, jadi satu partisi melayani ~600 pembacaan/detik sebelum melaluittles — bukan 3.000. Biaya tulis bulat naik per 1 KB, biaya baca naik per 4 KB.
Batasan tersebut adalah per partisi, bukan per tabel. Meja Anda dapat disediakan 40.000 WCU dan masih throttle, karena semua penulisan dilakukan pada satu partisi yang mencapai 1.000.
Bagaimana partisi terbagi
DynamoDB menambahkan partisi secara otomatis dalam dua kasus. Anda tidak pernah menjalankan perintah.
Bagi berdasarkan ukuran. Saat partisi terisi hingga ~10 GB, DynamoDB membagi kuncinya berkisar menjadi dua dan memindahkan separuh item ke partisi baru. Penyimpanan bertambah secara transparan; pembacaan dan penulisan Anda tetap berfungsi sepanjang waktu.
Pisahkan untuk panas. Saat partisi mengambil lalu lintas berkelanjutan mendekati throughputnya langit-langit, DynamoDB membagi rentang tombol pintas sehingga masing-masing setengahnya mendarat di partisinya sendiri. AWS menyebutnya sebagai mekanisme split-for-heat. Semburan throttling pendek yang berhenti sendiri sering kali berarti perpecahan demi panas – meskipun lonjakan singkat juga bisa saja terjadi menjadi kapasitas ledakan yang mengering.
Pemisahan membeli ruang di banyak kunci, dan pemisahan untuk panas bahkan dapat mengukir satu kunci pengumpulan item pada potongan kunci sortir. Apa yang tidak bisa disebarkannya adalah satu item panas, dan kunci pengurutan yang terus meningkat, atau koleksi yang disematkan oleh LSI.
Mengapa hot key mengalahkan splitter
Pemisahan mendistribusikan ulang rentang kunci partisi. Jika lalu lintas Anda terkonsentrasi pada satu nilai kunci, setiap permintaan di-hash ke partisi yang sama, dan tidak ada rentang kiri untuk membagi.
Jika arena 7f3a adalah final turnamen yang menghasilkan 4.000 penulisan/detik setiap saat
arena menganggur, Anda akan mencapai ttle pada 1.000 — dan split-for-heat tidak dapat melakukan rescue di sini,
karena eventKey yang diawali stempel waktu bersifat monoton, sehingga setiap penulisan baru terjadi
ujung depan dari satu rentang kunci sortir yang sempit tanpa ada yang bisa dipotong. Yang lebih baru
Alasan KeyRangeThroughputExceeded throttle menyebutkan persis seperti ini: kunci satu partisi
rentangnya, bukan tabelnya, yang melebihi batasnya.
Perbaikannya ada pada model data, bukan penggeser kapasitas. Write-shard tombol pintas: tambahkan sufiks kecil sehingga satu arena logis tersebar di N partisi fisik.
arenaId = "ARENA#7f3a#3" # shard 0..9, chosen per writeBacaan kemudian menyebar ke seluruh pecahan dan menggabungkan sisi klien. Anda dapat membuat prototipe
bentuk kunci dan Query untuk setiap pecahan dengan
DynamoDB Expression Builder sebelum Anda menyentuh
sebaris kode aplikasi.
Satu peringatan: pengecualian LSI
Ada satu kasus ketika penyimpanan is dibatasi per kunci partisi. Tanpa , kumpulan item terbagi menjadi beberapa partisi perlu melayani byte yang disimpan dan throughputnya — miliaran nilai kunci pengurutan baik-baik saja.
Tambahkan LSI, dan seluruh koleksi untuk satu kunci partisi harus muat dalam satu kunci partisi Partisi 10 GB, karena LSI membagikannya. Itulah tebing per-PK yang tercakup di dalamnya GSI vs LSI — alasan lain mengapa sebagian besar tim menggunakan GSI.
Mendesain agar partisi tetap sejuk
Tuas yang sebenarnya Anda kendalikan adalah kunci partisi. Pilih satu dengan banyak perbedaan nilai relatif terhadap jumlah baris, sehingga lalu lintas menyebar secara merata. (Lebih banyak pola di desain meja tunggal.)
- Kunci berkardinalitas tinggi. Kunci per pengguna atau per penyewa mengalahkan kunci per hari atau kunci per status yang dapat dipalu semua orang sekaligus.
- Perhatikan hot key yang diketahui. Nilai "turnamen saat ini" atau "hari ini" adalah a risiko konsentrasi sebelum Anda mengirim, bukan setelahnya.
- Sharding hot key yang tidak dapat dihindari. Ketika salah satu kunci harus mengambil lalu lintas yang sangat besar, a akhiran adalah palka escape standar.
Throttling dengan kapasitas tersisa adalah sinyal Anda bahwa satu partisi sedang panas. Periksa koleksi item yang miring dan latih tata letak kunci yang dipecah DynoTable — arahkan ke tabel Anda sendiri, GROUP BY kunci partisi masuk SQL Workbench untuk melihat tombol mana yang mendominasi, dan membuat model perbaikan sebelum memberitahukan Anda.