Pos disiapkan oleh anggota tim Yandex.Cloud: Ivan Vetkasov - arsitek, Leonid Klyuyev - editor
Baru-baru ini, kami berbicara tentang arsitektur Yandex.Cloud . Sekarang mari kita beralih dari teori ke praktik. Ada beberapa layanan di Cloud untuk kontrol DBMS otomatis: Layanan yang Dikelola untuk ClickHouse, Layanan yang Dikelola untuk PostgreSQL dan Layanan yang Dikelola untuk MongoDB. Semuanya berbasis platform dan memungkinkan Anda untuk fokus pada tugas penyimpanan data, dan bukan pada administrasi infrastruktur. Tetapi terkadang penting juga untuk mengontrol mesin virtual cluster. Misalnya, tugas penskalaan mungkin muncul sebagai respons terhadap kenaikan atau penurunan beban. Biasanya skenario ini adalah salah satu yang paling memakan waktu dari sudut pandang praktis. Hari ini kami akan memberi tahu bagaimana Yandex.Cloud memungkinkan Anda untuk mengotomatiskan tugas penskalaan kompleks, dan memastikan bahwa basis data tetap tersedia dalam proses mengubah ukuran kluster.
Pernyataan masalah
Saat membuat cluster dari setiap layanan, pengguna dapat menentukan jumlah host cluster dan zona ketersediaan (AZ), yang sesuai dengan pusat data fisik. Sekarang Yandex.Cloud menggunakan tiga pusat data Yandex yang terletak di wilayah tengah Rusia. Oleh karena itu, konfigurasi yang disarankan adalah kluster DBMS dengan tiga host - sebagai yang paling konsisten dengan prinsip-prinsip membangun arsitektur yang aman dan tahan bencana.
Jadi, bayangkan situasi di mana beban pada kluster DBMS melebihi kemampuan database dan sekarang saatnya untuk menambahkan sumber daya komputasi. Ini dapat dilakukan secara horizontal - dengan menambahkan host ke cluster, dan secara vertikal - dengan menambahkan sumber daya ke setiap mesin cluster. Pertimbangkan opsi kedua, sebagai yang paling memakan waktu dan berisiko kesalahan. Mengapa opsi ini melelahkan? Karena dalam kasus umum, prosedur untuk menambah sumber daya akan terlihat seperti ini: alihkan peran tuan rumah; jika perlu, hentikan DBMS; matikan mesin virtual; ubah konfigurasinya; kita mulai; ubah parameter DBMS; kami memulai DBMS; Kami sedang menunggu sinkronisasi perubahan data akumulasi. Dan jadi untuk ketiga host pada gilirannya. Banyak langkah - risiko kesalahan tinggi. Anda dapat mengotomatiskan proses ini - hanya sebelum memulai solusi otomatisasi yang dipilih harus diuji. Biasanya tidak ada cukup waktu untuk pengujian, tetapi di Yandex.Cloud berjalan dengan cepat dan tanpa tindakan yang tidak perlu di pihak Anda. Mari kita mulai.
Langkah Awal dan Proses Pengujian
Untuk persiapan kita perlu:
- Akses ke platform. Sekarang siapa pun dapat mengatur periode uji coba di situs web di situs web Yandex.Cloud .
- Jaringan cloud (saya akan menyebutnya testvpc dalam contoh saya) dan tiga subnet yang terletak di AZ yang berbeda. Rentang alamat subnet dalam hal ini tidak penting.
- Tuan rumah Bastion. Terlepas dari kenyataan bahwa Yandex.Cloud dapat membuka akses eksternal ke DBMS melalui IP publik, menerbitkan DBMS dalam domain publik bukanlah keputusan yang tepat. Oleh karena itu, kami menambahkan bastion host ke skema, dari mana kami akan membuka koneksi ke host. Sebagai host, Anda dapat menggunakan mesin dengan sebagian (5 persen) penggunaan kernel. Clickhouse-client harus diinstal pada mesin virtual. Selain itu, sesuai dengan instruksi untuk menghubungkan ke layanan, Anda perlu mengunduh sertifikat SSL.
- CLI Kami akan bekerja dengan Yandex.Cloud tidak melalui konsol, tetapi melalui utilitas baris perintah, yang juga perlu diinstal dan diinisiasi sesuai dengan dokumentasi .
Skenario pengujian akan sederhana: buka tiga sesi yang menghubungkan bastion host ke setiap host cluster database, jalankan query SQL dalam satu siklus dengan periode, katakanlah, 1 detik, setelah itu kami mengirim perintah untuk skala cluster dan melihat perilaku sistem.
Momen kebenaran
Pilih DBMS untuk menunjukkan penskalaan. Di PostgreSQL, host diberi peran, tetapi layanan belum memiliki peralihan transparan saat melakukan penskalaan - fungsi ini ada dalam rencana kami. Karena sisa mekanisme meningkatkan dan mengurangi cluster kurang lebih sama dalam kasus di ketiga DBMS, misalnya, ambil ClickHouse.
Mari kita membuat objek percobaan - sebuah cluster yang terdiri dari tiga host yang terletak di subnet virtual yang berbeda. Untuk melakukan ini, masukkan perintah
yc managed-clickhouse cluster create
dengan argumen yang diperlukan. Urutan argumen sesuai dengan daftar mereka di output "yc --help". Inti dari perintah ini sederhana: kami membuat cluster ch-to-resize di lingkungan produksi dengan testvpc yang terletak di jaringan virtual, menetapkan nama dan kata sandi, ruang disk 10 gigabytes dan kelas minimum s1.nano. Karakteristik berikut sesuai dengan kelas ini: 1 CPU, 4 GB RAM. Di masa depan, untuk penskalaan, kita akan beralih ke kelas s1.micro, sehingga jumlah CPU dan RAM berlipat ganda. Untuk mencari tahu apa kelas host lain yang dapat Anda tetapkan, cukup masukkan perintah
yc managed-clickhouse resource-preset list
.
Jadi, perintah untuk membuat cluster harus sebagai berikut:
yc managed-clickhouse cluster create --name ch-to-resize --environment production --network-name testvpc --host zone-id=ru-central1-a,subnet-id=e9bfnjacigdo9p6j7j2s,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-b,subnet-id=e2l8iamol3b9mrtskb8q,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-c,subnet-id=b0c6qit7u9e8r0egedvj,assign-public-ip=false,type=clickhouse --user name=test,password=test123123 --database name=testdb --clickhouse-disk-size 10 --clickhouse-resource-preset s1.nano --clickhouse-disk-type network-nvme –async
Sebagai tanggapan, kami mendapatkan ID kluster dan daftar nama inang dari inangnya:
yc managed-clickhouse cluster list +----------------------+--------------+-----------------------------+--------+---------+ | ID | NAME | CREATED AT | HEALTH | STATUS | +----------------------+--------------+-----------------------------+--------+---------+ | c9q7cr4ji2fe462qej8p | ch-to-resize | 2018-12-10T08:59:09.100272Z | ALIVE | RUNNING | +----------------------+--------------+-----------------------------+--------+---------+ yc managed-clickhouse host list --cluster-id c9q7cr4ji2fe462qej8p +-------------------------------------------+----------------------+---------+---------------+ | NAME | CLUSTER ID | HEALTH | ZONE ID | +-------------------------------------------+----------------------+---------+---------------+ | rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-a | | rc1a-sgxazra54xv6lhni.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-a | | rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-b | | rc1b-j1rtvsuz6t8x6ev2.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-b | | rc1c-emo0f2990povj7ie.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-c | | rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-c | +-------------------------------------------+----------------------+---------+---------------+
Mari kita buka koneksi ke setiap host dan jalankan kueri ke database:
clickhouse-client --host rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 1" clickhouse-client --host rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive!') from system.clusters where replica_num = 2" clickhouse-client --host rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 3"
Akhirnya, kirim permintaan untuk menambah cluster:
yc managed-clickhouse cluster update --id c9q7cr4ji2fe462qej8p --clickhouse-resource-preset s1.micro -–async
Penjelasan Pengurangan ClusterJika kita ingin mengurangi, daripada menambah jumlah sumber daya, kita perlu menentukan kelas yang lebih kecil, mengacu pada output
yc managed-clickhouse resource-preset list
- misalnya, s1.nano. Pada saat yang sama, struktur tim itu sendiri tetap sama.
Saya mengarahkan output query ke file. Berikut ini daftar singkat:
rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net Mon Dec 10 12:47:35 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:36 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:37 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:38 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:39 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:40 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:47:51 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:02 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:11 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:12 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:13 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:14 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:15 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:16 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:17 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:18 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:19 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:20 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net: Mon Dec 10 12:50:58 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:59 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:00 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:01 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:12 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:23 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:34 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:35 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:36 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:37 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:38 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:39 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:40 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:41 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:42 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:43 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:44 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:45 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:46 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net: Mon Dec 10 12:49:15 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:16 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:17 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:18 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:19 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:30 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:41 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:52 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:56 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:57 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:58 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:59 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:00 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:01 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:03 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:04 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:05 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:06 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:07 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive!
Daftar menunjukkan saat-saat ketika setiap host di gugus dimatikan (ketika waktu habis koneksi dimulai), saat-saat ketika host dihidupkan dan ClickHouse mulai memuat (ketika koneksi ditolak dimulai), dan juga saat-saat ketika host kembali beroperasi. Yang paling penting adalah pemisahan periode waktu ketika host tidak tersedia. Semua sementara penskalaan, setidaknya dua host tersedia untuk eksekusi permintaan. Ini dapat dilihat pada grafik:

Kesimpulan dan praktik terbaik
Sekilas, pengembangan proyek dengan basis data mencakup banyak pekerjaan rutin. Basis data perlu dipelihara, yaitu untuk membuat salinan cadangan, untuk menetapkan proses pembaruan DBMS secara berkala, dll. Layanan manajemen cloud muncul terutama untuk menghapus fungsi-fungsi yang menghabiskan waktu dari Anda. Namun, dalam lingkungan produksi yang nyata, sangat berguna bahwa sistem tidak hanya dapat dikelola dari sudut pandang layanan, tetapi juga fleksibel - responsif terhadap beban naik dan turun. Kami berbicara tentang cara meningkatkan kinerja database di Yandex.Cloud, sambil mempertahankan kapasitas kerja proyek untuk pengguna. Jika database dikonfigurasikan dengan benar, maka dengan peningkatan lalu lintas ada peningkatan jumlah sumber daya yang tersedia, dan dengan resesi - penurunan berganda, yang juga mengurangi biaya Anda.
Pendekatan, alat, atau teknologi berbasis cloud apa yang ingin Anda pelajari? Sarankan topik dalam komentar untuk posting Yandex.Cloud berikut.