PostgreSQL ile Yüksek Erişilebilirlik: pgpool ve Streaming Replication Rehberi
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
vesecondary_server_ip
değerlerini gerçek IP adresleriyle değiştirinREPMGR_NODE_NAME
: Benzersiz node ismiREPMGR_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
- PostgreSQL Replication Documentation
- pgpool-II Official Documentation
- Bitnami PostgreSQL Docker Images
- Database Performans Optimizasyonu Rehberi
Bu yazı PostgreSQL ve pgpool konularında tecrübelerime dayanmaktadır. Sorularınız için iletişim sayfasından ulaşabilirsiniz.