HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Kita akan melihat bagaimana Zabbix bekerja dengan database TimescaleDB sebagai backend. Kami akan menunjukkan cara memulai dari awal dan cara bermigrasi dari PostgreSQL. Kami juga akan memberikan uji kinerja komparatif dari kedua konfigurasi tersebut.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

HighLoad++ Siberia 2019. Balai Tomsk. 24 Juni, 16:00. Tesis dan presentasi. Konferensi HighLoad++ berikutnya akan diadakan pada tanggal 6 dan 7 April 2020 di St. Detail dan tiket по ссылке.

Andrey Gushchin (selanjutnya – AG): – Saya seorang insinyur dukungan teknis ZABBIX (selanjutnya disebut “Zabbix”), seorang pelatih. Saya telah bekerja di bagian dukungan teknis selama lebih dari 6 tahun dan memiliki pengalaman langsung dengan kinerja. Hari ini saya akan berbicara tentang kinerja yang dapat diberikan TimescaleDB jika dibandingkan dengan PostgreSQL 10 biasa. Juga, beberapa bagian pengantar tentang cara kerjanya secara umum.

Tantangan produktivitas teratas: mulai dari pengumpulan data hingga pembersihan data

Pertama-tama, ada tantangan kinerja tertentu yang dihadapi setiap sistem pemantauan. Tantangan produktivitas yang pertama adalah mengumpulkan dan memproses data dengan cepat.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Sistem pemantauan yang baik harus menerima semua data dengan cepat dan tepat waktu, memprosesnya sesuai dengan ekspresi pemicu, yaitu memprosesnya berdasarkan beberapa kriteria (hal ini berbeda pada sistem yang berbeda) dan menyimpannya dalam database untuk menggunakan data ini dalam masa depan.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Tantangan kinerja kedua adalah penyimpanan riwayat. Simpan dalam database sesering mungkin dan dapatkan akses cepat dan nyaman ke metrik ini yang dikumpulkan selama periode waktu tertentu. Yang paling penting adalah data ini mudah diperoleh, digunakan dalam laporan, grafik, pemicu, dalam beberapa nilai ambang batas, untuk peringatan, dll.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Tantangan kinerja ketiga adalah pembersihan riwayat, yaitu ketika Anda sampai pada titik di mana Anda tidak perlu menyimpan metrik terperinci apa pun yang telah dikumpulkan selama 5 tahun (bahkan berbulan-bulan atau dua bulan). Beberapa node jaringan telah dihapus, atau beberapa host, metriknya tidak lagi diperlukan karena sudah usang dan tidak lagi dikumpulkan. Semua ini perlu dibersihkan agar database Anda tidak bertambah terlalu besar. Secara umum, menghapus riwayat sering kali merupakan ujian serius bagi penyimpanan - sering kali hal ini berdampak sangat kuat pada kinerja.

Bagaimana cara mengatasi masalah cache?

Sekarang saya akan berbicara secara khusus tentang Zabbix. Di Zabbix, panggilan pertama dan kedua diselesaikan menggunakan caching.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Pengumpulan dan pemrosesan data - Kami menggunakan RAM untuk menyimpan semua data ini. Data ini sekarang akan dibahas lebih rinci.

Juga di sisi database ada beberapa caching untuk pilihan utama - untuk grafik dan hal lainnya.

Caching di sisi server Zabbix itu sendiri: kami memiliki ConfigurationCache, ValueCache, HistoryCache, TrendsCache. Apa itu?

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

ConfigurationCache adalah cache utama tempat kami menyimpan metrik, host, item data, pemicu; semua yang Anda perlukan untuk memproses pra-pemrosesan, mengumpulkan data, dari host mana yang dikumpulkan, dengan frekuensi berapa. Semua ini disimpan di ConfigurationCache agar tidak masuk ke database dan membuat pertanyaan yang tidak perlu. Setelah server dimulai, kami memperbarui cache ini (membuatnya) dan memperbaruinya secara berkala (tergantung pada pengaturan konfigurasi).

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Menyimpan cache di Zabbix. Pengumpulan data

