Bagaimana Anda menyinkronkan kembali Master MySQL DB dengan perubahan Slave DB jika Master offline?

11

MySQL Server 1 berjalan sebagai Master.
MySQL Server 2 berjalan sebagai Slave.

Dengan kedua DB online, mereka berada dalam "sinkronisasi sempurna". Jika Slave offline, tidak ada masalah jika Master masih online; mereka akan kembali menyinkronkan setelah Slave online lagi.

Selain konfigurasi server, saya mengalihkan koneksi (dengan kode JSP) untuk Slave DB jika Master offline (saya diuji tentu saja dengan /etc/init.d/mysqld stop).

Ketika Master kembali online, apakah ada metode otomatis untuk menyinkronkan Master dengan Slave pembaruan?

RolandoMySQLDBA
sumber

Jawaban:

8

Salah satu cara yang baik untuk melakukan sesuatu dari sifat itu adalah dengan mengatur Replikasi Master-Master atau Replikasi Lingkaran. Ini tidak menjadi bingung dengan MultiMaster Replciation.

Menyiapkan Replikasi Sirkular benar-benar sangat mudah jika Anda memiliki pengaturan Master-Slave Replication. Inilah yang perlu Anda lakukan untuk mengkonfigurasinya.

Untuk contoh ini, kami akan menganggap Replikasi Master-Slave aktif tetapi Anda akan mengalami sedikit waktu henti (1-2 menit):

Langkah 1) Tambahkan baris ini ke /etc/my.cnf pada Master.

log-budak-pembaruan

Langkah 2) Tambahkan baris ini ke /etc/my.cnf di Slave:

log-bin = mysql-bin (atau memiliki apa pun yang dimiliki master untuk ini) log-slave-update

PERINGATAN: Inilah saat singkat downtime !!!

Langkah 3) Pada Slave, service mysql restart

Ini akan mengaktifkan log biner pada Slave

Langkah 4) Pada Master, layanan berhenti mysql

Langkah 5) Gunakan rsync untuk menyalin folder / var / lib / mysql dari Slave ke Master.

PERINGATAN: Inilah saat downtime yang lebih lama !!!

Langkah 6) Pada Slave, layanan berhenti mysql

Langkah 7) Pada Slave, cari tahu log biner terakhir

Langkah 8) Pada Slave, cari tahu ukuran file dari log biner terakhir

Langkah 9) Gunakan rsync untuk menyalin folder / var / lib / mysql dari Slave ke Master. Ini harus menjadi salinan yang lebih cepat.

Langkah 10) Pada Master, edit
Baris 2 dari master.info dengan log biner terakhir dari Slave.
Baris 3 dari master.info dengan filesize dari log biner terakhir dari Slave.
Baris 4 master.info dengan IP dari Slave.
Baris 5 adalah userid dari pengguna replikasi (JANGAN SENTUH)
Baris 6 adalah kata sandi dari pengguna replikasi (JANGAN SENTUH)

Langkah 11) Hapus semua log biner dan file indeks log biner dari Master.

Langkah 12) Pada Slave, service mysql start, tunggu 15 detik

Langkah 13) Pada Master, layanan mysql mulai

Langkah 14) Pada Master, jalankan STOP SLAVE; TAMPILKAN STATUS MASTER;

Langkah 15) Di Budak, jalankan PERUBAHAN MASTER KE MASTER_HOST = 'IP Budak', MASTER_USER = 'pengguna pengguna replikasi dari Step10', MASTER_PASSWORD = 'kata sandi pengguna replikasi dari Step10', MASTER_LOG_FILE = 'log biner dari Step14', MASTER_LOG_POS = LogPos dari Step14.

Langkah 16) Pada Slave, jalankan START SLAVE;

Langkah 17) Pada Master, jalankan START SLAVE;

Saya melakukan langkah-langkah yang mirip dengan ini untuk pertanyaan StackExchange lain yang saya jawab .

Cobalah !!!

