disimpan VRRP_script tidak gagal

11

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.

Nvasion
sumber
Apakah instance cadangan Anda memperhatikan prioritas berubah atau mencatat sesuatu? Log dari keduanya akan sangat membantu.
Jim G.
Tidak. Satu-satunya waktu pemberitahuan perubahan adalah ketika master pergi. Seperti saat aku berhenti kenang-kenangan. Menghentikan proses yang saya pantau hanya menunjukkan VRRP_Script (chk_script) gagal pada master. Tanpa apa-apa pada budak.
Nvasion

Jawaban:

13

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:

vrrp_instance haproxy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1

CADANGAN:

vrrp_instance haproxy {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1

Naskah Check_script:

vrrp_script chk_haproxy {
   script "python /root/ha_check.py"
   interval 2     # check every 2 seconds
   weight 2
   rise 2
   fall 2

}

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

giomanda
sumber
Sepertinya juga tidak menentukan bobot sama sekali berarti bahwa track_script yang gagal akan memicu status kesalahan secara langsung
Oscar
@Nvasion: Mohon terima jawaban ini karena saya juga menyelesaikan masalah saya.
Ankur Soni
4

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:

iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
iptables -A INPUT -p vrrp -i eth0 -j ACCEPT

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.

  • Track_script bukan tipe aktif / nonaktif ("jika skrip OK: memenuhi syarat untuk pemilihan VIP; jika TIDAK OK: benar-benar tidak memenuhi syarat untuk pemilihan VIP") - itu hanya meningkatkan / mengurangi kemungkinan memenangkan pemilihan, dan jika hanya disimpan saja pernah mengamati dirinya sebagai satu - satunya pembicara VRRP dan tidak pernah menerima pesan dari pembicara lain, benar-benar tidak banyak pemilihan - Anda selalu menang.
Patrick Wagner
sumber
0

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 ,

If the Priority in the ADVERTISEMENT is Zero, then:

  o  Set the Master_Down_Timer to Skew_Time
else:

  If Preempt_Mode is False, or If the Priority in the
  ADVERTISEMENT is greater than or equal to the local
  Priority, then:

    o Reset the Master_Down_Timer to Master_Down_Interval
  else:

    o Discard the ADVERTISEMENT
  endif
endif

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,

  1. 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.

  2. Matikan nopreempt pada simpul BACKUP ke-2.

  3. Setel bobot setidaknya -2 pada simpul BACKUP ke-1.

Yu Watanabe
sumber