MySQL Master-Master Replication di TUTTI i database. Come?


16

Background : ho due server MySQL 5.1 configurati in replica di base (RBR) Master-Master seguendo questa eccellente guida . Voglio replicare tutti i database e aggiungerò nuovi database regolarmente.

Obiettivo : vorrei poter aggiungere nuovi database alla replica semplicemente aggiungendo il DB a uno dei server; senza dover arrestare entrambi gli slave, modificare i file di configurazione, riavviare i server MySQL e riavviare gli slave.

Domanda : Da quello che ho letto, io penso che posso fare questo semplicemente omettendo qualsiasi binlog-do-db, binlog-ignore-db, replicate-do-db, e le replicate-ignore-dbimpostazioni nella configurazione di ciascun server, ma non posso essere sicuro. I documenti di MySQL su come vengono valutate le opzioni di replica a livello di database e di tabella mi fanno pensare che potrebbe non esserci alcun modo per farlo.

Le parti pertinenti dei miei /etc/mysql/my.cnffile vengono copiate di seguito. Sono sulla buona strada? Ciò che voglio è anche possibile?

Master 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

Master 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

1
Creare il DB sulla macchina su cui si sta indirizzando le scritture.
Martin,

qual è la tua configurazione completa? Provo questa risposta qui sotto, non ha funzionato :-(
zx1986

Risposte:


17

È così che l'ho fatto per entrambi i maestri

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin

Sei in grado di aggiungere database a entrambi i master e farli replicare automaticamente all'altro?
Andrew Ensley,

si l'hanno fatto ... ho appena impostato quali ignorare
Mike,

1
Due domande: devo solo assicurarmi che entrambi diciamo la stessa cosa. # 1 Sei in grado di aggiungere un database a uno dei due master e viene creato automaticamente sull'altro, quindi tutti i dati inseriti nel nuovo database vengono replicati senza modificare la configurazione o riavviare i server? # 2 Stai utilizzando la replica basata su istruzioni o su riga? Ho bisogno di replicare tutte le modifiche su tutti i database; anche quelli eseguiti senza un'istruzione "use" in anticipo. Queste impostazioni funzioneranno bene con la replica basata su righe?
Andrew Ensley,

3
si si si si si :)
Mike,

1
Ok, ho appena configurato i miei server usando queste impostazioni ieri sera. Ho saltato l' log-slave-updatesimpostazione perché non ne ho visto la necessità. Tutto funziona perfettamente. Sono in grado di aggiungere e rilasciare database e le modifiche vengono replicate. Grazie! Premio assegnato.
Andrew Ensley,

4

Per quanto riguarda la creazione di database, esistono ancora segnalazioni di bug sull'utilizzo di CREATE DATABASE con replica basata su righe.

Questo report è chiuso, ma il bug è apparso di nuovo in MySQL 5.1.47
Questo report è basato su MySQL Cluster (motore di archiviazione NDB)
Questo report è basato su replicate-wild-ignore-table che si sta ancora replicando.

La replica basata su righe fa sì che i registri binari crescano a una velocità straordinaria che può aumentare il traffico di rete semplicemente inviando i dati del registro binario ai registri di inoltro dello slave.

@Mike dice che ha fatto in modo che la creazione del database funzionasse e si replicasse bene. Non ne dubito affatto. Quello che sono è un po 'esagerato di MySQL (eh Oracle) che non ha ottenuto tutti i nodi dalla replica basata su righe una volta che il database è stato istanziato.

È possibile che si desideri passare a row_format MIXED se si desidera ancora voci basate su righe nei registri binari. Internamente, il formato del registro binario tende a fluttuare tra istruzione e risolto comunque: (Vedi http://bugs.mysql.com/bug.php?id=40146 ). Ulteriori segnalazioni di bug vengono chiuse usando misti e scartando dalla riga ( http://bugs.mysql.com/bug.php?id=39701 ) ma i problemi persistono a intermittenza.

NOTA FINALE

Per la tua sanità mentale, torna alla replica basata su istruzioni e rendi quindi CREATE DATABASE (che è un'istruzione SQL) stabile e coerente per il successivo SQL rispetto al database creato. In effetti, la più recente segnalazione di bug mostra che è meglio usare la replica basata su istruzioni, indipendentemente da ciò che la documentazione dice sulle opzioni a livello di database e di tabella.


Grazie per tutte le informazioni. Il mio unico problema con la replica basata su istruzioni è che le modifiche che specificano il database (ovvero "INSERT INTO db1.table1 (col1) VALUES ('hi');") non funzioneranno a meno che il database non sia il database corrente in uso. Suppongo che potrebbe essere il momento di passare alla replica basata su istruzioni e ripulire un po 'di codice ...
Andrew Ensley,

Si scopre che non è stato così difficile correggere il codice necessario. Sto usando la replica basata su istruzioni ora. Grazie per il consiglio.
Andrew Ensley,

0

Hmm ... Dovrai anche trovare un modo per gestire / differenziare chiavi e campi auto-incrementati. Sembra interessante .. http://mysql-mmm.org/


Questo è gestito in auto-increment-increment, e le auto-increment-offsetimpostazioni nei miei file di configurazione. Vedi questa pagina: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley,

Penso che tu abbia frainteso. @Andrew sta parlando dell'aggiunta di nuovi database, non dell'aggiunta di nuovi server di database. Se @Andrew stava introducendo nuovi server di database, potrebbero verificarsi collisioni chiave durante la ridistribuzione dei dati tra 3 o più server DB, a cui la tua risposta verrebbe indirizzata. +1 per il tuo sforzo, ma ti preghiamo di leggere attentamente tutte le domande. Sono stato bruciato allo stesso modo.
RolandoMySQLDBA

@all: Oops .. Siamo spiacenti. Potrei giurare di averlo letto completo, ma invece non ho dovuto scremare ...
Nandhini Anand,

-1

cmiiw ho pensato che dovresti essere in grado di creare database su master1 e master2 senza cambiare conf o arrestare lo slave, ma assicurati che la replica master - master sia in esecuzione. poiché non si definisce quale database deve essere replicato, significa che tutto il database verrà replicato se non lo si definisce su my.cnf.


Questo è esattamente quello che chiedo qui. Non sono riuscito a trovare una risposta definitiva su questo finora.
Andrew Ensley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.