
Bu yazımızda PostgreSQL Patroni Cluster Kurulumu yazı serimizin 3. bölümü yani HAProxy ve PGBouncer kurulum ve yapılandırmasını adım adım anlatacağım. Öncelikle yazı serimizin başında paylaştığım mimariyi hatırlayalım.

Daha önceki Part1 ve Part 2 yazılarımızda database ve patroni kurulumlarını tamamlamıştık. Aşağıdaki linklerden erişebilirsiniz.
PostgreSQL Patroni Cluster Kurulumu-Part1
PostgreSQL Patroni Cluster Kurulumu-ETCD-PATRONI-Part2
Bu yazımızda haprxypb sunucumuzdaki kurulum ve yapılandırmalarını yapacağım. Benim ortamımda kaynak sıkıntısı olduğu ve isterleri karşıladığı için HAProxy ve PgBouncer servislerini tek makinede yapılandırmayı tercih ettim. Kaynak probleminiz yoksa bu servisleri ayrı sunucularda konumlandırmanız daha doğru olacaktır. Evet şimdi HAProxy kurulumu le başlayalım.
HAProxy Nedir?
HAProxy (High Availability Proxy), yüksek trafikli sistemlerde yük dengeleme (load balancing) ve yüksek erişilebilirlik (high availability) sağlayan açık kaynaklı bir çözümdür. Özellikle veri tabanı sistemlerinde trafiği birden fazla sunucuya dağıtmak için sıklıkla tercih edilir.
- HAProxy Kurulumu
Öncelikle HAProxy servisini kuruyoruz.
sudo yum install haproxy -y- HAProxy.conf Dosyasının Düzenlenmesi
HAProxy kurulumundan sonra default olarak conf dosyası /etc/haproxy/haproxy.cfg olarak gelmektedir. Şimdi bu dosyayı değiştirmeden önce yedeğini alıp değişiklikleri yapmanız daha iyi olacaktır. Daha sonra aşağıdaki gibi değişiklik yapıp kaydediyoruz.
sudo vi /etc/haproxy/haproxy.cfgglobal
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 1000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 900
listen stats
mode http
bind 192.168.26.104:7000
stats enable
stats uri /
listen postgres
bind 192.168.26.104:5432
option httpchk
http-check expect status 200
balance roundrobin
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgres1 192.168.26.101:5432 maxconn 1000 check port 8008
server postgres2 192.168.26.102:5432 maxconn 1000 check port 8008
server postgres3 192.168.26.103:5432 maxconn 1000 check port 8008Yapılandırma Açıklamaları:
global ve defaults blokları genel ayarları içerir.
listen stats: 7000 portundan erişilebilen bir web arayüzü sağlar.
listen postgres: HAProxy üzerinden PostgreSQL’e gelen TCP bağlantılarını dengeler.
httpchk ve check port 8008: PostgreSQL node’larının sağlık durumunu kontrol etmek için kullanılır.
- HAProxy Servisini Başlatma ve Etkinleştirme
Değişiklikleri kaydettikten sonra HAProxy servisini başlatın ve sistem açılışında otomatik başlatılması için enable edin:
sudo systemctl enable haproxy
sudo systemctl start haproxy
sudo systemctl status haproxy- HAProxy İstatistik Arayüzüne Erişim
Web tarayıcımızdan aşağıdaki adrese giderek istatistik arayüzüne ulaşabilirsiniz. Burada hangi sunucumun leader olduğu ve diğer istatistikleri görebiliriz:
http://192.168.26.104:7000/
Evet Buraya kadar HAProxy ile yük dengeleme adımlarının nasıl yapılacağı ve kurulum adımlarını tamamlamış olduk. PGBouncer kurulumları ile devam edelim.
PGBouncer Nedir?
Yüksek trafikli PostgreSQL sistemlerinde bağlantı sayısı arttıkça veritabanı sunucusu zorlanmaya başlar. Bu gibi durumlarda bağlantı havuzu (connection pooler) kullanmak, hem sistem kaynaklarını korur hem de performansı artırır. PgBouncer, PostgreSQL için geliştirilmiş, hafif, hızlı ve popüler bir bağlantı havuzlayıcısıdır.
PgBouncer, veritabanına yapılan istemci bağlantılarını ön yüzünde karşılayarak bir bağlantı havuzu oluşturur. Böylece:
- PostgreSQL sunucusunun bağlantı yükü azalır.
- Bağlantı yönetimi hızlanır.
- Uygulamalardaki “too many connections” hatalarının önüne geçilir.
- PgBouncer Kurulumu
PgBouncer repomuzda var ise doğrudan yum install ile kurulum yapacağız.
sudo yum install pgbouncer.x86_64- PgBouncer Yapılandırması
Yapılandırma dosyaları genellikle aşağıdaki dizindedir:
- Genel Conf Dosyası:
/etc/pgbouncer/pgbouncer.ini - Kullanıcı kimlik bilgileri:
/etc/pgbouncer/userlist.txt
Conf dosyasını düzenleyelim: pgbouncer.ini dosyasını yedekleyip aşağıdaki gibi yeni bir dosya oluşturup işlem yapabilirsiniz.
vi /etc/pgbouncer/pgbouncer.ini[databases]
postgres = host=192.168.26.104 port=5432 dbname=postgres user=postgres
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, postgres
ignore_startup_parameters = extra_float_digits
max_client_conn = 100
default_pool_size = 100
reserve_pool_size = 50- Kullanıcı Bilgilerini Tanımlama
PgBouncer, bağlantı kurulacak veri tabanı kullanıcılarının şifrelerini userlist.txt dosyasından okur. Bu dosyaya kullanıcı ve şifresini yazmamız gerekiyor. Buradaki şifre direkt olarak yazılabileceği gibi scram-sha-256 formatta da yazılabilmektedir. Biz scram-sha-256 formatta yazacağız. Bu işlem için database e bağlanıp aşağıdaki gibi pg_shadow ile şifrenin scram-sha-256 formatı oluşturulmalıdır.
select '"'||usename||'" "'||passwd||'"' from pg_catalog.pg_shadow where usename='postgres';Aşağıdaki gibi bir çıktı verecektir bu çıktıyı userslist.txt dosyasına ekliyoruz.
"postgres" "SCRAM-SHA-256$4096:ZMVbQi+ddHm9xP+4fdldkflkdh+l444/nRLxDTKB1X1D9c0dV2aEJX7tuEl35I=:="sudo vi /etc/pgbouncer/userlist.txt"postgres" "SCRAM-SHA-256$4096:ZMVbQi+ddHm9xP+4fdldkflkdh+l444/nRLxDTKB1X1D9c0dV2aEJX7tuEl35I=:="- PgBouncer Servisini Başlatma
Yapılandırma tamamlandıktan sonra servisi etkinleştirip başlatabiliriz:
sudo systemctl enable pgbouncer
sudo systemctl start pgbouncerKurulum ve ayarlamalarımız tamam şimdi PGBouncer ile bağlantı testi yapalım.PgBouncer arayüzüne bağlanmak için port olarak 6432 kullanılmalıdır:
psql -h 192.168.26.104 -p 6432 -U pgbouncerpgbouncer=#\x
# Pool yönetim izleyelim.
show pools;
# İstatistik bilgiler incele.
show stats;
# Daha fazlası için.
show help;- Aşağıda PGBouncer için bazı önemli parametrelerin açıklaması verilmiştir. Bizim ortmamızda bu parametrelerin bazıları set edilmiş olup sizin kuracağınız ortamda ihtiyaç halinde kullanabilirsiniz.
1.Genel Parametreler:
listen_addr: Bağlantıların dinleneceği IP adresi. 0.0.0.0 tüm IP'leri, 127.0.0.1 yalnızca localhost'u temsil eder.
Örnek:
listen_addr = 0.0.0.0
listen_port:pgbouncer'ın dinleyeceği port numarası (varsayılan PostgreSQL portu 5432'dir).
Örnek:
listen_port = 6432
auth_type:Kimlik doğrulama türünü belirler.
Yaygın seçenekler:
trust: Şifre olmadan kabul eder.
plain: Şifre düz metin olarak gönderilir.
md5: MD5 hash tabanlı kimlik doğrulama.
Örnek:
auth_type = md5
auth_file: Kimlik doğrulama bilgiler içeren dosyanın yolu. Genellikle şifrelerin bulunduğu pg_hba.conf yerine kullanılan bir dosyadır.
Örnek:
auth_file = /etc/pgbouncer/userlist.txt2.Performans Parametreleri:
pool_mode:pgbouncer bağlantılarının nasıl yönetileceğini belirler:
session: Bir oturum süresince bağlantıyı tutar (default).
transaction: Her işlem için yeni bir bağlantı kullanır.
statement: Her SQL komutunda bağlantı açar ve kapar.
Örnek:
pool_mode = transaction
max_client_conn:Aynı anda kaç istemcinin bağlanabileceğini belirler.
Örnek:
max_client_conn = 100
default_pool_size: Her hedef veri tabanı için açılacak maksimum bağlantı sayısı.
Örnek:
default_pool_size = 20
min_pool_size:Bağlantı havuzunun asgari boyutu. Belirtilmezse bağlantılar talep üzerine oluşturulur.
Örnek:
min_pool_size = 5
reserve_pool_size:Bağlantılar tükendiğinde acil durum için ayrılmış bağlantı sayısı.
Örnek:
reserve_pool_size = 5
reserve_pool_timeout:Bekleme kuyruğunda ne kadar süreliğine bir istemcinin acil durum bağlantısını alabileceğini belirtir (saniye).
Örnek:
reserve_pool_timeout = 5.03.Gecikme ve Zaman Aşımı Ayarları:
idle_transaction_timeout:Bir işlem bağlantısı boşta kaldığında ne kadar süre sonra bağlantının kapatılacağını belirler.
Örnek:
idle_transaction_timeout = 60
query_timeout:Bir sorgunun tamamlanması gereken maksimum süre (saniye).
Örnek:
query_timeout = 300
client_idle_timeout:Bir istemci bağlantısının boşta bekleyebileceği maksimum süre (saniye).
Örnek:
client_idle_timeout = 300
server_idle_timeout:Sunucu bağlantısının kullanılmadığı zaman kapatılacağı süre.
Örnek:
server_idle_timeout = 600
connect_timeout:Sunucu bağlantısının kurulması için beklenen maksimum süre.
Örnek:
connect_timeout = 154.Loglama ve İzleme Parametreleri
log_connections:İstemci bağlantı girişler kaydetmek için:0 veya 1 ile kapalı/açık olarak ayarlanır.
Örnek:
log_connections = 1
log_disconnections:İstemci bağlantılarının kapanmasını kaydeder.
Örnek:
log_disconnections = 1
log_pooler_errors:Havuzlama hatalarını günlüğe kaydetmek için: 0 veya 1 ile kapalı/açık.
Örnek:
log_pooler_errors = 1
log_stats:İstatistiklerin belirli aralıklarla günlüğe kaydedilmesi.
Örnek:
log_stats = 60PostgreSQL Patroni Cluster Kurulumu-HAProxy-PGBouncer- Part3 yazımızda HAProxy ve PgBouncer kurulumunu ve 3 sunuculu bir PostgreSQL kümesi için TCP tabanlı yük dengeleme ve pooling yapılandırmasını adım adım gerçekleştirdik. HAProxy sayesinde veri tabanı sisteminiz artık daha dengeli ve yüksek erişilebilir hale geldi. Aynı zamanda PgBouncer sayesinde de, PostgreSQL sistemlerinin ölçeklenebilirliğini artırır ve bağlantı sayısının yönetimini kolaylaştırır.
PostgreSQL Patroni Cluster Kurulumu-Part1
PostgreSQL Patroni Cluster Kurulumu-ETCD-PATRONI-Part2
Resmi dökümantasyon için tıklayınız.



Leave a Comment