LinuxOpen Source

HAProxy + Keepalived Aktif/Pasif Yük Dengeleyici Kurulumu

Ubuntu 24.04 LTS (Noble Numbat) — Temmuz 2026


1. Topoloji ve Ön Bilgiler

RolHostnameIP AdresiKeepalived DurumuPriority
Birincil LBlb0110.10.34.97MASTER150
İkincil LBlb0210.10.34.98BACKUP100
VIP (Sanal IP)lb-vip10.10.34.99Float 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şenSürümKaynak
İşletim sistemiUbuntu 24.04.x LTS
HAProxy3.4.x LTSppa:vbernat/haproxy-3.4
Keepalived2.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 sudo yetkisi
  • İ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ğunu apt-cache madison haproxy ile 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

restart yerine her zaman reload kullanı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

ParametreDeğerAçıklama
virtual_router_id51Farklı olursa iki düğüm de MASTER olur (split-brain)
auth_passVrrp2026Farklı olursa VRRP paketleri reddedilir
advert_int1Uyumsuzluk uyarı üretir
virtual_ipaddress10.10.34.99/24Aynı VIP
Subnet mask/24Ağı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

nopreempt yalnızca state BACKUP ile birlikte çalışır. state MASTER ile kullanılırsa yok sayılır.


9. Sorun Giderme

BelirtiOlası NedenÇözüm
İki düğümde de VIP var (split-brain)VRRP paketleri karşıya ulaşmıyorFirewall/VLAN kontrolü, tcpdump -i ens192 vrrp, virtual_router_id ve auth_pass eşleşmesi
HAProxy açılmıyor: cannot bind socketip_nonlocal_bind kapalısysctl net.ipv4.ip_nonlocal_bind = 1 olmalı
VIP taşınıyor ama trafik gelmiyorSwitch ARP tablosu güncellenmedivrrp_garp_master_refresh ayarı, hipervizör “Forged Transmits” izni
chk_haproxy hep FAULTBetik 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 uzunParolayı 8 karaktere indirin
Backend hep DOWNSağ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ışıyorvirtual_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 /metrics yayı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 üzerinde Entering MASTER STATE satı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

Muhammed Kerim Koç

1996 yılında Giresun Şebinkarahisarda dünyaya geldim. İlk ve orta öğretimi Şebinkarahisarda tamamladım. Liseyi Şebinkarahisar Anadolu Teknik ve Endüstri Meslek Lisesinde bitirdim. Üniversite için de Şebinkarahisar Teknik Bilimler Meslek Yüksek Okulunda Bilgisayar programcılığını okudum. Üniversite stajı için gelmiş olduğum özel bir firmada işe başladım. 5,5 yıl bu firmadan çalıştıktan sonra farklı bir sektör olan inşaat sektöründe Bilgi teknolojileri Uzmanı olarak 8 ay çalıştım. Daha sonra özel bir şirkette Sistem Network Sorumlusu olarak 4 ay çalıştıktan sonra proje sonlandırılmasından dolayı işten ayrıldım. Tekrar dan 5.5 yıl çalışmış olduğum firmaya Sistem ve Network Yöneticisi olarak geri döndüm ve çalışmaya başladım. Kendimi geliştirmek için Bilge Adam Akademi den Sistem Uzmanlığı eğitimi aldım. Sanallaştırma ve Ağ tarafında kendimi sürekli olarak geliştiriyorum.

İlgili Makaleler

Başa dön tuşu