GNU/Linux >> Znalost Linux >  >> Debian

Nastavení replikace Master-Master s MySQL na Debian 8 (Jessie)

Tento tutoriál popisuje replikované nastavení MySQL (replikace Mater/Master) se 2 uzly, kde lze data číst a zapisovat do obou uzlů současně. MySQL se postará o replikaci dat do druhého uzlu a zajistí, že primární klíče automatického přírůstku nebudou kolidovat.

Od verze 5 přichází MySQL s vestavěnou podporou replikace master-master, která řeší problém, který se může vyskytnout u samogenerovaných klíčů. V dřívějších verzích MySQL byl problém s replikací master-master v tom, že konflikty vznikly okamžitě, pokud uzel A i uzel B vložily automaticky inkrementační klíč do stejné tabulky. Výhody replikace master-master oproti tradiční replikaci master-slave spočívají v tom, že nemusíte své aplikace upravovat tak, aby umožňovaly zápis pouze na master, a že je snazší zajistit vysokou dostupnost, protože pokud selže master, stále máte druhého mistra.

1 předběžná poznámka

V tomto tutoriálu ukážu, jak replikovat databázi exampledb ze serveru server1.example.com s IP adresou 192.168.1.101 na server server2.example.com s IP adresou 192.168.1.102 a naopak. Každý systém je otrokem druhého pána a zároveň pánem druhého otroka. Oba systémy používají Debian 8; konfigurace by však měla platit pro téměř všechny distribuce s malými nebo žádnými úpravami.

2 Instalace MySQL 5.5

Pokud MySQL ještě není nainstalováno na server1 a server2, nainstalujte jej nyní:

server1/server2:

apt-get -y install mysql-server-5.5 mysql-client-5.5

Abychom se ujistili, že replikace může fungovat, musíme zajistit, aby MySQL naslouchala na všech rozhraních, proto zakomentujeme řádek bind-address =127.0.0.1 v /etc/mysql/my.cnf:

server1/server2:

nano /etc/mysql/my.cnf
[...]# Místo přeskočení sítě je nyní výchozím nastavením poslouchat pouze na # localhost, který je více kompatibilní a není méně bezpečný.#bind-address =127.0.0.1[...]

Poté restartujte MySQL:

server1/server2:

restart služby mysql

Poté zkontrolujte pomocí

server1/server2:

netstat -tap | grep mysql

že MySQL skutečně naslouchá na všech rozhraních:

netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 15437/mysqld
server1:~#

Nyní nastavíme replikačního uživatele slave2_user, kterého může server2 použít pro přístup k databázi MySQL na serveru1.

server1:

Přihlaste se do prostředí MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

V prostředí MySQL spusťte následující příkazy:

server1:

UDĚLEJTE REPLIKACI SLAVE NA *.* TOMU [e-mail chráněn]'%' IDENTIFIKOVÁNO 'secretpassword';
FLUSH PRIVILEGES;
quit;

Nahraďte slovo „tajné heslo “ s bezpečným heslem dle vašeho výběru. Nyní provedeme poslední dva kroky znovu na serveru2:

server2:

mysql --defaults-file=/etc/mysql/debian.cnf
UDĚLEJTE REPLIKACI SLAVE NA *.* TOMU [e-mail chráněn]'%' IDENTIFIKOVÁNO 'secretpassword';
FLUSH PRIVILEGES;
quit;

Nahraďte slovo „tajné heslo “ s bezpečným heslem i zde. Poznamenejte si hesla, jak je později budeme potřebovat. 

3 Několik poznámek

V následujícím budu předpokládat, že oba servery MySQL jsou prázdné (neobsahují zatím žádnou databázi kromě databáze 'mysql').

Pokud tomu tak není na vašem serveru, musíte zamknout a vypsat databáze na prvním serveru a importovat je na druhý, než budete pokračovat. Neodemykejte databáze před nastavením replikace. Níže je uvedeno několik příkazů, které ukazují, jak zkopírovat všechny databáze na nový server v případě, že nezačnete s "čistým" nastavením MySQL.

Příklad, jak uzamknout všechny databázové tabulky v databázi MySQL.

VYPLACHUJTE TABULKY SE ZÁMEKEM ČTENÍ;
NASTAVTE GLOBAL read_only =ON;

Příklad, jak vypsat všechny databáze do souboru all_databases.sql.

mysqldump --defaults-file=/etc/mysql/debian.cnf -cCeQ --hex-blob --quote-names --routines --events --triggers --all-databases -r all_databases.sql 

Příklad, jak importovat všechny tabulky na druhém serveru ze souboru all_databses.sql.

mysql --defaults-file=/etc/mysql/debian.cnf  

4 Nastavení replikace

Nyní nastavíme replikaci master-master v /etc/mysql/my.cnf. Klíčové možnosti konfigurace pro replikaci master-master jsou auto_increment_increment a auto_increment_offset:

  • auto_increment_increment řídí přírůstek mezi po sobě jdoucími hodnotami AUTO_INCREMENT.
  • auto_increment_offset určuje počáteční bod pro hodnoty sloupce AUTO_INCREMENT.

