Keepalived是一个开源(遵循 GPLv2 协议)的、基于 VRRP 协议的轻量级服务高可用和负载均衡方案,提供避免服务器单点故障和请求分流的能力。它为 Nginx 扩展了高可用能力,共同组成完整的 Web 服务集群模式(高可用+负载均衡)
VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定的时间内,Backup没有接收到这个通知内容,Backup就会替代Master成为新的Master(如果有多个BACKUP,那么会选举其中一个优先级高的作为MASTER)。Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备份节点则会直接丢弃这些请求和数据,不做处理,只是去监听Master的状态。
如上图Keepalived实现Nginx负载均衡的原理就是在两个Nginx节点中引入虚拟IP的概念(每台Nginx都安装Keepalived并都配置同一个虚拟IP),其中一台Nginx宕机,那么虚拟Ip将会飘移到另一台Nginx上去,而客户端就是通过这个虚拟IP来访问Nginx的。
¶一、安装
1 | 安装编译依赖 |
¶二、配置
1 | 编辑keepalived配置文件 |
服务器1配置
1 | ! Configuration File for keepalived |
以上配置中没有特别需求的话,最简单就是修改router_id、vrrp_strict、state、interface、priority、virtual_ipaddress三处地方即可。
服务器2配置
1 | ! Configuration File for keepalived |
防火墙配置:
1 | firewall-cmd --permanent --add-protocol=vrrp |
¶三、使用
¶1. 启动
1 | /usr/local/sbin/keepalived |
¶2. 测试
测试效果如下:
通过查看MASTER节点服务器的所有ip时,能够发现在MASTER节点的网卡接口ens33中多出了192.168.60.222这个虚拟ip地址。
1 | [root@localhost nginx-1.14.0]# ip a |
而通过查看BACKUP节点服务器的所有ip时,不会出现虚拟ip地址。
1 | [root@localhost nginx-1.14.0]# ip a |
¶3. 关闭
为了验证MASTER节点宕机或者出现故障时,原本的MASTER节点失去虚拟ip,而BACKUP节点上将获得虚拟ip(发生了IP飘移),可以通过在原本的MASTER节点中关闭keepalived:
1 | 关闭 |
¶4. 脚本
keepalived的作用其实也就是给多个服务器中加入唯一的虚拟IP,但关注到具体业务的话,还存在许多问题,比如做Nginx高可用的情况下,假设有两个Nginx节点,其中一台Nginx出现故障不可用,而其所在的服务器还在正常运行,所以其对应的keepalived程序也正常运行,很显然这是不会发生了IP飘移的。而我们的目的是Nginx出现故障不可用时其对应的keepalived也应该要跟着关掉,这样虚拟ip才会飘移到BACKUP节点。
keepalived允许我们通过编写脚本对业务进程进行检测监控。
1 | vim /etc/keepalived/ck_nginx.sh |
内容如下:
1 | !/bin/bash |
1 | 为脚本文件设置执行权限 |
将脚本添加到keepalived配置文件中
1 | vim /etc/keepalived/keepalived.conf |
1 | #加入以下vrrp_script |
¶6. 日志
1 | tail -f /var/log/messages |