Topik temu duga representatif

Temu duga reka bentuk sistem: Bagaimanakah anda menggunakan shuffle sharding untuk mengasingkan noisy neighbor?

Reka bentuk sistemSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Kluster API yang dikongsi menjadi perlahan disebabkan oleh beberapa penyewa (tenant) bervolum tinggi. Reka bentuk shuffle sharding supaya penyewa berkongsi sumber terhad sambil menyokong penskalaan, failover, kuota dan kebolehcerapan.

Kehendak soalan dan skop

API multi-tenant mempunyai (N) titik akhir (endpoints) bahagian belakang. Daripada menghantar setiap penyewa ke setiap titik akhir, tetapkan setiap penyewa dengan shuffle shard sebanyak (k) titik akhir. Permintaan hanya dihalakan dalam shard tersebut, jadi titik akhir yang terlebih beban terutamanya hanya menjejaskan penyewa yang shardnya bertindih dengannya.

Terangkan cara menjana dan mengekalkan penugasan, mengendalikan penyewa yang bising (noisy tenants), menyebarkan titik akhir merentas Availability Zones, mencuba semula dan menskalakan, serta membuktikan radius impak (blast radius) yang lebih kecil berbanding sharding mudah. AWS membentangkan shuffle sharding sebagai teknik pengasingan beban kerja dan dinding sekatan (bulkhead): pertindihan terkawal boleh menghasilkan banyak kombinasi terasing dengan sumber yang lebih sedikit.

Perkara yang dinilai oleh penemu duga

  • Sama ada anda mengukur matlamat pengasingan, skala penyewa, bilangan titik akhir, saiz shard dan belanjawan percubaan semula.
  • Sama ada anda memahami kebarangkalian pertindihan berbanding penugasan berstatus (stateful) tanpa pertindihan.
  • Sama ada anda mengimbangi pengasingan dan kos berbanding memberikan kapasiti khusus kepada setiap penyewa.
  • Sama ada anda mengendalikan penyewa yang bising, kegagalan titik akhir, zon dan penskalaan yang stabil.
  • Sama ada eksperimen dan metrik membuktikan sempadan impak sebenar.

Jawapan reka bentuk sistem yang kukuh membezakan shuffle sharding daripada consistent hashing, sel dan bulkhead: pertindihan terkawal kekal wujud, tetapi mana-mana satu titik kesesakan seharusnya hanya menjejaskan kumpulan penyewa yang kecil.

Soalan penjelasan sebelum menjawab

  • Berapakah bilangan penyewa, bilangan titik akhir, saiz shard dan beban puncak setiap penyewa?
  • Adakah anda mengasingkan CPU, kolam sambungan (connection pools), barisan gilir (queues), kuota kadar (rate quotas) atau setiap sumber?
  • Bolehkah seorang penyewa merentasi zon atau wilayah, dan adakah terdapat peraturan pemastautan data (data-residency)?
  • Bolehkah penugasan berhijrah secara singkat, dan adakah pemetaan stabil diperlukan untuk mengelakkan pergolakan cache (cache churn)?
  • Adakah percubaan semula di luar shard dibenarkan, dan adakah ia akan meluaskan domain kegagalan?

Kerangka jawapan 30 saat

Saya akan memetakan setiap penyewa kepada (k) titik akhir dan memerlukan kepelbagaian zon semasa penugasan. Reka bentuk tanpa status (stateless) menjana calon dengan cincangan (hashing) stabil; apabila had pertindihan menjadi penting, peruntuk berstatus (stateful allocator) akan menolak kombinasi yang terlalu banyak bertindih dengan penyewa besar sedia ada. Permintaan hanya mencuba semula di dalam shard, menggunakan kapasiti lebihannya. Penskalaan menerbitkan versi penugasan baharu dan memindahkan kelompok kecil. Saya akan memantau pertindihan, barisan gilir, ralat dan penyewa yang terjejas, serta menerima pakai corak ini hanya apabila pengasingan yang diukur mengatasi kos kapasitinya.

Jawapan mendalam langkah demi langkah

Langkah 1: Tentukan kolam sumber dan unit pengasingan

Tentukan sama ada shard mengasingkan kolam sambungan, barisan gilir, pengehad kadar (rate limiters), cache atau contoh perkhidmatan penuh. Menyatakan sistem menggunakan shuffle-sharded sedangkan setiap penyewa masih menulis pada satu pangkalan data yang dikongsi tidak membuktikan apa-apa. Labelkan setiap sumber dan titik akhir yang dikongsi dengan metadata kapasiti dan domain kegagalan.

