Zabbix Yüksek Erişilebilirlik Cluster Kurulumu
Üretim ortamında Zabbix çöktüğünde ne olduğunu bilen biri olarak söyleyeyim: izleme sisteminiz aşağı gittiğinde, aslında kör uçuşa geçmiş olursunuz. Tam o anda bir sunucu da çöker ve siz hiçbir şeyden haberdar olmazsınız. Bu yüzden Zabbix’in kendisini de yüksek erişilebilir hale getirmek, ciddi bir altyapı yöneticisi için tartışılmaz bir gereksinim haline geldi. Zabbix 6.0 ile birlikte gelen native HA cluster desteği, bu sorunu artık üçüncü parti araçlara gerek kalmadan çözüyor.
Zabbix Native HA Cluster Nedir ve Neden Önemlidir?
Zabbix 6.0 öncesinde yüksek erişilebilirlik için Pacemaker, Corosync ya da keepalived gibi araçları Zabbix’in üstüne entegre etmek gerekirdi. Bu çözümler işe yarasa da karmaşık yapılandırma gerektiriyordu ve bakımı ciddi zaman alıyordu. Zabbix 6.0 ile birlikte NodeAddress ve HANodeName gibi parametrelerle doğrudan Zabbix server yapılandırmasından cluster yönetimi yapılabilir hale geldi.
Native HA mimarisinde birden fazla Zabbix server node’u çalışır, ancak aynı anda yalnızca biri aktif durumdadır. Diğerleri standby modda bekler ve aktif node’un çökmesi durumunda devreye girer. Bu geçiş süreci otomatik olarak gerçekleşir ve Zabbix agent’ları, proxy’ler bu geçişten etkilenmez.
Kurulumumuzda şu bileşenler yer alacak:
- zabbix-node1 (192.168.10.11): Birincil Zabbix server node
- zabbix-node2 (192.168.10.12): İkincil Zabbix server node
- db-server (192.168.10.20): Paylaşımlı PostgreSQL veritabanı (ya da harici MySQL/MariaDB)
- Virtual IP (192.168.10.100): İstemcilerin bağlandığı sanal IP (keepalived ile yönetilecek)
Veritabanı paylaşımlı olmalı; bu mimari şartı değiştirmiyor. Her iki node da aynı DB’ye bağlanıyor. Fark şu: Zabbix kendi içinde hangi node’un aktif olduğunu DB’de tutuyor ve bunu koordine ediyor.
Gereksinimler ve Ön Hazırlık
Her iki node üzerinde de aşağıdaki adımları uyguluyoruz. Ortamımız Ubuntu 22.04 LTS, Zabbix 6.4 ve PostgreSQL 15.
Önce her iki sunucunun /etc/hosts dosyasına birbirlerini ekleyelim:
echo "192.168.10.11 zabbix-node1" >> /etc/hosts
echo "192.168.10.12 zabbix-node2" >> /etc/hosts
echo "192.168.10.20 db-server" >> /etc/hosts
Sistem saatlerinin senkronize olması kritik önem taşıyor. HA cluster’larda node’lar arası saat farkı koordinasyon sorunlarına yol açabilir:
apt install -y chrony
systemctl enable --now chrony
chronyc tracking
İki node’un da aynı NTP kaynağını kullandığından emin olun. Offset değerinin birkaç milisaniyenin altında kalması gerekiyor.
Zabbix Repository ve Paket Kurulumu
Her iki node üzerinde Zabbix 6.4 repository’sini ekliyoruz:
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
apt update
apt install -y zabbix-server-pgsql zabbix-frontend-php php8.1-pgsql
zabbix-apache-conf zabbix-sql-scripts zabbix-agent2
Dikkat: Frontend’i her iki node’a da kuruyoruz. Virtual IP üzerinden hangisi aktifse o frontend’e ulaşılacak, ama aslında her ikisi de aynı DB’ye bağlı olduğu için ikisinden de erişilebilir.
PostgreSQL Veritabanı Kurulumu
db-server üzerinde PostgreSQL’i kuruyoruz ve Zabbix için gerekli şemayı oluşturuyoruz:
apt install -y postgresql-15
sudo -u postgres createuser --pwprompt zabbix
sudo -u postgres createdb -O zabbix zabbix
# Şema yükleme - bu adım node1 üzerinden yapılacak
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz |
sudo -u zabbix psql -h 192.168.10.20 zabbix
PostgreSQL’in dışarıdan bağlantıya izin vermesi için postgresql.conf dosyasını düzenliyoruz:
# /etc/postgresql/15/main/postgresql.conf içinde
listen_addresses = '*'
max_connections = 200
# /etc/postgresql/15/main/pg_hba.conf içine ekleyin
host zabbix zabbix 192.168.10.11/32 scram-sha-256
host zabbix zabbix 192.168.10.12/32 scram-sha-256
Değişiklikleri uygulamak için PostgreSQL’i yeniden başlatın:
systemctl restart postgresql
Zabbix Server Yapılandırması
İşte kritik nokta burası. Her iki node’da /etc/zabbix/zabbix_server.conf dosyasını düzenliyoruz, ancak HANodeName ve NodeAddress parametreleri her node için farklı olacak.
Node1 üzerindeki yapılandırma:
# /etc/zabbix/zabbix_server.conf
DBHost=192.168.10.20
DBName=zabbix
DBUser=zabbix
DBPassword=güçlü_şifreniz_buraya
# HA Cluster parametreleri
HANodeName=zabbix-node1
NodeAddress=192.168.10.11:10051
# Performans ayarları - ortamınıza göre düzenleyin
StartPollers=50
StartPingers=10
StartDiscoverers=5
StartHTTPPollers=5
CacheSize=256M
HistoryCacheSize=128M
ValueCacheSize=64M
# Log ayarları
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=100
DebugLevel=3
Node2 üzerindeki yapılandırma (yalnızca değişen parametreler):
# /etc/zabbix/zabbix_server.conf - Node2'ye özgü değerler
HANodeName=zabbix-node2
NodeAddress=192.168.10.12:10051
# Diğer tüm parametreler node1 ile aynı
DBHost=192.168.10.20
DBName=zabbix
DBUser=zabbix
DBPassword=güçlü_şifreniz_buraya
HANodeName parametresi her node için benzersiz olmalı. Bu isim Zabbix’in veritabanında node’u tanımlamak için kullanılıyor. NodeAddress ise o node’un gerçek IP adresi ve portu.
keepalived ile Virtual IP Yapılandırması
Native Zabbix HA cluster, agent’ların hangi server’a bağlanacağını yönetmek için bir sanal IP gerektirmiyor ama web arayüzü ve bazı proxy yapılandırmaları için virtual IP kullanmak iyi pratik. Ayrıca agent’ların ServerActive parametresi için her iki node adresini virgülle ayırarak vermek de alternatif bir yöntem.
keepalived kurulumu her iki node’da:
apt install -y keepalived
Node1 için /etc/keepalived/keepalived.conf:
vrrp_script check_zabbix {
script "/usr/lib/nagios/plugins/check_procs -C zabbix_server -w 1: -c 1:"
interval 2
weight 10
fall 2
rise 1
}
vrrp_instance VI_ZABBIX {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass zabbix_ha_2024
}
virtual_ipaddress {
192.168.10.100/24 dev eth0
}
track_script {
check_zabbix
}
}
Node2 için fark eden parametreler:
# Node2'de state BACKUP, priority 100 olarak değiştirin
state BACKUP
priority 100
keepalived servisini her iki node’da başlatın:
systemctl enable --now keepalived
Virtual IP’nin node1’de aktif olduğunu doğrulamak için:
ip addr show eth0 | grep 192.168.10.100
Zabbix Server’ı Başlatmak ve HA Durumunu Kontrol Etmek
Her iki node’da Zabbix server’ı başlatıyoruz:
systemctl enable --now zabbix-server zabbix-agent2 apache2
# Servis durumunu kontrol edin
systemctl status zabbix-server
Node1’in aktif, node2’nin standby modda başlamasını bekliyoruz. Bunu doğrulamak için Zabbix server log’una bakabilirsiniz:
tail -f /var/log/zabbix/zabbix_server.log | grep -i "HA|cluster|active|standby"
Ya da doğrudan veritabanından sorgu atabilirsiniz:
sudo -u postgres psql -h 192.168.10.20 -U zabbix -d zabbix -c
"SELECT name, address, status, lastaccess FROM ha_node;"
Bu sorgunun çıktısında active ve standby durumlarını göreceksiniz. lastaccess sütunu node’ların ne zaman son kez DB’ye eriştiğini gösteriyor; bu değer birkaç saniyede bir güncelleniyor. Eğer bir node 30 saniyeden uzun süre DB’ye erişmezse diğer node aktif moda geçiyor.
Zabbix Frontend Yapılandırması
Her iki node’daki Apache frontend’ini aynı şekilde yapılandırıyoruz. /etc/zabbix/web/zabbix.conf.php dosyası her iki node’da aynı içeriğe sahip olmalı:
<?php
$DB['TYPE'] = 'POSTGRESQL';
$DB['SERVER'] = '192.168.10.20';
$DB['PORT'] = '5432';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'güçlü_şifreniz_buraya';
$DB['SCHEMA'] = '';
$DB['ENCRYPTION'] = false;
$ZBX_SERVER = '192.168.10.100';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'Zabbix HA Cluster';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
$ZBX_SERVER değeri olarak virtual IP’yi kullanıyoruz. Bu sayede web arayüzü her zaman aktif node ile konuşuyor.
Failover Testleri
Kurulumu yaptık, peki gerçekten çalışıyor mu? Bunu test etmeden üretime almayın. Failover testleri yaparken şu senaryoları deneyin:
Senaryo 1: Zabbix server servisini durdur
# Node1 üzerinde
systemctl stop zabbix-server
# Node2 üzerinde HA durumunu izle
watch -n 2 "sudo -u postgres psql -h 192.168.10.20 -U zabbix -d zabbix -c
"SELECT name, status, lastaccess FROM ha_node;""
Yaklaşık 30-60 saniye içinde node2’nin active statüsüne geçtiğini görmelisiniz. Bu süre ZabbixServer yapılandırmasındaki timeout değerlerine bağlı.
Senaryo 2: Sunucuyu tamamen kapat
# Node1'i tamamen kapat
shutdown -h now
Bu senaryoda hem keepalived devreye girip virtual IP’yi node2’ye taşımalı, hem de Zabbix cluster node2’yi aktif yapmalı.
Senaryo 3: Network bölünmesi simülasyonu
# Node1'den DB sunucusuna erişimi geçici olarak kes
iptables -A OUTPUT -d 192.168.10.20 -j DROP
# 60 saniye bekle, sonra node2'nin devreye girip girmediğini kontrol et
# Testi bitirince kuralı kaldır
iptables -D OUTPUT -d 192.168.10.20 -j DROP
Bu testlerin sonuçlarını kayıt altına alın. Failover sürenizi bilmek, RTO (Recovery Time Objective) hesaplamalarınız için kritik.
Zabbix Agent Yapılandırması HA Ortamında
Zabbix agent’lar, aktif izleme modunda ServerActive parametresini kullanır. HA ortamında agent’ların her iki node’u bilmesi gerekir:
# /etc/zabbix/zabbix_agent2.conf
Server=192.168.10.100
ServerActive=192.168.10.11:10051,192.168.10.12:10051
Hostname=izlenen-sunucu-hostname
ServerActive için virgülle ayrılmış liste vererek agent’ın her iki node’a da bağlanmayı denemesini sağlıyoruz. Agent aktif node’a bağlanacak ve diğerinde bağlantı kuramayacak, bu normal bir durum.
Yaygın Sorunlar ve Çözümleri
Gerçek hayatta karşılaştığım birkaç sorun ve çözümleri:
Problem: Her iki node da aktif görünüyor
Bu split-brain durumu genellikle DB bağlantı sorunlarından kaynaklanır. Kontrol edilecekler:
pg_hba.confher iki node için de doğru izinlere sahip mi?- Node’lar arası firewall kuralları DB portuna (5432) izin veriyor mu?
lastaccessdeğerleri gerçek zamanlı güncelleniyor mu?
Problem: Failover çok uzun sürüyor
Zabbix’in varsayılan failover süresi yaklaşık 60 saniye. Bunu hızlandırmak için zabbix_server.conf‘a ekleyin:
# Her iki node'da bu değeri düşürebilirsiniz
# Minimum 10 saniye önerilir
# Bu parametre Zabbix 6.2+ ile geldi
HAFailoverDelay=30
Problem: Frontend HA durumunu göstermiyor
Administration > High Availability bölümünde node’ları görmüyorsanız, web arayüzünün doğru DB’ye bağlandığını ve $ZBX_SERVER değerinin doğru ayarlandığını kontrol edin.
İzleme Altyapısının Kendisini İzlemek
Biraz ironic ama doğru: Zabbix cluster’ınızın kendisini de izlemeniz gerekiyor. Bunun için harici bir izleme noktası kullanmak ideal. Birkaç seçenek:
- Başka bir lokasyondaki küçük bir Zabbix proxy
- Basit bir cron job ile Zabbix API kontrolü
- Uptime Kuma ya da benzeri hafif bir araç
En basit kontrol için her iki node’da şu scripti çalıştırabilirsiniz:
#!/bin/bash
# /usr/local/bin/check-zabbix-ha.sh
DB_HOST="192.168.10.20"
DB_USER="zabbix"
DB_PASS="şifreniz"
DB_NAME="zabbix"
ACTIVE_NODE=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -t -c
"SELECT name FROM ha_node WHERE status='active';" 2>/dev/null | tr -d ' n')
if [ -z "$ACTIVE_NODE" ]; then
echo "CRITICAL: HA cluster'da aktif node bulunamadı!"
# Alarm gönder - mail, Telegram, Slack...
exit 2
else
echo "OK: Aktif node: $ACTIVE_NODE"
exit 0
fi
Bu scripti cron’a ekleyin ve sonucu bir yere raporlayın.
Performans ve Kapasite Planlama
HA cluster kurduğunuzda dikkat etmeniz gereken bir nokta var: standby node’lar da DB’ye bağlı ama veri yazmıyor. Yine de DB connection pool’una bağlantı açıyorlar. 10 node’luk bir cluster düşünüyorsanız PostgreSQL’in max_connections değerini buna göre artırmanız gerekiyor.
Her Zabbix server node, yapılandırmanıza bağlı olarak 50-200 arasında DB bağlantısı açabilir. PgBouncer kullanmak bu noktada çok mantıklı:
apt install -y pgbouncer
# /etc/pgbouncer/pgbouncer.ini
[databases]
zabbix = host=192.168.10.20 port=5432 dbname=zabbix
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
pool_mode = transaction
max_client_conn = 500
default_pool_size = 50
PgBouncer kullanıyorsanız Zabbix’in DBHost ve DBPort değerlerini PgBouncer’ı gösterecek şekilde güncelleyin.
Sonuç
Zabbix native HA cluster, özellikle 6.0 sürümünden itibaren kurulumu ve yönetimi önceki dönemlere kıyasla ciddi ölçüde kolaylaştı. İki node ile başlayıp sonradan üçüncü, dördüncü node eklemek de mümkün; her yeni node için zabbix_server.conf‘ta benzersiz bir HANodeName ve NodeAddress tanımlamak yeterli.
Üretime almadan önce mutlaka failover testleri yapın ve bu testlerin sonuçlarını belgeleyin. Failover sürenizi bilin, RTO değerinizi belirleyin. Zabbix cluster’ın kendisini izlemek için harici bir mekanizma kurun çünkü izleme sisteminizin çöktüğünü sadece kullanıcı şikayetlerinden öğrenmek kabul edilemez bir durum.
Son olarak: Bu mimariyi kurarken veritabanını da yüksek erişilebilir hale getirmeyi düşünün. PostgreSQL streaming replication ya da Patroni ile DB katmanını da HA yapmazsanız, Zabbix cluster’ınızda single point of failure olarak DB kalır. Gerçek bir HA mimarisi için tüm katmanların dayanıklı olması gerekiyor.
