La replica multi-source
Contents
Replica multi-source significa che un server esegue la replica da molti master. Questa funzionalità è stata introdotta in MariaDB 10.0.
Nuova sintassi
E' possibile specificare con quale connessione master si lavora sia passando il nome della connessione al comando, sia impostando @@default_master_connection
con il nome della connessione su cui si desidera lavorare.
Il nome della connessione può contenere qualsiasi carattere e deve avere una lunghezza inferiore a 64. I nomi delle connessioni sono case insensitive, cioé le lettere minuscole sono considerate uguali alle maiuscole. E' preferibile usare nomi brevi, perché verranno usati come suffisso nei relay log e nell'indice di master info.
Ecco la nuova sintassi, introdotta per gestire connessioni multiple:
CHANGE MASTER ["nome_connessione"] ...
FLUSH RELAY LOGS ["nome_connessione"]
MASTER_POS_WAIT(....,["nome_connessione"])
RESET SLAVE ["nome_connessione"]
SHOW RELAYLOG ["nome_connessione"] EVENTS
SHOW SLAVE ["nome_connessione"] STATUS
SHOW ALL SLAVES STATUS
START SLAVE ["nome_connessione"...]]
START ALL SLAVES ...
STOP SLAVE ["nome_connessione"] ...
STOP ALL SLAVES ...
La connessione originale vecchio stile è una stringa vuota ''
.
Non occorre usare questa connessione, se non si desidera farlo.
Per creare nuove connessioni master si usa CHANGE MASTER.
E' possibile cancellare permanentemente una connessione con RESET SLAVE "nome_connessione" ALL.
Variabili per la replica multi-source
La variabile @@default_master_connection
specifica quale connessione deve essere utilizzata per default per i comandi e le variabili. Quella predefinita è ''
(il nome di default delle connessioni).
Le seguenti variabili sono locali all'interno della connessione. In altre parole, mostrano il valore della connessione @@default_master_connection
). Stiamo lavorando per rendere le variabili più importanti locali alla connessione.
Tipo | Nome | Spiegazione |
---|---|---|
Variable | Max_relay_log_size | Dimensioni massime del relay log. Se è 0, all'avvio viene impostato a max_binlog_size |
Status | Slave_heartbeat_period | Quanto spesso deve essere richiesto al master un pacchetto heartbeat (in secondi). |
Status | Slave_received_heartbeats | Quanti heartbeat sono stati ricevuti dal master. |
Status | Slave_running | Mostra se lo slave è in funzione. YES significa che il thread sql e il thread IO sono attivi. No significa che uno dei due non è in esecuzione. "" significa che @@default_master_connection non esiste. |
Variable | Sql_slave_skip_counter | Quanti elementi del log della replica dovrebbero essere ignorati (si usa principalmente in caso di errori nel log). |
E' possibile accedere a tutte le variabili elencate sia con SESSION
, sia con GLOBAL
.
Si noti che, diversamente da quanto accade in MySQL, tutte le variabili mostrano sempre il valore corrente corretto!
Esempio:
set @@default_master_connection=''; show status like 'Slave_running'; set @@default_master_connection='altra_connessione'; show status like 'Slave_running';
Se @@default_master_connection
contiene un nome inesistente,
si ottiene un warning.
Tutte le altre variabili relative al master sono globali e hanno effetto o solo su "" o su tutte le connessioni. Per esempio, Slave_retried_transactions
ora mostra il numero totale delle transazioni che sono state ritentate su tutti gli slave
Nuove variabili di stato:
Nome | Spiegazione |
---|---|
Com_start_all_slaves | Numero di comandi START ALL SLAVES eseguiti. |
Com_start_slave | Numero di comandi START SLAVE eseguiti. Sostituisce Com_slave_start . |
Com_stop_slave | Numero di comandi STOP SLAVE eseguiti. Sostituisce Com_slave_stop . |
Com_stop_all_slaves | Numero di comandi STOP ALL SLAVES eseguiti. |
SHOW ALL SLAVES STATUS
ha le seguenti nuove colonne:
Nome | Spiegazione |
---|---|
Connection_name | Nome della connessione master. E' la prima variabile. |
Slave_SQL_State | Stato del thread SQL. |
Retried_transactions | Numero di connessioni ritentate in questa connessione. |
Max_relay_log_size | Dimensioni massime del relay log size in questa connessione. |
Executed_log_entries | Quanti elementi del log sono stati eseguiti dallo slave. |
Slave_received_heartbeats | Quanti heartbeat sono stati ricevuti dal master. |
Slave_heartbeat_period | Quando spesso deve richiedere un pacchetto heartbeat al master (in secondi). |
Nuovi file
Il principio di base dei nuovi file usati per la replica multi source è che hanno lo stesso nome dei file del relay log originale, con il suffisso connection_name
prima dell'estensione. L'eccezione più importante è il file contenente tutte le connessioni, che si chiama come il normale master-info-file
con un prefisso multi-
.
Se si usa la replica multi source, vengono creati i seguenti file:
Nome | Spiegazione |
---|---|
multi-master-info-file | Il file master-info-file (normalmente master.info ) con un prefisso multi- . Contiene tutte le connessioni ai master in uso. |
master-info-file -connection_name.estensione | Contiene la posizione corrente del master applicata allo slave. Estensione di solito è .info |
relay-log -nome_connessione.xxxxx | Il nome del relay-log con un suffisso nome_connessione. xxxxx è il numero progressivo del relay log. Questo contiene i dati della replica letti dal master. |
relay-log-index -nome_connessione.estensione | Contiene il nome dei file relay-log -nome_connessione.xxxxx attivi. Estensione di solito è .index |
relay-log-info-file -nome_connessione.estensione | Contiene la posizione corrente del master nel relay log. Estensione di solito è .info |
Quando si crea un file, il nome della connessione viene convertito in lettere minuscole e tutti i caratteri speciali vengono convertiti, nello stesso modo in cui vengono convertiti i nomi delle tabelle di MySQL. Questo serve a rendere il nome del file portabile su diversi sistemi operativi.
Suggerimento:
Invece di specificare i nomi per mysqld
con --relay-log
, --relay-log-index
, --relay-log-index
, --general-log
, --slow-log
,
--log-bin
, --log-bin-index
si può specificare soltanto --log-base-name
, così tutte le altre variabili verranno impostate con questo prefisso.
Altre cose
- Tutti i messaggi di errori provenienti da uno slave con un certo nome connessione, che sono scritti nel log degli errori, hanno ilprefisso
Master 'connection_name':
. In questo modo è più facile capire da dove proviene un errore. - Gli errori
ER_MASTER_INFO
eWARN_NO_MASTER_INFO
ora includono nome_connessione. - Non esiste una risoluzione dei conflitti. Il presupposto è che non ci siano conflitti tra i dati fra differenti master.
- Tutti i comandi eseguiti sono scritti nel log binario normale (niente di nuovo qui).
- Se la variabile server
log_warnings
> vale 1 si ottengono nel log alcune informazioni su quando il file multi-master-info è aggiornato (principalmente per il debug). - SHOW [FULL] SLAVE STATUS restituisce una riga per connessione e alcune colonne aggiuntive rispetto a prima. Si noti che la prima colonna è
connection_name
! RESET SLAVE
ora elimina tutti i file del relay-log.
Casi d'uso comuni
- Si stanno partizionando i dati su diversi master e si desidera riunirli tutti in una sola macchina per poter eseguire query analitiche.
- Si hanno diversi database sparsi su diversi server MariaDB/MySQL e si desidera riunirli tutti in un'unica macchina come backup aggiuntivo.
Limitazioni
- Per ora è possibile avere solo 64 master (se necessario, incrementare questo numero è triviale).
- Ogni connessione attiva crea 2 thread (come avviene normalmente nella replica di MariaDB).
- Occorre assicurarsi che tutti i master abbiano un valore differente per
server-id
. In caso contrario, si avranno problemi se si tenta di replicare da uno slave multi-source ai master. - E' possibile modificare
max_relay_log_size
per la connessione attiva, ma le nuove connessioni continueranno a usare il valore impostato all'avvio del server, che non può essere modificato a runtime. - L'opzione
innodb-recovery-update-relay-log
(funzionalità di xtradb per registrare e recuperare la posizione degli slave nel relay log) funziona solo sulla connessione predefinita ''. Poiché questa opzione non è realmente sicura e potrebbe facilmente causare una perdita di dati se si utilizzano Storage Engine diversi da InnoDB, si raccomanda di non usarla. Slave_net_timeout
ha effetto su tutte le connessioni. E' stato eliminato il controllo che verificava se è minore diSlave_heartbeat_period
, perché in una configurazione multi-source non ha senso.
TODO
- La replica semisincrona ('semisync_slave.so') non funziona con la multi-source. Verrà corretto per la prossima release.
- Tutti i task aperti e i bug conosciuti della replica multi-source si trovano qui.
- Possibilità di replicare da un master a uno slave con diversi thread.
Incompatibilità con MariaDB/MySQL 5.5
max_relay_log_size
ora è (quasi) quasi una variabile normale e non viene modificata quando cambia il valore dimax_binlog_size
. Perché tutto sia compatibile con i vecchi file di configurazione, viene impostata amax_binlog_size
all'avvio, se il suo valore è 0.- E' possibile accedere alle variabili della replica che dipendono dalla connessione attiva sia con
GLOBAL
, sia conSESSION
. - Le informazioni per il recupero delle posizioni nel relay log, vengono registrate solo se
innodb-recovery-update-relay-log
è impostata. Slave_retried_transaction
ora mostra il numero totale delle transazioni che sono state ritentate, fra tutti gli slave.- La variabile di stato
Com_slave_start
è stata sostituita conCom_start_slave
. - La variabile di stato
Com_slave_stop
è stata sostituita conCom_stop_slave
. - Il comando
FLUSH RELAY LOGS
non è più replicato. Non sarebbe sicuro, perché i nomi delle connessioni potrebbero essere differenti sugli slave.
<</product>>
Vedi anche
- Il lavoro su MariaDB si basa sulla descrizione del progetto di MDEV-253.
- La base di codice originale viene da Taobao, developed by Peng Lixun. Un grande ringraziamento a loro per questa importante funzionalità!