Cara memantau kinerja database MongoDB

Rick Golba adalah insinyur solusi di Percona.

MongoDB adalah database favorit bagi para pengembang. Sebagai opsi database NoSQL, ia menyediakan developer dengan lingkungan database yang memiliki desain skema fleksibel, failover otomatis, dan bahasa input yang akrab bagi developer, yaitu JSON.

Ada banyak jenis database NoSQL. Penyimpanan nilai kunci menyimpan dan mengambil setiap item menggunakan namanya (juga dikenal sebagai kunci). Penyimpanan kolom lebar adalah jenis penyimpanan nilai kunci yang menggunakan kolom dan baris (seperti database relasional), hanya nama kolom dan baris dalam tabel yang dapat bervariasi. Database grafik menggunakan struktur grafik untuk menyimpan jaringan data. Database berorientasi dokumen menyimpan data sebagai dokumen, memberikan fleksibilitas struktural yang lebih dari database lainnya.

MongoDB adalah database berorientasi dokumen. Ini adalah database lintas platform yang menyimpan data dalam dokumen dalam format JSON berkode biner (dikenal sebagai JSON biner, atau BSON). Format biner meningkatkan kecepatan dan fleksibilitas JSON, serta menambahkan lebih banyak tipe data.

Mekanisme replikasi MongoDB membantu memberikan ketersediaan tinggi, dan mekanisme shardingnya memungkinkan skalabilitas horizontal. Banyak perusahaan Internet top seperti Facebook dan eBay menggunakan MongoDB di lingkungan database mereka.

Mengapa memantau MongoDB?

Lingkungan database MongoDB Anda bisa sederhana atau rumit, lokal atau terdistribusi, lokal atau di cloud. Jika Anda ingin memastikan database yang berkinerja dan tersedia, Anda harus melacak dan memantau analitik untuk:

  • Tentukan status database saat ini
  • Tinjau data kinerja untuk mengidentifikasi perilaku abnormal apa pun
  • Berikan beberapa data diagnostik untuk menyelesaikan masalah yang teridentifikasi
  • Perbaiki masalah kecil sebelum berkembang menjadi masalah yang lebih besar
  • Jaga lingkungan Anda tetap aktif dan berjalan dengan lancar
  • Pastikan ketersediaan dan kesuksesan yang berkelanjutan

Memantau lingkungan database Anda dengan cara yang terukur dan teratur memastikan bahwa Anda dapat melihat setiap perbedaan, perilaku aneh, atau masalah sebelum berdampak pada kinerja. Pemantauan yang tepat berarti Anda dapat dengan cepat melihat perlambatan, keterbatasan sumber daya, atau perilaku menyimpang lainnya dan bertindak untuk memperbaiki masalah ini sebelum terkena konsekuensi dari situs web dan aplikasi yang lambat, data yang tidak tersedia, atau pelanggan yang frustrasi.

Apa yang harus kami pantau?

Ada banyak hal yang dapat Anda pantau di lingkungan MongoDB, tetapi beberapa area utama akan memberi tahu Anda dengan cepat jika ada yang salah. Anda harus menganalisis metrik berikut:

  • Replikasi lag . Replikasi lag mengacu pada penundaan dalam menyalin data dari node primer ke node sekunder.
  • Status replika . Status replika adalah metode pelacakan jika node sekunder telah mati, dan jika ada pemilihan node utama baru.
  • Status penguncian . Status penguncian menunjukkan kunci data apa yang disetel, dan lamanya waktu pengunciannya.
  • Pemanfaatan disk . Pemanfaatan disk mengacu pada akses disk.
  • Penggunaan memori . Penggunaan memori mengacu pada seberapa banyak memori yang digunakan, dan bagaimana memori itu digunakan.
  • Jumlah koneksi . Jumlah koneksi yang telah dibuka database untuk melayani permintaan secepat mungkin.

Mari kita pelajari beberapa detailnya.

Replikasi lag

MongoDB menggunakan replikasi untuk memenuhi tantangan dan tujuan ketersediaan. Replikasi adalah penyebaran data dari node primer ke beberapa node sekunder, karena operasi pada node primer mengubah data. Node ini dapat ditempatkan bersama, di lokasi geografis yang berbeda, atau virtual.

Semua hal dianggap sama, replikasi data harus terjadi dengan cepat dan tanpa masalah. Banyak hal dapat terjadi yang menghentikan proses replikasi agar tidak berjalan lancar. Bahkan dalam kondisi terbaik, properti fisik jaringan membatasi seberapa cepat data direplikasi. Penundaan antara memulai replikasi dan menyelesaikannya disebut sebagai keterlambatan replikasi.

Dalam rangkaian node primer dan sekunder yang berjalan lancar (disebut sebagai "set replika"), yang sekunder dengan cepat menyalin perubahan pada node primer, mereplikasi setiap grup operasi dari oplog secepat mungkin (atau sedekat mungkin) . Tujuannya adalah untuk menjaga replikasi lag mendekati nol. Pembacaan data dari node mana pun harus konsisten. Jika node utama yang dipilih turun atau menjadi tidak tersedia, sekunder dapat mengambil alih peran utama tanpa memengaruhi keakuratan data untuk klien. Data yang direplikasi harus konsisten dengan data primer sebelum data primer diturunkan.

