Saya telah menerapkan solusi HA untuk mysql berdasarkan replikasi master-master. Ada mekanisme di bagian ujung depan yang menjamin bahwa hanya satu db akan dibaca / ditulis pada waktu tertentu (yaitu kami hanya menggunakan replikasi untuk HA).
Saya telah mengkonfirmasi replikasi bekerja seperti yang diharapkan, tetapi saya bertanya-tanya tentang skenario kegagalan dan pemulihan Secara khusus, saya khawatir tentang apa yang terjadi ketika satu master gagal dalam keadaan yang tidak dapat dipulihkan, dan perlu diciptakan kembali dari master lainnya:
- Karena master lain aktif dan kemungkinan besar digunakan, saya tidak dapat menguncinya dan membuat dump dari
mysqldump
(database kami cukup besar, danmysqldump
dapat dengan mudah mengambil jam setelah penggunaan beberapa bulan). - Bahkan dengan asumsi saya memiliki dump, sangat penting bahwa posisi binlog seperti yang ditunjukkan oleh SHOW MASTER STATUS sesuai dengan dump yang dilakukan setelah database dikunci.
Solusi sederhana untuk masalah pertama adalah dengan menggunakan basis data ketiga yang bertindak sebagai cadangan, dari mana saya bisa melakukan mysqldump
. Tetapi kemudian bagaimana saya memastikan master yang diciptakan dapat memulai replikasi dari master yang berjalan secara konsisten?
sumber
Jawaban:
Ada dua pendekatan dasar untuk masalah ini yang saya sadari. Pertama, jika Anda menjalankan InnoDB alih-alih Myisam, maka Anda dapat melakukan pencadangan dalam transaksi (--single-transaction --lock-tables = FALSE), yang dikombinasikan dengan --flush-log (tidak diperlukan tapi bagus) dan --master-data akan memberi Anda cadangan yang konsisten dengan informasi posisi replikasi. Log flush akan mereset log sebelum dump dibuat, yang berarti posisinya akan selalu 106, dan - master-data akan menempatkan nama dan posisi logfile tepat di file dump. Tentu saja, Anda harus menjalankan ini pada master agar - master-data berfungsi.
Cara kedua, yang Anda sebutkan, adalah menggunakan host ketiga untuk membuat cadangan. Dalam hal ini, Anda harus menghentikan replikasi, pastikan DB hanya read_only (walaupun sebenarnya, semua replika Anda hanya boleh dibaca karena ini tidak mempengaruhi penulisan dari replikasi) dan kemudian buat cadangan Anda DAN catat posisi replikasi. Anda tidak dapat menggunakan --master-data dalam hal ini. Sebagai gantinya, Anda mungkin melakukan sesuatu seperti ini:
Jika Anda perlu memulihkan dari cadangan ini, Anda akan menjalankan pengembalian dan kemudian mengatur replikasi di mana dua parameter master_log_file dan master_log_pos berasal dari DB. File replikasi:
Catatan: Anda dapat DAN HARUS menguji ini dari replika lain.
Catatan tambahan: jika Anda memiliki kumpulan replika (misalnya jika Anda telah memisahkan baca dari tulis untuk aplikasi web), mungkin saja replika tidak sinkron dengan master baru; ini dapat terjadi jika failover terjadi selama periode penulisan I / O yang berat karena replika streaming secara tidak sinkron dan tidak ada jaminan bahwa siaga Anda berada pada posisi yang sama dengan replika lainnya ketika Anda failover. Namun, ini belum terjadi pada saya ...
sumber