Di sini diagramnya cukup besar:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Yang utama dalam skema ini adalah kolektor berikut:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Ini adalah proses perakitan itu sendiri, berbagai “pemeriksa” yang bertanggung jawab atas berbagai jenis pertemuan. Mereka mengumpulkan data melalui icmp, ipmi, dan berbagai protokol dan mentransfer semuanya ke prapemrosesan.

Cache Riwayat Pra-Pemrosesan

Selain itu, jika kita telah menghitung elemen data (mereka yang akrab dengan Zabbix tahu), yaitu elemen data agregasi terhitung, kita mengambilnya langsung dari ValueCache. Saya akan memberi tahu Anda cara mengisinya nanti. Semua kolektor ini menggunakan ConfigurationCache untuk menerima pekerjaannya dan kemudian meneruskannya ke prapemrosesan.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Prapemrosesan juga menggunakan ConfigurationCache untuk mendapatkan langkah prapemrosesan dan memproses data ini dengan berbagai cara. Mulai dari versi 4.2, kami telah memindahkannya ke proxy. Ini sangat mudah, karena pra-pemrosesan itu sendiri adalah operasi yang agak sulit. Dan jika Anda memiliki Zabbix yang sangat besar, dengan sejumlah besar elemen data dan frekuensi pengumpulan yang tinggi, ini sangat menyederhanakan pekerjaan.

Oleh karena itu, setelah kami memproses data ini dengan cara tertentu menggunakan prapemrosesan, kami menyimpannya di HistoryCache untuk diproses lebih lanjut. Ini menyimpulkan pengumpulan data. Kami beralih ke proses utama.

Pekerjaan sinkronisasi sejarah

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Proses utama di Zabbix (karena merupakan arsitektur monolitik) adalah sinkronisasi Sejarah. Ini adalah proses utama yang secara khusus berhubungan dengan pemrosesan atom setiap elemen data, yaitu setiap nilai:

  • nilainya berasal (diambil dari HistoryCache);
  • memeriksa sinkronisasi Konfigurasi: apakah ada pemicu untuk perhitungan - menghitungnya;
    jika ada - membuat acara, membuat eskalasi untuk membuat peringatan, jika perlu sesuai dengan konfigurasi;
  • catatan memicu untuk pemrosesan selanjutnya, agregasi; jika Anda menggabungkan selama satu jam terakhir dan seterusnya, nilai ini diingat oleh ValueCache agar tidak masuk ke tabel riwayat; Dengan demikian, ValueCache diisi dengan data penting yang diperlukan untuk menghitung pemicu, elemen terhitung, dll.;
  • kemudian sinkronisasi Riwayat menulis semua data ke database;
  • database menuliskannya ke disk - di sinilah proses pemrosesan berakhir.

Basis data. cache

Di sisi database, ketika Anda ingin melihat grafik atau beberapa laporan peristiwa, terdapat berbagai cache. Namun dalam laporan ini saya tidak akan membicarakannya.

Untuk MySQL ada Innodb_buffer_pool, dan banyak cache berbeda yang juga dapat dikonfigurasi.
Tapi ini yang utama:

  • shared_buffer;
  • ukuran_cache_efektif;
  • shared_pool.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Untuk semua database, saya katakan bahwa ada cache tertentu yang memungkinkan Anda menyimpan data dalam RAM yang sering diperlukan untuk kueri. Mereka punya teknologi sendiri untuk ini.

Tentang Kinerja Basis Data

