Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara Memulihkan Cluster MySQL Galera Dari Budak Asinkron

Pengantar

Saat menjalankan Galera Cluster, merupakan praktik umum untuk menambahkan satu atau beberapa slave asinkron di pusat data yang sama atau berbeda. Ini memberi kami rencana darurat dengan RTO rendah, dan dengan biaya pengoperasian yang rendah. Jika ada masalah yang tidak dapat dipulihkan di cluster kami, kami dapat dengan cepat melakukan failover ke sana sehingga aplikasi dapat terus memiliki akses ke data.

Saat menggunakan jenis pengaturan ini, kami tidak dapat membangun kembali cluster kami dari cadangan sebelumnya. Karena budak async sekarang menjadi sumber kebenaran baru, kita perlu membangun kembali cluster darinya.

Ini tidak berarti bahwa kita hanya memiliki satu cara untuk melakukannya, bahkan mungkin ada cara yang lebih baik! Jangan ragu untuk memberi kami saran Anda di bagian komentar di akhir posting ini.

Topologi

Topologi Kontrol Cluster Lihat Online

Di atas, kita dapat melihat contoh topologi dengan Galera Cluster dan replika/slave asynchronous.

Diagram Basis Data 1

Selanjutnya kita akan melihat bagaimana kita dapat membuat ulang cluster kita, mulai dari slave, dalam kasus menemukan sesuatu seperti ini:

Diagram Basis Data 2 Tampilan Topologi Kontrol Cluster Offline

Jika kita melihat gambar sebelumnya, kita bisa melihat 3 node Galera kita sedang down. Budak kami tidak dapat terhubung ke master Galera, tetapi dalam status "Aktif dan berjalan".

Promosikan Budak

Karena budak kami bekerja dengan benar, kami dapat mempromosikannya untuk menguasai dan mengarahkan aplikasi kami ke sana. Untuk ini, kita harus menonaktifkan parameter read-only di slave kita dan mengatur ulang konfigurasi slave.

Di budak kami (mysql1):

mysql> SET GLOBAL read_only=0;
Query OK, 0 rows affected (0.00 sec)
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> RESET SLAVE;
Query OK, 0 rows affected (0.18 sec)

Buat Cluster baru

Selanjutnya, untuk memulai pemulihan cluster kami yang gagal, kami akan membuat Cluster Galera baru. Ini dapat dengan mudah dilakukan melalui ClusterControl ClusterControl, silakan gulir lebih jauh ke bawah di blog ini untuk melihat caranya.

Setelah kami menerapkan cluster Galera baru kami, kami akan memiliki sesuatu seperti berikut:

Diagram Basis Data 3

Replikasi

Kita harus memastikan bahwa kita telah mengonfigurasi parameter replikasi.

Untuk node Galera (galera1, galera2, galera3):

server_id=<ID>         # Different value in each node
binlog_format=ROW
log_bin = /var/lib/mysql-binlog/binlog
log_slave_updates = ON
gtid_mode = ON
enforce_gtid_consistency = true
relay_log = relay-bin
expire_logs_days = 7

Untuk simpul Master (mysql1):

server_id=<ID>         # Different value in each node
binlog_format=ROW
log_bin=binlog
log_slave_updates=1
gtid_mode=ON
enforce_gtid_consistency=1
relay_log=relay-bin
expire_logs_days=7
read_only=ON
sync_binlog=1
report_host=<HOSTNAME or IP>    # Local server

Agar budak baru kita (galera1) terhubung dengan master baru kita (mysql1), kita harus membuat pengguna dengan izin replikasi di master kita.

Di master baru kami (mysql1):

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';

Catatan:Kita bisa mengganti "%" dengan IP node Galera Cluster yang akan kita jadikan slave, dalam contoh kita, galera1.

Cadangan

Jika kita tidak memilikinya, kita harus membuat cadangan yang konsisten dari master kita (mysql1) dan memuatnya di Galera Cluster baru kita. Untuk ini, kita dapat menggunakan alat XtraBackup atau mysqldump. Mari kita lihat kedua opsi tersebut.

