Node.js tek thread''de çalışır; tek process ile tek CPU çekirdeğinden faydalanabilirsiniz. 8 çekirdekli bir sunucuda kaynağın %87''si kullanılmadan kalır. Cluster mode ve PM2 ile hem tüm çekirdekleri kullanır hem de zero-downtime deploy yaparsınız. Bu rehber üretim kurulumunun her adımını anlatır.

Cluster Mode Nedir?

İlgili rehberler: Yazılım geliştirme süreçleri · PostgreSQL optimizasyonu · Git ileri seviye komutlar · Redis nedir, nasıl kullanılır · Docker ile deploy

Node.js''in cluster modülü master process altında birden fazla worker açar. Worker''lar aynı port''u paylaşır; OS kernel gelen bağlantıları worker''lar arasında dağıtır. 8 core sunucu = 8 worker = ~8x throughput.

PM2 Kurulumu ve Temel Kullanım

# Global kurulum
npm i -g pm2

# Tek komutla cluster başlat
pm2 start server.js -i max --name myapp
# -i max = tüm core''larda worker

# Durum
pm2 list
pm2 monit      # canlı dashboard
pm2 logs myapp --lines 100
pm2 describe myapp

# Yönetim
pm2 restart myapp
pm2 reload myapp    # zero-downtime — worker''ları tek tek yenile
pm2 stop myapp
pm2 delete myapp

ecosystem.config.js

Production için inline komut yerine config dosyası kullanın. Tüm ayarlar version control''de.

// ecosystem.config.js
module.exports = {
    apps: [{
        name: 'keydal',
        script: './server.js',
        instances: 'max',       // tüm çekirdekler
        exec_mode: 'cluster',

        // Memory limit aşılırsa restart
        max_memory_restart: '512M',

        // Env
        env: {
            NODE_ENV: 'development',
            PORT: 3000
        },
        env_production: {
            NODE_ENV: 'production',
            PORT: 3000
        },

        // Log
        out_file: '/var/log/keydal/out.log',
        error_file: '/var/log/keydal/error.log',
        log_date_format: 'YYYY-MM-DD HH:mm:ss',
        merge_logs: true,

        // Restart davranışı
        autorestart: true,
        watch: false,
        max_restarts: 10,
        min_uptime: '10s',

        // Graceful shutdown
        kill_timeout: 5000,
        listen_timeout: 3000,
        wait_ready: true
    }]
};
# Production başlat
pm2 start ecosystem.config.js --env production

# Boot''ta otomatik başlat
pm2 startup
pm2 save

Zero-Downtime Deploy

pm2 reload: worker''lar tek tek sırayla yenilenir. Yeni worker hazır olunca eskisi kill edilir; kullanıcı kesinti hissetmez. restart''tan farklı — o tüm worker''ları aynı anda keser.

// server.js — graceful shutdown için
const server = app.listen(PORT, () => {
    console.log(`Server started on ${PORT}`);
    if (process.send) process.send('ready');  // PM2'ye hazır sinyali
});

process.on('SIGINT', gracefulShutdown);
process.on('SIGTERM', gracefulShutdown);

function gracefulShutdown() {
    console.log('Shutting down gracefully...');
    server.close(() => {
        console.log('HTTP server closed');
        db.pool.end(() => process.exit(0));
    });
    // Zorla 10 saniye sonra çık
    setTimeout(() => process.exit(1), 10000);
}
Bilgi
wait_ready: true + process.send(''ready'') kombinasyonu PM2''ye worker''ın tamamen hazır olduğunu bildirir. Bu sinyal gelmeden eskisi kill edilmez.

Log Yönetimi

# Log rotation ekle (aksi halde log dosyaları şişer)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'

Monitoring

  • pm2 monit — lokal dashboard
  • PM2 Plus — cloud dashboard, ücretsiz plan var
  • Prometheus export — pm2-prom-module
  • OpenTelemetry — Datadog, New Relic entegrasyonu

Memory Leak Tespiti

# Heap snapshot al
pm2 restart myapp --node-args='--inspect'
# Chrome DevTools → chrome://inspect → Memory tab

# veya clinic
npm i -g clinic
clinic doctor -- node server.js
# 30 saniye trafik ver, sonra Ctrl+C
# tarayıcıda HTML raporu açılır

Cluster vs Docker/Kubernetes

Kubernetes ortamında PM2 cluster mode genellikle gereksizdir — K8s her pod''u tek process olarak çalıştırıp horizontal pod autoscaler ile ölçekler. PM2 cluster, tek VPS/dedicated sunucuda anlamlıdır.

Uyarı
K8s içinde PM2 kullanacaksan fork mode ile tek worker yap, ölçeklemeyi K8s''e bırak. Cluster mode memory''de 2 kat fazla yer kaplar.

Deploy Workflow

# Tipik deploy script
#!/bin/bash
set -e
BRANCH=${1:-main}

cd /var/www/myapp
git fetch origin
git checkout $BRANCH
git pull origin $BRANCH
npm ci --production
npm run build  # varsa
pm2 reload ecosystem.config.js --env production
pm2 save
echo "Deploy done."

Modern Yazılım Geliştirme ve DevOps Pratikleri

Profesyonel yazılım geliştirme süreci üç pillar üzerine kuruludur: kaynak kontrolü (Git + GitHub/GitLab pull request akışı, code review zorunlu), CI/CD pipeline (otomatik test + lint + build + deploy), ve gözlemlenebilirlik (Sentry/Datadog/Grafana ile log, metric, trace toplama). Test piramidi (unit > integration > e2e) ile kod kalitesini garantilemek, mikroservis mimarisinde Docker container ve Kubernetes orkestrasyonu kullanmak, REST veya GraphQL API tasarımında OpenAPI/GraphQL Schema sözleşmesi tutmak modern standardlardır. Yazılım geliştirme yaşam döngüsü boyunca (gereksinim → tasarım → implementasyon → test → deploy → bakım) Agile/Scrum sprintleri 1-2 hafta, DevOps takımları sürekli teslim (continuous delivery) prensibiyle çalışır.

Node.js production deploy

PM2, Docker ve Kubernetes ortamlarında Node.js production kurulumu için iletişime geçin

WhatsApp