migrasi chong mongodb shard 500GB membutuhkan waktu 13 hari - Apakah ini lambat atau normal?

9

Saya memiliki mongodb shard cluster, kunci shard di-hash. Ini memiliki 2 set replika beling. Setiap set replika memiliki 2 mesin.

Saya melakukan percobaan dengan menambahkan 2 set replika beling, dan mulai menyeimbangkan kembali.

Namun, setelah beberapa saat saya mengetahui bahwa migrasi chunk agak lambat. Dibutuhkan 1 jam untuk memindahkan data 1,4GB.

Itu membuat saya khawatir, itu artinya saya harus menunggu selama 13 hari untuk menyelesaikan 500GB migrasi chunk!

Saya baru dalam hal ini dan saya tidak memiliki perasaan dewa apakah itu lambat, cepat, atau normal. Tapi tetap saja, angka itu tidak meyakinkan saya.

Catatan tambahan pada percobaan: - menggunakan mesin aws m3 - tidak ada proses lain yang berjalan, hanya migrasi chunk - instalasi sharding mongodb default tanpa konfigurasi lebih lanjut - shardkey menggunakan hash pada objek id (_id) - ukuran chunk maksimal 64MB

rendybjunior
sumber

Jawaban:

10

Pembaruan: April 2018

Jawaban ini benar pada saat pertanyaan, tetapi hal-hal telah berubah sejak saat itu. Sejak versi 3.4 paralelisme telah diperkenalkan, dan tiket yang saya rujuk awalnya telah ditutup. Untuk informasi lebih lanjut, saya membahas beberapa detail dalam jawaban yang lebih baru . Saya akan meninggalkan sisa jawabannya apa adanya karena tetap menjadi referensi yang baik untuk masalah / kendala umum serta berlaku untuk siapa pun pada versi yang lebih lama.

Jawaban Asli

Saya memberikan penjelasan lengkap tentang apa yang terjadi dengan migrasi chunk di kursus M202 Advanced jika Anda tertarik. Secara umum, katakan saja migrasi tidak terlalu cepat, bahkan untuk potongan kosong, karena pembersihan dilakukan untuk memastikan migrasi bekerja dalam sistem yang aktif (ini masih terjadi bahkan jika tidak terjadi penyeimbangan kecuali terjadi penyeimbangan).

Selain itu, hanya ada satu migrasi yang terjadi pada satu waktu di seluruh cluster - tidak ada paralelisme. Jadi, terlepas dari kenyataan bahwa Anda memiliki dua simpul "penuh" dan dua simpul "kosong", pada waktu tertentu paling banyak terjadi satu migrasi (antara beling dengan potongan paling banyak dan beling dengan yang paling sedikit). Oleh karena itu, setelah menambahkan 2 pecahan, Anda tidak mendapatkan apa-apa dalam hal kecepatan penyeimbangan dan hanya meningkatkan jumlah bongkahan yang harus dipindahkan.

Untuk migrasi sendiri, ukuran chunk cenderung ~ 30MiB (tergantung pada bagaimana Anda mengisi data, tetapi umumnya ini akan menjadi rata-rata Anda dengan ukuran chunk max maksimum). Anda dapat menjalankan db.collection.getShardDistribution()beberapa informasi itu, dan lihat jawaban saya di sini untuk mengetahui cara mendapatkan lebih banyak informasi tentang potongan Anda.

Karena tidak ada aktivitas lain yang terjadi, agar migrasi terjadi, target shard (salah satu pecahan yang baru ditambahkan) perlu membaca ~ 30MiB data dari pecahan sumber (salah satu dari yang asli 2) dan memperbarui server konfigurasi ke mencerminkan lokasi chunk yang baru setelah selesai. Memindahkan 30MiB data seharusnya tidak menjadi hambatan bagi sistem normal tanpa beban.

Jika lambat, ada sejumlah alasan yang memungkinkan mengapa demikian, tetapi yang paling umum untuk sistem yang tidak sibuk adalah:

  • Sumber Disk I / O - jika data tidak ada dalam memori aktif ketika sedang dibaca, itu harus di-paging dari disk
  • Jaringan - jika ada latensi, pembatasan kecepatan, kehilangan paket, dll. Maka pembacaan mungkin memakan waktu cukup lama
  • Target Disk I / O - data dan indeks harus ditulis ke disk, banyak indeks dapat memperburuk ini, tetapi biasanya ini bukan masalah pada sistem yang dimuat dengan ringan
  • Masalah dengan migrasi yang menyebabkan aborsi dan migrasi gagal (masalah dengan server konfigurasi, masalah dengan penghapusan pada pendahuluan)
  • Kelambanan replikasi - untuk migrasi ke set replika, menulis kekhawatiran w:2atau w:majoritydigunakan secara default dan membutuhkan sekunder yang terkini untuk memuaskannya.

Jika sistem sibuk maka pertikaian memori, pertikaian kunci biasanya akan menjadi tersangka di sini juga.

Untuk mendapatkan informasi lebih lanjut tentang berapa lama migrasi, jika gagal, dll., Lihat entri di Anda config.changelog:

// connect to mongos
use config
db.changelog.find()

Seperti yang Anda lihat, dan seperti yang biasanya saya katakan kepada orang-orang ketika saya melakukan pelatihan / pendidikan, jika Anda tahu Anda akan membutuhkan 4 pecahan, maka biasanya lebih baik untuk memulai dengan 4 daripada meningkatkan. Jika Anda melakukannya, maka Anda perlu menyadari bahwa menambahkan beling dapat memakan waktu yang lama, dan awalnya merupakan negatif bersih pada sumber daya daripada keuntungan (lihat bagian II dari seri perangkap perangkap saya untuk diskusi lebih rinci tentang itu).

Akhirnya, untuk melacak / meningkatkan / mengomentari permintaan fitur untuk meningkatkan paralelisme migrasi chunk, lihat SERVER-4355

Adam C
sumber
Terima kasih, ini menjelaskan mekanisme migrasi chunk lebih dari dokumentasi mongodb.
rendybjunior
Saya pasti akan mengikuti kursus Anda. :) Apa pendapat Anda tentang kecepatan yang saya sebutkan sebelumnya? Apakah ini normal atau lambat? Saya tahu pertanyaan ini relatif berdasarkan banyak aspek. Tetapi saya meminta pendapat Anda sendiri
rendybjunior
Tampaknya sedikit lambat berdasarkan deskripsi Anda, tetapi saya harus membandingkan contoh menengah untuk memastikan. Nilai tukar Anda saat ini mungkin yang mereka mampu, atau Anda mungkin memiliki salah satu masalah yang saya sebutkan dalam jawaban. Satu kontrol yang dapat Anda coba adalah langkah chunk manual - matikan balancer dan pada dasarnya lakukan sendiri untuk melihat apakah ada masalah dan apa dampak gerakan terhadap sistem sumber / target. Anda dapat menemukan detail yang relevan di moveChunk di sini: docs.mongodb.org/manual/reference/method/sh.moveChunk
Adam C
Hanya menambahkan bahwa chunk mirgation memiliki prioritas rendah pada mongoDB dan bahkan pada Sistem Kinerja Tinggi dapat memakan waktu jika mereka sibuk.
Antonios
@Antonis - tidak yakin apa yang Anda maksud dengan prioritas, migrasi chunk adalah read dari source shard (sama seperti read lainnya) dan tulisan pada target shard (dengan masalah penulisan yang disebutkan di atas), tidak ada prioritas operasi ini versus yang lain. Mereka akan lambat pada sistem yang sibuk, tetapi bukan karena perbedaan prioritas yang melekat.
Adam C