Dalam contoh kami, kami menggunakan database sakila yang tersedia untuk pengujian.

Alat XtraBackup

Kami menghasilkan cadangan di master baru (mysql1). Dalam kasus kami, kami mengirimkannya ke direktori lokal /root/backup:

$ innobackupex /root/backup/

Kita harus mendapatkan pesannya:

180705 22:08:14 completed OK!

Kami memampatkan cadangan dan mengirimkannya ke node yang akan menjadi budak kami (galera1):

$ cd /root/backup
$ tar zcvf 2018-07-05_22-08-07.tar.gz 2018-07-05_22-08-07
$ scp /root/backup/2018-07-05_22-08-07.tar.gz galera1:/root/backup/

Di galera1, ekstrak cadangan:

$ tar zxvf /root/backup/2018-07-05_22-08-07.tar.gz

Kami menghentikan cluster (jika dimulai). Untuk ini kami menghentikan layanan mysql dari 3 node:

$ service mysql stop

Di galera1, kami mengganti nama direktori data mysql dan memuat cadangan:

$ mv /var/lib/mysql /var/lib/mysql.bak
$ innobackupex --copy-back /root/backup/2018-07-05_22-08-07

Kita harus mendapatkan pesannya:

180705 23:00:01 completed OK!

Kami menetapkan izin yang benar pada direktori data:

$ chown -R mysql.mysql /var/lib/mysql

Kemudian kita harus menginisialisasi cluster.

Setelah node pertama diinisialisasi, kita harus memulai layanan MySQL untuk node yang tersisa, menghilangkan salinan file grastate.dat sebelumnya, dan kemudian memverifikasi bahwa data kita telah diperbarui.

$ rm /var/lib/mysql/grastate.dat
$ service mysql start

Catatan:Verifikasi bahwa pengguna yang digunakan oleh XtraBackup dibuat di node inisialisasi kami, dan sama di setiap node.

mysqldump

Secara umum, kami tidak menyarankan melakukannya dengan mysqldump, karena bisa sangat lambat dengan volume data yang besar. Tapi itu adalah alternatif untuk melakukan tugas.

Kami membuat cadangan di master baru (mysql1):

$ mysqldump -uroot -p --single-transaction --skip-add-locks --triggers --routines --events --databases sakila > /root/backup/sakila_dump.sql

Kami mengompresnya dan mengirimkannya ke node budak kami (galera1):

$ gzip /root/backup/sakila_dump.sql
$ scp /root/backup/sakila_dump.sql.gz galera1:/root/backup/

Kami memuat dump ke galera1.

$ gunzip /root/backup/sakila_dump.sql.gz
$ mysql -p < /root/backup/sakila_dump.sql

Ketika dump dimuat di galera1, kita harus me-restart layanan MySQL pada node yang tersisa, menghapus file grastate.dat, dan memverifikasi bahwa data kita telah diperbarui.

$ rm /var/lib/mysql/grastate.dat
$ service mysql start

Mulai Replikasi Budak

Terlepas dari pilihan mana yang kita pilih, XtraBackup atau mysqldump, jika semuanya berjalan dengan baik, pada langkah ini kita sudah dapat mengaktifkan replikasi di node yang akan menjadi budak kita (galera1).

$ mysql> CHANGE MASTER TO MASTER_HOST = 'mysql1', MASTER_PORT = 3306, MASTER_USER = 'slave_user', MASTER_PASSWORD = 'slave_password', MASTER_AUTO_POSITION = 1;
$ mysql> START SLAVE;

Kami memverifikasi bahwa budak berfungsi:

mysql> SHOW SLAVE STATUS\G
       Slave_IO_Running: Yes
       Slave_SQL_Running: Yes

Pada titik ini, kami memiliki sesuatu seperti berikut:

Diagram Basis Data 4

