Jde o proces vytváření duplicitních verzí DB. Proces replikace je nejen zkopíruje databázi, ale také synchronizuje změny z hlavního na jeden z podřízených. To však neznamená, že podřízené databáze jsou identickou kopií hlavní, protože replikaci lze nakonfigurovat tak, že bude replikováno pouze schéma tabulek, sloupců nebo řádků, tedy částečná replikace. Replikace zajišťuje, že tyto specifické nakonfigurované objekty jsou mezi různými databázemi synchronizovány.
Koncepty replikace Mariadb
Zálohy :Replikaci lze použít pro zálohy DB. Například máte replikaci master -> slave. Pokud dojde ke ztrátě masteru (například selže hdd), můžete obnovit svou db z master.
Škálování :Pro řešení škálování můžete použít replikaci master -> slave. Pokud máte například několik velkých a máte dotaz SQL, pomocí replikace můžete tyto dotazy oddělit pro každý uzly replikace. Zápis SQL by měl být prováděn pouze na hlavním serveru, pro dotazy pouze pro čtení lze použít podřízený server.
Řešení pro šíření :Pro distribuci můžete použít replikaci. Můžete například distribuovat různá prodejní data do různých databází.
Řešení převzetí služeb při selhání :Například máte replikaci master -> slave(1) -> slave(2) -> slave(3). Můžete napsat skript pro hlavní monitorování, pokud hlavní monitor selže, skript může rychle změnit slave(1) nový na master master -> slave(1) -> slave(2) a vaše aplikace bude pokračovat v práci bez výpadků
Jednoduchá schematická demonstrace replikace

Než začnete, dobře víte, co je binární protokol a Ibdata1. binární protokol obsahuje záznam o všech změnách v db, datech a struktuře a také o tom, jak dlouho trvalo provedení každého příkazu. Bin log se skládá z nastavených log souborů a indexu. To znamená, že hlavní příkazy SQL jako CREATE, ALTER, INSERT, UPDATE a DELETE budou vkládány do tohoto protokolu, příkazy jako SELECT nebudou protokolovány. Tyto informace lze zaznamenat do souboru obecného query.log. Jednoduše Ibdata1 je soubor, který obsahuje všechny tabulky a všechny informace o db.
Konfigurace hlavního serveru
Je dobré mít aktualizovaný server
sudo yum install update -y && sudo yum install upgrade -y
Pracujeme na serveru centos 7
sudo cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
Nainstalujte MariaDB
sudo yum install mariadb-server -y
Spusťte MariaDB a povolte její spuštění při spuštění serveru
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service
Výstup:
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
Zkontrolujte stav MariaDB
sudo service mariadb status
nebo použijte
sudo systemctl is-active mariadb.service
Výstup:
Redirecting to /bin/systemctl status mariadb.service
mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled)
Nastavte heslo 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 – vaše heslo uživatele root. V mém případě použiji "q" - heslo, pak se pokusím přihlásit:
sudo mysql -u root -pSOME_ROOT_PASSWORD
Výstup:
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.
Napište 'help;' nebo '\h' pro pomoc. Chcete-li vymazat aktuální vstupní příkaz, zadejte '\c'.
Umožňuje vytvořit databázi s tabulkou s některými daty
Vytvořit databázi/schéma
sudo mysql -u root -pSOME_ROOT_PASSWORD
mysql> create database test_repl;
Kde:
test_repl - Name of shcema which will be replicated
Výstup:
Query OK, 1 row affected (0.00 sec)
Vytvořit tabulku Osoby
mysql> use test_repl;
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Výstup:
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)
Vložte nějaká data
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");
Výstup:
Query OK, 5 row affected (0.00 sec)
Zkontrolujte data
mysql> select * from Persons;
Výstup:
+----------+-----------+------------+----------+-------+
| 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 |
+----------+-----------+------------+----------+-------+
Nakonfigurujte MariaDB pro replikaci
Budete muset upravit soubor my.cnf na hlavním serveru, abyste povolili binární protokolování a nastavili id serveru. Budu používat textový editor vi, ale použití může použít jakýkoli vhodný pro váš, například nano, joe atd.
sudo vi /etc/my.cnf
a vložte do config v sekci [mysqld] takové řádky.
log-basename=master
log-bin
binlog-format=row
server_id=1
Výstup:

Poté restartujte MariaDB:
sudo service mariadb restart
Přihlaste se do MariaDB a zkontrolujte binární protokoly:
sudo mysql -u root -pq test_repl
mysql> ZOBRAZIT STAV HLAVNÍHO;
Výstup:
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 3913 | | |
+--------------------+----------+--------------+------------------+
Pamatujte: Hodnoty "Soubor" a "Pozice". TUTO HODNOTU BUDETE POTŘEBOVAT NA SLAVE SERVER
Vytvořit uživatele pro replikaci
mysql> GRANT REPLICATION SLAVE ON *.* TO replication_user IDENTIFIED BY 'bigs3cret' WITH GRANT OPTION;
mysql> flush privileges;
Výstup:
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Zkontrolujte uživatele v db
mysql> select * from mysql.user WHERE user="replication_user"\G;
Výstup:
mysql> select * from mysql.user WHERE user="replication_user"\G;
*************************** 1. row ***************************
Host: %
User: replication_user
Password: *2AF30E7AEE9BF3AF584FB19653881D2D072FA49C
Select_priv: N
.....
Vytvořte DB výpis (snímek všech dat, která budou replikována) hlavní formulář
mysqldump -uroot -pSOME_ROOT_PASSWORD test_repl > full-dump.sql
Kde:
SOME_ROOT_PASSWORD - password for root user that you have setup
test_repl - name of the data base which will be replicated;
Musíte obnovit výpis mysql (full-dump.sql) na podřízeném serveru. Je potřeba pro replikaci.
Konfigurace podřízeného serveru
Všechny tyto příkazy musíte provést na podřízeném serveru
Předpokládejme, že máme čerstvý/aktualizovaný server CentOS 7.x s nejnovějším serverem mariaDB a můžete se přihlásit jako root k serveru maria DB (toto bylo popsáno v první části článku)
Přihlaste se do konzole Maria DB a vytvořte DB
mysql -u root -pSOME_ROOT_PASSWORD;
mysql> create database test_repl;
mysql> exit;
Obnovte data z hlavního na podřízeném serveru
mysql -u root -pSOME_ROOT_PASSWORD test_repl < full-dump.sql
Kde:
full-dump.sql - its DB Dump that you have create at test server.
Přihlaste se do Maria DB a nastavte replikaci
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;

Kde:
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
Spusťte režim slave
mysql> slave start;
Výstup:
Query OK, 0 rows affected (0.00 sec)
Zkontrolujte stav slave
mysql> show slave status\G;
Výstup:
*************************** 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)
V tomto kroku by mělo být vše v pořádku a neměly by zde být chyby.
Otestujte replikaci
Na MAIN/MASTER serveru přidejte nějaké entity do 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");
Poté přejděte na SLAVE server a zkontrolujte replikovaná data
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 |
+----------+-----------+------------+----------+-------+
Můžete vidět, že data jsou replikována na podřízený server. Znamená to, že replikace funguje. Doufám, že se vám článek líbil. Pokud máte nějaké dotazy, dejte nám vědět.