È un processo di creazione di versioni duplicate di un DB. Il processo di replica non solo copia un database, ma sincronizza anche le modifiche dal master a uno degli slave. Ma questo non significa che i database slave siano copie identiche del master, perché la replica può essere configurata in modo che venga replicato solo uno schema di tabelle o colonne o righe, ovvero una replica parziale. La replica assicura che quegli oggetti specifici configurati siano mantenuti sincronizzati tra i diversi database.
Concetti di replica Mariadb
Backup :la replica può essere utilizzata per i backup dei database. Ad esempio, hai la replica master -> slave. Se il master viene perso (l'HDD non funziona, ad esempio) puoi ripristinare il tuo db dal master.
Ridimensionamento :è possibile utilizzare la replica master -> slave per la soluzione di ridimensionamento. Ad esempio, se hai alcune query grandi e hai una query SQL, usando replcation puoi separare queste query per ogni nodo di replcations. La scrittura SQL deve essere eseguita solo sul master, per le query di sola lettura è possibile utilizzare il server slave.
Soluzione di diffusione :È possibile utilizzare la replica per la distribuzione. Ad esempio, puoi distribuire dati di vendita diversi a database diversi.
Soluzione di failover :Ad esempio, hai la replica master -> slave(1) -> slave(2) -> slave(3). Puoi scrivere uno script per il monitoraggio del master, se il master fallisce, lo script può cambiare rapidamente slave(1) nuovo per master master -> slave(1) -> slave(2) e la tua applicazione continuerà a funzionare senza tempi di inattività
Semplice dimostrazione schematica della replica
Prima di iniziare, sappi cos'è il log binario e Ibdata1. Il log binario contiene un record su tutte le modifiche nel db, nei dati e nella struttura, nonché il tempo impiegato per l'esecuzione di ciascuna istruzione. Il registro bin è costituito da file di registro impostati e un indice. Significa che le istruzioni SQL principali come CREATE, ALTER, INSERT, UPDATE e DELETE verranno inserite in questo registro, mentre le istruzioni come SELECT non verranno registrate. Queste informazioni possono essere registrate nel file query.log generale. In semplice Ibdata1 è un file che contiene tutte le tabelle e tutte le informazioni su db.
Configurazione del server principale
È bello avere il server aggiornato
sudo yum install update -y && sudo yum install upgrade -y
Stiamo lavorando su centos 7 server
sudo cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
Installa MariaDB
sudo yum install mariadb-server -y
Avvia MariaDB e abilitalo all'avvio all'avvio del server
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service
Uscita:
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
Controlla lo stato di MariaDB
sudo service mariadb status
oppure usa
sudo systemctl is-active mariadb.service
Uscita:
Redirecting to /bin/systemctl status mariadb.service
mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled)
Imposta la password MariaDB
mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("SOME_ROOT_PASSWORD") where User='root';
mysql> flush privileges;
mysql> exit
SOME_ROOT_PASSWORD - la tua password di root. Nel mio caso userò "q" - password, quindi proverò ad accedere:
sudo mysql -u root -pSOME_ROOT_PASSWORD
Uscita:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.41-MariaDB MariaDB Server
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Digita 'aiuto;' o '\h' per aiuto. Digita '\c' per cancellare l'istruzione di input corrente.
Creiamo database con tabella con alcuni dati
Crea database/schema
sudo mysql -u root -pSOME_ROOT_PASSWORD
mysql> create database test_repl;
Dove:
test_repl - Name of shcema which will be replicated
Uscita:
Query OK, 1 row affected (0.00 sec)
Crea tabella Persone
mysql> use test_repl;
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Uscita:
mysql> MariaDB [test_repl]> CREATE TABLE Persons (
-> PersonID int,
-> LastName varchar(255),
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255)
-> );
Query OK, 0 rows affected (0.01 sec)
Inserisci alcuni dati
mysql> INSERT INTO Persons VALUES (1, "LastName1", "FirstName1", "Address1", "City1");
mysql> INSERT INTO Persons VALUES (2, "LastName2", "FirstName2", "Address2", "City2");
mysql> INSERT INTO Persons VALUES (3, "LastName3", "FirstName3", "Address3", "City3");
mysql> INSERT INTO Persons VALUES (4, "LastName4", "FirstName4", "Address4", "City4");
mysql> INSERT INTO Persons VALUES (5, "LastName5", "FirstName5", "Address5", "City5");
Uscita:
Query OK, 5 row affected (0.00 sec)
Controlla i dati
mysql> select * from Persons;
Uscita:
+----------+-----------+------------+----------+-------+
| PersonID | LastName | FirstName | Address | City |
+----------+-----------+------------+----------+-------+
| 1 | LastName1 | FirstName1 | Address1 | City1 |
| 1 | LastName1 | FirstName1 | Address1 | City1 |
| 2 | LastName2 | FirstName2 | Address2 | City2 |
| 3 | LastName3 | FirstName3 | Address3 | City3 |
| 4 | LastName4 | FirstName4 | Address4 | City4 |
| 5 | LastName5 | FirstName5 | Address5 | City5 |
+----------+-----------+------------+----------+-------+
Configura MariaDB per la replica
Sarà necessario modificare il file my.cnf sul server principale per abilitare la registrazione binaria e impostare l'ID del server. Userò vi editor di testo, ma l'uso può utilizzare qualsiasi adatto per te come nano, joe ecc.
sudo vi /etc/my.cnf
e metti a config nella sezione [mysqld] tali righe.
log-basename=master
log-bin
binlog-format=row
server_id=1
Uscita:
Quindi riavvia MariaDB:
sudo service mariadb restart
Accedi a MariaDB e controlla i log binari:
sudo mysql -u root -pq test_repl
mysql> MOSTRA STATO MASTER;
Uscita:
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 3913 | | |
+--------------------+----------+--------------+------------------+
Ricorda: Valori "File" e "Posizione". AVRAI BISOGNO DI QUESTO VALORE SU SLAVE SERVER
Crea utente per la replica
mysql> GRANT REPLICATION SLAVE ON *.* TO replication_user IDENTIFIED BY 'bigs3cret' WITH GRANT OPTION;
mysql> flush privileges;
Uscita:
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Controlla utente in db
mysql> select * from mysql.user WHERE user="replication_user"\G;
Uscita:
mysql> select * from mysql.user WHERE user="replication_user"\G;
*************************** 1. row ***************************
Host: %
User: replication_user
Password: *2AF30E7AEE9BF3AF584FB19653881D2D072FA49C
Select_priv: N
.....
Crea dump DB (istantanea di tutti i dati che verranno replicati) dal master
mysqldump -uroot -pSOME_ROOT_PASSWORD test_repl > full-dump.sql
Dove:
SOME_ROOT_PASSWORD - password for root user that you have setup
test_repl - name of the data base which will be replicated;
È necessario recuperare il dump di mysql (full-dump.sql) sul server slave. È necessario per la replica.
Configurazione del server slave
Tutti questi comandi devi eseguire sul server slave
Supponiamo di avere un server CentOS 7.x fresco/aggiornato con l'ultimo server mariaDB e che tu possa accedere come root al server maria DB (questo è stato descritto nella prima parte dell'articolo)
Accedi alla console Maria DB e crea DB
mysql -u root -pSOME_ROOT_PASSWORD;
mysql> create database test_repl;
mysql> exit;
Recupera i dati dal master al server slave
mysql -u root -pSOME_ROOT_PASSWORD test_repl < full-dump.sql
Dove:
full-dump.sql - its DB Dump that you have create at test server.
Accedi a Maria DB e configura la replica
mysql> CHANGE MASTER TO
MASTER_HOST='82.196.5.39',
MASTER_USER='replication_user',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000002',
MASTER_LOG_POS=3913,
MASTER_CONNECT_RETRY=10;
Dove:
MASTER_HOST - IP of the master server.
MASTER_USER - replication user at master server
MASTER_PASSWORD - replication user password
MASTER_PORT - mysql port at master
MASTER_LOG_FILE - bin-log file name form master
MASTER_LOG_POS - bin-log position file at master
Avvia la modalità slave
mysql> slave start;
Uscita:
Query OK, 0 rows affected (0.00 sec)
Controlla lo stato dello slave
mysql> show slave status\G;
Uscita:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 82.196.5.39
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mariadb-bin.000002
Read_Master_Log_Pos: 4175
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 793
Relay_Master_Log_File: mariadb-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4175
Relay_Log_Space: 1089
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
A questo punto tutto dovrebbe essere ok e non dovrebbero esserci errori.
Testare la replica
Al server MAIN/MASTER aggiungi alcune entità al DB
mysql -u root -pSOME_ROOT_PASSWORD test_repl
mysql> INSERT INTO Persons VALUES (6, "LastName6", "FirstName6", "Address6", "City6");
mysql> INSERT INTO Persons VALUES (7, "LastName7", "FirstName7", "Address7", "City7");
mysql> INSERT INTO Persons VALUES (8, "LastName8", "FirstName8", "Address8", "City8");
Quindi vai al server SLAVE e controlla i dati replicati
mysql -u root -pSOME_ROOT_PASSWORD test_repl
mysql> select * from Persons;
+----------+-----------+------------+----------+-------+
| PersonID | LastName | FirstName | Address | City |
+----------+-----------+------------+----------+-------+
...................
| 6 | LastName6 | FirstName6 | Address6 | City6 |
| 7 | LastName7 | FirstName7 | Address7 | City7 |
| 8 | LastName8 | FirstName8 | Address8 | City8 |
+----------+-----------+------------+----------+-------+
Puoi vedere che i dati vengono replicati sul server slave. Significa che la replica sta funzionando. Spero che l'articolo ti sia piaciuto. Facci sapere se hai domande.