两台linux虚机,分别安装keepalived和nginx。
master机器keepalived配置
global_defs {
router_id NodeA
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER #设置为主服务器
interface enp0s8 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 100 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.33.100/24 #VRRP HA虚拟地址
}
track_script {
chk_nginx
}
notify_master "/home/vagrant/nofity.py master "
notify_backup "/home/vagrant/notify.py backup"
}
slaver机器keepalived配置
global_defs {
router_id NodeB
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER #设置为主服务器
interface enp0s8 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 50 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.33.100/24 #VRRP HA虚拟地址
}
track_script {
chk_nginx
}
notify_master "/home/vagrant/notify.py master "
notify_backup "/home/vagrant/notify.py backup"
}
notify.py是主备机切换时候的邮件告警, 代码中的4个xxx需要根据自己调整
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import sys
import socket
import fcntl
import struct
import smtplib
from email.mime.text import MIMEText
mail_host="xxx"
mail_user="xxx"
mail_pass="xxx"
def send_mail(to_list,sub,content):
msg = MIMEText(content,_subtype='plain')
msg['Subject'] = sub
msg['From'] = mail_user
msg['To'] = ";".join(to_list)
try:
server = smtplib.SMTP()
server.connect(mail_host)
server.login(mail_user, mail_pass)
server.sendmail(mail_user, to_list, msg.as_string())
server.close()
except Exception, e:
print e
pass
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
mailto_list = ['xxx']
send_mail(mailto_list, "nginx keepalived changed", "nginx server [%s] chang to %s service" % (get_ip_address("xxx"), sys.argv[1]))
chk_nginx是检测nginx是否alived的脚本,由此判断是否停止keepalived服务
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
service keepalived stop
fi
fi
功能: 检测nginx进程是否alived,如果没有,尝试启动,如果失败,停止keepalived服务,然后vip就会漂移到备机。
评论
暂无评论~~