Topik ini menjelaskan cara melihat kemajuan tugas yang diinisiasi untuk menambah atau menghapus shard serta cara memeriksa apakah tugas tersebut terhambat oleh pengecualian.
Informasi latar belakang
Jika Anda menginisiasi tugas untuk menambahkan shard ke instance kluster sharded atau menghapus shard dari instance tersebut, tugas tersebut mungkin masih berlangsung untuk waktu yang lama setelah dikirimkan. Langkah-langkah berikut menjelaskan cara menangani masalah ini.
Sebelum memulai tugas seperti itu, Anda harus memahami item-item berikut:
Mode penyebaran instance set replika ApsaraDB for MongoDB dan instance kluster sharded, serta perbedaan antara arsitektur set replika dan kluster shard. Untuk informasi lebih lanjut, lihat Instance Set Replika dan Instance Kluster Sharded.
Prinsip kerja dasar balancer ApsaraDB for MongoDB. Untuk informasi lebih lanjut, lihat Kelola Balancer ApsaraDB for MongoDB.
Mode distribusi data instance ApsaraDB for MongoDB. Data instance didistribusikan di seluruh chunk.
Perintah O&M umum instance kluster sharded ApsaraDB for MongoDB, seperti
sh.status().Penggunaan dasar alat visualisasi, seperti mongo shell dan mongosh.
Periksa kemajuan tugas
Langkah 1: Periksa apakah balancer diaktifkan
Untuk tugas yang diinisiasi untuk menambah atau menghapus node shard, chunk data hanya akan dimigrasikan setelah balancer diaktifkan. Jika balancer dinonaktifkan, masalah berikut terjadi:
Saat shard sedang ditambahkan, chunk data tidak dapat dimigrasikan ke shard baru. Akibatnya, shard baru tidak dapat menangani lalu lintas bisnis.
Saat shard sedang dihapus, data dari shard yang ingin Anda hapus tidak dapat dimigrasikan. Dalam hal ini, tugas untuk menghapus shard terhambat.
Anda harus mengaktifkan balancer untuk memastikan bahwa chunk data dapat dimigrasikan sesuai harapan. Untuk informasi lebih lanjut, lihat Kelola Balancer ApsaraDB for MongoDB.
Anda dapat menggunakan salah satu metode berikut untuk memastikan apakah balancer diaktifkan:
Metode 1: Jalankan perintah
sh.status()Contoh berikut menunjukkan output yang dikembalikan untuk perintah sh.status() dengan balancer diaktifkan:
... autosplit: Saat ini diaktifkan: ya balancer: Saat ini diaktifkan: ya Saat ini berjalan: ya Jendela aktif balancer diatur antara 08:30 dan 11:30 waktu lokal server ...Jika
“Saat ini diaktifkan: tidak”ditampilkan dalam output, balancer dinonaktifkan.Metode 2: Jalankan perintah
sh.getBalancerState()Jika
truedikembalikan untuk perintah tersebut, balancer diaktifkan.Jika
falsedikembalikan untuk perintah tersebut, balancer dinonaktifkan.
Langkah 2: Periksa apakah jendela waktu balancer mencakup durasi yang singkat
Balancer mengelola kecepatan migrasi chunk data. Balancer hanya memigrasikan chunk data dalam jendela waktu tertentu. Jika chunk data tidak sepenuhnya dimigrasikan dalam jendela waktu yang ditentukan, tugas migrasi data akan dilanjutkan dalam jendela waktu berikutnya hingga migrasi selesai. Jika jendela waktu mencakup durasi yang singkat, kemajuan tugas untuk menambah atau menghapus shard akan tertunda. Untuk informasi lebih lanjut tentang cara memodifikasi jendela waktu balancer, lihat Kelola Balancer ApsaraDB for MongoDB.
Anda dapat menggunakan salah satu metode berikut untuk memeriksa jendela waktu balancer:
Metode 1: Jalankan perintah
sh.status()Contoh berikut menunjukkan output yang dikembalikan untuk perintah tersebut. Dalam contoh ini, jendela waktu balancer adalah dari 08:30 hingga 11:30 (waktu lokal) dan totalnya tiga jam.
... autosplit: Saat ini diaktifkan: ya balancer: Saat ini diaktifkan: ya Saat ini berjalan: ya Jendela aktif balancer diatur antara 08:30 dan 11:30 waktu lokal server ...Metode 2: Jalankan perintah
sh.getBalancerWindow()Contoh berikut menunjukkan output yang dikembalikan untuk perintah tersebut. Jika sebuah instance memiliki sejumlah besar koleksi sharded, metode ini dapat digunakan untuk menampilkan jendela waktu secara lebih intuitif.
{ "start" : "08:30", "stop" : "11:30" }
Langkah 3: Dapatkan informasi yang diperlukan untuk memperkirakan kemajuan tugas
Metode yang tersedia untuk versi sebelum MongoDB 6.0
Operasi berikut tersedia untuk versi berikut:
Instance yang menjalankan versi sebelum MongoDB 6.0.
Instance yang menjalankan MongoDB 6.0 dengan versi revisi sebelum MongoDB 7.0.1 (versi pembanding: 6.0.3). Untuk informasi tentang cara melihat versi minor suatu instance, lihat Catatan Rilis untuk Versi Minor ApsaraDB for MongoDB.
Sebelum mengevaluasi tugas, Anda harus mendapatkan hasil operasional balancer dan informasi chunk dari koleksi sharded yang akan dimigrasikan. Hasil operasional balancer mencakup statistik jumlah chunk yang dimigrasikan dan chunk yang gagal dimigrasikan.
Anda dapat menggunakan salah satu metode berikut untuk mendapatkan informasi di atas:
Metode 1: Lihat output yang dikembalikan untuk perintah
sh.status()Dalam output yang dikembalikan untuk perintah
sh.status(), Anda harus fokus pada hasil operasional terbaru balancer dan informasi chunk dari tabel sharded yang akan dimigrasikan. Contoh berikut menunjukkan hasil operasional terbaru balancer:... balancer: Koleksi dengan migrasi aktif: <db>.<koleksi> dimulai pada Rabu, 27 September 2023 10:25:21 GMT+0800 (CST) Putaran balancer gagal dalam 5 percobaan terakhir: 0 Hasil Migrasi dalam 24 jam terakhir: 300 : Sukses database: ...Contoh berikut menunjukkan informasi chunk dari koleksi sharded yang akan dimigrasikan:
... database: ... { "_id" : "<db>", "primary" : "d-xxxxxxxxxxxxxxx3", "partitioned" : true, "version" : { "uuid" : UUID("3409a337-c370-4425-ad72-8b8c6b0abd52"), "lastMod" : 1 } } <db>.<koleksi> kunci shard: { "<kunci_shard>" : "hashed" } unik: false balancing: true chunk: d-xxxxxxxxxxxxxxx1 13630 d-xxxxxxxxxxxxxxx2 13629 d-xxxxxxxxxxxxxxx3 13652 d-xxxxxxxxxxxxxxx4 13630 d-xxxxxxxxxxxxxxx5 3719 terlalu banyak chunk untuk dicetak, gunakan verbose jika Anda ingin memaksa pencetakan ...Dalam contoh di atas, d-xxxxxxxxxxxxxxx5 menunjukkan shard yang ditambahkan. Anda juga dapat menjalankan perintah
getShardDistributionpada database tempat tabel partisi berada untuk mendapatkan informasi tentang distribusi chunk data. Contoh kode:use <db> db.<koleksi>.getShardDistribution()Metode 2: Baca langsung informasi terkait dari database config
Kueri statistik chunk dan kemudian agregasikan berdasarkan shard. Contoh kode:
db.getSiblingDB("config").chunks.aggregate([{$group: {_id: "$shard", count: {$sum: 1}}}])Kueri chunk pada shard tertentu dan kemudian agregasikan berdasarkan namespace. Contoh kode:
db.getSiblingDB("config").chunks.aggregate([{$match: {shard: "d-xxxxxxxxxxxxxx"}},{$group: {_id: "$ns", count: {$sum: 1}}}])Kueri jumlah chunk yang dimigrasikan ke shard tertentu dalam sehari sebelumnya. Contoh kode:
// Tentukan field details.to sebagai shard yang ingin Anda migrasikan. // Tentukan field waktu sebagai rentang waktu tipe ISODate. db.getSiblingDB("config").changelog.find({"what" : "moveChunk.commit", "details.to" : "d-xxxxxxxxxxxxx","time" : {"$gte": ISODate("2023-09-26T00:00:00")}}).count()
Metode yang tersedia untuk versi setelah MongoDB 6.0
Operasi berikut tersedia untuk versi berikut:
Instance yang menjalankan versi setelah MongoDB 6.0.
Instance yang menjalankan MongoDB 6.0 dengan versi revisi MongoDB 7.0.1 (versi pembanding: 6.0.3) dan seterusnya. Untuk informasi tentang cara melihat versi minor suatu instance, lihat Catatan Rilis untuk Versi Minor ApsaraDB for MongoDB.
Sebelum mengevaluasi tugas, Anda harus fokus pada distribusi data di antara shard. Anda masih dapat menggunakan output yang dikembalikan oleh perintah sh.status() sebagai referensi. Namun, setelah Anda mendapatkan output, Anda harus lebih memperhatikan distribusi data pada setiap shard daripada jumlah chunk yang tidak merata pada setiap shard.
Dapatkan distribusi data dan keseragaman koleksi sharded.
Kami merekomendasikan Anda menjalankan perintah
getShardDistributionuntuk mendapatkan distribusi data pada koleksi sharded dan fokus pada keseragaman data, seperti yang ditunjukkan pada gambar berikut.
Anda juga dapat menjalankan perintah berikut untuk mendapatkan distribusi lebih rinci, termasuk jumlah dan ukuran total dokumen serta dokumen yatim:
db.getSiblingDB("admin").aggregate( [{ $shardedDataDistribution: { } },{ $match: { "ns": "<db>.<koleksi>" } }] ).pretty()Contoh berikut menunjukkan output untuk perintah di atas. Output tersebut menunjukkan bahwa data sangat tidak merata di antara shard.
{ "ns" : "<db>.<koleksi>", "shards" : [ { "shardName" : "d-xxxxxxxxxxxxxxx1", "numOrphanedDocs" : 0, "numOwnedDocuments" : 504298920, "ownedSizeBytes" : NumberLong("833101815840"), "orphanedSizeBytes" : 0 }, { "shardName" : "d-xxxxxxxxxxxxxxx2", "numOrphanedDocs" : 0, "numOwnedDocuments" : 250283901, "ownedSizeBytes" : NumberLong("409714745937"), "orphanedSizeBytes" : 0 }, { "shardName" : "d-xxxxxxxxxxxxxxx3", "numOrphanedDocs" : 0, "numOwnedDocuments" : 109098088, "ownedSizeBytes" : NumberLong("178157177704"), "orphanedSizeBytes" : 0 }, { "shardName" : "d-xxxxxxxxxxxxxxx4", "numOrphanedDocs" : 0, "numOwnedDocuments" : 382018055, "ownedSizeBytes" : NumberLong("630329790750"), "orphanedSizeBytes" : 0 } ] }Output tersebut juga menunjukkan item berikut: 1. Instance tempat Anda menjalankan perintah di atas berisi empat shard. 2. Volume data koleksi sharded bernama
<db>.<koleksi>dalam instance tersebut sekitar 2.051.303.530.231 byte (833.101.815.840 + 409.714.745.937 + 178.157.177.704 + 630.329.790.750), yang setara dengan 1.910,4 GB.Lihat jumlah data yang berhasil dimigrasikan dalam sehari sebelumnya.
Jalankan perintah berikut:
pipeline = [ { '$match': { 'what': 'moveChunk.commit', } }, { '$group': { '_id': { 'date': { '$dateToString': { 'format': '%Y-%m-%d', 'date': '$time'} }, }, 'chunks_moved': { '$sum': 1 }, 'docs_moved': { '$sum': '$details.counts.cloned' }, 'bytes_moved': { '$sum': '$details.counts.clonedBytes' }, } }, { '$sort': { '_id.date': -1} }, ] db.getSiblingDB("config").changelog.aggregate(pipeline)Gambar berikut menunjukkan output yang dikembalikan untuk perintah di atas.

