一、高可用原理
1、VRRP是什么
keepalived主要使用的是VRRP功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的就是解决静态路由出现的单点故障问题。
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
2、VRRP选举机制
VRRP路由器在运行过程中有三种状态:
1. Initialize状态: 系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;
2. Master状态;
3. Backup状态;
一般主路由器处于Master状态,备份路由器处于Backup状态。
VRRP使用选举机制来确定路由器的状态,优先级选举:
1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
3.比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
如下图所示,虚拟IP为10.1.1.254,在VRRP组中没有IP地址拥有者,则比较优先级,很明显RB和RA的优先级要大于RC,则比较RA和RB的IP地址,RB的IP地址大。所以RB为组中的主路由器。
路由器使用VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master 路由器,优先级低的成为Backup 路由器。Master 拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP 报文,通知备份组内的其他设备自己工作正常;Backup 路由器只接收Master 发来的报文信息,用来监控Master 的运行状态。当Master 失效时,Backup 路由器进行选举,优先级高的Backup 将成为新的Master 。
在抢占方式下,当Backup 路由器收到VRRP 报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master 路由器;否则将保持Backup状态;
在非抢占方式下,只要Master 路由器没有出现故障,备份组中的路由器始终保持Master 或Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器;
如果Backup 路由器的定时器超时后仍未收到Master 路由器发送来的VRRP报文,则认为Master 路由器已经无法正常工作,此时Backup 路由器会认为自己是Master 路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master 路由 器,承担报文的转发功能。
二、安装
1、环境
vip:192.168.0.16
server1:192.168.1.60
server2:192.168.1.65
centos 7
2、两台机器都安装keepalived
# cd /usr/local/src
# tar -zxvf keepalived-1.4.5.tar.gz
# cd keepalived-1.4.5
# ./configure --prefix=/usr/local/keepalived
# make && make install
拷贝文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ #这个文件可能没有,需要手动创建
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
这个文件可能没有,需要手动创建,/usr/local/keepalived/etc/rc.d/init.d/keepalived ,内容:
#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived
# Source function library
. /etc/rc.d/init.d/functions
# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived
RETVAL=0
prog="keepalived"
start() {
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
stop() {
echo -n $"Stopping $prog: "
killproc keepalived
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
}
reload() {
echo -n $"Reloading $prog: "
killproc keepalived -1
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
fi
;;
status)
status keepalived
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
chkconfig keepalived on #开机启动
三、配置
1、配置server1(主)
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id master #是运行keepalived的一个表示,多个集群设置不同。
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
interface em1 # 绑定虚拟 IP 的网络接口,ifconfig 查看IP对应的网卡
virtual_router_id 51 #设置VRID标记,多个集群不能重复(0..255)
mcast_src_ip 192.168.1.60 #localIP,可以不要该属性
priority 100 #设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP,至少50
nopreempt #设置为不抢占,说明:这个配置只能在BACKUP主机上面设置
advert_int 1 #检查的时间间隔,默认1s
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress { #设置VIP,可以设置多个,用于切换时的地址绑定。
10.1.125.244 #vip
}
}
2、配置server2(备机)
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id slave
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface em1
virtual_router_id 51
mcast_src_ip 192.168.1.65
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.16
}
}
vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
授权
# chmod +x /etc/keepalived/nginx_check.sh
两台机器都添加vrrp协议到防火墙,vi /etc/sysconfig/iptables
service iptables restart 重启防火墙。
四、测试
我这里只做keepalived测试,nginx的测试大家自行处理。
1、启动
service keepalived start
2、通过 ip a 查看是不是只有一个台机器绑定的vip,正常应该只有一个台机器有vip,如下图192.168.1.60,
3、停掉主 keepalived,备机自动切换为master,备机日志:
4、启动主机得keepalived,会自动抢占为master,备机日志如下:
tail -200 /var/log/messages
这个架构nginx+keepalived方案的缺点:
只有一台服务器对外提供服务,使用率是50%。可以采用双nginx对外提供服务的架构方案,提高服务的使用率。
五、注意
1、当主机服务恢复后,vip的master会自动切回到主机。
2、查看keepalived日志
tail -f /var/log/messages
3、如果主备发生网络不通分区的情况,可能让keepalived集群发生脑裂的情况,导致两台机器抢占vip。比如当防火墙隔离了keepalived的通讯端口112。