Setelah NewGalera1 diperbarui, kami dapat mengarahkan ulang aplikasi ke cluster galera baru kami, dan mengonfigurasi ulang replikasi asinkron.

Kontrol Cluster

Seperti yang kami sebutkan sebelumnya, dengan ClusterControl kita dapat melakukan beberapa tugas yang disebutkan di atas dalam beberapa klik sederhana. Ini juga memiliki opsi pemulihan otomatis, untuk node dan cluster. Mari kita lihat beberapa tugas yang dapat dibantunya.

Penerapan ClusterControl 1

Untuk melakukan penerapan, cukup pilih opsi “Deploy Database Cluster” dan ikuti petunjuk yang muncul.

Penerapan ClusterControl 2

Kita dapat memilih antara berbagai jenis teknologi dan vendor. Kami harus menentukan Pengguna, Kunci atau Kata Sandi dan port untuk terhubung dengan SSH ke server kami. Kami juga memerlukan nama untuk cluster baru kami dan jika kami ingin ClusterControl menginstal perangkat lunak dan konfigurasi yang sesuai untuk kami.

Penerapan ClusterControl 3

Setelah mengatur informasi akses SSH, kita harus mendefinisikan node di cluster kita. Kami juga dapat menentukan repositori mana yang akan digunakan. Kita perlu menambahkan server kita ke cluster yang akan kita buat.

Kami dapat memantau status pembuatan cluster baru kami dari monitor aktivitas ClusterControl.

Juga, kita dapat melakukan impor klaster atau database kita saat ini dengan mengikuti langkah yang sama. Dalam hal ini, ClusterControl tidak akan menginstal perangkat lunak database, karena sudah ada database yang berjalan.

ClusterControl Tambahkan Salve Replikasi

Untuk menambahkan slave replikasi, Anda perlu mengklik Cluster Actions, pilih Add Replication Slave, dan tambahkan informasi akses SSH dari server baru. ClusterControl akan terhubung ke server untuk membuat konfigurasi yang diperlukan untuk tindakan ini.

ClusterControl Aktifkan Logging Biner

Untuk mengubah satu atau lebih node Galera menjadi server master (seperti dalam arti memproduksi binlog), Anda dapat membuka Tindakan Node dan memilih Aktifkan Logging Biner.

ClusterControl Backup

Cadangan dapat dikonfigurasi dengan XtraBackup (penuh atau tambahan) dan mysqldump, dan Anda memiliki opsi lain seperti mengunggah cadangan ke cloud, enkripsi, kompresi, jadwal, dan lainnya.

Pemulihan Kontrol Cluster

Untuk memulihkan cadangan, buka tab Cadangan dan pilih opsi Pulihkan, lalu pilih di server mana yang ingin Anda pulihkan.

ClusterControl Ubah Master Replikasi

Jika Anda memiliki slave dan ingin mengubah master, atau membangun kembali replikasi, Anda dapat membuka Node Actions dan memilih opsi.

Kesimpulan

Seperti yang dapat kita lihat, kami memiliki beberapa cara untuk mencapai tujuan kami, beberapa lebih kompleks, yang lain lebih ramah pengguna, tetapi dengan salah satu dari mereka, Anda dapat membuat ulang cluster dari budak asinkron. Xtrabackup akan memulihkan lebih cepat untuk volume data yang lebih besar. Untuk menghindari kesalahan operator (mis., DROP TABLE yang salah), Anda juga dapat menggunakan slave yang tertunda sehingga Anda diharapkan memiliki waktu untuk menghentikan pernyataan agar tidak menyebar.

Kami berharap informasi ini berguna, dan Anda tidak perlu menggunakannya dalam produksi;)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TO_SECONDS() Contoh – MySQL

  2. ASCII() Contoh – MySQL

  3. Kelola MySQL dengan phpMyAdmin di Debian 5 (Lenny)

  4. Atur zona waktu di PHP dan MySQL

  5. Tutorial MySQL – Panduan Pemula Untuk Mempelajari MySQL