Azure Database for PostgreSQL Kurulumu ve Yapılandırması
Bulut altyapısına geçiş yapan ekiplerin en çok takıldığı noktalardan biri veritabanı yönetimidir. On-premise ortamda her şeyi kendiniz yapıyordunuz: kurulum, patch yönetimi, yedekleme, replikasyon. Azure Database for PostgreSQL ile bu yükün büyük kısmını Microsoft’a devrediyorsunuz ama bu, hiçbir şey yapmanıza gerek kalmadığı anlamına gelmiyor. Doğru yapılandırma, güvenlik ayarları ve performans optimizasyonu hala sizin sorumluluğunuzda. Bu yazıda sıfırdan başlayarak production ortamına hazır bir Azure PostgreSQL kurulumu yapacağız.
Azure Database for PostgreSQL Nedir ve Hangi Modu Seçmeliyim?
Azure, PostgreSQL için iki farklı deployment modu sunuyor:
- Flexible Server: Yeni nesil, önerilen seçenek. Daha fazla kontrol, daha iyi maliyet optimizasyonu, VNet entegrasyonu ve özelleştirilebilir bakım pencereleri sunuyor.
- Single Server: Eski nesil, Microsoft artık bu modu retirement sürecine soktu. Yeni kurulumlar için kesinlikle tercih etmeyin.
Bu yazıda Flexible Server üzerinden gideceğiz. Eğer hala Single Server kullanıyorsanız, migration planınızı yapmaya başlamanın tam zamanı.
Ön Gereksinimler
Başlamadan önce şunların hazır olması gerekiyor:
- Aktif bir Azure aboneliği
- Azure CLI (2.40.0 veya üzeri)
- Uygun kaynak grubu ve lokasyon kararı
- VNet planlaması (production için şart)
Azure CLI kurulumunu teyit edelim:
az --version
az login
az account show
Eğer birden fazla subscription’ınız varsa doğru olanı seçin:
az account list --output table
az account set --subscription "YOUR-SUBSCRIPTION-ID"
Resource Group ve Network Altyapısı Hazırlama
Production ortamı için önce network altyapısını kuruyoruz. Veritabanınızı public internet’e açmak yerine her zaman private VNet içinde konumlandırın.
# Resource group oluştur
az group create
--name rg-postgresql-prod
--location westeurope
--tags Environment=Production Project=WebApp Owner=SysAdmin
# VNet oluştur
az network vnet create
--resource-group rg-postgresql-prod
--name vnet-prod
--address-prefix 10.0.0.0/16
--location westeurope
# PostgreSQL için dedicated subnet
az network vnet subnet create
--resource-group rg-postgresql-prod
--vnet-name vnet-prod
--name snet-postgresql
--address-prefix 10.0.1.0/24
Private DNS zone oluşturmak da şart. Flexible Server, VNet entegrasyonu için bunu zorunlu kılıyor:
# Private DNS zone oluştur
az network private-dns zone create
--resource-group rg-postgresql-prod
--name "prod-postgres.private.postgres.database.azure.com"
# DNS zone'u VNet'e bağla
az network private-dns link vnet create
--resource-group rg-postgresql-prod
--zone-name "prod-postgres.private.postgres.database.azure.com"
--name dns-link-prod
--virtual-network vnet-prod
--registration-enabled false
Azure Database for PostgreSQL Flexible Server Kurulumu
Altyapı hazır, şimdi asıl sunucuyu oluşturalım. Buradaki parametreler production senaryosu için optimize edilmiş:
az postgres flexible-server create
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--location westeurope
--admin-user pgadmin
--admin-password "Str0ng@Pass#2024!"
--sku-name Standard_D4s_v3
--tier GeneralPurpose
--storage-size 128
--version 16
--high-availability Enabled
--zone 1
--standby-zone 2
--vnet vnet-prod
--subnet snet-postgresql
--private-dns-zone "prod-postgres.private.postgres.database.azure.com"
--backup-retention 35
--geo-redundant-backup Enabled
--tags Environment=Production Project=WebApp
Bu komuttaki kritik parametreleri açıklayalım:
- –sku-name Standard_D4s_v3: 4 vCore, 16 GB RAM. Workload’a göre ayarlayın.
- –tier GeneralPurpose: Çoğu production workload için uygun. Kritik sistemler için MemoryOptimized düşünebilirsiniz.
- –high-availability Enabled: Zone-redundant HA aktif. Bu olmadan production ortamı olmaz.
- –backup-retention 35: Maksimum 35 gün backup saklama. Compliance gereksinimlerinize göre ayarlayın.
- –geo-redundant-backup Enabled: Farklı region’a backup replikasyonu.
Komut çalışması birkaç dakika alabilir. Tamamlandığında sunucu bilgilerini görüntüleyin:
az postgres flexible-server show
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--output json
Güvenlik Yapılandırması
Sunucu ayakta, ama güvenlik ayarlarına geçmeden production’a almayın. SSL zorunluluğunu ve authentication ayarlarını kontrol edin:
# SSL durumunu kontrol et
az postgres flexible-server parameter show
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name require_ssl
# SSL'i zorla (zaten enabled olmalı ama teyit edin)
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name require_ssl
--value ON
# Log_connections aktif et - kim bağlanıyor görmek isteyeceksiniz
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name log_connections
--value ON
# Log_disconnections aktif et
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name log_disconnections
--value ON
Microsoft Entra ID (Azure AD) authentication’ı da aktif edin. Bu, password-based authentication yerine identity-based erişim sağlar:
# Azure AD admin ata
az postgres flexible-server ad-admin create
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--display-name "DBA Team"
--object-id "YOUR-ENTRA-GROUP-OBJECT-ID"
--type Group
Veritabanı ve Kullanıcı Yönetimi
Sunucuya bağlanıp veritabanlarını ve kullanıcıları oluşturalım. Bağlantı için psql veya Azure Cloud Shell kullanabilirsiniz. Eğer aynı VNet içindeyseniz doğrudan bağlanabilirsiniz:
# Bağlantı stringini al
PGHOST=$(az postgres flexible-server show
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--query "fullyQualifiedDomainName"
--output tsv)
# psql ile bağlan
psql "host=$PGHOST port=5432 dbname=postgres user=pgadmin sslmode=require"
Bağlantı sağlandıktan sonra veritabanı ve kullanıcıları oluşturun:
# psql içinde çalıştırın
-- Production veritabanı oluştur
CREATE DATABASE webapp_prod
WITH ENCODING 'UTF8'
LC_COLLATE='en_US.utf8'
LC_CTYPE='en_US.utf8'
TEMPLATE=template0;
-- Read-write kullanıcısı (uygulama için)
CREATE ROLE app_user WITH LOGIN PASSWORD 'AppUser@Str0ng#Pass';
GRANT CONNECT ON DATABASE webapp_prod TO app_user;
c webapp_prod
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
-- Read-only kullanıcısı (raporlama, analytics için)
CREATE ROLE readonly_user WITH LOGIN PASSWORD 'ReadOnly@Str0ng#Pass';
GRANT CONNECT ON DATABASE webapp_prod TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_user;
Önemli not: Admin kullanıcısını uygulama bağlantılarında asla kullanmayın. Her uygulama için minimum yetkili ayrı kullanıcı oluşturun.
Performance Parametrelerini Optimize Etme
Azure’un default parametreleri iyi bir başlangıç noktası sunar ama production için birkaç kritik ayar yapmanız gerekiyor. Sunucunuzun RAM’ine göre bu değerleri hesaplayın:
# shared_buffers - RAM'in %25'i (16 GB RAM için 4 GB)
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name shared_buffers
--value "4096000"
# work_mem - Sıralama ve hash işlemleri için
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name work_mem
--value "65536"
# effective_cache_size - OS cache tahmini, RAM'in %75'i
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name effective_cache_size
--value "12288000"
# max_connections - dikkatli olun, çok yüksek ayarlamayın
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name max_connections
--value "200"
# checkpoint_completion_target
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name checkpoint_completion_target
--value "0.9"
PgBouncer connection pooling de Flexible Server’da built-in geliyor. Uygulama tarafında bağlantı sayısı yüksekse aktif edin:
# PgBouncer'ı aktif et
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name pgbouncer.enabled
--value true
# Pool mode ayarla
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name pgbouncer.pool_mode
--value transaction
PgBouncer aktif olduğunda uygulamanızı port 5432 yerine 6432’ye yönlendirin.
Monitoring ve Alerting Kurulumu
Production ortamında ne olduğunu bilmeden yönetemezsiniz. Azure Monitor ile temel alertleri kuralım:
# Log Analytics workspace oluştur
az monitor log-analytics workspace create
--resource-group rg-postgresql-prod
--workspace-name law-postgresql-prod
--location westeurope
--retention-time 90
# Workspace ID al
WORKSPACE_ID=$(az monitor log-analytics workspace show
--resource-group rg-postgresql-prod
--workspace-name law-postgresql-prod
--query "id" --output tsv)
# PostgreSQL diagnostic settings aktif et
az monitor diagnostic-settings create
--name diag-psql-prod
--resource $(az postgres flexible-server show
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--query "id" --output tsv)
--workspace $WORKSPACE_ID
--logs '[{"category":"PostgreSQLLogs","enabled":true},{"category":"PostgreSQLFlexSessions","enabled":true},{"category":"PostgreSQLFlexQueryStoreRuntime","enabled":true}]'
--metrics '[{"category":"AllMetrics","enabled":true}]'
CPU kullanımı için alert oluşturun:
# Action group oluştur (email bildirimi için)
az monitor action-group create
--resource-group rg-postgresql-prod
--name ag-dba-team
--short-name dbateam
--action email dba-email [email protected]
# CPU alert
az monitor metrics alert create
--resource-group rg-postgresql-prod
--name alert-psql-high-cpu
--scopes $(az postgres flexible-server show
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--query "id" --output tsv)
--condition "avg cpu_percent > 85"
--window-size 5m
--evaluation-frequency 1m
--action ag-dba-team
--severity 2
--description "PostgreSQL CPU kullanimi %85 ustu"
Storage alert’i de ekleyin, disk dolunca ciddi sorunlar yaşarsınız:
az monitor metrics alert create
--resource-group rg-postgresql-prod
--name alert-psql-storage
--scopes $(az postgres flexible-server show
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--query "id" --output tsv)
--condition "avg storage_percent > 80"
--window-size 15m
--evaluation-frequency 5m
--action ag-dba-team
--severity 1
--description "PostgreSQL storage dolulugu %80 ustu"
Backup ve Restore Stratejisi
Azure otomatik backup yapıyor ama restore sürecinizi test etmek sizin sorumluluğunuzda. Backup’ı asla test etmeden güvenmeyin.
# Mevcut backup'ları listele
az postgres flexible-server backup list
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--output table
# Point-in-time restore ile test ortamı oluştur
az postgres flexible-server restore
--resource-group rg-postgresql-prod
--name psql-restore-test
--source-server psql-prod-webapp
--restore-time "2024-01-15T10:00:00Z"
--sku-name Standard_D2s_v3
--tier GeneralPurpose
Restore işlemi tamamlandıktan sonra verileri doğrulayın ve test ortamını silin:
# Test ortamını kontrol et ve sil
az postgres flexible-server delete
--resource-group rg-postgresql-prod
--name psql-restore-test
--yes
Gerçek dünya notu: Ben çalıştığım bir projede backup retention süresini 7 günde bırakmışlardık. Bir ay sonra compliance audit geldi ve 30 günlük veri erişimi istediler. Backup retention’ı baştan 35 güne ayarlayın, sonradan artırmak geçmişe dönük çalışmıyor.
Maintenance Window Yapılandırması
Production sistemlerde bakım penceresini kendiniz belirleyin. Yoksa Azure rastgele bir zamanda güncelleme yapabilir:
# Bakım penceresini Pazar sabahı 02:00 olarak ayarla
az postgres flexible-server update
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--maintenance-window day-of-week=0 start-hour=2 start-minute=0
Burada day-of-week=0 Pazar gününe karşılık geliyor. Pazartesi için 1, Salı için 2 kullanırsınız.
Connection String Yönetimi
Uygulamanızın bağlantı bilgilerini Azure Key Vault üzerinden yönetin. Hardcoded connection string üretim ortamında kabul edilemez:
# Key Vault oluştur
az keyvault create
--name kv-webapp-prod
--resource-group rg-postgresql-prod
--location westeurope
--enable-rbac-authorization true
# PostgreSQL connection string'i secret olarak sakla
az keyvault secret set
--vault-name kv-webapp-prod
--name "postgresql-connection-string"
--value "host=psql-prod-webapp.private.postgres.database.azure.com port=5432 dbname=webapp_prod user=app_user password=AppUser@Str0ng#Pass sslmode=require"
# Managed Identity ile uygulamanın Key Vault'a erişimini ver
az role assignment create
--role "Key Vault Secrets User"
--assignee "YOUR-APP-SERVICE-MANAGED-IDENTITY-ID"
--scope $(az keyvault show --name kv-webapp-prod --query "id" --output tsv)
Maliyet Optimizasyonu
Azure PostgreSQL maliyetli olabilir. Akıllıca kullanmak için bazı stratejiler:
- Compute Reserved Instances: 1 veya 3 yıllık rezervasyon ile %35-60 tasarruf yapabilirsiniz. Uzun vadeli production workloadları için mutlaka değerlendirin.
- Stop/Start özelliği: Development ve test ortamları için sunucuyu mesai saatleri dışında durdurun.
# Dev sunucuyu durdur (iş saati dışında)
az postgres flexible-server stop
--resource-group rg-postgresql-dev
--name psql-dev-webapp
# Sabah başlat
az postgres flexible-server start
--resource-group rg-postgresql-dev
--name psql-dev-webapp
Bu iki komutu Azure Automation veya Logic Apps ile zamanlanmış görev olarak ayarlarsanız dev ortamınızda ciddi tasarruf yaparsınız.
- Storage autogrow: Mevcut kullanımın %85’ine ulaşıldığında otomatik büyüme sağlar. Böylece fazladan storage tahsis etmek zorunda kalmazsınız.
az postgres flexible-server update
--resource-group rg-postgresql-prod
--name psql-prod-webapp
--storage-auto-grow Enabled
Sık Karşılaşılan Sorunlar ve Çözümleri
Bağlantı zaman aşımı: VNet peering veya private endpoint yapılandırma hatasından kaynaklanır. NSG kurallarını kontrol edin ve subnet delegation’ın doğru ayarlandığını teyit edin.
SSL sertifika hatası: Uygulama SELF_SIGNED_CERT_IN_CHAIN hatası veriyorsa Azure’un root sertifikasını indirip uygulamanıza eklemeniz gerekiyor. DigiCert Global Root G2 sertifikasını kullanın.
High CPU ve slow query: pg_stat_statements extension’ını aktif edip yavaş sorguları takip edin:
az postgres flexible-server parameter set
--resource-group rg-postgresql-prod
--server-name psql-prod-webapp
--name pg_qs.query_capture_mode
--value ALL
Sonra Azure Portal’daki Query Performance Insight bölümünden yavaş sorguları görselleştirin.
Max connections aşımı: PgBouncer’ı aktif etmek bu sorunu genellikle çözer. Uygulama tarafında connection pool boyutunu da düşürün.
Sonuç
Azure Database for PostgreSQL Flexible Server, doğru yapılandırıldığında güçlü ve yönetilebilir bir veritabanı platformu sunuyor. Bu yazıda network altyapısından güvenlik ayarlarına, performance optimizasyonundan maliyet yönetimine kadar production ortamı için ihtiyacınız olan temel kurulumu tamamladık.
En kritik noktaları özetlemek gerekirse: VNet entegrasyonundan taviz vermeyin, backup restore’u düzenli test edin, minimum yetkili kullanıcı politikasına uyun ve monitoring alertlerini baştan kurun. Bu dört maddeyi doğru yaparsanız gece 3’te sizi uyandıracak sürprizlerin büyük çoğunluğunu önlemiş olursunuz.
Bir sonraki adım olarak read replica kurulumu, cross-region failover senaryoları ve pgAudit ile detaylı audit logging konularına bakmanızı öneririm. Production veritabanı yönetimi sürekli öğrenme gerektiren bir alan ve Azure her birkaç ayda bir yeni özellikler ekliyor.
