Terlalu banyak database dan koleksi dalam instans MongoDB Anda dapat menurunkan performa database dan menyebabkan masalah lainnya.
Istilah database dan table yang digunakan dalam database tradisional masing-masing bersesuaian dengan database dan collection di MongoDB.
Di MongoDB, mesin penyimpanan WiredTiger membuat file disk terpisah untuk setiap koleksi. Setiap indeks juga menghasilkan file disk baru. Untuk setiap resource yang terbuka, seperti objek sistem file, mesin WiredTiger mempertahankan struktur data dhandle. Struktur ini menyimpan informasi seperti detail checkpoint, jumlah referensi sesi, pointer ke struktur B+ tree di memori, serta data statistik.
Oleh karena itu, semakin banyak database dan koleksi dalam sebuah instans MongoDB, semakin banyak objek sistem file yang harus dibuka oleh mesin WiredTiger. Hal ini meningkatkan jumlah struktur data dhandle di memori. Ketika sejumlah besar struktur dhandle ini disimpan di memori, kontensi lock dapat terjadi, yang mengakibatkan penurunan performa instans.
Potensi masalah
-
Kueri lambat dan latensi permintaan meningkat akibat
handleLockatauschemaLock.Terlalu banyak database dan koleksi dapat menyebabkan kueri lambat, yang menghasilkan log serupa contoh berikut:
2024-03-07T15:59:16.856+0800 I COMMAND [conn4175155] command db.collections command: count { count: "xxxxxx", query: { A: 1, B: 1 }, $readPreference: { mode: "secondaryPreferred" }, $db: "db" } planSummary: COLLSCAN keysExamined:0 keysExaminedBySizeInBytes:0 docsExamined:1 docsExaminedBySizeInBytes:208 numYields:1 queryHash:916BD9E3 planCacheKey:916BD9E3 reslen:185 locks:{ ReplicationStateTransition: { acquireCount: { w: 2 } }, Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 2 } }, Collection: { acquireCount: { r: 2 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 304, timeReadingMicros: 4 }, timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msLog kueri lambat di atas menunjukkan bahwa operasi count sederhana pada koleksi yang hanya berisi satu dokumen memerlukan waktu eksekusi yang sangat lama. Bagian
timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msdari log tersebut mengindikasikan bahwa permintaan baca menghabiskan terlalu banyak waktu menunggu untuk mendapatkanhandleLockdanschemaLockdari mesin penyimpanan dasar akibat jumlah koleksi yang sangat besar. -
Error out-of-memory (OOM) selama fase sinkronisasi awal saat menambahkan node baru.
-
Waktu startup instans meningkat.
-
Waktu sinkronisasi data meningkat.
-
Waktu yang lebih lama untuk backup dan restore data.
-
Tingkat kegagalan backup fisik meningkat.
-
Waktu pemulihan kegagalan lebih lama.
Jumlah database dan koleksi yang besar tidak selalu menyebabkan masalah. Dampak aktual bergantung pada faktor-faktor seperti model data aplikasi dan workload. Misalnya, pertimbangkan dua skenario berikut di mana database dengan spesifikasi yang sama masing-masing memiliki 10.000 koleksi dan total 100.000 file. Tantangan yang dihadapi keduanya sangat berbeda:
-
Sistem perangkat lunak akuntansi: Pola akses sangat terkonsentrasi. Sebagian besar koleksi digunakan untuk penyimpanan data dingin, dan hanya sebagian kecil koleksi terbaru yang sering diakses.
-
Sistem manajemen multi-tenant: Tenant diisolasi dengan menggunakan koleksi terpisah, dan hampir semua koleksi aktif diakses atau digunakan.
Metode optimasi
Hapus koleksi yang tidak diperlukan
Identifikasi koleksi dalam database yang dapat dihapus, misalnya koleksi yang sudah kedaluwarsa atau tidak lagi digunakan. Gunakan perintah dropCollection untuk menghapusnya. Untuk informasi lebih lanjut, lihat dropCollection().
Sebelum melakukan operasi penghapusan apa pun, pastikan Anda memiliki cadangan penuh yang tersedia.
Gunakan perintah berikut untuk melihat informasi database dan koleksi:
-
Jalankan perintah berikut untuk melihat jumlah koleksi dalam sebuah database.
db.getSiblingDB(<dbName>).getCollectionNames().length -
Jalankan perintah berikut untuk melihat informasi detail tentang sebuah database, termasuk jumlah koleksi, indeks, dan dokumen, serta ukuran data total.
// Lihat statistik untuk database tertentu. db.getSiblingDB(<dbName>).stats() -
Jalankan perintah berikut untuk melihat informasi detail tentang koleksi tertentu.
// Lihat statistik untuk koleksi tertentu. db.getSiblingDB(<dbName>).<collectionName>.stats()
Hapus indeks yang tidak diperlukan
Mengurangi jumlah indeks juga mengurangi jumlah file disk dan struktur dhandle yang sesuai yang dipertahankan oleh mesin penyimpanan WiredTiger, yang membantu mengurangi masalah ini.
Ikuti prinsip dasar berikut untuk optimasi indeks:
-
Hindari indeks yang tidak digunakan
Jika kueri tidak pernah mengakses bidang tertentu, indeks apa pun pada bidang tersebut tidak akan digunakan. Indeks semacam itu dianggap tidak terpakai dan dapat dihapus.
-
Ikuti aturan prefiks indeks
Misalnya, jika Anda memiliki indeks
{a:1}dan{a:1,b:1}, indeks pertama merupakan prefiks redundan dari yang kedua dan dapat dihapus. -
Pertimbangkan urutan bidang indeks untuk kueri equality
Untuk pencocokan equality, urutan bidang dalam indeks komposit tidak berpengaruh. Misalnya, untuk kueri pada bidang a dan b, indeks
{a:1,b:1}dan{b:1,a:1}secara fungsional setara. Anda dapat menghapus salah satu yang lebih jarang digunakan. -
Gunakan aturan ESR untuk kueri range
Untuk membuat indeks komposit optimal bagi kueri Anda, susun bidang-bidangnya dalam urutan
Equality, Sort, Range. Untuk informasi lebih lanjut, lihat Aturan ESR (Equality, Sort, Range). -
Tinjau indeks dengan jumlah hit rendah
Indeks dengan jumlah hit rendah sering kali tumpang tindih dengan indeks yang lebih efisien. Analisis semua pola kueri terkait untuk menentukan apakah Anda dapat menghapusnya dengan aman.
Anda dapat menggunakan stage agregasi $indexStats MongoDB untuk melihat statistik semua indeks dalam sebuah koleksi. Pastikan Anda memiliki izin yang diperlukan sebelum menjalankan perintah berikut.
// Lihat statistik indeks untuk koleksi tertentu.
db.getSiblingDB(<dbName>).<collectionName>.aggregate({"$indexStats":{}})
Perintah tersebut mengembalikan output serupa contoh berikut.
{
"name" : "item_1_quantity_1",
"key" : { "item" : 1, "quantity" : 1 },
"host" : "examplehost.local:27018",
"accesses" : {
"ops" : NumberLong(1),
"since" : ISODate("2020-02-10T21:11:23.059Z")
}
}
Tabel berikut menjelaskan parameter dalam informasi yang dikembalikan.
|
Parameter |
Deskripsi |
|
name |
Nama indeks. |
|
key |
Detail kunci indeks. |
|
accesses.ops |
Jumlah operasi yang telah menggunakan indeks ini, yang setara dengan jumlah hit indeks. |
|
accesses.since |
Waktu mulai pengumpulan statistik. Bidang ini dan bidang |
Jika Anda mengamati bahwa suatu indeks memiliki jumlah hit yang sangat rendah, misalnya accesses.ops bernilai 1, kemungkinan besar indeks tersebut redundan atau tidak terpakai sehingga dapat dipertimbangkan untuk dihapus. Jika instans MongoDB Anda versi 4.4 atau lebih baru, Anda dapat menggunakan perintah hideIndex untuk menyembunyikan indeks tersebut sebelum menghapusnya. Hal ini memungkinkan Anda memastikan tidak ada dampak negatif terhadap aplikasi dalam jangka waktu tertentu, sehingga mengurangi risiko penghapusan indeks.
Contoh
Asumsikan Anda memiliki koleksi pemain game dengan aturan: "Setiap kali pemain mengumpulkan 20 coins, koin tersebut dikonversi menjadi 1 star." Dokumen dalam koleksi tersebut tampak seperti berikut:
// Koleksi players
{
"_id": "ObjectId(123)",
"first_name": "John",
"last_name": "Doe",
"coins": 11,
"stars": 2
}
Koleksi tersebut saat ini memiliki lima indeks berikut, yang mencakup semua bidang:
-
_id(indeks default) -
{ last_name: 1 } -
{ last_name: 1, first_name: 1 } -
{ coins: -1 } -
{ stars: -1 }
Logika optimasi indeks adalah sebagai berikut:
-
Kueri aplikasi tidak mengakses bidang
coins, sehingga{ coins: -1 }merupakan indeks yang tidak terpakai. -
Berdasarkan aturan prefiks indeks yang disebutkan sebelumnya, indeks
{ last_name: 1, first_name: 1 }mencakup indeks{ last_name: 1 }. Oleh karena itu, Anda dapat menghapus indeks{ last_name: 1 }. -
Dengan menggunakan perintah
$indexStats, Anda mengamati bahwa jumlah hit untuk{ stars: -1 }rendah. Namun, di akhir putaran game, aplikasi memerlukan pengurutan pemain berdasarkan jumlahstarssecara descending untuk leaderboard. Oleh karena itu, meskipun tidak sering digunakan, indeks{ stars: -1 }harus dipertahankan untuk menghindari pemindaian koleksi penuh.
Setelah optimasi, tiga indeks tersisa dalam koleksi:
-
_id -
{ last_name: 1, first_name: 1 } -
{ stars: -1 }
Manfaat optimasi ini meliputi:
-
Ruang penyimpanan berkurang.
-
Performa write meningkat.
Jika Anda memiliki pertanyaan lebih lanjut tentang optimasi indeks, silakan submit a ticket untuk menghubungi dukungan teknis Alibaba Cloud.
Konsolidasikan data dari beberapa koleksi
Konsolidasikan data dari beberapa koleksi ke dalam satu koleksi untuk mengurangi jumlah total koleksi.
Sebagai contoh, database bernama temperatures menyimpan data suhu dari sensor. Sensor beroperasi dari pukul 10:00 hingga 22:00, membaca dan menyimpan data suhu setiap setengah jam. Data suhu harian disimpan dalam koleksi terpisah yang dinamai berdasarkan tanggal.
Cuplikan berikut menampilkan data sebagian dari dua koleksi, temperatures.march-09-2020 dan temperatures.march-10-2020.
-
Koleksi
temperatures.march-09-2020{ "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } -
Koleksi
temperatures.march-10-2020{ "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
Seiring waktu, jumlah koleksi dalam database meningkat. Karena MongoDB tidak memberlakukan batas keras pada jumlah koleksi dan model ini tidak memiliki kebijakan siklus hidup data yang jelas, jumlah koleksi dan indeks yang sesuai terus bertambah tanpa batas.
Selain masalah jumlah koleksi yang terus bertambah, model data ini menyulitkan pelaksanaan kueri yang mencakup beberapa hari. Untuk mengkueri data lintas beberapa hari guna menganalisis tren suhu jangka panjang, Anda perlu menggunakan kueri $lookup, yang kurang performanya dibandingkan kueri dalam satu koleksi.
Model data yang lebih baik adalah menyimpan semua pembacaan suhu dalam satu koleksi, dengan data harian disimpan dalam satu dokumen. Pendekatan ini merupakan contoh Bucket Pattern. Contoh berikut menunjukkan model yang dioptimalkan.
// temperatures.readings
{
"_id": ISODate("2020-03-09"),
"readings": [
{
"timestamp": "2020-03-09T010:00:00Z",
"temperature": 29
},
{
"timestamp": "2020-03-09T010:30:00Z",
"temperature": 30
},
...
{
"timestamp": "2020-03-09T022:00:00Z",
"temperature": 26
}
]
}
{
"_id": ISODate("2020-03-10"),
"readings": [
{
"timestamp": "2020-03-10T010:00:00Z",
"temperature": 30
},
{
"timestamp": "2020-03-10T010:30:00Z",
"temperature": 32
},
...
{
"timestamp": "2020-03-10T022:00:00Z",
"temperature": 28
}
]
}
Model yang dioptimalkan ini mengonsumsi jauh lebih sedikit resource dibandingkan model aslinya. Anda tidak perlu lagi membuat indeks berdasarkan waktu dalam sehari, dan indeks default _id pada koleksi memfasilitasi kueri berdasarkan tanggal. Ini juga menyelesaikan masalah jumlah koleksi yang tidak terbatas.
Untuk data deret waktu, Anda juga dapat mempertimbangkan penggunaan time series collections untuk mengatasi masalah ini.
Fitur time series collection hanya didukung di MongoDB versi 5.0 dan yang lebih baru.
Pisahkan instans
Jika Anda tidak dapat mengurangi jumlah total database dan koleksi dalam satu instans MongoDB, pertimbangkan pemisahan logis instans database beserta perubahan yang sesuai pada aplikasi Anda.
Anda dapat menerapkan pendekatan ini dalam dua skenario:
|
Skenario |
Solusi pemisahan |
Pertimbangan |
|
Koleksi tersebar di beberapa database |
Jika logika bisnis antar-database tidak saling terkait erat (misalnya, beberapa aplikasi atau layanan berbagi satu instans database), gunakan DTS (Data Transmission Service) untuk memigrasikan beberapa database ke instans ApsaraDB for MongoDB replica set atau sharded cluster baru. Sebelum migrasi selesai, Anda juga harus memisahkan logika aplikasi dan metode akses yang sesuai. Jika logika bisnis antar-database saling terkait erat, rujuk solusi pemisahan untuk skenario single-database. |
|
|
Koleksi terkonsentrasi dalam satu database |
Tim bisnis Anda harus terlebih dahulu menentukan apakah semua koleksi dapat dipisahkan berdasarkan dimensi tertentu, seperti wilayah, kota, prioritas, atau atribut bisnis bermakna lainnya. Kemudian, gunakan DTS untuk memigrasikan beberapa koleksi ke satu atau beberapa instans MongoDB baru, sehingga membagi satu instans menjadi N instans. Sebelum migrasi selesai, Anda harus memisahkan logika aplikasi dan metode akses yang sesuai. |
|
Contoh
Platform manajemen multi-tenant menggunakan database MongoDB. Dalam model data awal, setiap tenant memiliki koleksi terpisah. Seiring pertumbuhan bisnis, jumlah tenant melebihi seratus ribu, dan ukuran total database mencapai tingkat terabyte. Instans sering mengalami akses database lambat dan latensi tinggi.
Tim bisnis memutuskan untuk membagi tenant berdasarkan wilayah geografis, membagi tenant domestik menjadi Tiongkok Utara, Timur Laut, Timur, Tengah, Selatan, Barat Daya, dan Barat Laut. Mereka membuat instans MongoDB baru di zona ketersediaan yang sesuai untuk setiap wilayah dan melakukan migrasi bertahap menggunakan DTS. Untuk memenuhi kebutuhan analisis agregat bisnis, mereka juga menyiapkan sinkronisasi dari instans MongoDB ke gudang data.
Pemisahan ini secara signifikan mengurangi jumlah database dan koleksi di setiap instans MongoDB, dan tim menurunkan spesifikasi instans yang sesuai. Dengan menerapkan prinsip akses wilayah terdekat, aplikasi mengurangi latensi permintaan hingga tingkat milidetik, sangat meningkatkan pengalaman produk. Pemeliharaan instans berikutnya juga menjadi jauh lebih sederhana.
Migrasikan ke kluster sharded dengan shard tags
Jika semua koleksi Anda berada dalam satu database dan Anda ingin mengelolanya sebagai satu instans logis, pertimbangkan migrasi data Anda ke arsitektur kluster sharded dan gunakan shard tags untuk manajemen. Metode manajemen shard tag sedikit lebih kompleks dan memerlukan langkah operasional tambahan (menggunakan sh.addShardTag dan sh.addTagRange). Namun, satu instans MongoDB tetap mengelola semua koleksi, sehingga hanya memerlukan perubahan minimal pada aplikasi Anda. Anda hanya perlu mengganti string koneksi dengan string koneksi instans kluster sharded baru.
Sebagai contoh, jika instans Anda memiliki 100.000 koleksi aktif, Anda dapat membeli instans kluster sharded baru dengan 10 shard. Ikuti proses berikut untuk mengonfigurasi instans dan migrasi data, yang akan menghasilkan 10.000 koleksi aktif per shard. Prosedurnya sebagai berikut:
-
Beli instans kluster sharded baru. Contoh ini menggunakan instans 2-shard. Untuk petunjuk cara membuat kluster sharded, lihat Create a sharded cluster instance.
-
Hubungkan ke node mongos instans kluster sharded. Untuk informasi lebih lanjut, lihat Connect to an ApsaraDB for MongoDB sharded cluster instance by using the mongo shell.
-
Jalankan perintah berikut untuk menambahkan shard tag ke setiap shard.
sh.addShardTag("d-xxxxxxxxx1", "shard_tag1") sh.addShardTag("d-xxxxxxxxx2", "shard_tag2")Catatan-
Sebelum menjalankan perintah ini, pastikan akun yang Anda gunakan memiliki izin yang diperlukan.
-
DMS (Data Management) saat ini tidak mendukung perintah
sh.addShardTag. Kami menyarankan menghubungkan ke instans dengan mongo shell atau mongosh untuk menjalankan perintah ini.
-
-
Pra-konfigurasikan aturan distribusi rentang berbasis tag untuk semua koleksi yang di-shard.
use <dbName> sh.enableSharding("<dbName>") sh.addTagRange("<dbName>.test", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag1") sh.addTagRange("<dbName>.test1", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag2")Contoh ini menggunakan
_idsebagai kunci shard. Pilih kunci shard yang sesuai dengan workload Anda, dan pastikan semua operasi kueri menyertakan bidang kunci shard. Kunci shard harus konsisten dengan bidang yang digunakan pada langkah berikutnya. Anda juga harus menggunakan batas[MinKey,MaxKey]untuk memastikan semua data untuk satu koleksi berada di satu shard. -
Jalankan operasi shardCollection untuk semua koleksi yang akan dimigrasikan.
sh.shardCollection("<dbName>.test", {"_id":1}) sh.shardCollection("<dbName>.test1", {"_id":1}) -
Jalankan perintah
sh.status()untuk memastikan aturan tersebut berlaku.zhongli.test shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } zhongli.test1 shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrate data from a replica set instance to a sharded cluster instance.
CatatanKarena Anda telah melakukan pra-sharding koleksi di instans tujuan, semua informasi database dan koleksi sudah ada. Oleh karena itu, Anda harus mengatur Processing Mode of Conflicting Tables menjadi Ignore Errors and Proceed dalam tugas DTS Anda.
-
Setelah memverifikasi konsistensi data, alihkan aplikasi Anda untuk mengakses instans kluster sharded baru.
-
Jika Anda perlu menambahkan lebih banyak shard ke instans, Anda harus mengulangi Langkah 3 untuk menambahkan tag ke semua shard baru.
-
Jika koleksi baru akan terus ditambahkan ke database, Anda harus mengulangi Langkah 4 dan 5 untuk koleksi tersebut. Jika Anda tidak melakukan langkah-langkah ini, koleksi baru hanya akan dibuat di shard utama, menyebabkan jumlah koleksi di shard tersebut meningkat dan berpotensi menyebabkan ketidakstabilan performa lagi.
Migrasikan ke kluster sharded dengan zona
Metode ini mirip dengan penggunaan shard tags, tetapi menggunakan fitur Zones MongoDB. Metode ini memerlukan langkah operasional tambahan, khususnya sh.addShardToZone() dan sh.updateZoneKeyRange().
Prosedurnya sebagai berikut:
-
Beli instans kluster sharded baru. Contoh ini menggunakan instans 2-shard. Untuk petunjuk cara membuat kluster sharded, lihat Create a sharded cluster instance.
-
Hubungkan ke node mongos instans kluster sharded. Untuk informasi lebih lanjut, lihat Connect to an ApsaraDB for MongoDB sharded cluster instance by using the mongo shell.
-
Jalankan perintah berikut untuk menetapkan setiap shard ke zona.
sh.addShardToZone("d-xxxxxxxxx1", "ZoneA") sh.addShardToZone("d-xxxxxxxxx2", "ZoneB")Catatan-
Sebelum menjalankan perintah ini, pastikan akun yang Anda gunakan memiliki izin yang diperlukan.
-
DMS saat ini tidak mendukung perintah
sh.addShardToZone. Kami menyarankan menghubungkan ke instans dengan mongo shell atau mongosh untuk menjalankan perintah ini.
-
-
Pra-konfigurasikan aturan distribusi rentang berbasis zona untuk semua koleksi.
use <dbName> sh.enableSharding("<dbName>") sh.updateZoneKeyRange("<dbName>.test", { "_id": MinKey }, { "_id": MaxKey }, "ZoneA") sh.updateZoneKeyRange("<dbName>.test1", { "_id": MinKey }, { "_id": MaxKey }, "ZoneB")Contoh ini menggunakan
_idsebagai kunci shard. Pilih kunci shard yang sesuai dengan workload Anda, dan pastikan semua operasi kueri menyertakan bidang kunci shard. Kunci shard harus konsisten dengan bidang yang digunakan pada langkah berikutnya. Anda juga harus menggunakan batas[MinKey,MaxKey]untuk memastikan semua data untuk satu koleksi berada di satu shard. -
Jalankan operasi shardCollection untuk semua koleksi yang akan dimigrasikan.
sh.shardCollection("<dbName>.test", { "_id": 1 }) sh.shardCollection("<dbName>.test1", { "_id": 1 }) -
Jalankan perintah
sh.status()untuk melihat distribusi sharding dan memastikan konfigurasi zona berlaku. Output contohnya sebagai berikut:{ "_id" : "shardDistributionDB", "primary" : "d-xxx24", "partitioned" : false, "version" : { "uuid" : UUID("1dc635xxx"), "lastMod" : 1 } } shardDistributionDB.test shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2ze9797089ef3704 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx04 Timestamp(1, 0) tag: ZoneA { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } shardDistributionDB.test1 shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2zed2e752c35af24 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx24 Timestamp(1, 0) tag: ZoneB { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrate data from a replica set instance to a sharded cluster instance.
CatatanKarena Anda telah melakukan pra-sharding koleksi di instans tujuan, semua informasi database dan koleksi sudah ada. Oleh karena itu, Anda harus mengatur Processing Mode of Conflicting Tables menjadi Ignore Errors and Proceed dalam tugas DTS Anda.
-
Setelah memverifikasi konsistensi data, alihkan aplikasi Anda untuk mengakses instans kluster sharded baru.
-
Jika Anda perlu menambahkan lebih banyak shard ke instans, Anda harus mengulangi Langkah 3 untuk menetapkan zona ke semua shard baru.
-
Jika koleksi baru akan terus ditambahkan ke database, Anda harus mengulangi Langkah 4 dan 5 untuk koleksi tersebut. Jika Anda tidak melakukan langkah-langkah ini, koleksi baru hanya akan dibuat di shard utama, menyebabkan jumlah koleksi di shard tersebut meningkat dan berpotensi menyebabkan ketidakstabilan performa lagi.
Saran risiko
Kami sangat menyarankan agar tidak menggunakan perintah dropDatabase untuk langsung menghapus database yang berisi banyak koleksi.
Setelah Anda menjalankan perintah dropDatabase, mesin WiredTiger melakukan operasi pembersihan asinkron, menghapus metadata dan file fisik untuk semua koleksi yang ditandai untuk dihapus secara berurutan. Operasi ini dapat mengganggu replikasi pada node secondary, menyebabkan latensi replikasi meningkat. Hal ini, pada gilirannya, dapat memicu mekanisme flow control atau memengaruhi semua operasi write yang menggunakan {writeConcern:majority}.
Pertimbangkan pendekatan berikut untuk mengurangi risiko ini:
-
Hapus koleksi secara batch dengan interval yang wajar antar-batch. Setelah semua koleksi dihapus, jalankan perintah
dropDatabaseterakhir. -
Gunakan DTS atau alat migrasi lain untuk memindahkan database dan koleksi yang ingin Anda pertahankan ke instans baru. Setelah migrasi dan cutover selesai, hapus instans lama.
Dalam semua kasus, Anda harus mengonfigurasi alert latensi replikasi yang sesuai untuk instans Anda. Jika instans Anda mengalami masalah ini, submit a ticket untuk bantuan teknis.
Ringkasan
-
Sebagai aturan umum, usahakan agar jumlah total koleksi dalam satu replica set tetap di bawah 10.000. Angka ini harus lebih rendah jika masing-masing koleksi memiliki banyak indeks (misalnya, lebih dari 15).
-
Jika kebutuhan aplikasi Anda mengharuskan jumlah koleksi yang besar, seperti dalam sistem multi-tenant yang menggunakan isolasi berbasis koleksi, pertimbangkan untuk membagi logika aplikasi Anda dan menggunakan instans kluster sharded.
-
Jika database Anda telah terdampak oleh terlalu banyak koleksi dan Anda tidak yakin cara mengubah model data aplikasi, Anda dapat mengajukan Tiket untuk menghubungi dukungan teknis guna memperoleh bantuan.