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):

sql
MySQL 8.0
-- 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:

sql
MySQL 8.0
-- 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';
Dikkat

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:

sql
MySQL 8.0
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:

sql
MySQL 8.0
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.