MySQL Replikasyon

Master-slave replikasyon, GTID ve yüksek erişilebilirlik

Kubedo Academy’e hoş geldiniz! Bu laboratuvarda MySQL replikasyon, GTID ve yüksek erişilebilirlik konularını öğreneceksiniz.


Zorluk seviyesi: İleri
Süre: Yaklaşık 60 dakika


1. Replikasyon Nedir?

Replikasyon, verilerin bir MySQL sunucusundan (master/source) diğerlerine (slave/replica) kopyalanması işlemidir.

Neden Replikasyon?

AmaçAçıklama
YedeklilikMaster arızasında slave devralır
Okuma ÖlçeklemeRead query’leri slave’lere dağıtma
YedeklemeSlave’den backup alarak master’ı etkilememe
AnalitikRaporlama için ayrı sunucu
Coğrafi DağıtımKullanıcılara yakın sunucular

Replikasyon Türleri

TürAçıklama
AsenkronMaster beklemez (varsayılan)
Yarı-senkronEn az bir slave onaylar
SenkronTüm slave’ler onaylar (Group Replication)

2. Replikasyon Mimarisi

Master-Slave (Source-Replica)

  [Master]
     |
     ├── [Slave 1] (read replica)
     ├── [Slave 2] (backup)
     └── [Slave 3] (analytics)

Master-Master

  [Master 1] ←→ [Master 2]

[!CAUTION] Master-Master yapılandırması conflict riski taşır. Aynı veriyi aynı anda güncellemeyin!

Chain Replication

  [Master] → [Slave 1] → [Slave 2]

3. Binary Log Formatları

Format Türleri

FormatAçıklamaAvantaj/Dezavantaj
STATEMENTSQL ifadelerini loglarKüçük log, non-deterministic sorun
ROWSatır değişikliklerini loglarBüyük log, güvenilir
MIXEDOtomatik seçimDengeli

Yapılandırma

[mysqld]
binlog_format = ROW

[!TIP] Production ortamda ROW format önerilir. STATEMENT ile non-deterministic fonksiyonlar (NOW(), RAND()) sorun çıkarabilir.


4. Geleneksel Replikasyon Kurulumu

Master Yapılandırması

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
binlog_do_db = kubedo

Replikasyon Kullanıcısı Oluşturma (Master)

CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplicaPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

Master Durumunu Alma

Terminal
$ SHOW MASTER STATUS;

Çıktı:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154      | kubedo       |                  |
+------------------+----------+--------------+------------------+

Slave Yapılandırması

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 2
relay_log = /var/log/mysql/relay-bin
read_only = ON

Slave’i Master’a Bağlama

CHANGE MASTER TO
    MASTER_HOST = '192.168.1.10',
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'ReplicaPass123!',
    MASTER_LOG_FILE = 'mysql-bin.000001',
    MASTER_LOG_POS = 154;

Replikasyonu Başlatma

Terminal
$ START SLAVE;
SHOW SLAVE STATUS\G

5. GTID Replikasyon

GTID (Global Transaction Identifier), her transaction’a benzersiz bir ID atar.

GTID Avantajları

  • Log file ve position takibine gerek yok
  • Failover daha kolay
  • Otomatik pozisyon bulma

GTID Formatı

server_uuid:transaction_id

Örnek: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23

GTID Yapılandırması (Master ve Slave)

[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON

GTID ile Slave Kurulumu

CHANGE MASTER TO
    MASTER_HOST = '192.168.1.10',
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'ReplicaPass123!',
    MASTER_AUTO_POSITION = 1;

START SLAVE;

GTID Durumu

Terminal
$ SHOW MASTER STATUS;
SHOW SLAVE STATUS\G
SELECT @@GLOBAL.GTID_EXECUTED;

6. Replikasyon İzleme

Slave Durumu Kontrolü

SHOW SLAVE STATUS\G

Önemli alanlar:

AlanDeğerAçıklama
Slave_IO_RunningYesIO thread durumu
Slave_SQL_RunningYesSQL thread durumu
Seconds_Behind_Master0Gecikme (lag)
Last_Error-Son hata mesajı

Replikasyon Lag İzleme

-- Slave'de
SHOW SLAVE STATUS\G

-- Seconds_Behind_Master değerini kontrol et

Performans Schema ile İzleme

SELECT * FROM performance_schema.replication_connection_status;
SELECT * FROM performance_schema.replication_applier_status;

7. Replikasyon Sorun Giderme

Yaygın Sorunlar

SorunBelirtiÇözüm
Duplicate keySQL thread dururSKIP veya veri düzeltme
Missing tableSQL thread dururTabloyu yeniden oluştur
NetworkIO thread dururBağlantıyı kontrol et
LagSeconds_Behind_Master yüksekSlave kapasitesini artır

Hata Atlama

-- Tek transaction atla
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

-- GTID ile atla
SET GTID_NEXT = '3E11FA47-71CA-11E1-9E33-C80AA9429562:23';
BEGIN; COMMIT;
SET GTID_NEXT = AUTOMATIC;
START SLAVE;

Replikasyonu Sıfırlama

STOP SLAVE;
RESET SLAVE ALL;
-- Yeniden yapılandır
CHANGE MASTER TO ...;
START SLAVE;

8. Yüksek Erişilebilirlik

Failover Stratejileri

StratejiAçıklama
ManuelDBA müdahalesi
OtomatikOrchestrator, MHA, ProxySQL
Group ReplicationMySQL native çözüm

MySQL Group Replication

  [Primary] ←→ [Secondary 1] ←→ [Secondary 2]
     ↑______________↓_______________↓
            (consensus)

InnoDB Cluster

MySQL InnoDB Cluster bileşenleri:

  1. Group Replication: Veri replikasyonu
  2. MySQL Router: Uygulama yönlendirme
  3. MySQL Shell: Yönetim aracı

ProxySQL ile Yük Dağıtımı

  [Application]
       |
  [ProxySQL]
     / | \
[M] [S1] [S2]

ProxySQL özellikleri:

  • Read/Write splitting
  • Query routing
  • Connection pooling
  • Query caching

9. Backup ve Replikasyon

Slave’den Backup Alma

# Slave SQL thread'i durdur
mysql -e "STOP SLAVE SQL_THREAD"

# Backup al
mysqldump -u root -p --single-transaction kubedo > backup.sql

# Slave'i devam ettir
mysql -e "START SLAVE SQL_THREAD"

[!TIP] Production master’dan değil, slave’den backup almak master performansını etkilemez.


10. Best Practices

Genel Öneriler

  1. GTID kullanın - Failover’ı kolaylaştırır
  2. ROW format - Güvenilir replikasyon
  3. read_only - Slave’lerde yazma engelleme
  4. Monitoring - Lag ve hataları izleyin
  5. Semi-sync - Kritik veriler için

Güvenlik

-- Slave'de
SET GLOBAL super_read_only = ON;

-- Master'da replikasyon kullanıcısı için IP kısıtlaması
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY '...';

Konu Tekrarı - Kısa Sınav


Sonraki Adımlar

Bu eğitimle MySQL replikasyon temellerini öğrendiniz. İleri konular için:

  • MySQL InnoDB Cluster: Tam entegre HA çözümü
  • Percona XtraDB Cluster: Galera tabanlı çoklu master
  • ProxySQL: Query routing ve load balancing
  • Orchestrator: Otomatik failover yönetimi