MySQL Replication Kurulumu ve Yönetimi

Node.js ile MySQL Replication Kurulumu ve Yönetimi: Kapsamlı Rehber

Modern web uygulamalarında veri tabanı performansı ve yüksek erişilebilirlik (High Availability), projenin başarısı için kritik öneme sahiptir. Bu makalede, Node.js ekosisteminde çalışan uygulamalar için MySQL Replication kurulumunu, Master-Slave mimarisini ve Node.js katmanında okuma/yazma ayrımının (Read/Write Splitting) nasıl optimize edileceğini derinlemesine inceleyeceğiz.

Neden Replication? Tek bir veritabanı sunucusu hem yazma hem de okuma yükünü taşıdığında darboğaz oluşur. Replication ile yazma işlemlerini "Master" sunucuya, okuma yükünü ise bir veya birden fazla "Slave" sunucuya dağıtarak yatayda ölçekleme sağlarız.

1. MySQL Replication Mimarisi ve Türleri

MySQL replication, verilerin bir sunucudan (Source/Master) bir veya daha fazla sunucuya (Replica/Slave) otomatik olarak kopyalanması işlemidir. Node.js uygulamalarında genellikle şu iki model tercih edilir:

Model Açıklama Kullanım Durumu
Master-Slave Bir sunucu yazar, diğerleri sadece okur. En yaygın model, yüksek okuma yükü.
Master-Master Her iki sunucu da hem okur hem yazar. Karmaşık çakışma yönetimi gerektirir.
Group Replication Hata toleransı yüksek, senkronize yapı. Kritik finansal veriler ve sistemler.

2. Adım Adım MySQL Master-Slave Kurulumu

2.1. Master Sunucu Yapılandırması

Master sunucuda /etc/mysql/my.cnf (veya mysqld.cnf) dosyasını düzenleyerek binary log sistemini aktif etmemiz gerekir.

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_do_db = projeniz_db
bind-address = 0.0.0.0

Yapılandırma sonrası MySQL'i yeniden başlatın ve replication kullanıcısını oluşturun:

CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'guclu_sifre';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

-- Mevcut durumu not edin (File ve Position değerleri önemlidir)
SHOW MASTER STATUS;

2.2. Slave Sunucu Yapılandırması

Slave sunucuda server-id değerinin benzersiz olması şarttır.

[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log

Slave sunucuyu Master'a bağlamak için aşağıdaki komutu çalıştırın:

CHANGE MASTER TO
  MASTER_HOST='MASTER_IP_ADRESI',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='guclu_sifre',
  MASTER_LOG_FILE='mysql-bin.000001', -- Master Status'tan alınan dosya
  MASTER_LOG_POS=154;                 -- Master Status'tan alınan pozisyon

START SLAVE;
SHOW SLAVE STATUS\G;

3. Node.js Katmanında Read/Write Splitting Yönetimi

Node.js tarafında en büyük zorluk, hangi sorgunun Master'a (INSERT, UPDATE, DELETE) hangisinin Slave'e (SELECT) gideceğine karar vermektir. Bunu manuel olarak veya mysql2 kütüphanesi ile bir havuz (pool) yönetimi yaparak çözebiliriz.

3.1. Birden Fazla Bağlantı Havuzu Oluşturma

Profesyonel bir yaklaşım için yazma ve okuma işlemleri için ayrı havuzlar oluşturulmalıdır.

const mysql = require('mysql2');

// Yazma işlemleri için Master bağlantısı
const masterPool = mysql.createPool({
  host: 'master-ip',
  user: 'admin',
  password: 'password',
  database: 'projeniz_db',
  waitForConnections: true,
  connectionLimit: 10
});

// Okuma işlemleri için Slave bağlantısı
const slavePool = mysql.createPool({
  host: 'slave-ip',
  user: 'read_user',
  password: 'password',
  database: 'projeniz_db',
  waitForConnections: true,
  connectionLimit: 50 // Okuma yükü daha fazla olacağı için limit yüksek
});

module.exports = {
  query: (sql, params) => {
    const isWriteQuery = /^\s*(INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|ALTER)/i.test(sql);
    const pool = isWriteQuery ? masterPool : slavePool;
    return pool.promise().execute(sql, params);
  }
};
Deneyim Notu: "Read-after-write" tutarsızlığına dikkat edin. Bir veri yazıldıktan hemen sonra (milisaniyeler içinde) okunursa, replication gecikmesi (lag) nedeniyle Slave sunucuda henüz güncellenmemiş olabilir. Kritik okumalar için opsiyonel olarak Master kullanımı sağlanmalıdır.

4. İzleme ve Bakım (Monitoring)

Replication sisteminin sağlıklı çalışması için Seconds_Behind_Master parametresi düzenli olarak izlenmelidir. Eğer bu değer artıyorsa, Slave sunucu Master'a yetişemiyor demektir.

4.1. Node.js ile Sağlık Kontrolü (Health Check)

async function checkSlaveHealth() {
  try {
    const [rows] = await slavePool.promise().query('SHOW SLAVE STATUS');
    const lag = rows[0].Seconds_Behind_Master;
    
    if (lag > 30) {
      console.error(`Kritik Gecikme: ${lag} saniye!`);
      // Alarm mekanizmasını tetikle (Slack, Email vb.)
    }
  } catch (err) {
    console.error('Slave sunucuya erişilemiyor!');
  }
}

5. Best Practices (En İyi Uygulamalar)

  • GTID Kullanımı: Klasik dosya/pozisyon tabanlı replication yerine Global Transaction Identifiers (GTID) kullanın. Bu, failover (hata kurtarma) süreçlerini kolaylaştırır.
  • SSL Şifreleme: Eğer sunucular farklı veri merkezlerindeyse, replication trafiğini mutlaka SSL üzerinden şifreleyin.
  • Load Balancer: Birden fazla Slave sunucunuz varsa, Node.js tarafında bir Proxy (örneğin ProxySQL veya HAProxy) kullanarak yük dengeleme yapın.
  • ReadOnly Modu: Slave sunucuları her zaman read_only = 1 modunda çalıştırın ki yanlışlıkla Slave üzerinde veri değişikliği yapılmasın.

Sonuç olarak, Node.js ve MySQL replication kombinasyonu, yüksek trafikli uygulamalar için mükemmel bir temel sunar. Doğru yapılandırılmış bir mimari ile sisteminizin yanıt sürelerini düşürebilir ve veri güvenliğini artırabilirsiniz.