DA
Tüm yazılara dön
PostgreSQL ile Yüksek Erişilebilirlik: pgpool ve Streaming Replication Rehberi

PostgreSQL ile Yüksek Erişilebilirlik: pgpool ve Streaming Replication Rehberi

PostgreSQLpgpoolDockerHigh AvailabilityDatabaseFailoverReplication

PostgreSQL ile Yüksek Erişilebilirlik: pgpool ve Streaming Replication Rehberi

Modern uygulamalarda veritabanı kesintileri ciddi sorunlara yol açabilir. Bu yazıda PostgreSQL için pgpool kullanarak yüksek erişilebilirlik (high availability) ve otomatik failover nasıl kuracağınızı öğreneceksiniz.

Neden Yüksek Erişilebilirlik?

Veritabanı kesintileri:

  • Mali kayıplara neden olur
  • Kullanıcı deneyimini olumsuz etkiler
  • Marka güvenilirliğini sarsabilir
  • Veri kaybı riskini artırır

pgpool Nedir?

pgpool-II, PostgreSQL için geliştirilmiş bir middleware'dir ve şu özellikleri sunar:

Temel Özellikler

  • Connection Pooling: Bağlantı havuzu yönetimi
  • Load Balancing: Okuma işlemlerini slave sunuculara dağıtma
  • Automatic Failover: Otomatik başarısızlık kurtarma
  • Health Checking: Sunucu sağlık kontrolü
  • Query Routing: Sorgu yönlendirme

Sistem Mimarisi

Kurulumumuz üç temel bileşenden oluşur:

┌─────────────────┐    ┌─────────────────┐
│   pgpool        │    │   Primary DB    │
│   (Router)      │◄───┤   (Master)      │
│   Port: 5432    │    │   Port: 5432    │
└─────────────────┘    └─────────────────┘
         │                       │
         │                       │ Streaming
         │                       │ Replication
         │               ┌─────────────────┐
         └───────────────┤  Secondary DB   │
                         │   (Slave)       │
                         │   Port: 5432    │
                         └─────────────────┘

Adım 1: Primary PostgreSQL Sunucusu

İlk olarak ana (primary) PostgreSQL sunucusunu kuralım:

# primary-server.yml
services:
  pg-0:
    image: bitnami/postgresql-repmgr:14
    ports:
      - 5432:5432
    expose:
      - 5432
    environment:
      # PostgreSQL temel ayarları
      - POSTGRESQL_POSTGRES_PASSWORD=adminpassword
      - POSTGRESQL_USERNAME=customuser
      - POSTGRESQL_PASSWORD=custompassword
      - POSTGRESQL_DATABASE=customdatabase

      # Repmgr (Replication Manager) ayarları
      - REPMGR_PASSWORD=repmgrpassword
      - REPMGR_PRIMARY_HOST=primary_server_ip
      - REPMGR_PARTNER_NODES=primary_server_ip,secondary_server_ip
      - REPMGR_NODE_NAME=pg-0
      - REPMGR_NODE_NETWORK_NAME=primary_server_ip

Önemli Notlar:

  • primary_server_ip ve secondary_server_ip değerlerini gerçek IP adresleriyle değiştirin
  • REPMGR_NODE_NAME: Benzersiz node ismi
  • REPMGR_PRIMARY_HOST: Ana sunucu IP adresi

Adım 2: Secondary PostgreSQL Sunucusu

İkincil (secondary) sunucu primary'den veri replike eder:

# secondary-server.yml
services:
  pg-1:
    image: bitnami/postgresql-repmgr:14
    ports:
      - 5432:5432
    expose:
      - 5432
    environment:
      # Aynı veritabanı bilgileri
      - POSTGRESQL_POSTGRES_PASSWORD=adminpassword
      - POSTGRESQL_USERNAME=customuser
      - POSTGRESQL_PASSWORD=custompassword
      - POSTGRESQL_DATABASE=customdatabase

      # Repmgr ayarları
      - REPMGR_PASSWORD=repmgrpassword
      - REPMGR_PRIMARY_HOST=primary_server_ip
      - REPMGR_PARTNER_NODES=primary_server_ip,secondary_server_ip
      - REPMGR_NODE_NAME=pg-1
      - REPMGR_NODE_NETWORK_NAME=secondary_server_ip

Adım 3: pgpool Router Sunucusu

pgpool, uygulamalarınız ile veritabanı arasında proxy görevi görür:

# pgpool-router-server.yml
services:
  pgpool:
    image: bitnami/pgpool:4
    ports:
      - 5432:5432
    environment:
      # Backend sunucular
      - PGPOOL_BACKEND_NODES=0:primary_server_ip:5432,1:secondary_server_ip:5432

      # Streaming replication kontrolü
      - PGPOOL_SR_CHECK_USER=customuser
      - PGPOOL_SR_CHECK_PASSWORD=custompassword

      # PostgreSQL bağlantı bilgileri
      - PGPOOL_POSTGRES_USERNAME=postgres
      - PGPOOL_POSTGRES_PASSWORD=adminpassword

      # pgpool admin ayarları
      - PGPOOL_ADMIN_USERNAME=admin
      - PGPOOL_ADMIN_PASSWORD=adminpassword

      # Load balancing kapalı (sadece failover)
      - PGPOOL_ENABLE_STATEMENT_LOAD_BALANCING=no
      - PGPOOL_ENABLE_LOAD_BALANCING=no

      # LDAP devre dışı
      - PGPOOL_ENABLE_LDAP=no

    healthcheck:
      test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
      interval: 10s
      timeout: 5s
      retries: 5

