Elinde iki ayrı MySQL kaynağı var — diyelim biri sipariş, biri kullanıcı servisi — ve ikisini de tek bir replica'da birleştirmek istiyorsun: raporlama, yedek ya da merkezi analiz için. MySQL 8.0'ın multi-source replication'ı tam bunu yapar: bir replica, her biri kendi kanalından (channel) beslenen birden çok kaynağı aynı anda takip eder.
Kanal (channel) nedir?
Klasik replikasyonda bir replica'nın tek bir kaynağı vardır. Multi-source'ta her kaynak-replica ilişkisi isimlendirilmiş bir kanaldır; replica her kanalı bağımsız yönetir (ayrı I/O ve SQL thread'i, ayrı relay log). Böylece kaynak1 ve kaynak2 çakışmadan, paralel akar.
Ön koşullar (8.0'da varsayılan olarak hazır ama doğrula):
-- Her kaynak ve replica FARKLI server_id kullanmalı
SELECT @@server_id;
-- 8.0'da kaynak/relay bilgisi tabloda tutulur (varsayılan) — dosya değil
SELECT @@master_info_repository, @@relay_log_info_repository; -- TABLE beklenir
Kurulum: kanal başına CHANGE REPLICATION SOURCE
Replica üzerinde her kaynak için ayrı kanal tanımla. GTID kullanmak konumları kendin takip etmekten çok daha güvenlidir:
-- Kanal 1: sipariş kaynağı
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.0.0.11', SOURCE_USER='repl', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION=1
FOR CHANNEL 'siparis';
-- Kanal 2: kullanıcı kaynağı
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.0.0.12', SOURCE_USER='repl', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION=1
FOR CHANNEL 'kullanici';
START REPLICA FOR CHANNEL 'siparis';
START REPLICA FOR CHANNEL 'kullanici';
En sık yapılan hata: iki kaynağın aynı veritabanına yazması. Multi-source, multi-master değildir — çakışma çözümü yoktur. İki kanal aynı tabloya yazarsa, aynı birincil anahtar iki kaynaktan gelince replica'da Duplicate entry ile SQL thread durur. Kural: her kaynak ayrık şemalara yazsın. Zorundaysan kanal başına replikasyon filtresiyle sınırla (CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('siparis.%') FOR CHANNEL 'siparis';).
İzleme: her kanalı ayrı gör
SHOW REPLICA STATUS artık kanal başına satır döndürür; ama okunası hali performance_schema'dadır:
SELECT CHANNEL_NAME, SERVICE_STATE
FROM performance_schema.replication_connection_status;
-- Gecikme ve uygulanan işlem için:
SELECT CHANNEL_NAME, SERVICE_STATE, COUNT_TRANSACTIONS_RETRIES
FROM performance_schema.replication_applier_status_by_worker;
Tek bir kanalı durdurup başlatmak diğerlerini etkilemez:
STOP REPLICA FOR CHANNEL 'kullanici';
-- bakım...
START REPLICA FOR CHANNEL 'kullanici';
Sürüm notu: SOURCE mu MASTER mı?
MySQL 8.0.22'den itibaren sözdizimi CHANGE REPLICATION SOURCE TO, START REPLICA, SHOW REPLICA STATUS oldu; eski CHANGE MASTER TO / START SLAVE hâlâ çalışır ama artık deprecated. 8.0.22 öncesi bir sürümdeysen eski anahtar kelimeleri kullan; script'lerini yükseltmeden önce sürümünü kontrol et.
Hızlı karar tablosu
| İhtiyaç | Multi-source uygun mu? |
|---|---|
| Çok kaynağı tek yerde raporlamak | Evet — birincil kullanım |
| Kaynaklar ayrık şemalara yazıyor | Evet |
| Aynı tabloya iki yönlü yazım | Hayır — bu multi-master/çakışma çözümü ister (Group Replication'a bak) |
| Kanal başına bağımsız bakım | Evet — FOR CHANNEL ile |
Özet
Multi-source replication, dağınık MySQL kaynaklarını tek bir replica'da toplamanın standart yoludur: her kaynak kendi kanalında, GTID ile, bağımsız izlenir ve durdurulur. Tek gerçek tehlike, kaynakları aynı şemaya yazdırmaktır — o zaman replikasyon çakışmayla durur. Kaynakları ayrık tut, kanal başına filtre koy, performance_schema'dan gecikmeyi izle. Kurmadan önce test ortamında iki kaynağı da aynı anda başlatıp Duplicate entry çıkmadığını gör.