什么是Keepalived
引用官方的原话:
Keepalived是一个用c语言编写的路由软件,这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性的设施。
loadbalance框架依赖于著名且广泛使用的Linux Virtual Server (IPVS)内核模块提供的第4层loadbalance。
Keepalived实现了一组检查器,根据负载平衡服务器池的运行状况动态地、自适应地维护和管理负载平衡服务器池。
另一方面,通过VRRP协议实现了高可用性。VRRP是路由器故障转移的基础。
此外,Keepalived实现了一组到VRRP有限状态机的钩子,提供了低级别和高速的协议交互。
为了提供最快的网络故障检测,Keepalived实现了BFD协议。
VRRP状态转换可以考虑BFD提示来驱动快速状态转换。
保留的框架可以单独使用,也可以一起使用,以提供弹性的基础设施。
案例
我有两台虚拟机,IP分别为 192.168.0.123 和 192.168.0.124,并用nginx部署了相同的静态页面。
在外网能够通过虚拟IP 192.168.0.125 访问到nginx的静态页面。
当123上面的nginx不可用时,125会自动路由到124;124不可用时,125路由到123;如此到达高可用性。
安装
两台虚拟机分别安装nginx和keepalived,并启动
1 | yum install -y nginx keepalived |
我安装的版本是keepalived-1.3.5,不同版本的配置可能会有差异。
可参考示例文件:
/usr/share/doc/keepalived-x.x.x/samples/
部署静态页面
nginx安装启动完后,即可访问默认的index页面:http://localhost
为了能直观的判断虚拟IP指向的真实地址,稍微修改一下index页面:
1 | <head> |
此时还不能通过125访问nginx,需要修改keepalived配置文件。
配置Keepalived
1 | ! Configuration File for keepalived |
默认是抢占模式,意思是当2个机器都正常工作时,虚拟IP只能指向1个真实IP,
所以在同一个虚拟路由组下的keepalived就要相互争夺VIP的所有权。抢占的优先级主要还是看
priority,谁高谁就优先;priority相同的情况下,再看
state谁是master,谁是backup;如果都是master,就看谁的真实IP大,谁就优先;
如果都是backup,当前所有权保持不变。
验证
重新启动123的keepalived
1 | systemctl stop keepalived |
访问 http://192.168.0.125 可以看到标签页的标题是nginx 1
再重启124的keepalived,刷新浏览器标题变为nginx 2
分别重启2台虚拟机的keepalived或nginx,刷新浏览器观察标题变化
非抢占模式
非抢占模式是指如果VIP已经绑定到某一机器上,另外的机器不会根据优先级去抢占VIP,即priority配置失效。
修改两个keepalived的配置文件:1
2
3
4
5...
vrrp_instance {
state BACKUP # 只有作为BACKUP,非抢占模式才能生效
nopreempt # 添加非抢占模式标识
...
上述配置有个问题:当VIP指向的服务器nginx出现故障,检测脚本虽然发现了问题降低了自身权重,但因为
priority失效,所以VIP不会漂移到其它节点上。当然也有解决办法:修改检测脚本,发现nginx不可用时,关闭自身keepalived而不是降低权重。
健康检测/负载均衡
* 以下内容没有验证成功,折腾了半天,不知道哪里出了问题
通过配置虚拟服务,可以开启负载均衡功能,并且在应用层监测服务是否可用,将不可用的移除服务器池。
1 | virtual_server 192.168.0.125 80 { # 虚拟IP及端口 |
完成上述配置后重启keepalived,发现负载均衡并没有生效,只能访问绑定了虚拟IP的那台服务器的nginx。
网上查找了些资料,说这跟选用的路由模式有关
NAT模式
在局域网中,由于real_server在接收到请求包后找不到路由进行数据返回,此时需要将keepalived主机作为网关,
在real_server上添加回程路由route add default gw 192.168.0.125
DR模式
DR模式会将目标地址为虚拟IP地址原封不动的传给real_server。
real_server发现这不是我的IP,因此会丢弃掉该包,所以这边得欺骗一下real_server,让他认为这是他的地址。
在real_server的lo回环口上添加那个虚拟IP,这样real_server就会认为自己就是VIP这台服务器。ifconfig lo:0 192.168.0.125 netmask 255.255.255.0 up
两种模式的解决方法都试了,还是没有实现负载均衡