HAProxy + Keepalived Aktif/Pasif Yük Dengeleyici Kurulumu

Ubuntu 24.04 LTS (Noble Numbat) — Temmuz 2026
1. Topoloji ve Ön Bilgiler
| Rol | Hostname | IP Adresi | Keepalived Durumu | Priority |
|---|---|---|---|---|
| Birincil LB | lb01 | 10.10.34.97 | MASTER | 150 |
| İkincil LB | lb02 | 10.10.34.98 | BACKUP | 100 |
| VIP (Sanal IP) | lb-vip | 10.10.34.99 | Float eden adres | — |
Çalışma mantığı:
İstemciler
│
▼
VIP: 10.10.34.99
│
┌─────────────┴─────────────┐
│ │
┌───────▼────────┐ ┌───────▼────────┐
│ lb01 (.97) │ VRRP │ lb02 (.98) │
│ MASTER │◄────────►│ BACKUP │
│ HAProxy (çalışıyor) │ HAProxy (çalışıyor)
└───────┬────────┘ └───────┬────────┘
└─────────────┬─────────────┘
▼
Backend sunucular
Önemli: HAProxy servisi her iki sunucuda da sürekli çalışır. Aktif/pasif olan şey HAProxy değil, VIP’in hangi makinede durduğudur. Keepalived, VRRP protokolü (IP protokol no: 112) ile eşini izler; MASTER düşerse VIP saniyeler içinde BACKUP’a geçer ve gratuitous ARP ile switch’e duyurulur.
Kullanılacak sürümler
| Bileşen | Sürüm | Kaynak |
|---|---|---|
| İşletim sistemi | Ubuntu 24.04.x LTS | — |
| HAProxy | 3.4.x LTS | ppa:vbernat/haproxy-3.4 |
| Keepalived | 2.2.8 (dağıtım deposu) | Ubuntu Noble main |
Not: Ubuntu 24.04’ün kendi deposunda HAProxy 2.8.x bulunur. Uzun ömürlü kurulum için LTS dalı olan 3.4’ü PPA’dan kuruyoruz. PPA erişiminiz yoksa veya kurum politikası izin vermiyorsa depo sürümü (2.8) da 2028’e kadar desteklidir ve buradaki konfigürasyonlarla uyumludur.
Ön koşullar
- Her iki VM’de root veya
sudoyetkisi - İki sunucu aynı L2 broadcast domaininde olmalı (VRRP çalışması için şart)
- 10.10.34.99 adresi DHCP havuzunun dışında ve başka bir cihazda kullanılmıyor olmalı
- VMware/Proxmox kullanıyorsanız vSwitch/port-group üzerinde MAC değişikliği (MAC Address Changes) ve Forged Transmits izinleri açık olmalı — aksi halde VIP taşınmaz
2. Sistem Hazırlığı (Her İki Sunucuda)
2.1 Güncelleme ve temel paketler
sudo apt update && sudo apt -y full-upgrade
sudo apt -y install software-properties-common curl vim net-tools \
chrony psmisc iproute2 socat
Saat senkronizasyonu HA kümelerinde log korelasyonu için kritiktir:
sudo timedatectl set-timezone Europe/Istanbul
sudo systemctl enable --now chrony
timedatectl status
2.2 Hostname ve /etc/hosts
lb01’de:
sudo hostnamectl set-hostname lb01
lb02’de:
sudo hostnamectl set-hostname lb02
Her ikisinde /etc/hosts dosyasına ekleyin:
10.10.34.97 lb01
10.10.34.98 lb02
10.10.34.99 lb-vip
2.3 Ağ arayüzü adını tespit edin
ip -br link show
Çıktıda ens160, ens192, eth0 gibi bir isim göreceksiniz. Bu dokümanda ens192 kullanılmıştır — kendi arayüz adınızla değiştirin.
2.4 Kernel parametreleri (KRİTİK)
HAProxy, üzerinde bulunmayan bir IP’ye (VIP) bind olabilmelidir. Pasif düğümde VIP mevcut olmadığı için bu parametre olmadan HAProxy açılışta hata verir:
sudo tee /etc/sysctl.d/99-haproxy-ha.conf > /dev/null <<'EOF'
# Var olmayan (VIP) adrese bind izni
net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 1
# Bağlantı yoğunluğu için ayarlar
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.core.netdev_max_backlog = 16384
EOF
sudo sysctl --system
Doğrulama:
sysctl net.ipv4.ip_nonlocal_bind
2.5 Dosya tanıtıcı (file descriptor) limitleri
sudo mkdir -p /etc/systemd/system/haproxy.service.d
sudo tee /etc/systemd/system/haproxy.service.d/limits.conf > /dev/null <<'EOF'
[Service]
LimitNOFILE=200000
EOF
sudo systemctl daemon-reload
3. HAProxy 3.4 LTS Kurulumu (Her İki Sunucuda)
sudo add-apt-repository --yes ppa:vbernat/haproxy-3.4
sudo apt update
sudo apt -y install haproxy=3.4.\*
PPA henüz 3.4 için yayınlanmadıysa
ppa:vbernat/haproxy-3.2(LTS, 2030’a kadar destekli) kullanın. Hangi sürümlerin mevcut olduğunuapt-cache madison haproxyile görebilirsiniz.
Sürümü ve depoyu doğrulayın:
haproxy -v
apt-cache madison haproxy
Otomatik ana sürüm atlamasını engellemek için paketi sabitleyin (opsiyonel ama önerilir):
sudo tee /etc/apt/preferences.d/haproxy > /dev/null <<'EOF'
Package: haproxy
Pin: version 3.4.*
Pin-Priority: 1001
EOF
3.1 Sertifika dizini (HTTPS terminasyonu kullanacaksanız)
sudo mkdir -p /etc/haproxy/certs
sudo chmod 700 /etc/haproxy/certs
sudo chown haproxy:haproxy /etc/haproxy/certs
HAProxy sertifika ve anahtarı tek dosyada birleştirilmiş olarak bekler:
# fullchain.pem + private.key -> site.pem
sudo bash -c 'cat /yol/fullchain.pem /yol/private.key > /etc/haproxy/certs/site.pem'
sudo chmod 600 /etc/haproxy/certs/site.pem
sudo chown haproxy:haproxy /etc/haproxy/certs/site.pem
4. HAProxy Konfigürasyonu
Önce mevcut dosyayı yedekleyin:
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orj
4.1 /etc/haproxy/haproxy.cfg
Aşağıdaki içerik her iki sunucuda birebir aynı olmalıdır (tek fark peers bölümündeki localpeer değeridir; onu da hostname üzerinden otomatik çözüyoruz).
#---------------------------------------------------------------------
# GLOBAL
#---------------------------------------------------------------------
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 40000
nbthread 4 # vCPU sayınıza göre ayarlayın
# TLS varsayılanları (modern, uyumlu profil)
ca-base /etc/ssl/certs
crt-base /etc/haproxy/certs
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-server-options ssl-min-ver TLSv1.2 no-tls-tickets
tune.ssl.default-dh-param 2048
#---------------------------------------------------------------------
# PEERS - İki LB arasında stick-table (oturum yapışkanlığı) senkronu
#---------------------------------------------------------------------
peers lb_cluster
peer lb01 10.10.34.97:10000
peer lb02 10.10.34.98:10000
#---------------------------------------------------------------------
# DEFAULTS
#---------------------------------------------------------------------
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor except 127.0.0.0/8
option http-server-close
retries 3
option redispatch
timeout connect 5s
timeout client 60s
timeout server 60s
timeout http-request 10s
timeout http-keep-alive 10s
timeout queue 30s
timeout check 5s
timeout tunnel 1h # WebSocket / uzun bağlantılar için
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
#---------------------------------------------------------------------
# STATS ARAYÜZÜ - VIP üzerinde DEĞİL, düğümün kendi IP'sinde dinler
# Böylece pasif düğümün durumunu da görebilirsiniz.
#---------------------------------------------------------------------
listen stats
bind *:8404
mode http
stats enable
stats uri /stats
stats refresh 10s
stats show-node
stats show-legends
stats admin if TRUE
stats auth admin:BurayaGucluBirParolaYaz
no log
#---------------------------------------------------------------------
# FRONTEND - HTTP (80) : HTTPS'e yönlendirme
#---------------------------------------------------------------------
frontend fe_http
bind 10.10.34.99:80
mode http
# Let's Encrypt HTTP-01 doğrulaması geçsin
acl is_acme path_beg /.well-known/acme-challenge/
use_backend be_acme if is_acme
http-request redirect scheme https code 301 unless { ssl_fc } or is_acme
#---------------------------------------------------------------------
# FRONTEND - HTTPS (443)
#---------------------------------------------------------------------
frontend fe_https
bind 10.10.34.99:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
mode http
# Güvenlik başlıkları
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Content-Type-Options nosniff
http-response set-header X-Frame-Options SAMEORIGIN
# İstemci bilgisi backend'e aktarılsın
http-request set-header X-Forwarded-Proto https
http-request set-header X-Forwarded-Port %[dst_port]
# Basit hız sınırlama (opsiyonel) - iki LB arasında senkron
stick-table type ip size 200k expire 60s store http_req_rate(10s) peers lb_cluster
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 300 }
default_backend be_web
#---------------------------------------------------------------------
# BACKEND - Web sunucular
#---------------------------------------------------------------------
backend be_web
mode http
balance roundrobin
option httpchk
http-check send meth GET uri /health ver HTTP/1.1 hdr Host healthcheck.local
http-check expect status 200
# Oturum yapışkanlığı (cookie tabanlı) - gerekmiyorsa kaldırın
cookie SRVID insert indirect nocache
default-server inter 3s fall 3 rise 2 maxconn 2000 check
server web01 10.10.34.11:8080 cookie web01
server web02 10.10.34.12:8080 cookie web02
# server web03 10.10.34.13:8080 cookie web03 backup
#---------------------------------------------------------------------
# BACKEND - ACME (certbot standalone kullanacaksanız)
#---------------------------------------------------------------------
backend be_acme
mode http
server acme 127.0.0.1:8888
#---------------------------------------------------------------------
# ÖRNEK: TCP modunda yük dengeleme (ör. MSSQL, PostgreSQL, RDP, SMTP)
#---------------------------------------------------------------------
#listen li_mssql
# bind 10.10.34.99:1433
# mode tcp
# option tcplog
# balance leastconn
# timeout client 30m
# timeout server 30m
# default-server inter 5s fall 3 rise 2 check
# server db01 10.10.34.21:1433
# server db02 10.10.34.22:1433 backup
4.2 Konfigürasyon doğrulama ve servisi başlatma
Her değişiklikten sonra mutlaka syntax kontrolü yapın:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
Çıktı Configuration file is valid olmalıdır. Ardından:
sudo systemctl enable --now haproxy
sudo systemctl status haproxy --no-pager
Kesintisiz yeniden yükleme (mevcut bağlantılar korunur):
sudo systemctl reload haproxy
restartyerine her zamanreloadkullanın. HAProxy 3.x master-worker modunda çalıştığı için reload sırasında bağlantı kaybı yaşanmaz.
4.3 Loglama
Ubuntu paketi /etc/rsyslog.d/49-haproxy.conf dosyasını otomatik oluşturur. Doğrulayın:
sudo systemctl restart rsyslog
sudo tail -f /var/log/haproxy.log
Log yoksa /etc/rsyslog.conf içinde imuxsock modülünün aktif olduğundan emin olun.
5. Keepalived Kurulumu ve Konfigürasyonu
sudo apt -y install keepalived
keepalived -v
5.1 Sağlık kontrol betiği (her iki sunucuda)
sudo tee /etc/keepalived/check_haproxy.sh > /dev/null <<'EOF'
#!/bin/bash
# HAProxy süreci ayakta mı ve stats portu cevap veriyor mu?
# Çıkış 0 = sağlıklı, 0 dışı = sağlıksız
if ! /bin/pidof haproxy > /dev/null 2>&1; then
exit 1
fi
# Admin soketi üzerinden canlılık teyidi
if ! echo "show info" | /usr/bin/socat stdio /run/haproxy/admin.sock > /dev/null 2>&1; then
exit 1
fi
exit 0
EOF
sudo chown root:root /etc/keepalived/check_haproxy.sh
sudo chmod 0755 /etc/keepalived/check_haproxy.sh
Betiği elle test edin:
sudo /etc/keepalived/check_haproxy.sh; echo "Sonuc: $?"
5.2 Durum değişikliği bildirim betiği (opsiyonel, tavsiye edilir)
sudo tee /etc/keepalived/notify.sh > /dev/null <<'EOF'
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
/usr/bin/logger -t keepalived-notify "VRRP durumu degisti: ${NAME} -> ${STATE}"
case $STATE in
"MASTER")
# VIP bu düğüme geçti. Gerekirse ek işlem yapın:
/usr/bin/systemctl reload haproxy
;;
"BACKUP"|"FAULT")
# VIP bu düğümden ayrıldı
;;
esac
exit 0
EOF
sudo chown root:root /etc/keepalived/notify.sh
sudo chmod 0755 /etc/keepalived/notify.sh
5.3 lb01 (MASTER) — /etc/keepalived/keepalived.conf
sudo tee /etc/keepalived/keepalived.conf > /dev/null <<'EOF'
global_defs {
router_id LB01
script_user root
enable_script_security
vrrp_skip_check_adv_addr
vrrp_garp_master_refresh 60
vrrp_garp_master_delay 1
max_auto_priority -1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2 # 2 saniyede bir kontrol
timeout 3
fall 2 # 2 başarısız kontrol -> sağlıksız
rise 2 # 2 başarılı kontrol -> sağlıklı
weight -60 # sağlıksızsa priority 60 düşer (150 -> 90 < 100)
}
vrrp_instance VI_LB {
state MASTER
interface ens192 # <<< KENDİ ARAYÜZ ADINIZLA DEĞİŞTİRİN
virtual_router_id 51 # 1-255 arası, L2 domaininde benzersiz
priority 150
advert_int 1
# Unicast VRRP - sanallaştırma/bulut ortamlarında multicast'ten daha güvenilir
unicast_src_ip 10.10.34.97
unicast_peer {
10.10.34.98
}
authentication {
auth_type PASS
auth_pass Vrrp2026 # EN FAZLA 8 KARAKTER (fazlası kırpılır)
}
virtual_ipaddress {
10.10.34.99/24 dev ens192 label ens192:vip
}
track_script {
chk_haproxy
}
track_interface {
ens192
}
notify /etc/keepalived/notify.sh
}
EOF
sudo chmod 600 /etc/keepalived/keepalived.conf
5.4 lb02 (BACKUP) — /etc/keepalived/keepalived.conf
sudo tee /etc/keepalived/keepalived.conf > /dev/null <<'EOF'
global_defs {
router_id LB02
script_user root
enable_script_security
vrrp_skip_check_adv_addr
vrrp_garp_master_refresh 60
vrrp_garp_master_delay 1
max_auto_priority -1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
timeout 3
fall 2
rise 2
weight -60
}
vrrp_instance VI_LB {
state BACKUP
interface ens192 # <<< KENDİ ARAYÜZ ADINIZLA DEĞİŞTİRİN
virtual_router_id 51 # MASTER ile AYNI olmalı
priority 100
advert_int 1
unicast_src_ip 10.10.34.98
unicast_peer {
10.10.34.97
}
authentication {
auth_type PASS
auth_pass Vrrp2026 # MASTER ile AYNI olmalı
}
virtual_ipaddress {
10.10.34.99/24 dev ens192 label ens192:vip
}
track_script {
chk_haproxy
}
track_interface {
ens192
}
notify /etc/keepalived/notify.sh
}
EOF
sudo chmod 600 /etc/keepalived/keepalived.conf
5.5 İki düğüm arasında aynı olması ZORUNLU parametreler
| Parametre | Değer | Açıklama |
|---|---|---|
virtual_router_id | 51 | Farklı olursa iki düğüm de MASTER olur (split-brain) |
auth_pass | Vrrp2026 | Farklı olursa VRRP paketleri reddedilir |
advert_int | 1 | Uyumsuzluk uyarı üretir |
virtual_ipaddress | 10.10.34.99/24 | Aynı VIP |
| Subnet mask | /24 | Ağınızın gerçek maskesiyle uyumlu olmalı |
5.6 Servisi başlatma
# Önce lb01, sonra lb02
sudo systemctl enable --now keepalived
sudo systemctl status keepalived --no-pager
6. Güvenlik Duvarı (UFW) Ayarları
VRRP, IP protokol numarası 112 kullanır ve UFW bunu isimle desteklemez. En pratik yöntem eş düğümü tam olarak yetkilendirmektir:
# --- Her iki sunucuda ---
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw allow from 10.10.34.0/24 to any port 8404 proto tcp comment 'HAProxy stats'
# --- lb01 üzerinde: eşe tam güven (VRRP + peers portu) ---
sudo ufw allow from 10.10.34.98 comment 'VRRP + HAProxy peer - lb02'
# --- lb02 üzerinde ---
sudo ufw allow from 10.10.34.97 comment 'VRRP + HAProxy peer - lb01'
sudo ufw --force enable
sudo ufw status numbered
Multicast VRRP kullanmayı tercih ederseniz (unicast_peer bloklarını kaldırırsanız) ek olarak /etc/ufw/before.rules dosyasının COMMIT satırından önce şunları ekleyin:
-A ufw-before-input -d 224.0.0.18 -p vrrp -j ACCEPT
-A ufw-before-output -d 224.0.0.18 -p vrrp -j ACCEPT
Ardından sudo ufw reload.
Öneri: Sanallaştırma ortamlarında (VMware, Hyper-V, OpenStack) ve VLAN’lar arası ortamlarda multicast sıklıkla filtrelenir. Bu dokümandaki unicast yapılandırması varsayılan olarak daha güvenilirdir.
7. Doğrulama ve Test Senaryoları
7.1 VIP’in doğru düğümde olduğunu kontrol edin
lb01’de:
ip -br addr show ens192
Çıktıda hem 10.10.34.97/24 hem de 10.10.34.99/24 görünmelidir.
lb02’de aynı komut sadece 10.10.34.98/24 göstermelidir. İki düğümde de VIP görünüyorsa split-brain vardır (bkz. Bölüm 9).
7.2 Keepalived loglarını izleyin
sudo journalctl -u keepalived -f
Beklenen satırlar:
- lb01:
Entering MASTER STATE - lb02:
Entering BACKUP STATE
7.3 VRRP trafiğini gözlemleyin
sudo tcpdump -i ens192 -n vrrp
Saniyede bir MASTER’dan advertisement paketi görmelisiniz.
7.4 Servis erişim testi
Harici bir makineden:
curl -I http://10.10.34.99
curl -Ik https://10.10.34.99
Stats sayfaları (her düğüm için ayrı ayrı):
http://10.10.34.97:8404/stats
http://10.10.34.98:8404/stats
7.5 Failover testi — HAProxy servisini durdurma
lb01’de:
sudo systemctl stop haproxy
Beklenen: chk_haproxy betiği 2 kontrol (≈4 sn) içinde başarısız olur, priority 150 → 90 düşer, lb02 (100) devralır. lb02’de kontrol edin:
ip -br addr show ens192 # VIP burada görünmeli
Geri alma:
sudo systemctl start haproxy # lb01'de
Priority tekrar 150’ye çıkar ve VIP lb01’e döner (preemption).
7.6 Failover testi — Düğümü tamamen kapatma
sudo systemctl stop keepalived # veya sunucuyu reboot edin
VIP anında lb02’ye geçmelidir.
7.7 Kesintisiz erişim testi
Failover sırasında bir terminalde sürekli istek gönderin:
while true; do
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://10.10.34.99/
sleep 0.5
done
Failover anında en fazla 1-3 saniyelik bir kesinti kabul edilebilir.
8. Preemption (Geri Alma) Davranışı
Varsayılan yapılandırmada lb01 geri geldiğinde VIP’i otomatik olarak geri alır. Bu, kısa bir ek kesintiye neden olur. “Flapping” (sürekli gidip gelme) riski varsa lb01’de aşağıdaki ayarı ekleyerek geri almayı gecikmeli yapabilirsiniz:
preempt_delay 60 # 60 saniye bekle, sonra devral
Geri almayı tamamen kapatmak isterseniz her iki düğümde de state BACKUP yapıp lb01’e şunu ekleyin:
state BACKUP
priority 150
nopreempt
nopreemptyalnızcastate BACKUPile birlikte çalışır.state MASTERile kullanılırsa yok sayılır.
9. Sorun Giderme
| Belirti | Olası Neden | Çözüm |
|---|---|---|
| İki düğümde de VIP var (split-brain) | VRRP paketleri karşıya ulaşmıyor | Firewall/VLAN kontrolü, tcpdump -i ens192 vrrp, virtual_router_id ve auth_pass eşleşmesi |
HAProxy açılmıyor: cannot bind socket | ip_nonlocal_bind kapalı | sysctl net.ipv4.ip_nonlocal_bind = 1 olmalı |
| VIP taşınıyor ama trafik gelmiyor | Switch ARP tablosu güncellenmedi | vrrp_garp_master_refresh ayarı, hipervizör “Forged Transmits” izni |
chk_haproxy hep FAULT | Betik yolu/izni yanlış | Betik root’a ait ve 0755 olmalı; enable_script_security aktifken dünya-yazılabilir dizinde olamaz |
| VRRP auth uyarısı | auth_pass 8 karakterden uzun | Parolayı 8 karaktere indirin |
| Backend hep DOWN | Sağlık kontrol yolu yanlış | http-check satırını backend’inizin gerçek endpoint’ine göre düzenleyin |
| Aynı L2’de başka bir VRRP kümesi çakışıyor | virtual_router_id çakışması | Farklı bir ID (ör. 52) seçin |
Faydalı komutlar:
# Keepalived konfigürasyon syntax kontrolü
sudo keepalived --config-test -f /etc/keepalived/keepalived.conf
# Keepalived detaylı durum dökümü
sudo systemctl reload keepalived # /tmp/keepalived.data ve .stats üretir
cat /tmp/keepalived.data
# HAProxy canlı istatistikler (soket üzerinden)
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock | column -s, -t
echo "show info" | sudo socat stdio /run/haproxy/admin.sock
echo "show servers state" | sudo socat stdio /run/haproxy/admin.sock
# Bir backend sunucuyu bakıma alma (kesintisiz)
echo "set server be_web/web01 state maint" | sudo socat stdio /run/haproxy/admin.sock
echo "set server be_web/web01 state ready" | sudo socat stdio /run/haproxy/admin.sock
10. İşletim Notları
10.1 Konfigürasyon senkronizasyonu
haproxy.cfg iki düğümde birebir aynı kalmalıdır. Elle kopyalama hata kaynağıdır; git veya rsync kullanın:
# lb01'den lb02'ye
sudo rsync -avz --delete /etc/haproxy/ root@10.10.34.98:/etc/haproxy/
ssh root@10.10.34.98 'haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxy'
Uzun vadede Ansible ile yönetmenizi öneririm — konfigürasyon farkı (drift) HA kümelerindeki en yaygın arıza sebebidir.
10.2 Bakım prosedürü (kesintisiz)
lb01’e bakım yapacaksanız:
# 1. lb01'de keepalived'i durdur -> VIP lb02'ye geçer
sudo systemctl stop keepalived
# 2. lb02'de VIP'in geldiğini doğrula
# 3. lb01'de bakımı yap (paket güncelleme, reboot vb.)
# 4. lb01'de servisleri geri başlat
sudo systemctl start haproxy && sudo systemctl start keepalived
10.3 Sertifika yenileme
/etc/haproxy/certs/ dizinindeki .pem dosyasını güncelledikten sonra:
sudo systemctl reload haproxy
veya kesintisiz olarak soket üzerinden:
echo -e "set ssl cert /etc/haproxy/certs/site.pem <<\n$(cat /yeni/site.pem)\n" | sudo socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/site.pem" | sudo socat stdio /run/haproxy/admin.sock
10.4 İzleme önerileri
- HAProxy Prometheus exporter’ı dahili gelir;
frontend‘e ekleyerek/metricsyayınlayabilirsiniz:frontend fe_metrics bind *:8405 http-request use-service prometheus-exporter if { path /metrics } no log - İzlenmesi gereken kritik metrikler: backend UP sunucu sayısı, 5xx oranı, kuyruk uzunluğu, oturum kullanım yüzdesi, VIP’in hangi düğümde olduğu
journalctl -u keepalivedüzerindeEntering MASTER STATEsatırı için alarm kurun — beklenmedik failover’ları yakalar
10.5 Güncelleme
sudo apt update && sudo apt list --upgradable | grep -E 'haproxy|keepalived'
# Önce pasif düğümde güncelleyin, test edin, sonra failover yapıp diğerine geçin



