Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

MySQL replication master-slave — konfiguracja krok po kroku

Opublikowano: 9 kwietnia 2026 · Kategoria: Bazy danych

Twoja baza MySQL jest pojedynczym punktem awarii? Jeden pad serwera i cała aplikacja offline? Replication to pierwszy krok do High Availability. Master obsługuje zapisy, repliki automatycznie otrzymują wszystkie zmiany i mogą obsługiwać zapytania SELECT — odciążając master i zapewniając backup "na żywo".

Jak działa replication

MySQL replication opiera się na binary log — pliku zawierającym wszystkie zmiany danych (INSERT, UPDATE, DELETE, ALTER). Przepływ:

  • Master zapisuje każdą zmianę do mysql-bin.000001 (binary log)
  • Replika uruchamia dwa wątki: I/O thread pobiera binary log z mastera i zapisuje do lokalnego relay-bin
  • SQL thread czyta relay log i wykonuje zapytania na lokalnej bazie repliki
  • Dane na replice są identyczne jak na master (z małym opóźnieniem 0-2s)

Krok 1 — Konfiguracja mastera

Edytuj /etc/mysql/mysql.conf.d/mysqld.cnf na serwerze master:

[mysqld]
# Unikalny ID (musi być różny na master i każdej replice)
server-id = 1

# Włącz binary log
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW

# Retencja logów (7 dni)
binlog_expire_logs_seconds = 604800

# Opcjonalnie: tylko wybrane bazy do replikacji
# binlog_do_db = moja_baza

# Bind na LAN IP (nie localhost) — replika musi się połączyć
bind-address = 10.0.0.1
sudo systemctl restart mysql

# Utwórz użytkownika dla replikacji
mysql -u root -p
-- Na serwerze MASTER
CREATE USER 'replica_user'@'10.0.0.2' IDENTIFIED WITH mysql_native_password BY 'SilneHaslo2026!';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'10.0.0.2';
FLUSH PRIVILEGES;

-- Zablokuj tabele i zapisz pozycję binary log
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

-- Zanotuj File i Position, np.:
-- File: mysql-bin.000003 | Position: 157

Krok 2 — Dump danych

W drugim terminalu (master nadal zablokowany) zrób dump całej bazy i przenieś na replikę:

# Na master
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > dump.sql

# Prześlij na replikę
scp dump.sql [email protected]:/tmp/

# Wróć do MySQL na master i odblokuj
mysql -u root -p -e "UNLOCK TABLES;"

Krok 3 — Konfiguracja repliki

Na serwerze repliki edytuj /etc/mysql/mysql.conf.d/mysqld.cnf:

[mysqld]
# Inny server-id niż master
server-id = 2

# Relay log
relay_log = /var/log/mysql/mysql-relay-bin.log

# Tylko do odczytu — nikt nie zapisuje na replice ręcznie
read_only = ON
super_read_only = ON

# Opcjonalnie: włącz binary log żeby robić kaskadową replikację
log_bin = /var/log/mysql/mysql-bin.log
# Restart i import dumpu
sudo systemctl restart mysql
mysql -u root -p < /tmp/dump.sql

# Ustaw źródło replikacji
mysql -u root -p
-- Na REPLICE (MySQL 8.0+)
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='10.0.0.1',
  SOURCE_USER='replica_user',
  SOURCE_PASSWORD='SilneHaslo2026!',
  SOURCE_LOG_FILE='mysql-bin.000003',
  SOURCE_LOG_POS=157;

START REPLICA;
SHOW REPLICA STATUS\G

Monitoring replikacji

Kluczowe pola w SHOW REPLICA STATUS:

Pole Oczekiwana wartość Co sprawdzić
Replica_IO_Running Yes Jeśli No — sprawdź połączenie sieciowe, firewall, hasło
Replica_SQL_Running Yes Jeśli No — sprawdź Last_SQL_Error (zwykle konflikt danych)
Seconds_Behind_Source 0-2 Jeśli rośnie — replika nie nadąża (słaby CPU/dysk)
Last_Error (puste) Każdy błąd zatrzymuje SQL thread — wymaga interwencji

Typowe problemy

  • Duplicate entry błąd — ktoś zapisał na replice (brak read_only). Rozwiązanie: STOP REPLICA; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START REPLICA; lub reseed.
  • Replika za daleko w tyle — zbyt słaby sprzęt. Rozwiązanie: więcej RAM/CPU lub włącz parallel replication: replica_parallel_workers = 4.
  • Binary log się przepełnił — retencja za długa, dysk pełny. Skróć binlog_expire_logs_seconds lub ręcznie: PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;
  • Replika po restarcie nie startuje automatycznie — dodaj skip_replica_start = OFF w my.cnf.

Uwaga: Dla produkcji rozważ semi-synchronous replication (plugin rpl_semi_sync_source) lub MySQL Group Replication (MySQL 8.0+) dla prawdziwego HA z automatycznym failover.

Najczęstsze pytania

Co to jest MySQL replication i kiedy jej używać? +
MySQL replication to mechanizm kopiowania danych z jednego serwera (master/primary) na jeden lub więcej serwerów (replica/slave) w czasie rzeczywistym. Używasz jej gdy: chcesz mieć zapasowy serwer w razie awarii (HA), rozdzielić zapytania SELECT na wiele maszyn (read scaling), tworzyć backup bez obciążania master, albo mieć geograficznie rozproszone repliki dla niższego latency.
Jaka jest różnica między asynchronous i semi-synchronous replication? +
Asynchronous (domyślny): master zapisuje transakcję i od razu zwraca OK klientowi, replika dostaje ją z opóźnieniem. Szybki, ale w razie awarii mastera możesz stracić ostatnie transakcje. Semi-synchronous: master czeka aż przynajmniej jedna replika potwierdzi otrzymanie zmian przed zwróceniem OK. Bezpieczniejszy, ale wolniejszy (+2-10ms na transakcję). W praktyce: dla produkcji z krytycznymi danymi — semi-sync.
Czy replication zastępuje backup? +
NIE. Replication kopiuje wszystkie zmiany natychmiast — w tym błędy. Jeśli ktoś wykona DROP TABLE users na master, komenda natychmiast trafi na wszystkie repliki i dane znikną wszędzie. Replication zapewnia HA (wysoką dostępność), ale nadal potrzebujesz klasycznych backupów (mysqldump/xtrabackup) do odzyskiwania po błędach ludzkich lub atakach ransomware.
Jak sprawdzić czy replication działa poprawnie? +
Na replice: SHOW REPLICA STATUS\G (MySQL 8.0+) lub SHOW SLAVE STATUS\G (starsze). Sprawdź: Slave_IO_Running: Yes, Slave_SQL_Running: Yes, Seconds_Behind_Master: 0 lub niska wartość, Last_Error: pusty. Jeśli Seconds_Behind_Master rośnie — replika nie nadąża. Jeśli widzisz błąd — zatrzymaj replikację (STOP REPLICA) i zdiagnozuj przyczynę przed restartem.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.