Replikasi lag adalah alasan node primer dan sekunder tidak sinkron. Jika node sekunder dipilih sebagai primer, dan keterlambatan replikasi tinggi, maka versi data sekunder mungkin sudah usang. Status penundaan replikasi yang meningkat dapat terjadi karena beberapa alasan non-permanen atau tidak ditentukan dan mengoreksi dirinya sendiri. Namun, jika kelambatan replikasi tetap tinggi atau mulai meningkat pada kecepatan yang teratur, ini merupakan tanda masalah sistemik atau lingkungan. Dalam kedua kasus tersebut, semakin besar keterlambatan replikasi - dan semakin lama tetap tinggi - semakin besar risiko data Anda menjadi usang bagi klien.

Hanya ada satu cara untuk menganalisis metrik ini: pantau! Ini adalah metrik yang harus dipantau 24x7x365, jadi paling baik dilakukan dengan menggunakan otomatisasi dan peringatan pemicu untuk memperingatkan DBA atau administrator sistem respons segera setelah mencapai ambang batas yang tidak diinginkan. Konfigurasi untuk ambang ini bergantung pada toleransi aplikasi Anda untuk penundaan replikasi. Untuk menentukan ambang batas yang tepat, gunakan alat yang membuat grafik penundaan dari waktu ke waktu seperti Kompas, MongoBooster, Studio 3T, atau Percona Monitoring and Management (PMM).

Status replika

Replikasi ditangani melalui set replika. Seperangkat replika adalah sekumpulan node dengan node primer terpilih dan beberapa node sekunder. Node utama adalah penjaga data terbaru, dan data tersebut direplikasi ke node sekunder saat ada perubahan pada node utama.

Biasanya, satu anggota kumpulan replika adalah utama dan semua anggota lainnya adalah sekunder. Status yang diberikan jarang berubah. Jika ya, kami ingin mengetahuinya (biasanya segera). Perubahan peran biasanya terjadi dengan cepat, dan biasanya mulus, tetapi penting untuk memahami dengan tepat mengapa status node berubah, karena bisa jadi karena kegagalan perangkat keras atau jaringan. Perubahan antara status primer dan sekunder (juga dikenal sebagai flapping) bukanlah kejadian normal, dan di dunia yang sempurna seharusnya hanya terjadi karena alasan yang diketahui (misalnya, selama pemeliharaan lingkungan seperti mengupgrade perangkat lunak atau perangkat keras, atau selama insiden tertentu seperti sebagai pemadaman jaringan).

Status penguncian

Basis data adalah lingkungan yang sangat bersamaan dan tidak stabil, dengan banyak klien membuat permintaan dan memulai transaksi yang dilakukan pada data. Permintaan dan transaksi ini tidak terjadi secara berurutan atau dalam urutan yang rasional. Konflik dapat terjadi - misalnya, jika transaksi mencoba memperbarui catatan atau dokumen yang sama, jika permintaan baca datang saat pembaruan data, dll. Cara yang digunakan banyak database untuk memastikan data diakses dengan cara yang terorganisir adalah “penguncian. ” Penguncian terjadi ketika transaksi mencegah rekaman database, dokumen, baris, tabel, dll., Dari diubah atau dibaca hingga transaksi saat ini selesai diproses.

Di MongoDB, penguncian dilakukan di tingkat pengumpulan atau dokumen untuk mencegah konflik antara transaksi bersamaan. Operasi tertentu juga bisa memerlukan kunci database global (misalnya, saat menjatuhkan koleksi). Jika penguncian terjadi terlalu sering, hal itu memengaruhi kinerja dengan membuat transaksi (termasuk pembacaan) menunggu bagian yang terkunci dari database tersedia untuk dibaca atau dimodifikasi. Persentase penguncian yang tinggi adalah tanda masalah lain dalam database: kegagalan perangkat keras, desain skema yang buruk, indeks yang dikonfigurasi dengan buruk, tidak menggunakan indeks, dll.

Penting untuk memantau persentase penguncian. Anda harus mengetahui persentase yang dapat diterima terkait dengan kinerja, dan berapa lama persentase tersebut dapat dipertahankan sebelum memengaruhi kinerja. Jika kinerja menurun terlalu banyak karena persentase penguncian yang tinggi, hal itu dapat memicu perubahan status replikasi melalui ketidakresponsifan server.

Pemanfaatan disk

Setiap DBA harus memantau ruang disk yang tersedia di server database mereka. Setelah database menggunakan ruang disk pada host, server itu akan berhenti mendadak. Mengubah ukuran data secara proaktif dan memantau ukuran file log adalah teknik hebat untuk mengukur basis data.

