keepalived介绍
keepalived起初是位lvs设计,专门用来监控服务中各个服务节点的状态,根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除。Keepalived又加入了VRRP的功能
VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
keepalived核心功能
健康监测:采用tcp三次握手,icmp请求,http请求,udp echo 请求等方式对负载均衡器后面的实际服务器进行保活
失败切换:应用于配置了主备模式的负载均衡器,利用vrrp维持主备负载均衡器的心跳,当主备负载均衡器出现问题,由被负载均衡器承载对应的业务,从而在最大程度上减少流量损失,并提供服务稳定性。
keepalived 原理
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
Keepalived对服务器运行状态和故障隔离的工作原理:
Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
keepalived工作方式
Keepalived服务两大用途healthcheck & failover
Ha failover功能:实现LB Master主机和Backup主机之间故障转移和自动切换。
这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡管理器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。
rs healthcheck功能:负载均衡定期检查RS的可用性决定是否非其分发请求。
当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动地把他们加入转发队列,分发请求提供正常服务。
keepalived 安装与配置
1) 同步时间
yum install ntp ntpdate -y
ntpdate co.pool.ntp.org
2) 解压
tar -xf keepalived-2.0.10.tar.gz -C /usr/local/src/
3)创建目录
mkdir -p /data/keepalived
4) yum install openssl-devel
5)编译安装
cd /usr/local/src/keepalived-2.0.10
./configure --prefix=/data/keepalived/
make
make install
6)从解压安装包文件中拷贝启动文件
cd /usr/local/src/keepalived-2.0.1/keepalived/etc
cp -R init /data/keepalived/
cp -R init /data/keepalived/etc/
cp -R init /data/keepalived/etc/
cp -R init.d /data/keepalived/etc/
ll /data/keepalived/etc/
7)配置启动项
cp /data/keepalived/etc/init.d/keepalived /etc/init.d/
cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /data/keepalived/sbin/keepalived /usr/sbin/
8)启动服务
/etc/init.d/keepalived start
ps -ef |grep keepalived
keepalived 高可用实例配置
1、单实例(主备)
主节点:192.168.76.156
备节点:192.168.76.172
浮动ip:192.168.76.201
1) vim /etc/keepalived/keepalived.conf
主:
! 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 LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.201/24 dev ens33 label ens33:1
}
}
2)重启服务
/etc/init.d/keepalived restart
3)ip a | grep 192.168.76.201
备:
1)配置文件
! 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 LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.201/24 dev ens33 label ens33:1
}
}
2)重启服务
/etc/init.d/keepalived restart
3)ip a | grep 192.168.76.201
此时,发现备结点是没有浮动ip192.168.76.201
4)测试
关闭主节点的keepalived ,发现 浮动ip漂浮到备结点
2、双实例(双主)
节点1:192.168.76.156
节点2:192.168.76.172
浮动ip:192.168.76.201,192.168.76.2001
节点1
1)配置文件
! 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 LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.201/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 56
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.6.200/24 dev ens33 label ens33:2
}
}
2)重启服务
/etc/init.d/keepalived restart
3)ip a
节点2
1)配置文件
! 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 LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.201/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 56
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.76.200/24 dev ens33 label ens33:2
}
}
2)重启服务
/etc/init.d/keepalived restart
3)ip a
4)测试
1、关闭节点1的keepalived,发现浮动ip192.168.76.201,192.168.76.200浮动到节点2
2、关闭节点2的keepalived,发现浮动ip192.168.76.201,192.168.76.200浮动到节点1
keepalived实现http服务的高可用配置
两个节点(此例在keepalived上安装)安装httpd服务:
yum install httpd -y
启动httpd服务:
/etc/init.d/httpd start
准备两个测试站点页面
echo 'web 156, my ip 192.168.76.201!' > /var/www/html/index.html
echo 'web 172, my ip 192.168.76.20!' > /var/www/html/index.html
利用keepalived主备模式测试:
关闭主节点的keepalived,输入“192.168.76.201”发现页面跳转到“web,172,my ip 192.168.76.172”,此时,已经切换至节点2提供web服务。
keepalived自定义监控
#!/bin/bash
# function:check http status
while true
do
httpdpid=`ps -C httpd --no-header |wc -l`
if [ $httpdpid -eq 0 ];then
/etc/init.d/httpd start
sleep 5
httpdpid=`ps -C httpd--no-header |wc -l`
if [ $httpdpid -eq 0 ];then
/etc/init.d/keepalive stop
fi
fi
sleep 5
done