Oleh karena itu, terdapat lingkungan yang kompetitif, yaitu server Zabbix mengumpulkan data dan mencatatnya. Saat dimulai ulang, ia juga membaca riwayat untuk mengisi ValueCache dan seterusnya. Di sini Anda dapat memiliki skrip dan laporan yang menggunakan Zabbix API, yang dibangun pada antarmuka web. Zabbix API memasuki database dan menerima data yang diperlukan untuk mendapatkan grafik, laporan, atau semacam daftar kejadian, masalah terkini.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Solusi visualisasi yang juga sangat populer adalah Grafana, yang digunakan pengguna kami. Bisa langsung login baik melalui Zabbix API maupun melalui database. Hal ini juga menciptakan persaingan tertentu untuk mendapatkan data: diperlukan penyetelan database yang lebih baik dan lebih baik agar dapat memenuhi pengiriman hasil dan pengujian yang cepat.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Menghapus riwayat. Zabbix memiliki Pengurus Rumah Tangga

Panggilan ketiga yang digunakan di Zabbix adalah membersihkan history menggunakan Housekeeper. Pengurus rumah tangga mengikuti semua pengaturan, yaitu elemen data kami menunjukkan berapa lama untuk menyimpan (dalam hari), berapa lama untuk menyimpan tren, dan dinamika perubahan.

Saya tidak berbicara tentang TrendCache, yang kami hitung dengan cepat: data tiba, kami menggabungkannya selama satu jam (kebanyakan ini adalah angka untuk satu jam terakhir), jumlahnya rata-rata/minimum dan kami mencatatnya sekali dalam satu jam di tabel dinamika perubahan (“Tren”) . “Pengurus Rumah Tangga” memulai dan menghapus data dari database menggunakan pemilihan biasa, yang tidak selalu efektif.

Bagaimana memahami bahwa ini tidak efektif? Anda dapat melihat gambar berikut pada grafik kinerja proses internal:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Sinkronisasi Riwayat Anda selalu sibuk (grafik merah). Dan grafik “merah” di atas. Ini adalah "Pengurus Rumah Tangga" yang memulai dan menunggu database menghapus semua baris yang telah ditentukan.

Mari kita ambil beberapa ID Item: Anda perlu menghapus 5 ribu yang terakhir; tentu saja, berdasarkan indeks. Namun biasanya kumpulan datanya cukup besar - database masih membacanya dari disk dan menyimpannya ke dalam cache, dan ini adalah operasi yang sangat mahal untuk database. Tergantung pada ukurannya, hal ini dapat menyebabkan masalah kinerja tertentu.

Anda dapat menonaktifkan Housekeeper dengan cara sederhana - kami memiliki antarmuka web yang familier. Pengaturan di Administrasi umum (pengaturan untuk “Pengurus Rumah Tangga”) kami menonaktifkan tata graha internal untuk riwayat dan tren internal. Oleh karena itu, Pengurus Rumah Tangga tidak lagi mengontrol hal ini:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Apa yang dapat Anda lakukan selanjutnya? Anda mematikannya, grafik Anda sudah rata... Masalah apa lagi yang mungkin timbul dalam kasus ini? Apa yang bisa membantu?

Partisi (pembagian)

Biasanya ini dikonfigurasi dengan cara berbeda pada setiap database relasional yang saya daftarkan. MySQL memiliki teknologinya sendiri. Namun secara keseluruhan keduanya sangat mirip dalam hal PostgreSQL 10 dan MySQL. Tentu saja, terdapat banyak perbedaan internal dalam cara penerapannya dan pengaruhnya terhadap kinerja. Namun secara umum, pembuatan partisi baru seringkali juga menimbulkan masalah tertentu.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Bergantung pada pengaturan Anda (berapa banyak data yang Anda buat dalam satu hari), mereka biasanya menetapkan minimum - ini adalah 1 hari / kumpulan, dan untuk "tren", dinamika perubahan - 1 bulan / kumpulan baru. Ini mungkin berubah jika Anda memiliki pengaturan yang sangat besar.

Katakanlah langsung tentang ukuran penyiapan: hingga 5 ribu nilai baru per detik (disebut nvps) - ini akan dianggap sebagai "penyiapan" kecil. Rata-rata – dari 5 hingga 25 ribu nilai per detik. Semua yang diatas sudah merupakan instalasi yang besar dan sangat besar sehingga memerlukan konfigurasi database yang sangat hati-hati.

