Uno schiavo, più padroni MySql


9

È possibile configurare MySql Replication in modo che uno slave ascolti due diversi master?

Risposte:


3

In base alla progettazione, un processo mysqld non può ascoltare contemporaneamente due master diversi.

Il comando CAMBIA MASTER TO consente solo di impostare un master come sorgente da leggere.

Per emularlo, dovresti alternare tra i due Master in modo programmatico. Come si fa a farlo ?

In StackOverflow ho descritto come collegare manualmente uno slave a diversi master in cui ogni master era un laptop e lo slave era un computer centrale.

Ecco l'idea di base

  • Master M1
  • Master M2
  • Slave S1

Configura la replica da M1 a S1 e quindi da M2 a S1 in questo modo

  • 1) Avere S1 eseguito CHANGE MASTER TO con M1 come sorgente
  • 2) AVVIO SLAVE;
  • 3) Eseguire la replica per un po '
  • 4) STOP SLAVE;
  • 5) Avere S1 eseguito CHANGE MASTER TO con M2 come sorgente
  • 6) AVVIO SLAVE;
  • 7) Eseguire la replica per un po '
  • 8) STOP SLAVE;
  • 9) Torna al passaggio 1

Ogni volta che passi da un Master a un altro, devi registrare due valori da SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

Questi due valori rappresentano l'ultima istruzione SQL che proveniva dal Master e che doveva essere eseguita sullo Slave.

C'è una grande cautela: fintanto che M1 e M2 stanno aggiornando database reciprocamente esclusivi, questo algoritmo dovrebbe andare bene.

Che ci crediate o no, ho risposto a una domanda come questa in ServerFault nel maggio 2011. In realtà ho spiegato come emulare un vero multimaster / singolo slave utilizzando il motore di archiviazione BLACKHOLE basato sul libro "High Performance MySQL".


Anche se non ne ho ancora veramente bisogno, ho pensato a questo problema in precedenza. Non sarebbe possibile fondamentalmente reindirizzare il binlog del secondo master nello slave mysql? Immagino che la cosa migliore sarebbe avere uno strumento che controlli anche i risultati di ogni query e si fermi su un errore proprio come fa il normale thread slave di replica. Ma in sostanza dovrebbe fare anche una semplice pipa. Naturalmente entrambi i master che scrivono nello stesso database / tabella diventerebbero difficili rapidamente. Qualcosa per cui i tuoi guru devono riflettere?
Jannes,

1
Penso che valga la pena aggiungere alla tua risposta che anche se MySQL 5.6 non lo fa, tale 5.7 supporterà più master.
Phil Sumner,

4

La soluzione di Rolando ha molti avvertimenti. Il primo essendo uno stream di replica non si replica necessariamente mentre l'altro funziona. Questo ti darà periodi di tempo in cui lo schiavo non è sincronizzato. Ora devi giocare un delicato gesto di bilanciamento per assicurarti che ognuno abbia abbastanza tempo per recuperare quando ha il suo "turno".

Come descritto, devi anche ricoprire il ruolo di custode delle posizioni dei registri per tornare a. Questo sembra davvero errato, aprendo la finestra per dati mancanti o incoerenti o addirittura rompendo la replica quando va storto (o causato da un errore "off by one" nella posizione del registro)

Consiglierei di eseguire più istanze mysql. Non c'è nulla che ti impedisca di eseguire due o più mysql sulla stessa macchina. Naturalmente non possono entrambi operare sulla stessa porta. Non vedo davvero questo come un problema, poiché ogni client e libreria ti consente di specificare qualcosa di diverso da 3306.

Basta specificare port = 3307 (o qualunque altra cosa in uno dei file .cnf).

È inoltre necessario assicurarsi che i pool di buffer configurati individualmente e le altre configurazioni di memoria non siano in contrasto tra loro. Questo è in realtà un vantaggio, poiché è possibile ottimizzare con maggiore precisione tali impostazioni in base ai requisiti specifici dei singoli database che vengono replicati.

In questo modo hai solo due flussi di replica in esecuzione nello stesso server; mai dietro, nessun libro richiesto, nessuno script di "scambio" richiesto.


Sono contento che qualcuno capisca la follia contabile. Bella risposta pure. +1 !!!
RolandoMySQLDBA


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.