Předpokládejme, že máme N uzlů MySQL (v tomto příkladu N=2), pak auto_increment_increment má na všech uzlech hodnotu N a každý uzel musí mít jinou hodnotu pro auto_increment_offset (1, 2, ..., N).

Nyní nakonfigurujeme naše dva MySQL uzly:

server1:

nano /etc/mysql/my.cnf

Vyhledejte sekci začínající na [mysqld] a vložte do ní následující možnosti (komentujte všechny existující konfliktní možnosti):

[...][mysqld]
# Jedinečné ID serveru
ID serveru =1

# Nereplikovat následující databáze
binlog-ignore -db =mysql
replicate-ignore-db =mysql

# Posun automatického přírůstku
automatický přírůstek =2

# Nereplikovat SQL dotazy pro ID místního serveru
replicate-same-server-id =0

# Začátek automatického přírůstku s 1
automatický přírůstek-offset =1

# Smazat data binlogu po 10 dnech
expire_logs_days =10

# Maximální velikost binlogu
max_binlog_size =500 milionů

# Cesta k souboru Binlog
log_bin =/var/log/mysql/mysql-bin.log

[...]

Poté restartujte MySQL:

server1:

restart služby mysql

Nyní udělejte totéž na serveru2:

server2:

nano /etc/mysql/my.cnf
[...]

# Jedinečné ID serveru
ID serveru =2

# Nereplikovat následující databáze
binlog- ignore-db =mysql
replicate-ignore-db =mysql

# Posun automatického přírůstku
automatický přírůstek =2

# Ne replikovat dotazy SQL pro ID místního serveru
replikovat-stejný-server-id =0

# Začátek automatického přírůstku s 1
automatický přírůstek-offset =2
# Smazat data binlogu po 10 dnech
expire_logs_days =10

# Maximální velikost binlogu
max_binlog_size =500 milionů

# Cesta k souboru Binlog
log_bin =/var/log/mysql/mysql-bin.log

[...]

server2:

restart služby mysql

Dále zamkneme databázi exampledb na serveru1, zjistíme hlavní stav serveru1, vytvoříme SQL výpis databáze exampledb (který naimportujeme do exampledb na serveru2, aby obě databáze obsahovaly stejná data) a odemkneme databázi tak, aby lze znovu použít:

server2:

Nyní zahájíme replikaci na serveru 2. Otevřete shell MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

A spusťte následující příkaz SQL pro aktivaci replikace ze serveru1 na server2:

CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='secretpassword';

Nahraďte tajné heslo s heslem pro repl Uživatel MySQL, kterého jste nastavili v kapitole 2.

Nyní zkontrolujte stav slave spuštěním příkazu "show slave status\G" v prostředí MySQL.

zobrazit stav slave\G

Výstup bude podobný tomuto:

mysql> zobrazit stav otroka\G
**************************** 1. řádek ****** *********************
Slave_IO_State:
Master_Host:192.168.1.101
Master_User:repl
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos:107
Relay_Log_File:mysqld-relay-bin.000003
Relay_3Ma_2Log_Log_Relay_Log_Log :mysql-bin.000001
Slave_IO_Running:Ne
Slave_SQL_Running:Ne
Replicate_Do_DB:
Replicate_Ignore_DB:mysql
Replicate_Do_Table:
Replicate_Do_Table /Table :
Replicate_Wild_Ignore_Table:
Last_Errno:0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos:107
Relay_Log_Space:410 Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed:Ne
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_S /> Seco nds_Behind_Master:NULL
Master_SSL_Verify_Server_Cert:Ne
Last_IO_Errno:0
Last_IO_Error:
Last_SQL_Errno:0
Last_SQL_Error:
Replikovat_Ignorování_serveru /Ids:1 br />1 řádek v sadě (0,00 s)

Řádky, které byste měli zkontrolovat, jsou tyto:

Master_Host:192.168.1.101
Master_User:repl
Master_Port:3306
Master_Log_File:mysql-bin.000001
Relay_Log_File:mysqld.0000 Slave_IO_Running:Ne
Slave_SQL_Running:Ne

Nyní spusťte replikaci pomocí tohoto příkazu v prostředí MySQL:

start slave;

a poté znovu zkontrolujte stav slave:

zobrazit stav slave\G

Následující dva řádky by nyní měly zobrazovat „ano“:

Slave_IO_Running:Ano
Slave_SQL_Running:Ano
Seconds_Behind_Master:0

Pokud "Seconds_Behind_Master" není 0, počkejte několik sekund a znovu zkontrolujte stav. Toto pole ukazuje, zda jsou master a slave synchronizovány.

Pro další krok potřebujeme znát hodnoty "Master_Log_File" a "Read_Master_Log_Pos" příkazu "show slave status\G". V mém případě to jsou:

Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos:107