Langkah 2: Pilih saiz shard

Dengan (N) titik akhir dan (k) titik akhir bagi setiap penyewa, meningkatkan (k) akan menambah kapasiti lebihan bagi setiap penyewa tetapi juga meningkatkan pertindihan dan peluang kegagalan biasa. Mengurangkan (k) meningkatkan pengasingan tetapi mengurangkan ruang lega (headroom). Anggarkan dengan pemprosesan puncak (peak throughput), kegagalan titik akhir dan bilangan percubaan semula dan bukannya andaian tetap dua replika.

Langkah 3: Jana calon tanpa status (stateless)

Gunakan ID penyewa, versi kolam sumber dan kunci untuk menjana jujukan rawak pseudo (pseudorandom) yang boleh dihasilkan semula, kemudian pilih (k) titik akhir yang berbeza. Penggiliran kunci atau perubahan set titik akhir mengubah hasilnya, jadi sertakan versi penugasan dalam token penghalaan. Penjanaan tanpa status adalah mudah di pinggir (edge) tetapi tidak dapat menjamin pertindihan maksimum antara penyewa.

Langkah 4: Gunakan carian berstatus (stateful) apabila perlu

Bagi penyewa bernilai tinggi atau bising, kekalkan penugasan dalam satah kawalan (control plane) dan semak persilangan setiap calon dengan penugasan terdahulu. Contohnya, hadkan dua penyewa besar kepada paling banyak (r) titik akhir yang dikongsi sambil memerlukan kepelbagaian zon. Carian ini menambah kos peruntukan dan pengurusan status sebagai pertukaran bagi batasan pengasingan yang kukuh.

Langkah 5: Reka bentuk penghalaan dan percubaan semula

Penghala membaca penugasan penyewa yang berversi dan memilih titik akhir yang sihat di dalam shard. Percubaan semula kekal di dalam shard dengan jumlah belanjawan, backoff dan keperluan keidempotanan (idempotency). Jangan siarkan percubaan semula ke kolam global apabila satu titik akhir gagal. Jika shard tepu, kembalikan hasil pendikit (throttle) atau penurunan prestasi yang boleh dikenal pasti dengan isyarat peringkat penyewa.

Langkah 6: Kendalikan penyewa bising dan kuota

Berikan penyewa bising kuota bebas, had keserentakan (concurrency limits) dan belanjawan barisan gilir supaya mereka tidak dapat menggunakan setiap sumber dalam sesuatu shard. Pindahkan mereka ke shard khusus atau lebih besar dengan bacaan dwi (dual reads), serahan singkat dan undur balik (rollback). Ukur kuota mengikut penyewa dan shard; purata global boleh kelihatan sihat sedangkan kolam tempatan telah kehabisan sumber.

Langkah 7: Skala, lakukan failover dan tempatkan merentas zon

Menambah titik akhir mengubah kombinasi calon. Terbitkan versi penugasan baharu, gunakannya untuk penyewa baharu dan hijrahkan penyewa berisiko rendah secara beransur-ansur sambil mengekalkan versi lama. Sahkan pelepasan cache, barisan gilir dan sambungan. Label titik akhir mesti menyertakan zon, dan gangguan zon harus diserap oleh baki titik akhir shard dan bukannya percubaan semula rentas wilayah tanpa had.

Langkah 8: Sahkan faedah dan kos pengasingan

Suntik beban lampau titik akhir tunggal, sekatan barisan gilir, kegagalan zon dan trafik penyewa bising. Rekod penyewa yang terjejas, saiz pertindihan, masa pemulihan, percubaan semula rentas shard dan kapasiti lebihan, kemudian bandingkan dengan sharding mudah, sel atau kolam khusus. Contoh AWS menunjukkan bahawa memilih empat titik akhir untuk sesuatu shuffle shard boleh mengurangkan impak secara mendadak, tetapi hasil tepat bergantung pada (N), (k), kaedah penugasan dan pengedaran trafik.

Model jawapan

