Jadi saya menjalankan keepalived di dua server dan saya tidak bisa mendapatkannya failover ke yang lain.
Di bawah ini saya memiliki konfigurasi saya untuk salah satu server. Satu-satunya yang berbeda antara keduanya adalah nomor prioritas master 110 dan kembali 109.
Tetapi ketika saya menghentikan proses saya dengan /etc/init.d/process stop keepalived tidak gagal lagi. Saya hanya mendapatkan VRRP_Script (chk_script) gagal dan tidak ada yang lain. Tidak ada kegagalan atau tidak sama sekali.
vrrp_script chk_script {
script "/usr/local/bin/failover.sh"
interval 2
weight 2
}
vrrp_instance HAInstance {
state BACKUP
interface eth0
virtual_router_id 8
priority 109
advert_int 1
nopreempt
vrrp_unicast_bind 10.10.10.8
vrrp_unicast_peer 10.10.10.9
virtual_ipaddress {
10.10.10.10/16 dev eth0
}
notify /usr/local/bin/keepalivednotify.sh
track_script {
chk_script weight 20
}
}
Ini adalah chk_script saya di bawah ini. Masalah yang sama juga terjadi ketika saya melakukan killall -0 proses sebagai skrip saya.
!/bin/bash
SERVICE='process'
STATUS=$(ps ax | grep -v grep | grep $SERVICE)
if [ "$STATUS" != "" ]
then
exit 0
else
exit 1
fi
Adakah yang tahu cara memperbaikinya? Terima kasih.
linux
keepalived
Nvasion
sumber
sumber
Jawaban:
Saya memiliki masalah yang persis sama namun masalah saya bukan di firewall atau di adaptor Ethernet saya tetapi dalam pengaturan "berat" dari skrip cek.
Ini adalah konfigurasi saya:
MENGUASAI:
CADANGAN:
Naskah Check_script:
}
Alasan master menolak untuk merilis VIP adalah karena meskipun skrip telah gagal, master masih memiliki nomor prioritas yang lebih tinggi dari server CADANGAN. Ini terjadi karena pengaturan "weight" pada check_script tidak cukup untuk menutupi "GAP" antara nomor prioritas, yang berarti meningkatkan nomor prioritas server BACKUP lebih besar daripada yang MASTER Server. Saya akan menjelaskan lebih lanjut:
Menurut manual keepalived, angka positif pada pengaturan "berat" akan menambahkan nomor itu ke prioritas jika cek berhasil.
Angka negatif akan mengurangi angka itu dari nomor prioritas jika pemeriksaan gagal.
Jadi, sesuai dengan konfigurasi saya:
Prioritas Server Kegagalan skrip sebelumnya:
MASTER: 152
BACKUP: 100
Failover_IP: MASTER
IP failover secara benar "diraih" oleh server master karena Master memiliki prioritas lebih tinggi dibandingkan dengan server cadangan (152> 100)
Prioritas Server SETELAH kegagalan skrip:
MASTER server: 148
BACKUP server: 102
Failover_IP: STILL ON MASTER
IP failover masih di server master karena Master memiliki prioritas lebih tinggi dibandingkan dengan CADANGAN (148> 102). Server MASTER menolak untuk melepaskan IP dan benar dia melakukannya karena prioritasnya lebih tinggi daripada server lain.
Solusi untuk situasi saya adalah:
Solusi -1: Ubah nomor prioritas kedua server sehingga mereka tidak memiliki banyak "GAP".
Sebagai contoh:
Prioritas Utama: 150
Prioritas Cadangan: 149
Berat check_script: Seperti apa adanya (2).
Dengan konfigurasi di atas, ketika skrip berhasil (artinya semuanya ok) prioritasnya adalah:
Master: 152
Backup: 149
IP_Location: On Master (152> 149)
Ketika skrip gagal:
Master: 150
Backup: 151
IP_Location: On Backup (151> 150)
Solusi - 2: Ubah jumlah bobot skrip dari 2, menjadi -60
sumber
Saya memiliki masalah yang sama - dua CentOS 7.1 server dengan track_script, dan gagal vrrp_script pada MASTER hanya akan menghasilkan pesan log tunggal "VRRP_Script (chk_script) gagal", bukan dalam failover. Di server CADANGAN, saya mendapat banyak pesan yang disimpan untuk mencoba mengambil alih IP virtual selama saya memiliki track_script pada server MASTER gagal.
Solusi dalam kasus saya: Firewall (iptables) pada server MASTER tidak dikonfigurasi dengan benar untuk memungkinkan paket VRRP / paket multicast, sementara pada saat yang sama firewall di server lain, BACKUP, dikonfigurasi dengan benar.
Saya telah memasukkan aturan iptables yang sama ke kedua server sebagai berikut:
Ini bekerja pada salah satu server (server BACKUP VRRP) tetapi bukan yang MASTER karena saya lupa bahwa antarmuka tidak bernama 'eth0' pada server MASTER, sehingga kedua aturan tidak berpengaruh sama sekali.
Ini menjelaskan perilaku yang saya amati:
Jika keepalived tidak dapat melihat speaker VRRP lain untuk virtual_router_id tertentu, ia tetap percaya bahwa dirinya adalah yang memiliki prioritas tertinggi (sehingga MASTER sah) bahkan setelah modifikasi bobot negatif karena tidak pernah menerima pesan VRRP dengan prioritas yang lebih tinggi daripada miliknya sendiri ( karena iklan dari pengeras suara lain diblokir oleh firewall dan tidak pernah dapat mencapai proses yang disimpan untuk membuatnya sadar akan mereka). Itu sebabnya Anda tidak melihatnya merilis VIP.
Server BACKUP, bagaimanapun, dapat melihat iklan MASTER (sekarang gagal), menemukan prioritas dalam paket-paket tersebut dikurangi menjadi nilai yang lebih rendah daripada nilai miliknya, dan melanjutkan untuk mendeklarasikan dirinya MASTER dan mengirimkan ARP gratis untuk mengklaim VIP. Jadi kami berakhir dalam situasi di mana kedua server berpikir mereka perlu melayani VIP sebagai MASTER.
Kesimpulan: - Selalu periksa konfigurasi firewall pada semua speaker VRRP jika Anda mengalami perilaku aneh (tidak ada failover, beberapa MASTER). Keepalived logging tidak cukup membantu seperti yang seharusnya (pesan sederhana "VIP tidak dirilis karena saya masih prio tertinggi" setelah "VRRP_Script (chk_script) gagal" baris akan sangat memudahkan pemecahan masalah.
sumber
Saya baru saja bertemu dengan situasi yang sama seperti Anda dan melakukan beberapa belajar tentang tetap hidup. Mari kita pikirkan apa yang terjadi di setiap server. Dengan asumsi Anda ingin menerapkan arsitektur failback manual,
Pada simpul CADANGAN 1
Setiap kali track_script gagal jumlah kali jatuh itu mengirimkan iklan ke simpul BACKUP ke-2. Poin di sini adalah Prioritas yang ditetapkan di dalam iklan. Dalam kasus anda,
129 (109 + 20)
dikirim ke server CADANGAN 2.
Di server CADANGAN ke-2
Berikutnya adalah pada simpul BACKUP ke-2.
Menurut RFC ,
Karena, Anda telah mengaktifkan nopreempt dan menerima vrrp prioritas yang lebih tinggi, simpul BACKUP ke-2 tidak akan menyatakan fase transisi.
Larutan
Jadi jika Anda ingin membuat transisi keadaan terjadi pada simpul ke-2, Anda juga bisa,
Setel bobot ke 0 pada simpul BACKUP 1. Ini akan mengirimkan iklan Prioritas 0 ke simpul BACKUP ke-2. doc menjelaskan lebih lanjut tentang berat 0.
Matikan nopreempt pada simpul BACKUP ke-2.
Setel bobot setidaknya -2 pada simpul BACKUP ke-1.
sumber