Zapište si hodnoty, které získáte na svém serveru, potřebujeme je pro další krok na serveru 1.

Poté můžete opustit prostředí MySQL:

ukončit

server1:

Pokračujeme na prvním serveru, otevřeme prostředí MySQL na serveru 1:

mysql --defaults-file=/etc/mysql/debian.cnf

A spusťte následující příkaz MySQL:

CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_USER='repl', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

Ve výše uvedeném příkazu musíte nahradit několik věcí:

  1. IP adresa musí být IP vašeho druhého serveru MySQL.
  2. Heslo "secretpassword" musí být to, které jste zvolili v kapitole 2 pro odpověď uživatele.
  3. MASTER_LOG_FILE a MASTER_LOG_POS musí být hodnoty, které jsme si zapsali v posledním kroku.

Nyní zkontrolujte pomocí:

zobrazit stav slave\G

na shell MySQL, pokud nejsou žádné chyby.

mysql> zobrazit stav otroka\G
**************************** 1. řádek ****** *********************
Slave_IO_State:
Master_Host:192.168.1.102
Master_User:repl
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos:107
Relay_Log_File:mysqld-relay-bin.000001>
Slave_IO_Running:Ne
Slave_SQL_Running:Ne
Replicate_Do_DB:
Replicate_Ignore_DB:mysql
Replicate_Do_Table:
Replicate_Do_Table /Table :
Replicate_Wild_Ignore_Table:
Last_Errno:0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos:107
Relay_Log_Space:107 /> Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed:Ne
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_S /> Za druhé s_Behind_Master:NULL
Master_SSL_Verify_Server_Cert:Ne
Last_IO_Errno:0
Last_IO_Error:
Last_SQL_Errno:0
Last_SQL_Error:
Server_Replicate_Ids:0 /Ignore_Ignore_0 br />1 řádek v sadě (0,00 s)

A spustit otroka.

start slave;

Znovu zkontrolujte stav slave:

zobrazit stav slave\G

Následující dva řádky by nyní měly zobrazovat „ano“:

Slave_IO_Running:Ano
Slave_SQL_Running:Ano

Poté můžete opustit prostředí MySQL:

ukončit

Pokud se nic nepokazilo, replikace MySQL master-master by nyní měla fungovat. Pokud ne, zkontrolujte prosím /var/log/syslog chyby MySQL na serveru1 a serveru2.

5 Otestujte replikaci

Nyní je čas otestovat naše nastavení replikace. Vytvořím databázi exampledb1 na serveru1 a poté zkontroluji na serveru2, zda byla databáze replikována na druhý server:

server1:

Přihlaste se do konzole MySQL na serveru1 a vytvořte databázi:

mysql --defaults-file=/etc/mysql/debian.cnf
CREATE DATABASE exampledb1;

server2

Nyní se přihlaste do konzole MySQL na serveru2 a zkontrolujte, zda tam nyní existuje exampledb1:

mysql --defaults-file=/etc/mysql/debian.cnf
zobrazit databáze;

Jak vidíme, nová databáze se zobrazuje také na serveru2.

mysql> zobrazit databáze;
+--------------------+
| Databáze |
+--------------------+
| informační_schéma |
| exampledb1 |
| mysql |
| performance_schema |
+-------------------+
4 řádky v sadě (0,00 s)

Dále otestuji, zda replikace funguje i v opačném směru. Stále jsme přihlášeni na server2 a vytváříme tam databázi exampledb2:

CREATE DATABASE exampledb2;

Nyní se vraťte na server1 a spusťte „show databases“ v konzole MySQL:

server1

zobrazit databáze;

Výsledek ukazuje naši novou databázi exampledb2, takže replikace funguje oběma směry.

mysql> zobrazit databáze;
+--------------------+
| Databáze |
+--------------------+
| informační_schéma |
| exampledb1 |
| exampledb2 |
| mysql |
| performance_schema |
+-------------------+
5 řádků v sadě (0,01 s)

  • MySQL:http://www.mysql.com
  • Debian:http://www.debian.org

Debian
  1. Jak nastavit replikaci MySQL Master-Master Replication

  2. Jak nastavit PostgreSQL Streaming Replication s replikačními sloty na Debianu 10

  3. Jak nainstalovat WebDAV s Lighttpd na Debian 8 (Jessie)

  1. Jak nakonfigurovat replikaci MySQL (MariaDB) Master-Slave na Debianu 10

  2. Instalace Lighttpd s podporou PHP5 a MySQL na Debian Etch

  3. Jak nainstalovat MySQL v5.7 pomocí apt-get na Debian 8 Jessie

  1. Instalace Lighttpd s podporou PHP5 a MySQL na Debian Lenny

  2. Virtuální hosting s vsftpd a MySQL na Debian Squeeze

  3. Použití ngx_pagespeed s nginx Na Debianu Jessie/testing