Keepalived及VRRP协议原理
keepalived起初是专门为lvs设计的负载均衡设计的,用来管理并监控lvs集群中各个服务器节点的状态,后加入可实现高可用的vrrp功能,就可以作为其他服务(nginx,haproxy,mysql)的高可用解决方案软件
Keepalived软件主要是通过VRRP协议实现高可用功能的。
VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
三个重要功能:
(1)管理LVS负载均衡软件
(2)实现对LVS集群节点健康检查功能
(3)作为系统网络服务的高可用功能
裂脑的概念及如何规避解决裂脑问题
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。
导致脑裂的原因:
(1)高可用服务器之间心跳线断
(2)网卡及相关驱动坏了,IP配置及冲突问题
(3)心跳线间连接的设备故障(网卡及交换机)
(4)高可用服务器上开启了iptables防火墙阻挡了心跳消息传
(5)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
(6)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等
解决问题:
(1)如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决(防火墙问题)
(2)可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
(3)开发检测程序通过监控软件(例如Nagios)检测裂脑,及时通知,避免及时止损。
Keepalived高可用服务搭建准备
准备两台虚拟机,并且都设置两块网卡,分别yum安装keepalived(注意每个虚拟机的第二块网卡的网段应与第一块不同)
/etc/init.d/keepalived/ start 启动脚本
lb01 主服务器vi /etc/keepalived/keepalived.conf (keepalived的配置文件)
! Configuration File for keepalived
global_defs { *全局模块*
notification_email { *通知模块*
acassen@firewall.loc *邮箱*
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc *发件人的邮箱地址*
smtp_server 192.168.200.1 *邮件服务器的服务地址*
smtp_connect_timeout 30 *邮件服务超时时间*
router_id lb01 *真实路由地址(主和备的路由地址不能一样)*
}
vrrp_instance VI_1 { *实例的名字,相同实例的备节点名字要和这个相同*
state MASTER *状态为MASTER,备节点状态需要为BACKUP*
interface eth1 *通信(心跳)接口为eth1,此参数备节点设置和主节点相同*
virtual_router_id 55 *虚拟路由ID为55,要和备节点相同*
priority 150 *优先级为150,备节点的优先级必须比此数字低*
advert_int 1 *通信检查间隔时间1秒*
authentication { *密码验证(一般用默认)*
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { 虚拟IP地址(VIP)
192.168.200.66/24 dev eth0 label eth0:1 *虚拟IP,即VIP为192.168.200.66,子网掩码为24位,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同*
}
}
lb02 备服务器设置如下:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.66/24 dev eth0 label eth0:1
}
}
双实例高可用双主模式的配置文件
lb01主服务器增加VI_2实例
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.67/24 dev eth0 label eth0:2
}
}
lb02备服务器增加VI_2实例
vrrp_instance VI_2 {
state MASTER
interface eth1
virtual_router_id 60
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.67/24 dev eth0 label eth0:2
}
}
解决多组Keepalived服务器在一个局域网的冲突问题
global_defs {
router_id LVS_19
vrrp_mcast_group4 224.0.0.19 #这个就是指定多播地址的配置
}
高可用服务只针对物理服务器问题解决方案
keepalived是针对物理服务器出问题的,但是如果主服务器的nginx服务断掉,而keepalived服务继续运行,用户无法通过这个主服务器达到资源目的,所以设置个脚本,如下:
while true
do
if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
sleep 5
done
脚本的基本思想是若没有80端口存在,就停掉Keepalived服务实现释放本地的VIP。在后台执行上述脚本并检查。