2015-03-08 3 views
0

Что происходит? Когда я начинаю keepalived, все работает нормально. Когда node01 терпит неудачу и он не может начать postgresql, он будет постоянно пытаться заставить выборы. Даже если postgresql не может начаться. Выборы происходят каждую секунду.keepalived script делает переход на другой ресурс безумным

Что я хочу достичь Он должен проверить, PostgreSQL может быть запущен на node01 когда node02 является хозяином, а не силой на выборах все время. Может кто-то попытаться помочь и понять?

Это мой код

стоп-PgSQL:

#!/usr/bin/python 

import sys 
import subprocess 

sys.exit(
    subprocess.call(['/usr/bin/systemctl', 'stop', 'postgresql.service']) 
) 

уведомить:

#!/usr/bin/python 

import sys 
import subprocess 

state = sys.argv[3] 

with open('/var/run/keepalived.pgsql.state', 'w+') as f: 
    f.write(state) 

if state == 'MASTER': 
    sys.exit(
     subprocess.call(['/usr/bin/systemctl', 'start', 'postgresql.service']) 
    ) 

if state == 'BACKUP': 
    sys.exit(
     subprocess.call(['/usr/bin/systemctl', 'stop', 'postgresql.service']) 
    ) 

if state == 'FAULT': 
    sys.exit(
     subprocess.call(['/usr/bin/systemctl', 'stop', 'postgresql.service']) 
    ) 

регистрация PgSQL:

#!/usr/bin/python 

import sys 
import subprocess 
from time import sleep 

sleep(1) 

with open('/var/run/keepalived.pgsql.state', 'r') as f: 
    state = f.read().strip().strip("\n") 

# status 0: Postgresql is running 
# status 3: Postgresql has been stopped 
status = subprocess.call(['/usr/bin/systemctl', 'status', 'postgresql.service']) 

if status == 0 and state == 'MASTER': 
    sys.exit(0) 

if status == 0 and state == 'BACKUP': 
    sys.exit(3) 

if status == 3 and state == 'MASTER': 
    sys.exit(3) 

if status == 3 and state == 'BACKUP': 
    sys.exit(0) 

keepalived config:

vrrp_script chk_pgsql { 
    script  "/etc/keepalived/check-pgsql" 
    interval 1 
    fall 3 
    rise 3 
    weight -4 
} 

vrrp_instance pgsql_vip { 
    state EQUAL 
    interface eth0 
    virtual_router_id 4 
    priority 100(node01)|99{node02} 
    advert_int 1 
    authentication { 
     auth_type PASS 
     auth_pass 1111 
    } 
    track_script { 
     chk_pgsql 
    } 
    virtual_ipaddress { 
     192.168.1.20 
    } 
    notify "/etc/keepalived/notify" 
    notify_stop "/etc/keepalived/stop" 
} 

ответ

0

После того, как node01 умирает, node02 получает избранный мастер. Затем узел01 проверяется вашим скриптом проверки. Скрипт видит, что node01 теперь находится в состоянии BACKUP, а posgresql остановлен и возвращает 0. После того, как скрипт проверки вернется 0 3 раза (на основе вашей конфигурации VRRP), node01 считает, что все в порядке. Затем, поскольку node01 имеет более высокий приоритет, чем node02, он контролирует процесс выборов. Затем скрипт проверки выходит из строя, потому что node01 находится в состоянии MASTER, а posgresql остановлен. Это приводит к тому, что они начинают ломаться между узлами.

Я думаю, вы могли бы решить эту проблему в один из 2 способов:

  1. делают node01 и node02 равный приоритет
  2. изменить ваш чек сценарий просто вернуть статус PosgreSQL