Buat slave MySQL dari slave lain, tetapi arahkan pada master

8

Masalah

Saya memiliki pengaturan replikasi MySQL antara 2 server, master ( A ) dan slave ( B ). Saya perlu menambahkan budak baru ke dalam campuran ( C ). Saya ingin budak ini mendapatkan pembaruan langsung dari master, saya tidak ingin replikasi berantai dari budak. Namun, masternya "panas", saya biasanya menggunakan Xtrabackup untuk membuat cadangan lengkap master, tetapi ini akan menguncinya selama 10 menit, karena database berukuran sekitar 20GB.

Kemungkinan Solusi

FLUSH TABLES DENGAN READ LOCK pada slave B , gunakan SHOW SLAVE STATUS pada B , tuliskan binlog dan posisikan. Kemudian backup database dengan Xtrabackup, kirimkan backup ke C dan gunakan untuk membuat slave, dan atur replikasi ke titik A dengan posisi binlog yang baru saja saya tulis.

Pertanyaan

Apakah ada cara yang lebih baik yang tidak mengharuskan saya mengunci B begitu lama? Atau sesuatu yang lebih mudah diotomatisasi?

Alex Recarey
sumber

Jawaban:

20

Hei saya tahu metode gila untuk membuat budak tanpa menambah operasi master (ServerA) atau budak (ServerB)

Langkah 1) Menyiapkan Server Baru (ServerC)

Langkah 2) Di ServerC, Instal MySQL (versi yang sama dengan ServerB)

Langkah 3) Pada ServerC, layanan berhenti mysql

Langkah 4) Salin /etc/my.cnf dari ServerB ke ServerC

Langkah 5) Pada ServerC, ubah server_id ke nilai yang berbeda dari ServerA dan ServerB

Langkah 6) rsync / var / lib / mysql di ServerB ke ServerC

Langkah 7) Ketika rsync selesai, jalankan "STOP SLAVE;" di ServerB

Langkah 8) rsync / var / lib / mysql di ServerB ke ServerC

Langkah 9) Di ServerB, jalankan "START SLAVE;"

Langkah 10) Pada ServerC, layanan mysql mulai

Langkah 11) Pada ServerC, jalankan "START SLAVE;" (Lakukan ini jika skip-slave-start ada di /etc/my.cnf)

Cobalah !!!

BTW Saya memiliki kepercayaan diri yang tinggi ini akan berhasil karena saya baru saja melakukan ini untuk klien selama 2 hari terakhir. Klien memiliki 2,7TB data pada seorang budak. Saya rsyncd ke server lain saat slave masih aktif. rsync butuh waktu 11 jam. Saya kemudian menjalankan STOP SLAVE; pada slave pertama dan jalankan rsync lagi. Butuh satu jam lagi. Saya kemudian melakukan langkah di atas dan semuanya dilakukan.

RolandoMySQLDBA
sumber
LOL. Saya akan mengomentari OP untuk menggunakan saran Anda, dan rendah dan lihatlah Tuannya Rolando DBA "Kulkas". Rolando mengenai paku di kepala dan ini adalah metode yang disukai tanpa harus menghentikan Master dan tanpa menghentikan budak B Anda terlalu lama.
coderwhiz
2
Saya tahu ini posting yang cukup lama tetapi seseorang bertanya kepada saya tentang metode ini. Ini berfungsi dengan baik dengan asumsi bahwa budak baru dan budak lama sama persis. Jika budak baru adalah lengkungan yang berbeda, itu tidak akan berfungsi (iirc). Dan saya hampir yakin bahwa jika Anda menggunakan tablespace innodb per-file itu tidak akan berfungsi. Solusi teraman adalah dengan melakukan backup penuh dari master jika ada keraguan.
lusis
@lusis - Komentar Anda sangat benar. Dalam dunia yang sempurna, yang dibayangkan kebanyakan klien mysql, mereka ingin ini dilakukan karena semua spesifikasi perangkat keras identik. Dalam pengaturan di mana perangkat keras berbeda, mysqldumps dan memuat ulang adalah yang paling aman. Anda harus mengirimkan komentar Anda sebagai jawaban. Saya akan mengangkatnya. Mari kita lihat apakah orang lain mau !!!
RolandoMySQLDBA
Saya mengikuti prosedur. Setelah memulai mysql kembali pada SlaveC saya mendapatkan kesalahan mengatakan "Database Anda mungkin rusak atau Anda mungkin telah menyalin tablespace InnoDB tetapi bukan file log InnoDB". Dan pada start slave(SlaveC) saya mendapatkan "Gagal membuka log relay '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli
Dengan cara ini Anda dapat dengan mudah kehilangan data di ServerC.
akuzminsky
3

