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.
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);
}
};
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 = 1modunda ç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.