RolandoMySQLDBA
sumber
Sangat bagus! Apakah mungkin untuk memiliki lebih dari satu database budak yang disinkronkan ke dalam master, lebih seperti solusi "Master-Master-Master"?
Herberth Amaral
Ini merusak pengaturan saya yang tidak dapat diperbaiki. Harus menginstal ulang VPS saya sepenuhnya. Saya kira saya akan mengambil snapshot sebelum membaca saran cerdik lain kali.
Vasili Syrakis
@VasiliSyrakis Saya menyesal Anda merasa saran saya cerdik. Meskipun demikian, dalam 10 tahun saya sebagai DBA MySQL, saya tidak pernah menghancurkan VPS atau instalasi MySQL ketika menyelaraskan kembali log biner untuk replikasi. Saya telah melakukan ini untuk klien Drupal dan Wordpress selama bertahun-tahun tanpa insiden. Maaf atas saran saya.
RolandoMySQLDBA
Hmm. Saya tidak akan merekomendasikan untuk menggunakan rsync untuk menyalin instance yang sedang berjalan. Saya akan menggunakan Percona XtraBackup untuk menginisialisasi ulang master dari slave . Anda juga tidak perlu log-slave-updateskecuali master akan memiliki budak tambahan.
Bill Karwin
2

Tidak dengan replikasi Asynchronous yang merupakan apa yang ditawarkan MySQL. Anda tinggal menekan pepatah mengapa replikasi MySQL 'out of the box' (pre 5.5) bukan solusi ketersediaan tinggi dalam dan dari dirinya sendiri. Segalanya menjadi sedikit lebih baik dengan 5,5 dengan replikasi semi-sinkron (http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html) tetapi dengan biaya waktu transaksi yang lebih lambat saat master menunggu untuk ack dari slave.

Jika menerima kemungkinan kehilangan data ketika master turun bukanlah suatu pilihan, saya akan mengatakan pengaturan yang lebih canggih daripada master / slave sederhana.

Replikasi Master ke Master telah dianggap lebih banyak masalah daripada manfaat oleh banyak orang terkenal MySQL (bahkan MySQL AB sendiri tidak lagi merekomendasikannya sebagai solusi ketersediaan tinggi). Jadi, saya pikir menggunakan pengaturan DRBD untuk menjaga master aktif dan budak pasif dalam sinkronisasi menggunakan salinan level blok adalah apa yang sebenarnya Anda butuhkan di sini.

TechieGurl
sumber
1
Saya suka DRBD sendiri. Saya bekerja dengannya secara teratur dengan banyak klien menggunakan ucarp sebagai mekanisme kegagalan saya. DRBD sebenarnya sangat baik dan lebih disukai untuk HA, asalkan database semua InnoDB. Setiap tabel MyISAM yang dibuka selama failover ditandai macet bahkan di DRBD Secondary. InnoDB baru saja mengalami crash crash ketika gagal ke DRBD Primary baru. Jadi, saya melihat DRBD dan InnoDB digunakan bersama. Terima kasih atas akal sehat Anda untuk menghadirkan DRBD. +1 untuk jawaban Anda.
RolandoMySQLDBA
Terima kasih :) dan saya kira dalam jawaban saya, saya membuat anggapan bahwa jika Anda sangat peduli tentang konsistensi data antara replika Anda, Anda sudah semua atau sebagian besar InnoDB :)
TechieGurl
1

IMHO, Pertama-tama, dalam konfigurasi non-multi-master (master / slave), budak Anda seharusnya tidak pernah menulis. Slave my.cnf harus dikonfigurasi dan server mulai dengan:

# Flag to not take writes from network
read-only

Selanjutnya, untuk menyembuhkan masalah master yang tidak sinkron dengan budak yang dapat ditulisi secara tidak sengaja menulis, Anda harus melakukan diff data pada kedua host. Jika tidak ada tabrakan kunci, Anda harus mempromosikan mantan host slave Anda ke master dan gambar ulang master lama Anda sebagai host slave yang direplikasi dari master baru. (mungkin ada / mungkin masalah data di sini)

Akhirnya, jika skenario ini outage / downtime bahkan kemungkinan maju , luangkan waktu untuk mengatur kedua host sebagai multi-master (log-bin, server-id, offset, dll.). Ini akan membantu Anda mengurangi gangguan dan downtime sampai batas tertentu.

Jika Anda harus menjalankan master / slave , setidaknya dapatkan beberapa poin bonus untuk memisahkan koneksi pengguna baca dan tulis di ACL dan aplikasi Anda.

randomx
sumber