keepalived+nginx,实现nginx高可用
- VIP不需要在服务器网络配置文件中配置。一般为未使用的IP充当虚拟IP
- nginx主不可用时,需要kill掉nginx主的keepalived服务,这样才可以实现VIP切换,因为主的keepalived优先级高。
- 故障切换即keepalived主备切换 触发notify_maste(节点变成主节点)指定的脚本
- keepalived自带的邮件通知基于sendmail 不推荐使用
- 配置文件 /etc/keepalived/keepalived.conf
全局配置
# 全局def配置块
global_defs {
# 将接收通知邮件的电子邮件帐户
notification_email {
coldsmog@foxmai.com
}
# sendmail 发送者
notification_email_from coldsmog.work@foxmai.com
# smtp 用于发送邮件通知的服务器地址
smtp_server host
# 指定SMTP处理超时
smtp_connect_timeout 30
# 指定LVS主管的姓名 一般为本机的hostname
lvs_id string
}
虚拟服务器配置
# 虚拟服务器定义块
virtual_server (@IP PORT)|(fwmark num) {
# 以秒为单位指定两次检查之间的间隔
delay_loop 6
# 选择特定的调度程序(rr|wrr|lc|wlc|sh|dh|lblc)
lb_algo rr
# 选择特定的转发方式(NAT|DR|TUN)
lb_kind NAT
# 如果您不将LVS与Linux内核2.2系列一起使用,则“ nat_mask”关键字已过时。该标志使您能够定义反向NAT粒度。
(nat_mask @IP)
# 指定持久连接的超时值
persistence_timeout 50
# 为持久连接指定粒度掩码
persistence_granularity @IP
# 指定用于HTTP | SSL_GET的HTTP虚拟主机
virtualhost string
# 指定协议种类(TCP|UDP)
protocol TCP
# 如果所有真实服务器都已关闭,则将服务器添加到池中
sorry_server @IP PORT
# 指定一个真实的服务器成员
real_server 192.168.201.100 443 {
# 权重
weight 1
# 使用TCP连接检查实际服务器的可用性
TCP_CHECK {
connect_port num
connect_timeout num
}
}
real_server 192.168.200.1 1358 {
weight 1
# 使用用户定义的脚本检查实际服务器的可用性
MISC_CHECK {
# 不需要携带参数
misc_path /path_to_script/script.sh
# 对于需要自变量的脚本,路径和参数必须用双引号(“)引起来
(or misc_path “ /path_to_script/script.sh <arg_list>”)
}
}
real_server 192.168.200.2 1358 {
weight 1
# 使用(HTTP_GET|SSL_GET)请求检查实际服务器的可用性
HTTP_GET {
# 可以添加多个URL块
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
VRRP实例配置
# 标识VRRP同步实例组
vrrp_sync_group string {
group {
string
string
}
# 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
notify_master /etc/keepalived/send_mail.sh
notify_backup /etc/keepalived/send_mail.sh
notify_fault /etc/keepalived/send_mail.sh
}
# VRRP实例定义块
vrrp_instance VI_1 {
# 声明节点实例状态 (MASTER|BACKUP)
state MASTER
# 指定要在其上运行实例的网络接口 一般为eth0
interface eth0
# 本机IP地址
mcast_src_ip @IP
# 指定要在其上运行lvs_sync_daemon的网络接口
lvs_sync_daemon_interface eth0
# 指定实例所属的VRRP路由器ID, 相同的VRID为一个组,他将决定多播的MAC地址,一般为VIP(xx.xx.xx.73)最后一段
virtual_router_id 73
# 在VRRP路由器中指定实例优先级
priority 100
# 组播信息发送间隔,两个节点设置必须一样,默认1s
advert_int 1
# 激活SMTP通知以进行主状态转换
smtp_alert
#
authentication {
# 指定要使用的身份验证类型(PASS|AH)
auth_type PASS
# 指定要使用的密码字符串 同组节点必须一致
auth_pass string
}
# VRRP VIP定义块 注意VIP必须是没有使用过的IP
virtual_ipaddress { # 限制为20个IP地址
172.16.xx.73
}
virtual_ipaddress_excluded { # 排查IP地址
@IP
@IP
}
# 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
notify_master /etc/keepalived/send_mail.sh
notify_backup /etc/keepalived/send_mail.sh
notify_fault /etc/keepalived/send_mail.sh
}
Nginx 检查脚本
如果nginx停止运行,尝试启动,如果无法启动则杀死本机的keepalived进程,keepalied将虚拟ip绑定到BACKUP机器上vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
来个示例
! Configuration File for keepalived
global_defs {
router_id esignweb-prod1
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测nginx状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 80
mcast_src_ip 172.16.18.73
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
## 将track_script块加入instance 配置块
track_script {
chk_nginx ## 执行Nginx监控的服务
}
## 虚拟IP池, 两个节点设置必须一样
virtual_ipaddress {
172.16.18.80
}
}
参考 https://github.com/acassen/keepalived
参考 https://www.cnblogs.com/John-2011/p/7838794.html
参考 http://my.oschina.net/hncscwc/blog/158746