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"] EVENTSSHOW SLAVE ["nome_connessione"] STATUSSHOW ALL SLAVES STATUSSTART 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_INFOeWARN_NO_MASTER_INFOora 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 SLAVEora 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_sizeper 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_timeoutha 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_sizeora è (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_sizeall'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_transactionora 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 LOGSnon è 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à!