Pada instalasi yang sangat besar, 1 hari mungkin tidak optimal. Saya pribadi telah melihat partisi di MySQL sebesar 40 gigabyte per hari (dan mungkin lebih banyak lagi). Ini adalah jumlah data yang sangat besar, yang dapat menimbulkan beberapa masalah. Itu perlu dikurangi.

Mengapa Anda perlu mempartisi?

Apa yang disediakan oleh Partisi, saya rasa semua orang tahu, adalah partisi tabel. Seringkali ini adalah file terpisah pada permintaan disk dan span. Ia memilih satu partisi secara lebih optimal jika itu adalah bagian dari partisi normal.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Khususnya untuk Zabbix, digunakan berdasarkan rentang, berdasarkan rentang, yaitu kami menggunakan stempel waktu (angka biasa, waktu sejak awal epoch). Anda menentukan awal hari/akhir hari, dan ini adalah partisinya. Oleh karena itu, jika Anda meminta data yang berumur dua hari, semuanya akan diambil dari database lebih cepat, karena Anda hanya perlu memuat satu file ke dalam cache dan mengembalikannya (bukan tabel besar).

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Banyak database juga mempercepat penyisipan (penyisipan ke dalam satu tabel anak). Saya berbicara secara abstrak untuk saat ini, tetapi ini juga mungkin. Mempartisi sering kali membantu.

Pencarian elastis untuk NoSQL

Baru-baru ini, di versi 3.4, kami menerapkan solusi NoSQL. Menambahkan kemampuan menulis di Elasticsearch. Anda dapat menulis jenis tertentu: Anda memilih - menulis angka atau beberapa tanda; kami memiliki teks string, Anda dapat menulis log ke Elasticsearch... Oleh karena itu, antarmuka web juga akan mengakses Elasticsearch. Ini berfungsi dengan baik dalam beberapa kasus, tetapi saat ini dapat digunakan.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Skala waktuDB. Hipertabel

Untuk 4.4.2 kami memperhatikan satu hal seperti TimescaleDB. Apa itu? Ini adalah ekstensi untuk PostgreSQL, yaitu memiliki antarmuka asli PostgreSQL. Selain itu, ekstensi ini memungkinkan Anda bekerja lebih efisien dengan data deret waktu dan memiliki partisi otomatis. Seperti apa rupanya:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Ini hypertable - ada konsep seperti itu di Timescale. Ini adalah hypertable yang Anda buat, dan berisi potongan. Potongan itu partisi, ini tabel anak kalau tidak salah. Ini sangat efektif.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

TimescaleDB dan PostgreSQL

Seperti yang dipastikan oleh produsen TimescaleDB, mereka menggunakan algoritme yang lebih tepat untuk memproses kueri, khususnya penyisipan, yang memungkinkan mereka memiliki kinerja yang kira-kira konstan dengan bertambahnya ukuran penyisipan kumpulan data. Artinya, setelah 200 juta baris Postgres, yang biasa mulai melorot dan kehilangan kinerja hingga nol, sementara Timescale memungkinkan Anda memasukkan sisipan seefisien mungkin dengan jumlah data berapa pun.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Bagaimana cara menginstal TimescaleDB? Itu mudah!

Ada di dokumentasi, dijelaskan - Anda dapat menginstalnya dari paket untuk apa pun... Itu tergantung pada paket resmi Postgres. Dapat dikompilasi secara manual. Kebetulan saya harus mengkompilasi untuk database.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Di Zabbix kita cukup mengaktifkan Extention. Saya pikir mereka yang menggunakan Extention di Postgres... Anda cukup mengaktifkan Extention, buat untuk database Zabbix yang Anda gunakan.

Dan langkah terakhir...

Skala waktuDB. Migrasi tabel riwayat

