Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
keepalived的安装:
yum -y install keepalived
keepalived的配置文件分三段:
# vim/etc/keepalived/keepalived.conf
全局配置:
global_defs { notification_email { root@localhost ----->邮件通知给谁 } notification_email_from [email protected] smtp_server 172.16.249.224 ---->从那个服务器上发出的邮件 smtp_connect_timeout 30 ---->连接超时时间 router_id LVS_DEVEL ---->路由器的标识 }
VRRP实例配置
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 ---虚拟路由ID号,来源于Vmack的最后一段。不能大于255 ID定义号mack就定义好了 priority 100 ---优先级 advert_int 1 ---通告时间间隔 authentication { ---认证 auth_type PASS auth_pass 1111 } virtual_ipaddress { ---虚拟地址VIP IPADDR/MASK[vip及其子网掩码] brd <IPADDR>[广播地址] dev[配置在那个网卡接口] scope [网卡的生效范围] label [网卡别名ip addr配置,ip addr show 查看] 示例: 192.168.2.110/24 255.255.255.255 dev eth0 label eth0:0 } }
ipvs规则的配置:
virtual_server 192.168.200.100 443 { --->Director ip 和端口 delay_loop 6 lb_algo rr --->调度方法 lb_kind NAT --->NAT模式 nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP ---协议 real_server 192.168.201.100 443 { --->Real Server ip 和端口 weight 1 --->权重 SSL_GET { ---获取方法 url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc --->针对那个页面做摘要检测 } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 --->连接超时时间 nb_get_retry 3 --->连接次数 delay_before_retry 3 --->到下一次连接的延迟时长 } } }
一:Director Server 高可用的配置:
主节点的配置:
global_defs { notification_email { root@localhost } notification_email_from admin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 35 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.100
从节点配置:
global_defs { notification_email { root@localhost } notification_email_from admin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 35 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.100
主节点启动keepalive
# service keepalived start
查看日志信息
# tail -f /var/log/messages
查看网卡配置信息:
# ip addr show
启动从节点:查看日志信息:
我们停止掉主节点服务查看VIP是否会转移到从节点,以及从节点BACKUP-MASTER的转换。
# service keepalived stop
查看从节点的日志信息:
查看从节点的IP配置信息:
当我们开启主节点keepalived服务的时候,VIP会转换回主节点,并提升为MASTER模式,从节点会降为BACKUP,因为主节点的优先级比从节点的优先级高,keepalived默认工作模式是抢占模式。
主节点的健康状态检测,我们可以基于脚本以及脚本追踪机制来实现,并完成资源转移
在globle添加如下项:
vrrp_script chk_keepalived_down { script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -2 }
在配置实例添加脚本追踪:
track_script { chk_keepalived_down }
当我们在/etc/keepalived/目录下创建down文件的时候主节点就会降低优先级,这样就会被从节点强占MASTER并转移VIP资源。
注意:从节点也是相同的配置
keepalived状态转换时的通知机制的实现:
通常在vrrp_instance VI_1 {
}中使用脚本实现
也可以用在vrrp_sync_group{
}中
第一种方法:
# to MASTER transition
notify_master /path/to_master.sh
# to BACKUP transition
notify_backup /path/to_backup.sh
# FAULT transition
notify_fault "/path/fault.sh VG_1"
可以分别写三个状态模式的脚本,并在track_script {
}脚本中定义追踪。
第二种方法:一个脚本接受3个参数:
# $1 = "GROUP"|"INSTANCE"
# $2 = name of group or instance
# $3 = target state of transition
# ("MASTER"|"BACKUP"|"FAULT")
notify /path/notify.sh
$1 引用当前的组或实例,明确说明这是那一个实例。对那一个实例中的节点状态转换进行监控。要定义你是选择的是group还是instance
$2:组或实例的名称
$3:说明是转换成什么状态通知的。
脚本示例: 两个节点都需要配置:
vip=192.168.2.100 contact='root@localhost' notify() { mailsubject="`hostname`became $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; esac
别忘了给脚本一个执行权限:
# chmod +x notify.sh
执行脚本./notify.sh
查看邮件mail
接着我们把写好的脚本定义实例配置中:
vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 35 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_keepalived_down } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" virtual_ipaddress { 192.168.2.100 }
检测是否会有通知:
# touch down # mail
二:N基于keepalived实现ipvs的配置实现:
配置文档简介:
1:virtual_server的相关配置: # virtual_server IP port ---基于ip # virtual_server fwmark int ---基于防火墙标记,实现用iptables 写好规则,打好标记 # virtual_server group string ---多个虚拟机定义一个组,把一个组定义成一个虚拟服务需要一同转移。 # lb_algo rr|wrr|lc|wlc|sh|dh ---负载均衡的调度方法 # lb_kind NAT|DR|TUN ---LVS的模式 # persistence_timeout ---持久连接的时间 # protocol TCP ---协议 # sorry_server ipaddr port ---所有Real Server全挂掉以后提供网页的Server 2:Real Server的相关配置: # weight 1 ---权重 # notify_up # nptify_down ---当这个Real Server UP或者DOWN了发送的通知脚本 # SSL_GET|HTTP_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK ---健康状态检测机制 # connect_timeout 3 ---连接超时时间 # nb_get_retry 3 ---连接尝试次数 # delay_before_retry 3 ---到下一次连接时的延迟时间
配置思路:
1:定义virtual_server的VIP 端口,子网掩码,协议。
2:Real Server的real ip,端口,健康检查机制。
3:别的选项可以默人,也可以根据实际情况进行修改。
配置实例:
virtual_server 192.168.2.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.0.0 persistence_timeout 50 protocol TCP real_server 192.168.2.120 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
安装ipvsadm查看效果
# yum -y install ipvsadm # ipvsadm -L -n
三:Nginx的高可用
基于通知脚本实现:
让脚本中状态转换的时候顺便执行nginx服务的启动脚本即可
#!/bin/bash # Author: MageEdu <[email protected]> # description: An example of notify script # vip=192.168.2.100 contact='root@localhost' notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; *) echo 'Usage:`basename $0` {master|backup|fault}' exit 1 ;; esac
测试:
1:提供两个不同的Nginx测试页面:
从节点:192.168.2.115的测试页面
主节点:192.168.2.113的测试页面
2:启动双节点的keepalived,并在主节点启动Nginx服务,访问页面
3:在主节点/etc/keepalived/创建down文件,让主节点的keepalived停止服务,在访问页面
可以看到主节点的VIP和80端口都不在了。在看从节点:
可以看到VIP已转移,80端口已启用,我们访问网页测试:
基于服务的健康检测监控,当Nginx服务停止以后实现的转移
监控脚本:通过访问站点主页面获取相应码来实现服务健康检测。
第一个节点
#!/bin/bash url="http://192.168.2.100/index.html" status=$(/usr/bin/curl -s --head "$url" | awk '/HTTP/ {print $2}') if [ "$status" != "200" ]; then /etc/init.d/keepalived stop fi
keepalived.conf的配置信息:
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 1 weight -2 } vrrp_instance Nginx_1 { state MASTER interface eth0 virtual_router_id 35 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx chk_keepalived } virtual_ipaddress { 192.168.2.200 } } vrrp_instance Nginx_2 { state BACKUP interface eth0 virtual_router_id 36 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.222 } }
第二个节点:
脚本配置:
#!/bin/bash url="http://192.168.2.115/index.html" status=$(/usr/bin/curl -s --head "$url" | awk '/HTTP/ {print $2}') if [ "$status" != "200" ]; then /etc/init.d/keepalived stop fi
第二节点keepalived。conf的配置信息:
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 1 weight -2 } vrrp_instance Nginx_1 { state BACKUP interface eth0 virtual_router_id 35 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.200 } } vrrp_instance Nginx_2 { state MASTER interface eth0 virtual_router_id 36 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx chk_keepalived } virtual_ipaddress { 192.168.2.222 } } track_script { chk_nginx chk_keepalived } virtual_ipaddress { 192.168.2.222 } }
我们kill掉一个节点的Nginx务:查看转移情况:
双主模式其实就是配置两个vrrp_instance 互为主备,需要提醒大家的是基于服务脚本的访问ip一定是本机的真实ip而不是virtual ip。OK,基于keepalive 实现的lvs nginx 以及双主模式nginx的高可用已全部实现。