Saya akan memecahkan (shard) kolam sambungan, barisan gilir dan pengehad kadar ke dalam kolam titik akhir yang dilabel mengikut zon. Setiap penyewa mendapat (k) titik akhir berversi. Penyewa biasa menggunakan calon rawak pseudo yang stabil; penyewa bising menggunakan carian berstatus untuk mengehadkan pertindihan. Permintaan hanya mencuba semula di dalam shard, manakala penyewa bising mendapat kuota bebas dan penghijrahan yang boleh diterbalikkan. Penskalaan menggunakan versi penugasan baharu dan pelancaran beransur-ansur. Latihan simulasi merangkumi kegagalan titik akhir, zon dan penyewa bising; penyewa yang terjejas, batasan pertindihan, pemulihan, percubaan semula rentas shard dan kos kapasiti menentukan sama ada ia mengatasi sharding mudah.

Kesilapan lazim

  • Menghantar semua permintaan ke kolam global → tiada pengasingan kerosakan → kekalkan penghalaan dan percubaan semula di dalam shard.
  • Menyebut "rawak" tanpa analisis pertindihan → tiada bukti radius impak → kuantiti (N), (k), persilangan dan versi.
  • Memberikan titik akhir khusus kepada setiap penyewa → kos tinggi dan pemecahan (fragmentation) → khususkan hanya untuk penyewa bising dan kongsi selebihnya dengan batasan.
  • Mencuba semula secara global apabila berlaku kegagalan → kesesakan merebak → gunakan belanjawan shard, backoff dan keidempotanan.
  • Mengira semula cincangan serta-merta semasa penskalaan keluar (scale-out) → pergolakan cache dan barisan gilir → versikan penugasan dan hijrahkan secara beransur-ansur.
  • Hanya memerhatikan purata global → penyewa tempatan terjejas tanpa disedari → perhatikan dimensi penyewa, shard dan domain kegagalan.

Soalan susulan dan jawapan

Bagaimanakah shuffle sharding berbeza daripada consistent hashing?

Consistent hashing biasanya memetakan kunci kepada satu atau beberapa nod dan meminimumkan pergerakan semasa penskalaan. Shuffle sharding memilih satu set nod bagi setiap penyewa dan mengehadkan kegagalan biasa serta pertindihan dengan noisy neighbor.

Berapakah saiz (k) yang sepatutnya?

Pilih saiznya berdasarkan pemprosesan penyewa, kegagalan titik akhir, belanjawan percubaan semula dan kos kapasiti. Nilai (k) yang lebih besar menambah ruang lega dan boleh meningkatkan pertindihan; ujian beban dan suntikan kerosakan harus menentukannya dan bukannya angka tetap.

Bagaimana jika jadual penugasan tidak tersedia?

Kekalkan cache tempatan berversi dan sandaran tanpa status yang boleh disahkan. Jeda perubahan penugasan dan kekalkan penyewa sedia ada pada versi lama; jangan kira semula secara rawak sehingga mewujudkan penulisan berpecah (split writes).

Bolehkah penyewa yang bising merentasi shard?

Ia boleh menjadi strategi kapasiti terhad dengan belanjawan, had trafik dan undur balik tersendiri. Penyebaran tanpa had menggagalkan matlamat pengasingan.

Bagaimanakah anda mengendalikan kegagalan zon?

Wajibkan kepelbagaian zon dalam penugasan dan halakan hanya ke titik akhir yang sihat di dalam shard. Failover rentas wilayah memerlukan reka bentuk kapasiti dan ketekalan yang jelas, bukan percubaan semula tanpa henti.

Bilakah anda memilih seni bina sel (cells)?

Pilih sel apabila satah data penuh, sempadan penyewa dan keluaran versi mesti bebas sepenuhnya. Pilih shuffle sharding apabila pengasingan sumber kongsi dan noisy neighbor sudah mencukupi pada kos pertindihan yang lebih rendah.

Apakah metrik yang akan membuatkan anda berhenti menggunakannya?

Berhenti menggunakannya jika latihan simulasi masih menjejaskan banyak penyewa yang tidak berkaitan, percubaan semula rentas shard kerap berlaku, penghijrahan menyebabkan pergolakan teruk, atau kos kapasiti melebihi faedah pengasingan. Kembali kepada sharding mudah atau kolam khusus.

Sumber awam

Soalan berkaitan

Alat temu duga berkaitan

Gunakan Jawab untuk jawapan reka bentuk sistem

Jelaskan keperluan terlebih dahulu, kemudian teruskan dengan skala, seni bina, pilihan komponen dan pertukaran (trade-off).

Lihat alat