Satu budak, beberapa master MySql

9

Apakah mungkin untuk mengatur Replikasi MySql agar satu budak mendengarkan dua tuan yang berbeda?

Jonny
sumber

Jawaban:

3

Secara desain, satu proses mysqld tidak dapat secara bersamaan mendengarkan dua Master yang berbeda.

Perintah CHANGE MASTER TO TO hanya memungkinkan Anda untuk menetapkan satu Master sebagai sumber untuk dibaca.

Untuk meniru ini, Anda harus bergantian antara dua Master secara terprogram. Bagaimana kamu melakukannya ?

Saya menjelaskan dalam StackOverflow bagaimana Cara Menghubungkan Budak Secara Manual ke Master yang berbeda di mana setiap Master adalah Laptop dan Budak adalah Komputer Pusat.

Inilah ide dasarnya

  • Master M1
  • Master M2
  • Budak S1

Atur Replikasi M1 ke S1 dan kemudian M2 ke S1 seperti ini

  • 1) Minta S1 menjalankan CHANGE MASTER TO dengan M1 sebagai Sumber
  • 2) MULAI BUDAK;
  • 3) Jalankan Replikasi sebentar
  • 4) BERHENTI BUDAK;
  • 5) Minta S1 menjalankan CHANGE MASTER TO dengan M2 sebagai Sumber
  • 6) MULAI BUDAK;
  • 7) Jalankan Replikasi sebentar
  • 8) BERHENTI BUDAK;
  • 9) Kembali ke Langkah 1

Setiap kali Anda beralih dari satu Master ke Master lain, Anda harus merekam dua nilai dari SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

Kedua nilai ini mewakili Pernyataan SQL terakhir yang berasal dari Master dan selanjutnya akan dieksekusi pada Slave.

Ada satu peringatan utama: Selama M1 dan M2 memperbarui basis data yang saling eksklusif, algoritma ini harus baik-baik saja.

Percaya atau tidak, saya menjawab pertanyaan seperti ini di ServerFault kembali pada Mei 2011. Saya benar-benar menjelaskan cara meniru multimaster / slave tunggal menggunakan mesin penyimpanan BLACKHOLE berdasarkan buku "MySQL Kinerja Tinggi".

RolandoMySQLDBA
sumber
Meskipun saya belum benar-benar membutuhkannya, saya telah memikirkan masalah ini sebelumnya. Apakah tidak mungkin untuk secara mendasar menyalurkan binlog dari master kedua ke slave mysql? Saya kira yang terbaik adalah memiliki alat yang juga mengawasi hasil dari setiap permintaan dan berhenti pada kesalahan seperti halnya replikasi-slave normal. Tetapi pada dasarnya pipa sederhana juga harus dilakukan. Tentu saja kedua master yang menulis ke database / tabel yang sama akan menjadi rumit dengan cepat. Sesuatu yang harus Anda renungkan?
Jannes
1
Saya pikir perlu menambahkan jawaban Anda bahwa meskipun MySQL 5.6 tidak melakukan ini, 5.7 itu akan mendukung banyak master.
Phil Sumner
4

Solusi Rolando memiliki banyak peringatan. Yang pertama adalah satu aliran replika tidak harus mereplikasi sementara yang lain berfungsi Ini akan memberi Anda periode waktu di mana budak Anda tidak selaras. Anda sekarang harus memainkan tindakan penyeimbangan yang rumit untuk memastikan masing-masing memiliki cukup waktu untuk mengejar ketinggalan saat "berbelok".

Seperti yang dijelaskan Anda juga harus memainkan penjaga buku posisi log untuk kembali. Ini benar-benar hanya tampak buggy, membuka jendela untuk data yang hilang atau tidak konsisten atau bahkan melanggar replikasi ketika terjadi kesalahan (baik disebabkan oleh kesalahan 'off oleh satu' pada posisi log)

Saya akan merekomendasikan hanya menjalankan beberapa contoh mysql. Tidak ada yang menghentikan Anda dari menjalankan dua atau lebih mysql di mesin yang sama. Keduanya tidak dapat beroperasi pada port yang sama tentunya. Saya tidak benar-benar melihat ini sebagai masalah karena setiap klien dan perpustakaan memungkinkan Anda untuk menentukan sesuatu selain 3306.

Cukup tentukan port = 3307 (atau apa pun di salah satu file .cnf).

Anda juga ingin berhati-hati dalam memastikan kumpulan buffer yang dikonfigurasi secara individual dan konfigurasi memori lainnya tidak bertentangan satu sama lain. Ini sebenarnya menguntungkan karena Anda dapat menyesuaikan pengaturan tersebut dengan persyaratan spesifik dari masing-masing basis data yang direplikasi.

Dengan cara ini Anda hanya memiliki dua aliran replikasi berlari ke server yang sama; tidak pernah ketinggalan, tidak ada pembukuan yang diperlukan, tidak ada naskah "swapping" diperlukan.

atxdba
sumber
Saya senang seseorang memahami kegilaan pembukuan. Jawaban yang bagus juga. +1 !!!
RolandoMySQLDBA
0

MariaDB yang dapat digunakan sebagai pengganti MySql inplace dapat digunakan. Ini mendukungnya dari versi 10.2

Masalah dengan dukungan Mysql 5.7 adalah kebutuhan untuk GTID, yang berarti bahwa master HARUS juga diubah, dalam kasus MariaDb hal ini tidak terjadi.

Contoh / Tautan HowTo: http://www.skysql.com/blogs/dean-ellis/multi-source-replication-mariadb-100

Roman M
sumber