Output tersebut menunjukkan bahwa 183.117.965.820 byte berhasil dimigrasikan pada
2024-09-21, yang setara dengan 170,5 GB.
Langkah 4: Perkirakan kemajuan dan waktu penyelesaian tugas
Metode yang tersedia untuk versi sebelum MongoDB 6.0
Operasi berikut tersedia untuk versi berikut:
Instance yang menjalankan versi sebelum MongoDB 6.0.
Instance yang menjalankan MongoDB 6.0 dengan versi revisi sebelum MongoDB 7.0.1 (versi pembanding: 6.0.3). Untuk informasi tentang cara melihat versi minor suatu instance, lihat Catatan Rilis untuk Versi Minor ApsaraDB for MongoDB.
Setelah Anda mendapatkan jumlah chunk yang dimigrasikan dari koleksi sharded dan distribusi data dalam koleksi sharded saat ini, Anda dapat memperkirakan kemajuan keseluruhan dan waktu penyelesaian yang diharapkan dari tugas tersebut.
Anggaplah Anda ingin menambahkan shard. Sebelum shard ditambahkan, jumlah total chunk tetap tidak berubah. Selain itu, jumlah shard tetap tidak berubah, yang menunjukkan bahwa tidak ada tugas yang diinisiasi untuk menambah atau menghapus shard. Saat shard sedang ditambahkan, beban kerja bisnis tetap konstan, dan parameter terkait balancer disetel ke nilai default mereka. Contoh pertama yang dijelaskan dalam metode yang tersedia untuk versi sebelum MongoDB 6.0 di Langkah 3 digunakan. Contoh tersebut menunjukkan item berikut:
Lima shard ditambahkan.
300 chunk dimigrasikan dalam jendela waktu balancer.
58.260 chunk terdapat dalam koleksi sharded bernama
<db>.<koleksi>. Jumlah chunk dihitung berdasarkan rumus berikut: 13.630 + 13.629 + 13.652 + 13.630 + 3.719 = 58.260.
Nilai berikut dapat dihitung berdasarkan hasil di atas:
Saat chunk didistribusikan secara merata di seluruh shard, jumlah chunk di setiap shard adalah 11.652 (58.260/5 = 11.652).
Berdasarkan kecepatan migrasi saat ini, dibutuhkan waktu tambahan 26,4 hari untuk menyelesaikan migrasi. Jumlah hari dihitung berdasarkan rumus berikut: (11.652 - 3.719)/300 ≈ 26,4.
Proses tugas untuk menambahkan shard adalah 32% (3.719/11.652 = 32%).
Dalam skenario nyata, jumlah total chunk meningkat karena data terus-menerus ditulis ke instance dan terjadinya pemecahan chunk. Asumsi di atas adalah kondisi ideal. Waktu aktual yang diperlukan untuk menyelesaikan tugas mungkin lebih lama.
Metode yang tersedia untuk versi setelah MongoDB 6.0
Operasi berikut tersedia untuk versi berikut:
Instance yang menjalankan versi setelah MongoDB 6.0.
Instance yang menjalankan MongoDB 6.0 dengan versi revisi MongoDB 7.0.1 (versi pembanding: 6.0.3) dan seterusnya. Untuk informasi tentang cara melihat versi minor suatu instance, lihat Catatan Rilis untuk Versi Minor ApsaraDB for MongoDB.
Anggaplah hanya satu koleksi dalam instance kluster sharded yang perlu diseimbangkan. Contoh pertama yang dijelaskan dalam metode yang tersedia untuk versi setelah MongoDB 6.0 di Langkah 3 digunakan. Contoh tersebut menunjukkan item berikut:
Empat shard ditambahkan.
183.117.965.820 byte berhasil dimigrasikan pada
2024-09-21, yang setara dengan 170,5 GB.Volume data koleksi sharded bernama
<db>.<koleksi>sekitar 2.051.303.530.231 byte (833.101.815.840 + 409.714.745.937 + 178.157.177.704 + 630.329.790.750), yang setara dengan 1.910,4 GB.
Nilai berikut dapat dihitung berdasarkan hasil di atas:
Saat keseimbangan data tercapai di antara shard, volume data setiap shard sekitar 512.825.882.557,75 byte, yang setara dengan 477,6 GB.
Untuk mencapai keseimbangan data di antara shard, Anda harus memigrasikan total 875.559.682.949 byte di antara shard, yang setara dengan 815,4 GB. Data spesifik yang dimigrasikan dari setiap shard:
Jumlah data yang harus dimigrasikan dari Shard 1 adalah 320.275.933.282,25 byte (833.101.815.840 - 512.825.882.557,75).
Jumlah data yang harus dimigrasikan dari Shard 2 adalah 103.111.136.620,75 byte (409.714.745.937 - 512.825.882.557,75).
Jumlah data yang harus dimigrasikan dari Shard 3 adalah 334.668.704.853,75 byte (178.157.177.704 - 512.825.882.557,75).
Jumlah data yang harus dimigrasikan dari Shard 4 adalah 117.503.908.192,25 byte (630.329.790.750 - 512.825.882.557,75).
(320.275.933.282,25 + 103.111.136.620,75 + 334.668.704.853,75 + 117.503.908.192,25 = 875.559.682.949)
Dibutuhkan sekitar 4,8 hari (815,4 GB/170,5 GB per hari) untuk mencapai keseimbangan data pada tingkat migrasi saat ini.
Langkah 5: Periksa apakah tugas terhambat saat shard sedang dihapus
Jika tugas yang diinisiasi untuk menghapus shard terhambat, output yang dikembalikan untuk perintah sh.status() tidak berisi pesan yang menunjukkan migrasi chunk yang berhasil dalam periode sebelumnya, dan beberapa chunk tidak dimigrasikan dari shard yang akan dihapus. Dalam hal ini, tugas belum selesai, dan operasi O&M yang dilakukan pada instance Anda di konsol ApsaraDB for MongoDB terpengaruh.
Contoh berikut menunjukkan output yang dikembalikan untuk perintah sh.status().