Anda perlu membuat hypertable. Ada fungsi khusus untuk ini – Buat hypertable. Di dalamnya, parameter pertama adalah tabel yang diperlukan dalam database ini (untuk itu Anda perlu membuat hypertable).

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Bidang yang akan digunakan untuk membuat, dan chunk_time_interval (ini adalah interval potongan (partisi yang perlu digunakan). 86 adalah satu hari.

Parameter Migrate_data: Jika Anda memasukkan ke true, maka ini akan memigrasikan semua data saat ini ke potongan yang telah dibuat sebelumnya.

Saya sendiri telah menggunakan migrasi_data - ini memerlukan waktu yang cukup lama, bergantung pada seberapa besar database Anda. Saya memiliki lebih dari satu terabyte - butuh lebih dari satu jam untuk membuatnya. Dalam beberapa kasus, selama pengujian, saya menghapus data historis untuk teks (history_text) dan string (history_str) agar tidak mentransfernya - mereka tidak terlalu menarik bagi saya.

Dan kami melakukan pembaruan terakhir di db_extention kami: kami menginstal timescaledb sehingga database dan, khususnya, Zabbix kami memahami bahwa ada db_extention. Dia mengaktifkannya dan menggunakan sintaks dan kueri yang benar ke database, menggunakan “fitur” yang diperlukan untuk TimescaleDB.

Konfigurasi server

Saya menggunakan dua server. Server pertama adalah mesin virtual yang cukup kecil, 20 prosesor, RAM 16 gigabyte. Saya mengkonfigurasi Postgres 10.8 di atasnya:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Sistem operasinya adalah Debian, sistem filenya adalah xfs. Saya membuat pengaturan minimal untuk menggunakan database khusus ini, kecuali apa yang akan digunakan Zabbix sendiri. Di mesin yang sama terdapat server Zabbix, PostgreSQL dan agen beban.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Saya telah menggunakan 50 agen aktif yang menggunakan LoadableModule untuk menghasilkan hasil yang berbeda dengan cepat. Merekalah yang menghasilkan string, angka, dan sebagainya. Saya mengisi database dengan banyak data. Awalnya, konfigurasi berisi 5 ribu elemen data per host, dan kira-kira setiap elemen data berisi pemicu - agar ini menjadi pengaturan yang sebenarnya. Terkadang Anda bahkan memerlukan lebih dari satu pemicu untuk digunakan.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Saya mengatur interval pembaruan dan pemuatannya sendiri dengan tidak hanya menggunakan 50 agen (menambahkan lebih banyak), tetapi juga menggunakan elemen data dinamis dan mengurangi interval pembaruan menjadi 4 detik.

Uji kinerja. PostgreSQL: 36 ribu NVP

Peluncuran pertama, pengaturan pertama yang saya lakukan adalah pada PostreSQL 10 murni pada perangkat keras ini (nilai 35 ribu per detik). Secara umum, seperti yang Anda lihat di layar, memasukkan data membutuhkan waktu sepersekian detik - semuanya baik dan cepat, drive SSD (200 gigabyte). Satu-satunya hal adalah 20 GB terisi cukup cepat.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Akan ada cukup banyak grafik seperti itu di masa depan. Ini adalah dasbor kinerja server Zabbix standar.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Grafik pertama adalah jumlah nilai per detik (biru, kiri atas), dalam hal ini 35 ribu nilai. Ini (tengah atas) adalah pemuatan proses pembangunan, dan ini (kanan atas) adalah pemuatan proses internal: sinkronisasi riwayat dan pengurus rumah tangga, yang di sini (tengah bawah) telah berjalan cukup lama.

Grafik ini (tengah bawah) menunjukkan penggunaan ValueCache - berapa banyak ValueCache yang terkena pemicu (beberapa ribu nilai per detik). Grafik penting lainnya adalah grafik keempat (kiri bawah), yang menunjukkan penggunaan HistoryCache yang saya bicarakan, yaitu buffer sebelum dimasukkan ke dalam database.

Uji kinerja. PostgreSQL: 50 ribu NVP

Selanjutnya, saya meningkatkan beban menjadi 50 ribu nilai per detik pada perangkat keras yang sama. Saat dimuat oleh Housekeeper, 10 ribu nilai dicatat dalam 2-3 detik dengan perhitungan. Apa sebenarnya yang ditunjukkan pada tangkapan layar berikut:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

“Pengurus rumah tangga” sudah mulai mengganggu pekerjaan, namun secara umum beban penjebak penyerap sejarah masih di level 60% (grafik ketiga, kanan atas). HistoryCache sudah mulai terisi secara aktif saat Housekeeper sedang berjalan (kiri bawah). Itu sekitar setengah gigabyte, 20% penuh.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Uji kinerja. PostgreSQL: 80 ribu NVP

Lalu saya tingkatkan menjadi 80 ribu nilai per detik:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Itu sekitar 400 ribu elemen data, 280 ribu pemicu. Sisipannya, seperti yang Anda lihat, dalam hal beban pemberat sejarah (ada 30 di antaranya) sudah cukup tinggi. Kemudian saya meningkatkan berbagai parameter: penyerap riwayat, cache... Pada perangkat keras ini, beban pada penyerap riwayat mulai meningkat hingga maksimum, hampir "di rak" - oleh karena itu, HistoryCache mengalami beban yang sangat tinggi:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Selama ini saya memantau semua parameter sistem (bagaimana prosesor digunakan, RAM) dan menemukan bahwa pemanfaatan disk sudah maksimal - saya mencapai kapasitas maksimum disk ini pada perangkat keras ini, pada mesin virtual ini. "Postgres" mulai membuang data dengan cukup aktif pada intensitas seperti itu, dan disk tidak lagi punya waktu untuk menulis, membaca...

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Saya mengambil server lain yang sudah memiliki 48 prosesor dan 128 gigabyte RAM:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Saya juga "menyetelnya" - menginstal sinkronisasi History (60 buah) dan mencapai kinerja yang dapat diterima. Faktanya, kita tidak “berada di rak”, tetapi ini mungkin merupakan batas produktivitas, di mana kita perlu melakukan sesuatu untuk mengatasinya.

Uji kinerja. TimescaleDB: 80 ribu NVP

Tugas utama saya adalah menggunakan TimescaleDB. Setiap grafik menunjukkan penurunan:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Kegagalan ini tepatnya adalah migrasi data. Setelah itu, di server Zabbix, profil pemuatan penyerap riwayat, seperti yang Anda lihat, banyak berubah. Ini memungkinkan Anda memasukkan data hampir 3 kali lebih cepat dan menggunakan lebih sedikit HistoryCache - karenanya, data Anda akan dikirimkan tepat waktu. Sekali lagi, 80 ribu nilai per detik adalah angka yang cukup tinggi (tentu saja, bukan untuk Yandex). Secara keseluruhan ini adalah setup yang cukup besar, dengan satu server.

Tes kinerja PostgreSQL: 120 ribu NVP

Selanjutnya, saya meningkatkan nilai jumlah elemen data menjadi setengah juta dan mendapatkan nilai terhitung 125 ribu per detik:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Dan saya mendapatkan grafik ini:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Pada prinsipnya, ini adalah pengaturan yang berfungsi, dapat bekerja untuk waktu yang cukup lama. Namun karena saya hanya mempunyai disk berukuran 1,5 terabyte, saya menggunakannya dalam beberapa hari. Hal yang paling penting adalah pada saat yang sama partisi baru dibuat di TimescaleDB, dan hal ini sama sekali tidak diperhatikan dalam hal kinerja, yang tidak dapat dikatakan tentang MySQL.

Biasanya, partisi dibuat pada malam hari, karena hal ini biasanya menghalangi penyisipan dan bekerja dengan tabel dan dapat menyebabkan penurunan layanan. Dalam hal ini tidak demikian! Tugas utamanya adalah menguji kemampuan TimescaleDB. Hasilnya adalah angka berikut: 120 ribu nilai per detik.

Ada juga contoh di masyarakat:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Orang tersebut juga mengaktifkan TimescaleDB dan beban penggunaan io.weight turun pada prosesor; dan penggunaan elemen proses internal juga berkurang karena dimasukkannya TimescaleDB. Selain itu, ini adalah disk pancake biasa, yaitu mesin virtual biasa pada disk biasa (bukan SSD)!

Untuk beberapa pengaturan kecil yang dibatasi oleh kinerja disk, TimescaleDB menurut saya adalah solusi yang sangat baik. Ini akan memungkinkan Anda untuk terus bekerja sebelum bermigrasi ke perangkat keras yang lebih cepat untuk database.

Saya mengundang Anda semua ke acara kami: Konferensi di Moskow, Konferensi Tingkat Tinggi di Riga. Gunakan saluran kami - Telegram, forum, IRC. Jika Anda memiliki pertanyaan, datanglah ke meja kami, kami dapat membicarakan segalanya.

Pertanyaan Audiens

Pertanyaan dari penonton (selanjutnya - A): - Jika TimescaleDB sangat mudah dikonfigurasi, dan memberikan peningkatan kinerja, mungkin ini harus digunakan sebagai praktik terbaik untuk mengonfigurasi Zabbix dengan Postgres? Dan apakah ada jebakan dan kerugian dari solusi ini, atau lagi pula, jika saya memutuskan untuk membuat Zabbix sendiri, saya dapat dengan mudah menggunakan Postgres, segera menginstal Timescale di sana, menggunakannya dan tidak memikirkan masalah apa pun?

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

AG: – Ya, menurut saya ini adalah rekomendasi yang bagus: segera gunakan Postgres dengan ekstensi TimescaleDB. Seperti yang sudah saya katakan, banyak ulasan bagus, meskipun faktanya “fitur” ini bersifat eksperimental. Namun sebenarnya pengujian menunjukkan bahwa ini adalah solusi hebat (dengan TimescaleDB) dan menurut saya ini akan berkembang! Kami memantau bagaimana ekstensi ini berkembang dan akan melakukan perubahan jika diperlukan.

Bahkan selama pengembangan, kami mengandalkan salah satu “fitur” mereka yang terkenal: potongan dapat digunakan dengan cara yang sedikit berbeda. Namun kemudian mereka menghentikannya pada rilis berikutnya, dan kami harus berhenti mengandalkan kode ini. Saya akan merekomendasikan menggunakan solusi ini pada banyak pengaturan. Jika Anda menggunakan MySQL... Untuk pengaturan rata-rata, solusi apa pun berfungsi dengan baik.

A: – Pada grafik terakhir dari komunitas, terdapat grafik dengan “Pengurus Rumah Tangga”:

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Dia terus bekerja. Apa yang dilakukan Pengurus Rumah Tangga dengan TimescaleDB?

AG: – Sekarang saya tidak bisa memastikannya – Saya akan melihat kodenya dan memberi tahu Anda lebih detail. Ia menggunakan kueri TimescaleDB bukan untuk menghapus potongan, tetapi untuk menggabungkannya. Saya belum siap menjawab pertanyaan teknis ini. Kita akan mengetahui lebih lanjut di stand hari ini atau besok.

A: – Saya memiliki pertanyaan serupa – tentang kinerja operasi penghapusan di Skala Waktu.
A (jawaban dari hadirin): – Saat Anda menghapus data dari tabel, jika Anda melakukannya melalui penghapusan, maka Anda harus menelusuri tabel - hapus, bersihkan, tandai semuanya untuk vakum di masa mendatang. Di Timescale, karena Anda memiliki potongan, Anda dapat menjatuhkannya. Secara kasar, Anda cukup memberi tahu file yang ada di big data: “Hapus!”

Skala waktu hanya memahami bahwa potongan seperti itu sudah tidak ada lagi. Dan karena terintegrasi ke dalam perencana kueri, ia menggunakan kait untuk menangkap kondisi Anda dalam operasi pemilihan atau lainnya dan segera memahami bahwa potongan ini tidak ada lagi - "Saya tidak akan pergi ke sana lagi!" (data tidak tersedia). Itu saja! Artinya, pemindaian tabel digantikan dengan penghapusan file biner, sehingga cepat.

A: – Kami telah menyentuh topik non-SQL. Sejauh yang saya pahami, Zabbix tidak terlalu perlu mengubah data, dan semua ini seperti log. Apakah mungkin untuk menggunakan database khusus yang tidak dapat mengubah datanya, namun pada saat yang sama menyimpan, mengumpulkan, dan mendistribusikan lebih cepat - Clickhouse, misalnya, sesuatu yang mirip Kafka?.. Kafka juga merupakan log! Apakah mungkin untuk mengintegrasikannya?

AG: - Bongkar muat dapat dilakukan. Kami memiliki “fitur” tertentu sejak versi 3.4: Anda dapat menulis semua file historis, peristiwa, dan lainnya ke file; dan kemudian mengirimkannya ke database lain menggunakan beberapa penangan. Faktanya, banyak orang yang mengerjakan ulang dan menulis langsung ke database. Dengan cepat, penyerap sejarah menulis semua ini ke dalam file, memutar file-file ini, dan seterusnya, dan Anda dapat mentransfernya ke Clickhouse. Saya tidak bisa mengatakan tentang rencananya, tapi mungkin dukungan lebih lanjut untuk solusi NoSQL (seperti Clickhouse) akan terus berlanjut.

A: – Secara umum, ternyata postgres bisa dihilangkan sepenuhnya?

AG: – Tentu saja, bagian tersulit di Zabbix adalah tabel sejarah, yang paling banyak menimbulkan masalah, dan peristiwa. Dalam hal ini, jika Anda tidak menyimpan acara untuk waktu yang lama dan menyimpan riwayat dengan tren di beberapa penyimpanan cepat lainnya, maka secara umum, menurut saya, tidak akan ada masalah.

A: – Bisakah Anda memperkirakan seberapa cepat semuanya akan bekerja jika Anda beralih ke Clickhouse, misalnya?

AG: – Saya belum mengujinya. Saya pikir setidaknya angka yang sama dapat dicapai dengan cukup sederhana, mengingat Clickhouse memiliki antarmuka sendiri, tapi saya tidak bisa memastikannya. Lebih baik untuk menguji. Itu semua tergantung pada konfigurasi: berapa banyak host yang Anda miliki, dan seterusnya. Memasukkan adalah satu hal, tetapi Anda juga perlu mengambil data ini - Grafana atau yang lainnya.

A: – Jadi kita berbicara tentang pertarungan yang setara, dan bukan tentang keuntungan besar dari database cepat ini?

AG: – Saya pikir ketika kita berintegrasi, akan ada tes yang lebih akurat.

A: – Kemana perginya RRD lama yang bagus? Apa yang membuat Anda beralih ke database SQL? Awalnya, semua metrik dikumpulkan di RRD.

AG: – Zabbix memiliki RRD, mungkin dalam versi yang sangat kuno. Selalu ada database SQL - pendekatan klasik. Pendekatan klasiknya adalah MySQL, PostgreSQL (sudah ada sejak lama). Kami hampir tidak pernah menggunakan antarmuka umum untuk database SQL dan RRD.

HighLoad++, Andrey Gushchin (Zabbix): kinerja tinggi dan partisi asli

Beberapa iklan 🙂

Terima kasih untuk tetap bersama kami. Apakah Anda menyukai artikel kami? Ingin melihat konten yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikan kepada teman, cloud VPS untuk pengembang mulai $4.99, analog unik dari server level awal, yang kami temukan untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps dari $19 atau bagaimana cara berbagi server? (tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

Dell R730xd 2x lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya disini 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV dari $199 di Belanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - mulai $99! Membaca tentang Bagaimana membangun infrastruktur corp. kelas dengan penggunaan server Dell R730xd E5-2650 v4 senilai 9000 euro untuk satu sen?

Sumber: www.habr.com

Tambah komentar