Ketika kami menambahkan budak ke dalam campuran kami, kami melakukan hal berikut:

  • ambil satu budak offline
  • salin direktori data basis data ke slave baru (pengaturan slave -binlog, master host dll - akan benar karena kita menyalin dari slave)
  • mulai budak asli
  • modifikasi server-id di my.cnf untuk slave baru
  • mulai budak baru
sreimer
sumber
Saya hanya harus melakukan ini sendiri sore ini
sreimer
1

Saya melakukan apa yang disarankan @RolandoMySQLDBA tetapi juga menambahkan langkah 6 ' dan 8' (ini memecahkan apa yang komentar @Hussain Tamboli .):

Langkah 1) Menyiapkan Server Baru (ServerC)

Langkah 2) Di ServerC, Instal MySQL (versi yang sama dengan ServerB)

Langkah 3) Pada ServerC, layanan berhenti mysql

Langkah 4) Salin /etc/my.cnf dari ServerB ke ServerC

Langkah 5) Pada ServerC, ubah server_id ke nilai yang berbeda dari ServerA dan ServerB

Langkah 6) rsync / var / lib / mysql di ServerB ke ServerC

Langkah 6 ') rsync / var / log / mysql di ServerB ke ServerC

Langkah 7) Ketika rsync selesai, jalankan "STOP SLAVE;" di ServerB

Langkah 8) rsync / var / lib / mysql di ServerB ke ServerC

Langkah 8 ') rsync / var / log / mysql di ServerB ke ServerC

Langkah 9) Di ServerB, jalankan "START SLAVE;"

Langkah 10) Pada ServerC, layanan mysql mulai

Langkah 11) Pada ServerC, jalankan "START SLAVE;" (Lakukan ini jika skip-slave-start ada di /etc/my.cnf)

Pere Barceló
sumber
jawaban Anda tidak lengkap, dan itu merujuk hal-hal lain. ini bukan forum, tingkatkan jawaban Anda agar lengkap sendiri.
asdmin
0

Anda memiliki opsi "LOAD DATA FROM MASTER" tetapi itu sangat tidak disarankan.

Apakah Anda mengambil backup malam / mingguan pada sistem Anda? Jika demikian, perhatikan juga posisi dengan cadangan Anda maka Anda dapat menggunakan cadangan itu untuk menyiapkan budak baru. Biarkan saja dan biarkan up to date untuk beberapa waktu.

jishi
sumber
0

Saya mencoba jawaban Rolando dan bekerja dengan baik, tetapi mulai diputar ulang dari awal dan saya harus menambahkan lebih banyak kode kesalahan untuk dilewati (saya tahu itu tidak disarankan, tetapi saya tahu apa yang saya lakukan).

Setelah selesai dengan langkah 7, saya telah memeriksa log mysql dan mencatat nama dan posisi bin log dan melanjutkan hingga langkah ke-9. Sebelum langkah ke 10, saya baru dieksekusi change masteruntuk file log dan posisi log. Dan dilanjutkan dari langkah 11. Semua terlihat baik bagi saya.

Paku
sumber
-2

Anda perlu mengubah slave uuid di auto.cnf sehingga master dapat membedakan dua slave.

Nazgul
sumber