Pertemuan tatap muka, saat ini, sangat terbatas, aktivitas online telah mengambil alih sebagai cara utama untuk interaksi guru - siswa. Ini meningkatkan tekanan pada platform "rapat" online yang ada (adakah orang yang tidak tahu apa itu Zoom saat ini?) Tetapi juga pada platform pembelajaran online. Ketersediaan tinggi alat online lebih penting dari sebelumnya dan tim operasi bergegas membangun arsitektur yang tahan lama dan sangat tersedia untuk lingkungan mereka.
Kemungkinan besar setidaknya beberapa dari Anda telah menggunakan Moodle - ini adalah platform pembelajaran online mandiri yang dapat Anda terapkan di tempat dan menggunakannya untuk memberikan pelatihan online bagi organisasi Anda. Seperti yang kami sebutkan, sangat penting untuk membuatnya bekerja dengan cara yang tahan lama dan sangat tersedia. Kami ingin mengusulkan solusi yang sangat tersedia yang melibatkan MariaDB sebagai database backend - baik replikasi asinkron maupun Galera Cluster.
Proses Desain Lingkungan
Kami ingin memulai dengan proses di mana kami akan menjelaskan proses pemikiran di balik perancangan lingkungan untuk Moodle. Kami menginginkan ketersediaan tinggi oleh karena itu satu node basis data tidak berfungsi untuk kami. Kami ingin banyak node dan ini membawa kami ke keputusan desain pertama. Haruskah kita menggunakan replikasi asinkron atau Galera Cluster? Pertanyaan kedua adalah:bagaimana kita akan mendistribusikan beban kerja di seluruh node? Mari kita mulai dengan yang kedua.
Versi Moodle terbaru saat blog ini ditulis (3.9) memperkenalkan fitur bagus yang disebut safe reads. Masalah yang harus dipecahkan di sini adalah membaca setelah menulis. Saat Anda menggunakan satu simpul, dunia adalah tempat yang sederhana. Anda menulis dan kemudian Anda membaca. Apa pun yang Anda tulis sudah ada di sana. Namun, ketika Anda menambahkan node, segalanya berubah. Dalam budak replikasi asinkron mungkin tertinggal bahkan puluhan detik atau lebih. Apa pun yang Anda tulis di master mungkin memerlukan beberapa menit (jika tidak lebih dalam kasus yang lebih ekstrim) untuk diterapkan ke slave. Jika Anda menjalankan penulisan dan kemudian segera mencoba membaca data yang sama dari salah satu slave, Anda mungkin akan mendapat kejutan yang tidak menyenangkan - data tidak akan ada di sana. Cluster Galera menggunakan replikasi sinkron "hampir" dan dalam kasus khusus ini "hampir" membuat perbedaan besar - Galera tidak kebal terhadap masalah read-after-write. Selalu ada penundaan antara eksekusi tulis pada node lokal dan writeset yang diterapkan ke node cluster yang tersisa. Tentu, kemungkinan besar diukur dalam milidetik daripada detik tetapi masih dapat mematahkan asumsi bahwa Anda dapat segera membaca apa yang Anda tulis. Satu-satunya tempat di mana Anda dapat membaca dengan aman setelah menulis adalah simpul tempat Anda menulis data.
Karena Moodle sangat bergantung pada read-after-write, kita tidak dapat dengan mudah menskalakan pembacaan hanya dengan menambahkan lebih banyak node untuk dibaca. Untuk Galera Cluster, kami dapat mencoba mengurangi masalah dengan menggunakan pengaturan konfigurasi wsrep-sync-wait untuk memaksa Galera memastikan bahwa pembacaan aman untuk dieksekusi. Ini menciptakan dampak kinerja pada sistem karena semua pembacaan harus menunggu penulisan diterapkan sebelum dapat dieksekusi. Ini juga merupakan solusi untuk MariaDB Cluster (dan solusi berbasis Galera lainnya), bukan untuk replikasi asinkron. Untungnya, solusi dari Moodle memecahkan masalah ini. Anda dapat menentukan daftar node yang mungkin tertinggal dan Moodle akan menggunakannya hanya untuk pembacaan yang tidak memerlukan pembaruan penulisan. Semua pembacaan yang tersisa yang memerlukan data untuk selalu terbarui akan diarahkan ke node penulis. Jadi, skalabilitas Moodle agak terbatas karena hanya pembacaan "aman" yang dapat diperkecil. Kami pasti ingin menggunakan fitur 3.9 mengingat ini adalah satu-satunya metode aman untuk menentukan pilihan mana yang harus pergi ke mana. Mengingat bahwa semuanya ditulis dalam file konfigurasi Moodle, kemungkinan besar kita ingin menggunakan penyeimbang beban, sebaiknya ProxySQL, untuk membuat logika yang akan menangani distribusi baca kita.
Haruskah kita menggunakan MariaDB Cluster atau replikasi asinkron? Kami benar-benar akan menunjukkan cara menggunakan keduanya. Dalam kedua kasus konfigurasi untuk Moodle akan hampir sama. Dalam kedua kasus kami akan menggunakan ProxySQL sebagai penyeimbang beban. Perbedaan utama antara solusi tersebut adalah failover. MariaDB Cluster jauh lebih mudah untuk ditangani - jika satu node mati, ProxySQL hanya akan memindahkan lalu lintas tulis ke salah satu node yang tersisa. Dengan replikasi asinkron, semuanya sedikit berbeda. Jika master turun, failover harus terjadi. Ini tidak terjadi secara otomatis, Anda harus melakukannya dengan tangan atau Anda dapat mengandalkan beberapa perangkat lunak untuk melakukannya. Dalam kasus kami, kami akan menggunakan ClusterControl untuk mengelola lingkungan dan melakukan failover oleh karena itu, dari sudut pandang pengguna, tidak ada banyak perbedaan antara replikasi asinkron dan Cluster MariaDB - dalam kedua kasus, kegagalan penulis akan ditangani secara otomatis dan cluster akan secara otomatis pulih .
Apa yang telah kami tetapkan adalah bahwa kami akan menampilkan replikasi asinkron dan hampir sinkron. Kami akan menggunakan fitur penulisan aman dari Moodle 3.9 dan kami akan menggunakan ProxySQL sebagai penyeimbang beban. Untuk memastikan ketersediaan tinggi, kami akan membutuhkan lebih dari satu instance ProxySQL oleh karena itu kami akan menggunakan dua di antaranya dan untuk membuat satu titik masuk ke lapisan basis data, kami akan menggunakan Keepalive untuk membuat IP Virtual dan mengarahkannya ke salah satu ProxySQL yang tersedia node. Berikut tampilan cluster database kami:
Untuk replikasi asinkron, ini bisa terlihat seperti ini:
Men-deploy Backend Database yang Sangat Tersedia untuk Moodle Menggunakan Replikasi MariaDB
Mari kita mulai dengan Replikasi MariaDB. Kami akan menggunakan ClusterControl untuk menerapkan seluruh backend database termasuk penyeimbang beban.
Menerapkan Kluster Replikasi MariaDB
Pada awalnya, kita harus memilih “Deploy” dari wizard:
Kemudian kita harus mendefinisikan konektivitas SSH, tanpa kata sandi, akses SSH berbasis kunci adalah persyaratan untuk ClusterControl untuk mengelola infrastruktur database.
Saat Anda mengisi detail tersebut, saatnya memilih vendor dan versi , tentukan sandi pengguna super dan tentukan beberapa detail lainnya.
Kita akan menggunakan MariaDB 10.4 untuk saat ini. Sebagai langkah selanjutnya kita harus mendefinisikan topologi replikasi:
Kita harus meneruskan nama host dari node dan bagaimana mereka harus berhubungan satu sama lain lainnya. Setelah kami puas dengan topologi, kami dapat menyebarkan. Untuk tujuan blog ini kami akan menggunakan master dan dua budak sebagai backend kami.
Kami memiliki cluster pertama dan siap. Sekarang, mari kita terapkan ProxySQL dan Keepalive.
Menyebarkan ProxySQL
Untuk ProxySQL, perlu mengisi beberapa detail - pilih host yang akan dipasang aktif, tentukan versi ProxySQL, kredensial untuk pengguna administratif dan pemantauan. Anda juga harus mengimpor pengguna database yang ada atau membuat yang baru untuk aplikasi Anda. Terakhir, putuskan node database mana yang ingin Anda gunakan dengan ProxySQL dan putuskan apakah Anda menggunakan transaksi implisit. Dalam kasus Moodle, ini tidak benar.
Menerapkan Keepalive
Sebagai langkah selanjutnya kami akan menerapkan Keepalive.
Setelah melewati detail seperti instance ProxySQL yang harus dipantau, IP Virtual, dan antarmuka VIP harus mengikat kami siap untuk menyebarkan. Setelah beberapa menit semuanya akan siap dan topologi akan terlihat seperti di bawah ini:
Konfigurasi Moodle dan ProxySQL untuk Penskalaan Penulisan Aman
Langkah terakhir adalah mengkonfigurasi Moodle dan ProxySQL untuk menggunakan penulisan yang aman. Meskipun dimungkinkan untuk membuat hardcode node database dalam konfigurasi Moodle, akan jauh lebih baik untuk mengandalkan ProxySQL untuk menangani perubahan topologi. Yang bisa kita lakukan adalah membuat pengguna tambahan di database. Pengguna tersebut akan dikonfigurasi di Moodle untuk mengeksekusi pembacaan yang aman. ProxySQL akan dikonfigurasi untuk mengirim semua lalu lintas yang dijalankan dari pengguna tersebut ke node slave yang tersedia.
Pertama, mari buat pengguna yang akan kita gunakan untuk akses hanya baca.
Kami memberikan semua hak istimewa di sini, tetapi daftar itu harus dibatasi .
Pengguna yang baru saja kita buat harus ditambahkan ke kedua instance ProxySQL yang kita miliki di kluster agar ProxySQL dapat mengautentikasi sebagai pengguna tersebut. Di UI ClusterControl Anda dapat menggunakan tindakan “Impor Pengguna”.
Kita dapat mencari pengguna yang baru saja kita buat:
ProxySQL menggunakan konsep hostgroup - grup host yang melayani tujuan yang sama . Dalam konfigurasi default kami ada dua grup host - grup host 10 yang selalu mengarah ke master saat ini dan grup host 20 yang mengarah ke node budak. Kami ingin pengguna ini mengirimkan lalu lintas ke node budak karena itu kami akan menetapkan HG 20 sebagai yang default.
Itu dia, pengguna akan ditampilkan pada daftar pengguna:
Sekarang kita harus mengulangi proses yang sama pada node ProxySQL lain atau menggunakan Opsi "Sinkronkan Instance". Dengan satu atau lain cara, kedua node ProxySQL harus menambahkan pengguna moodle_safereads.
Langkah terakhir adalah men-deploy Moodle. Kami tidak akan pergi ke sini melalui seluruh proses, tetapi ada satu masalah yang harus kami atasi. ProxySQL menampilkan dirinya sebagai 5.5.30 dan Moodle mengeluh itu terlalu tua. Kita dapat mengeditnya dengan mudah ke versi apa pun yang kita inginkan:
Setelah ini selesai, kita harus mengirim semua lalu lintas untuk sementara tuannya. Ini dapat dilakukan dengan menghapus semua aturan kueri di ProxySQL. Pengguna 'moodle' memiliki HG10 sebagai grup host default yang berarti bahwa tanpa aturan kueri, semua lalu lintas dari pengguna tersebut akan diarahkan ke master. Yang kedua, pembacaan aman, pengguna memiliki hostgroup default 20 yang merupakan hampir semua konfigurasi yang ingin kita miliki.
Setelah ini selesai, kita harus mengedit file konfigurasi Moodle dan mengaktifkan brankas membaca fitur:
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = 'mysqli';
$CFG->dblibrary = 'native';
$CFG->dbhost = '192.168.1.111';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'moodle';
$CFG->dbpass = 'pass';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => 6033,
'dbsocket' => '',
'dbcollation' => 'utf8mb4_general_ci',
'readonly' => [
'instance' => [
'dbhost' => '192.168.1.111',
'dbport' => 6033,
'dbuser' => 'moodle_safereads',
'dbpass' => 'pass'
]
]
);
$CFG->wwwroot = 'http://192.168.1.200/moodle';
$CFG->dataroot = '/var/www/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
require_once(__DIR__ . '/lib/setup.php');
// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!
Apa yang terjadi di sini adalah kami menambahkan koneksi hanya baca ke ProxySQL yang akan menggunakan pengguna moodle_safereads. Pengguna ini akan selalu menunjuk ke arah budak. Ini mengakhiri penyiapan Moodle untuk replikasi MariaDB.
Men-deploy Backend Database yang Sangat Tersedia untuk Moodle Menggunakan MariaDB Cluster
Kali ini kita akan mencoba menggunakan MariaDB Cluster sebagai backend kita. Sekali lagi, langkah pertama sama, kita harus memilih “Deploy” dari wizard:
Setelah Anda melakukannya, kita harus mendefinisikan konektivitas SSH, tanpa kata sandi, kunci- akses SSH berbasis merupakan persyaratan bagi ClusterControl untuk mengelola infrastruktur database.
Kemudian kita harus memutuskan vendor, versi, host sandi, dan pasangan lainnya pengaturan:
Setelah kami mengisi semua detail, kami siap menerapkannya.
Kami dapat melanjutkan di sini lebih jauh tetapi mengingat semua langkah lebih lanjut pada dasarnya sama dengan replikasi MariaDB, kami hanya akan meminta Anda untuk menggulir ke atas dan memeriksa bagian "Menyebarkan ProxySQL" dan semua yang mengikutinya. Anda harus menerapkan ProxySQL, Keepalive, mengkonfigurasi ulang, mengubah file konfigurasi Moodle dan ini cukup banyak. Kami berharap blog ini akan membantu Anda membangun lingkungan yang sangat tersedia untuk Moodle yang didukung oleh MariaDB Cluster atau replikasi.