Seringkali database Anda mungkin perlu berkembang secara otomatis. Dalam kasus ini, Anda perlu menjamin bahwa itu tidak melebihi perangkat keras. Meninjau ruang disk secara berkala dapat membantu mencegah server database berhenti tiba-tiba, serta menemukan masalah desain yang buruk (seperti kueri yang memerlukan pemindaian koleksi lengkap).

Penggunaan memori

Menyimpan semua data Anda dalam RAM akan mempercepat waktu respons database. Tapi apa artinya itu, dan bagaimana Anda tahu jika ada sesuatu di RAM?

Cara database Anda menggunakan memori bisa jadi agak tidak jelas. Sebagian besar memori yang digunakan server adalah untuk kumpulan buffer (data). Mungkin sulit untuk mengetahui database mana yang menggunakan porsi terbesar dari memori buffer pool, dan bahkan lebih sulit lagi untuk mengetahui koleksi atau dokumen mana yang sebenarnya ada dalam memori buffer pool. Mengetahui informasi ini berguna saat melakukan load balancing database Anda di beberapa server (melalui sharding), atau mengidentifikasi data yang optimal untuk digabungkan ke dalam satu instance server.

Menggunakan alat untuk menentukan instans mana yang paling banyak menggunakan memori, dan untuk data apa, dapat membantu Anda mengoptimalkan lingkungan Anda.

Jumlah koneksi

Transaksi database biasanya dimulai oleh aplikasi dan proses melalui "koneksi". Jumlah koneksi terbuka dapat memengaruhi kinerja database. Secara teori, setelah transaksi selesai, koneksi harus diakhiri. Namun, dalam praktiknya, banyak koneksi dibiarkan terbuka. Merupakan hal yang normal bagi database untuk menjaga beberapa koneksi tetap hidup untuk memfasilitasi transaksi tertentu, tetapi jika terlalu banyak yang dibiarkan terbuka itu dapat membatasi jumlah yang tersedia di kumpulan koneksi.

Sebagai praktik terbaik, database harus menjaga koneksi tetap terbuka untuk waktu yang paling sedikit diperlukan untuk menyelesaikan permintaan. Hal ini memungkinkan sekelompok kecil koneksi untuk melayani sejumlah besar permintaan transaksi. Jika tidak, permintaan transaksi aplikasi akan macet menunggu koneksi terbuka. Anda perlu memantau jumlah koneksi yang terbuka di database untuk memverifikasi bahwa mereka sedang ditutup, dan bahwa ada sejumlah koneksi yang tersisa di kumpulan untuk permintaan masuk.

Alat yang disediakan dengan MongoDB

Sekarang kita tahu apa yang harus kita pantau, pertanyaan selanjutnya adalah bagaimana? Untungnya, MongoDB hadir dengan beberapa alat yang mudah digunakan untuk memantau statistik server.

mongostat

Utilitas ini menyediakan statistik global tentang penggunaan memori, status set replika, dan lainnya, diperbarui setiap detik (secara default).

The mongostatutilitas memberikan gambaran contoh server MongoDB Anda. Jika Anda menjalankan satu instance "mongod", ini menunjukkan kepada Anda statistik untuk instance tunggal itu. Jika Anda menjalankan lingkungan kluster MongoDB, lingkungan kluster akan menampilkan statistik untuk instance "mongos". mongostatpaling baik digunakan untuk menonton satu kejadian untuk acara tertentu (misalnya, apa yang terjadi ketika permintaan aplikasi tertentu masuk). Anda dapat menggunakan perintah ini untuk memantau statistik server dasar:

  • CPU
  • Penyimpanan
  • Disk IO
  • Lalu lintas jaringan

Lihat dokumentasi MongoDB di mongostatuntuk spesifikasi penggunaan.

mongotop

Utilitas ini menyediakan statistik tingkat koleksi pada aktivitas baca dan tulis.

The mongotopperintah melacak waktu yang dibutuhkan untuk membaca dan menulis operasi lengkap pada contoh server MongoDB. Ini memberikan statistik pada tingkat per koleksi. mongotopmengembalikan nilai setiap detik secara default, tetapi Anda dapat menyesuaikan kerangka waktu sesuai kebutuhan.

Semua metrik per detik relatif terhadap konfigurasi server Anda, serta arsitektur cluster. Untuk instance tunggal yang dijalankan secara lokal, dan menggunakan port default, yang perlu Anda lakukan hanyalah memasukkan mongotopperintah. Jika Anda menjalankan dalam lingkungan berkerumun dengan beberapa contoh mongod dan mongos, Anda perlu memberikan nama host dan nomor port dengan perintah.

Lihat dokumentasi MongoDB di mongotopuntuk spesifikasi penggunaan.

rs.status()

Perintah ini memberikan status set replika.

Anda dapat menggunakan rs.status()perintah untuk mendapatkan informasi tentang kumpulan replika yang sedang berjalan. Perintah ini dapat dijalankan dari konsol anggota mana pun dari kumpulan mana pun, dan ini akan mengembalikan status kumpulan replika seperti yang terlihat oleh anggota yang bersangkutan.

Lihat dokumentasi MongoDB di rs.status()untuk spesifikasi penggunaan.