Masalah di atas mungkin disebabkan oleh chunk jumbo. Hal ini menghambat kemajuan penghapusan shard. Anda dapat menggunakan perintah berikut untuk memastikan apakah chunk jumbo ada.
db.getSiblingDB("config").chunks.aggregate([{$match: {shard: "d-xxxxxxxxxxxxxx", jumbo:true}},{$group: {_id: "$ns", count: {$sum: 1}}}])Dalam kebanyakan kasus, kemunculan chunk jumbo dapat dikaitkan dengan faktor-faktor seperti desain kunci shard yang tidak tepat atau buruk, yang mungkin mencakup keberadaan hotkey. Anda dapat menggunakan salah satu metode berikut untuk menangani masalah chunk jumbo pada klien Anda:
Jika versi mesin utama instance Anda adalah MongoDB 4.4, Anda dapat menjalankan perintah refineCollectionShardKey untuk mengoptimalkan desain kunci shard. Untuk menangani masalah terkait chunk jumbo, Anda dapat menambahkan akhiran ke kunci shard asli untuk meningkatkan kardinalitas kunci.
Jika versi mesin utama instance Anda adalah MongoDB 5.0 atau lebih baru, Anda dapat menjalankan perintah reshardCollection untuk melakukan resharding pada koleksi sharded tertentu berdasarkan kunci shard baru. Untuk informasi lebih lanjut, lihat Reshard a Collection.
Jika Anda yakin bahwa beberapa data dapat dihapus, Anda dapat menghapus data dari chunk jumbo yang sesuai. Ini mengurangi ukuran chunk jumbo. Setelah beberapa data dihapus, chunk jumbo menyusut ke ukuran chunk normal dan kemudian dipindahkan keluar oleh balancer.
Anda dapat meningkatkan nilai parameter
chunkSizeuntuk mengubah kondisi penentuan chunk jumbo. Kami merekomendasikan Anda melakukan operasi berdasarkan saran dari dukungan teknis Alibaba Cloud.
Jika metode di atas tidak berhasil, kami merekomendasikan Anda
ajukan tiket untuk menghubungi dukungan teknis.Percepat kemajuan tugas yang diinisiasi untuk menambah atau menghapus shard
Jika Anda ingin mempercepat proses keseluruhan penambahan atau penghapusan shard, Anda dapat menggunakan salah satu metode berikut:
Tingkatkan jendela waktu balancer. Namun, migrasi chunk dapat memperkenalkan beban tambahan pada layanan Anda, yang dapat memengaruhi kinerja operasi bisnis Anda. Oleh karena itu, kami merekomendasikan Anda mengevaluasi risiko sebelum memodifikasi jendela waktu. Untuk informasi lebih lanjut tentang cara memodifikasi jendela waktu, lihat Kelola Balancer ApsaraDB for MongoDB.
Sesuaikan nilai parameter setParameter.chunkMigrationConcurrency untuk instance kluster sharded untuk memodifikasi jumlah chunk konkuren yang akan dimigrasikan. Untuk informasi lebih lanjut tentang cara menggunakan parameter tersebut, lihat Instance Kluster Sharded (parameter yang tersedia hanya untuk shard).
Lakukan operasi
moveChunkselama jam-jam sepi. Untuk informasi lebih lanjut, lihat sh.moveChunk(). Contoh kode:sh.moveChunk("<db>.<koleksi>", {"<kunci_shard>": <nilai>}, "d-xxxxxxxxxxxxx") // contoh: sh.moveChunk("records.people", { zipcode: "53187" }, "shard0019")- Ajukan tiket untuk menghubungi dukungan teknis guna memodifikasi parameter kernel terkait.