keepalived的介绍
作用
keepalived主要针对LVS群聚应用而设计的,提供故障切换和健康检查功能。在非LVS群集环境中,也可用来实现多机热备功能。
- 故障切换:ha fallover功能,实现LB Master和Backup主机之间故障转移和自动切换
这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时候,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器故障修复,主负载均衡器又会接管回它原来处理的工作,而备份负载均衡器会释放master失效时它接管的工作,这时候两者恢复到之前的角色。
- 健康检查:rs healthcheck功能。负载均衡定期检查RS的可用性决定是否给其分发请求。
当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动的将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动把它加入到转发队列,分发请求提供正常服务。
故障切换原理:
是通过VRRP(虚拟路由器冗余协议)来实现的。在keepalived Director正常工作时,主Director节点会不断的向备节点广播心跳消息,用来告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身接管程序,接管主节点的IP资源及服务。而当主节点恢复时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身的备用角色。
安装部署
安装步骤
1.安装所必须的软件包
yum install kernel-developenssl-devel popt-devel -y
2.下载keepalived源码报,编译安装
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz tar zxfkeepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/--with-kernel-dir=/usr/src/kernels/2.6.* make && make install
编译参数:
--with-kernel-dir=DIR 指定内核文件所在目录,通常是在/usr/src/kernels/2.2*
--disable-lvs-syncd do not use LVS synchronization daemon
--disable-lvs do not use the LVS framework
--disable-vrrp do not use the VRRP framework
若只想做keepalived其他服务(http,db,nginx,haproxy)高可用而不做LVS的高可用时候,可以使用上面三个参数进行禁用
keepalivedhi安装完之后,若安装路径不是指定的根路径,则为了操作方便,需要把生成的文件拷贝到系统常用的目录中
提示:当执行./configure之后出现下面这种情况时,表示成功
Keepalived configuration
------------------------
Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : No #LVS功能
IPVS sync daemon support :No #LVS功能
Use VRRP Framework : Yes #VRRP功能
Use Debug flags : No
由于本实验只是测试keepalived双机热备,没装LVS(ipvsadm),所以会提示NO
若要都为yes时需要先安装ipvsadm
下载安装ipvsadm
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
ln -sfkernels/2.6.32-358.el6.x86_64/ /usr/src/linux
tar zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install
配置文件详解
! Configuration File forkeepalived
global_defs {
notification_email { #指定邮件的目的地址
[email protected]
[email protected]
[email protected]
}
[email protected]
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30
router_id LVS_MASTER #指定本机ID
}
全局定义部分:主要设置keepalived的通知机制和表示
第7--14行是email通知参数。作用:当LVS发生切换或RS等有故障时,就会发邮件报警。
第15行lvs负载均衡的表示(router_id),在一个局域网内,它必须是唯一的
vrrp_instance VI_1 { 定义VRRP热备实例
state MASTER
interface eth0
virtual_router_id 51 #虚拟路由标识
priority 100 #设置优先级。用于确定那个是主,备
advert_int 1 #通告间隔描述即心跳
nopreempt #非抢占(因为默认如果master挂的时候,backup会顶上,当master再好的时候,会再切回去,这样就会造成两次断开,加上nopreempt的时候,及时master又好了,依旧不会切换,但是要注意两个state 都要是backup)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP类似LVS中的VIP
172.16.254.111
192.168.254.111
}
VRRP定义模块
第17行为VRRP实例vrrp_instance。每个VRRP实例可以认为是一个keepalived实例,在配置中可以存在多个实例
第18行实例状态,只有MASER和BACKUP两种状态,并且需要大写。
interface 通信接口,设备对外提供服务的网卡。注意:lvs_sync_daemon_interface是用来设置负载均衡器之间监控的接口。
virtual_router_id这个标识是一个数字,同一个VRRP实例中必须唯一。每个热备组中需要保持一致。
配置多实例的时候只需要把第17-32行复制一份,修改VRRP实例名字等
virtual_server 192.168.200.100 80 { #VIP 端口
delay_loop 3 #健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT #负载均衡转发规则NAT|DR|RUN
nat_mask 255.255.255.0 #nat 掩码
persistence_timeout 50 #会话保持时间
protocol TCP #使用的协议
sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用
real_server 192.168.201.100 443 { #RIP 端口
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up 脚本(绝对路径) #在检测到server up后执行脚本
notify_down 脚本(绝对路径) #在检测到server down后执行脚本
SSL_GET { #健康检查的名字
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc #检查url,可以指定多个
status_code 200 #检查的返回状态码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查的端口的端口
}
}
}
启动并测试
1.keepalived启动
keepalived会自动生成启动文件,只需要附加执行权限即可
chmod a+x/etc/init.d/keepalived service keepalived start chkconfig keepalived on
2.查看生成的虚拟IP,并测试
主:
[[email protected] ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:f3:4e:52 brdff:ff:ff:ff:ff:ff
inet 192.168.1.110/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fef3:4e52/64 scopelink
valid_lft forever preferred_lft forever
备:
[[email protected] ~]# ip add show dev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
比较可以看出,现在虚拟ip在主(MASTER)上生成。
现在模拟主的eth0宕机,继续查看
主:
[[email protected] master ~]# ifdown eth0
[[email protected] master ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:0c:29:f3:4e:52brd ff:ff:ff:ff:ff:ff
备:
[[email protected] backup ~]# ip add show dev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet 192.168.1.250/32 scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
而同时去ping虚拟ip,会发现中断一下之后会继续能ping通。(下面截图是在虚拟环境中,所以会有延迟,真实环境会是瞬间就完成切换)
恢复主master
主:
[[email protected] master ~]# ifup eth0
正在决定 eth0 的 IP 信息...完成。
[[email protected] master ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:f3:4e:52 brdff:ff:ff:ff:ff:ff
inet 192.168.1.250/32 scope global eth0
inet 192.168.1.110/24 brd 192.168.1.255scope global eth0
inet6 fe80::20c:29ff:fef3:4e52/64 scopelink
valid_lft forever preferred_lft forever
备:
[[email protected] backup ~]# ip add showdev eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:15:20:bb brdff:ff:ff:ff:ff:ff
inet 192.168.1.109/24 brd 192.168.1.255scope global eth0
inet6 fe80::20c:29ff:fe15:20bb/64 scopelink
valid_lft forever preferred_lft forever
会发现,虚拟IP重新回到主上。ping包也是丢了一个后立刻就又通了