keepalived 是一种基于VRRP(虚拟路由器冗余协议)的高可用解决方案,主要是用于服务器的负载均衡和高可用性的保障,自动将服务切换到备份服务器上,确保业务的连续性。
工作原理:
VRRP协议:一组路由器(或服务器)组成一个虚拟路由器,其中有一个主路由器(Master)和多个备份路由器(Backup)。虚拟路由器有一个虚拟 IP 地址(VIP),对外提供服务。主路由器定期发送VRRP通告消息,备份路由器监听这些消息。
当备份路由器在一定时间内没有收到主路由器的通告消息时,会认为主路由器发生故障,此时会根据优先级选举出一个新的主路由器,并接管虚拟 IP 地址,继续对外提供服务。
Keepalived 在此基础上,不仅实现了 VRRP 的基本功能,还添加了一些自定义的健康检查机制和服务管理功能。它对后端的真实服务器进行健康检查,如通过 HTTP、TCP 等协议检查服务器的端口是否可达、服务是否正常响应等。
如果检测到某台真实服务器出现故障,Keepalived 可以将其从负载均衡集群中剔除,待服务器恢复正常后再重新加入。
keepalived+nginx高可用实验
1.下载 Nginx 源码包:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压源码包:
tar -zxvf nginx-1.18.0.tar.gz
进入解压目录配置并编译安装
cd nginx-1.18.0
./configure --prefix=/usr/local/nginx
make && make install
启动Nginx
/usr/local/nginx/sbin/nginx
验证 Nginx 是否成功启动:在浏览器中输入服务器的内网 IP 地址,若出现 Nginx 的欢迎页面,则启动成功。
安装 Keepalived:
在 Server1 和 Server2 上同时进行以下操作:
yum install -y keepalived
配置 Keepalived:
在 Server1 上,编辑
/etc/keepalived/keepalived.conf
文件,如下:
global_defs { router_id SERVER1 # 服务器唯一标识 } # 定义 VRRP 实例 vrrp_instance VI_1 { state MASTER # 此服务器为主服务器 interface ens160 # 绑定的网络接口 virtual_router_id 65 # 虚拟路由器 ID,取值范围 0 - 255,同一组需保持一致 priority 100 # 优先级,数值越大优先级越高 advert_int 1 # 通告间隔时间,单位为秒 authentication { auth_type PASS # 认证类型为简单密码认证 auth_pass 123456 # 认证密码,需与 Server2 保持一致 } virtual_ipaddress { 192.168.65.200/24 dev ens160 # 虚拟 IP 地址 } }
在 Server2 上,编辑
/etc/keepalived/keepalived.conf
文件,如下:
global_defs { router_id SERVER2 # 服务器唯一标识 } # 定义 VRRP 实例 vrrp_instance VI_1 { state BACKUP # 此服务器为备用服务器 interface ens160 # 绑定的网络接口 virtual_router_id 65 # 虚拟路由器 ID,取值范围 0 - 255,同一组需保持一致 priority 90 # 优先级,低于 Server1 advert_int 1 # 通告间隔时间,单位为秒 authentication { auth_type PASS # 认证类型为简单密码认证 auth_pass 123456 # 认证密码,需与 Server1 保持一致 } virtual_ipaddress { 192.168.65.200/24 dev ens160 # 虚拟 IP 地址 } }
启动 Keepalived:
在 Server1 和 Server2 上分别执行:
systemctl start keepalived
MASTER(主)节点(192.168.65.131)成功标志
192.168.65.131拿到了VIP 192.168.131.200。
BACKUP(备)节点(192.168.65.132)成功标志
BACKUP上只有192.168.65.132这个ip,正常。
测试高可用性
初始状态下,在局域网内的其他电脑(或通过虚拟机的宿主机)上,在浏览器中输入虚拟 IP 地址(192.168.1.200),此时应该能访问到 Server1 上的 Nginx 页面,因为 Server1 为主服务器。
模拟 Server1 故障:
在 Server1 上停止 Keepalived 服务:
systemctl stop keepalived
*初始状态:*
*模拟故障:*
快速在浏览器中再次输入虚拟 IP 地址,此时页面应能快速切换到 Server2 上的 Nginx 页面,这表明 Server2 成功接管服务。
这样,就完成了一个 Keepalived + Nginx 的简单实验,实现了 Web 服务的高可用性。