Kurulum ve Çalıştırma

1. Sunucuları Sırayla Başlatın

# 1. Primary sunucuyu başlat
docker-compose -f primary-server.yml up -d

# 2. Secondary sunucuyu başlat (primary'den replikasyon başlar)
docker-compose -f secondary-server.yml up -d

# 3. pgpool router'ı başlat
docker-compose -f pgpool-router-server.yml up -d

2. Durum Kontrolü

# pgpool durumunu kontrol et
docker-compose -f pgpool-router-server.yml logs

# Replication durumunu kontrol et
docker exec -it primary_container_name psql -U postgres -c "SELECT * FROM pg_stat_replication;"

Failover Testi

Sisteminizin failover mekanizmasını test edin:

1. Primary Sunucuyu Durdur

docker-compose -f primary-server.yml down

2. pgpool Loglarını İzle

docker-compose -f pgpool-router-server.yml logs -f

3. Bağlantıyı Test Et

# pgpool üzerinden bağlan
psql -h pgpool_server_ip -p 5432 -U customuser -d customdatabase

Güvenlik Önerileri

1. Şifre Güvenliği

# Güçlü şifreler kullanın
- POSTGRESQL_POSTGRES_PASSWORD=ComplexP@ssw0rd123!
- REPMGR_PASSWORD=RepmgrSecur3P@ss!

2. Network Güvenliği

# Docker network kullanın
networks:
  postgres_network:
    driver: bridge

3. SSL Bağlantı

environment:
  - POSTGRESQL_ENABLE_TLS=yes
  - POSTGRESQL_TLS_CERT_FILE=/path/to/cert.pem
  - POSTGRESQL_TLS_KEY_FILE=/path/to/key.pem

Monitoring ve İzleme

1. pgpool Status

# pgpool durum kontrolü
docker exec pgpool_container show pool_nodes

2. Replication Lag

-- Replication gecikmesi
SELECT
    client_addr,
    state,
    sent_lsn,
    write_lsn,
    flush_lsn,
    replay_lsn,
    write_lag,
    flush_lag,
    replay_lag
FROM pg_stat_replication;

3. Health Check Script

#!/bin/bash
# health-check.sh

# pgpool health check
if docker exec pgpool_container /opt/bitnami/scripts/pgpool/healthcheck.sh; then
    echo "pgpool: OK"
else
    echo "pgpool: FAILED"
    # Alert gönder
fi

# PostgreSQL replication check
LAG=$(docker exec primary_container psql -U postgres -t -c "SELECT COALESCE(EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp())), 0);")

if (( $(echo "$LAG < 5" | bc -l) )); then
    echo "Replication lag: OK ($LAG seconds)"
else
    echo "Replication lag: WARNING ($LAG seconds)"
    # Alert gönder
fi

Performans Optimizasyonu

1. Connection Pooling

# pgpool ayarları
- PGPOOL_NUM_INIT_CHILDREN=32
- PGPOOL_MAX_POOL=4
- PGPOOL_CHILD_LIFE_TIME=300

2. PostgreSQL Ayarları

# PostgreSQL performans ayarları
- POSTGRESQL_SHARED_BUFFERS=256MB
- POSTGRESQL_EFFECTIVE_CACHE_SIZE=1GB
- POSTGRESQL_MAINTENANCE_WORK_MEM=64MB
- POSTGRESQL_CHECKPOINT_COMPLETION_TARGET=0.9

Backup Stratejisi

1. Otomatik Backup

#!/bin/bash
# backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups"

# Full backup
docker exec primary_container pg_dump -U postgres customdatabase > $BACKUP_DIR/backup_$DATE.sql

# Retention (7 gün)
find $BACKUP_DIR -name "backup_*.sql" -mtime +7 -delete

2. Point-in-Time Recovery

# WAL archiving aktif et
environment:
  - POSTGRESQL_WAL_LEVEL=replica
  - POSTGRESQL_ARCHIVE_MODE=on
  - POSTGRESQL_ARCHIVE_COMMAND='cp %p /archive/%f'

Sorun Giderme

1. Bağlantı Sorunları

# Network kontrolü
docker network ls
docker network inspect network_name

# Port kontrolü
netstat -tlnp | grep 5432

2. Replication Sorunları

-- Replication slot kontrolü
SELECT slot_name, active, restart_lsn FROM pg_replication_slots;

-- WAL status
SELECT pg_current_wal_lsn(), pg_last_wal_replay_lsn();

3. pgpool Sorunları

# pgpool logları
docker logs pgpool_container

# Backend status
docker exec pgpool_container pcp_node_info -h localhost -p 9898 -U admin 0

Sonuç

PostgreSQL ile pgpool kullanarak yüksek erişilebilirlik kurmak:

Avantajlar

Otomatik failover
Sıfır downtime hedefi
Veri koruma
Ölçeklenebilirlik

Dikkat Edilecekler

⚠️ Network latency
⚠️ Split-brain senaryoları
⚠️ Backup stratejisi
⚠️ Monitoring gerekliliği

Bu rehberle PostgreSQL veritabanınız için robust bir yüksek erişilebilirlik çözümü kurabilirsiniz. Unutmayın ki production ortamında mutlaka test etmeli ve monitoring sistemleri kurmalısınız.

İlgili Kaynaklar


Bu yazı PostgreSQL ve pgpool konularında tecrübelerime dayanmaktadır. Sorularınız için iletişim sayfasından ulaşabilirsiniz.