Web HA集群部署 - Keepalived
- 1. Keepalived概述
- 1.1 工作原理
- 1.2 核心功能
- 1.3 拓扑图
- 2. KeepAlived安装方式
- 2.1 yum源安装
- 2.2 源码包编译
- 3. KeepAlived安装
- 3.1 环境依赖
- 3.2 安装nginx
- 3.3 安装Keepalived
- 4. Keepalived部署
- 4.1 主备模式
- 1. 节点配置
- 2. 主节点配置文件
- 3. 从节点配置文件
- 4. 验证
- 4.2 一主多备(1+N)模式
- 1. 节点配置
- 2. 主节点配置内容
- 3. 备节点1配置内容
- 4. 备节点2配置内容
- 5. 验证
- 4.3 互为主备(主主模式)
- 1. 节点配置
- 2. 节点1配置内容
- 3. 节点2配置内容
- 4. 验证
- 4.4 N+1模式
- 1. 节点配置
- 2. 节点1配置内容
- 3. 节点2配置内容
- 4. 备节点配置内容
- 5. 验证
- 4.5 N+M模式
- 4.6 资源故障检测
- 1. 节点配置
- 2. 主节点配置内容
- 2. 备节点配置内容
- 4. 配置检测脚本
- 5. 验证
- 5. 配置文件详解
- 1. global_defs(全局定义块)
- 2. vrrp_instance(VRRP实例定义块)
- 3. virtual_server(虚拟服务器virtual_server定义块)
- 4. 配置示例
- 6. VRRP协议介绍
- 1. 基本概念
- 2. VRRP选举机制
- 3. VRRP工作过程
- 4. VRRP的特点
- 7. Keepalived VS Heartbeat
1. Keepalived概述
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
1.1 工作原理
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
- Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
网络层(layer 3):Keepalived 通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(layer 4):Keepalived 在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived 一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(layer 5):Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
1.2 核心功能
健康检查和失败切换是keepalived的两大核心功能。
- 健康检查:采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;
- 失败切换:主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
1.3 拓扑图
2. KeepAlived安装方式
2.1 yum源安装
yum install keepalived
2.2 源码包编译
KeepAlived官网提供可编译源码包,可直接下载。
官网 https://www.keepalived.org/
3. KeepAlived安装
高可用实现支持多种集群配置模式:主备模式,主主模式,N+1模式,N+M模式;另外支持资源及节点故障检测。
3.1 环境依赖
-
硬件准备
要实现KeepAlived的多种模式,因此这里准备了3台虚拟机进行测试,设备IP分别为:192.168.71.183
192.168.71.253
192.168.70.183 -
软件准备
本次高可用实现以nginx
进行效果展示,nginx未进行任何配置,仅修改了对应index.html文件以展示对应情况的高可用实现效果。
3.2 安装nginx
[root@node1 ~]# yum install -y nginx
[root@node1 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@node1 ~]# systemctl start nginx
[root@node1 ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-03-01 12:03:04 EST; 5s ago
...
为了方便辨别实现效果,此处修改nginx的主页。
在各节点执行
[root@node1 ~]# echo '<h2><strong>The IP is 192.168.71.183</strong></h2>' >> /usr/share/nginx/html/index.html
3.3 安装Keepalived
本次使用yum安装
在各节点执行
[root@node1 ~]# yum install keepalived -y
...
Total download size: 1.8 M
Installed size: 6.0 M
...
Installed:
keepalived.x86_64 0:1.3.5-19.el7
Dependency Installed:
lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2
net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2
Complete!
查看版本
[root@node1 ~]# keepalived -v
Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Copyright(C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>
Build options: PIPE2 LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF RTA_VIA FRA_OIFNAME FRA_SUPPRESS_PREFIXLEN FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK LIBIPTC LIBIPSET_DYNAMIC LVS LIBIPVS_NETLINK VRRP VRRP_AUTH VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC FIB_ROUTING INET6_ADDR_GEN_MODE SNMP_V3_FOR_V2 SNMP SNMP_KEEPALIVED SNMP_CHECKER SNMP_RFC SNMP_RFCV2 SNMP_RFCV3 SO_MARK
查询对应的配置文件:
[root@node1 ~]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service
/usr/libexec/keepalived
/usr/sbin/keepalived
...
/usr/share/man/man1/genhash.1.gz
/usr/share/man/man5/keepalived.conf.5.gz
/usr/share/man/man8/keepalived.8.gz
/usr/share/snmp/mibs/KEEPALIVED-MIB.txt
/usr/share/snmp/mibs/VRRP-MIB.txt
/usr/share/snmp/mibs/VRRPv3-MIB.txt
文件说明:
- /etc/keepalived -主目录
- /etc/keepalived/keepalived.conf -配置文件
- /etc/sysconfig/keepalived -系统配置文件
- /usr/lib/systemd/system/keepalived.service -系统服务
- /usr/libexec/keepalived -库目录
- /usr/sbin/keepalived -系统命令
4. Keepalived部署
Keepalived主要通过修改/etc/keepalived/keepalived.conf
配置文件进行配置高可用集群
4.1 主备模式
主备模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,热备服务器永远处于浪费状态,对于服务器不多的网站,该方案并不经济实惠。
1. 节点配置
此模式下使用两台虚拟机和一个VIP进行:
主节点:192.168.71.183
备节点:192.168.71.253
VIP:192.168.71.254
2. 主节点配置文件
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 86
priority 200
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
3. 从节点配置文件
[root@node2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 20
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
4. 验证
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
② 故障
停止主节点keepalived服务,主节点执行;
[root@node1 ~]# systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.253,当前由于主节点故障,备用节点启用,接管VIP流量。
③ 故障恢复
重新启动主节点keepalived服务;
[root@node1 ~]# systemctl start keepalived
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点恢复,接管VIP流量。
4.2 一主多备(1+N)模式
1. 节点配置
此模式下使用三台虚拟机(备用节点)进行:
主节点:192.168.71.183
备节点1:192.168.71.253
备节点2:192.168.70.183
VIP:192.168.71.254
2. 主节点配置内容
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 86
priority 200
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.70.183
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
3. 备节点1配置内容
[root@zabbix-svr-2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 100
unicast_src_ip 192.168.70.183
unicast_peer {
192.168.71.253
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
4. 备节点2配置内容
[root@node2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 20
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.70.183
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
5. 验证
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
图片可参考上例
② 故障-1
停止主节点keepalived服务,主节点执行;
[root@node1 ~]# systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.70.183,当前由于主节点故障,备用节点启用,接管VIP流量。
笔者这里无法访问,可能是因为不是一个网段的原因。理由是直接访问70.183,可以正常访问到nginx网页,而访问虚拟IP确不行。另外70.183的ens33网卡设备,确实增加了71.254这个IP,但在其他机器无法ping通71.254。
③ 故障-2
停止备节点1 keepalived服务,主节点执行;
[root@node1 ~]# systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.253,当前由于主节点故障,备用节1故障,备节点2启用,接管VIP流量。
④ 故障恢复
重新启动主节点keepalived服务;
[root@node1 ~]# systemctl start keepalived
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点恢复,接管VIP流量。
4.3 互为主备(主主模式)
此模式下两台机器两个虚拟IP,每台机器对应一个虚拟IP的主节点,对应另一个虚拟IP的备节点,两台机器互为主备。
1. 节点配置
此模式下使用两台虚拟机进行:
节点1:192.168.71.183
节点2:192.168.71.253
虚拟IP1:192.168.71.254
虚拟IP2:192.168.71.252
2. 节点1配置内容
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 86
priority 200
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 85
priority 20
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.252
}
}
3. 节点2配置内容
[root@node2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 100
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 85
priority 100
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.252
}
}
4. 验证
① 正常状态
浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP2:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
② 故障-1
停止节点1 keepalived服务,节点1执行;
[root@node1 ~]# systemctl stop keepalived
浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.253,当前由于节点1故障,备用节点启用,所以作为节点1的备用节点,节点2接管VIP1流量。浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
③ 故障-1 恢复
恢复节点1keepalived服务,节点1执行;
systemctl restart keepalived
浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.183,由于节点1已恢复,作为VIP1的主节点-节点1,节点1恢复接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
④ 故障-2
停止节点2keepalived服务,节点2执行;
systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.183,当前由于节点2故障,备用节点启用,所以作为节点2的备用节点,节点1接管VIP2流量。
4.4 N+1模式
此模式下三台机器两个虚拟IP,两台机器各对应一个虚拟IP的主节点,另外一台机器为两个虚拟IP的备节点。
1. 节点配置
此模式下使用三台虚拟机进行:
主节点1:192.168.71.183
主节点2:192.168.71.253
备节点:192.168.70.183
虚拟IP1:192.168.71.254
虚拟IP2:192.168.71.252
2. 节点1配置内容
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 86
priority 200
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.70.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
3. 节点2配置内容
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 85
priority 100
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.70.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.252
}
}
4. 备节点配置内容
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 100
unicast_src_ip 192.168.70.183
unicast_peer {
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 85
priority 20
unicast_src_ip 192.168.70.183
unicast_peer {
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.252
}
}
5. 验证
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
② 故障-1
停止主节点1 keepalived服务,主节点1执行;
systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.70.183,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
③ 故障-2
停止主节点2 keepalived服务,主节点2执行;
systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-主节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.70.183,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。
④ 故障-3
停止主节点1keepalived服务,主节点1执行;
systemctl stop keepalived
停止主节点2keepalived服务,主节点2执行;
systemctl stop keepalived
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.70.183,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.70.183,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。
4.5 N+M模式
N+M模式的配置参考N+1模式,复制备节点即可
4.6 资源故障检测
说明:
Keepalived通过在配置文件中添加script来实现对服务状态的检测和故障切换
在global配置段外定义脚本或者shell命令,然后再virtual_server配置段中调用脚本,最后根据脚本的执行结果(成功或失败) 来增加或减少当前的节点的优先级,因为keepalived是根据优先级来判断是否为主节点 所以当优先级低时则就成为备份节点 从而将VIP飘动到优先级高的主节点上 实现了对其他服务的高可用
script配置及调用说明:
vrrp_script chk_nginx { # chk_nginx为自定义的vrrp脚本名称 后续调用需要此名称
script "killall -0 sshd" # 执行的脚本或命令
interval 2 # 监测的时间间隔 单位:秒 默认:1秒
weight -4 # 此值默认为0 范围:-253~253 ,
# 如果此值为负数 则代表当上面的脚本或命令执行失败时($?结果为非0) 则将本节点的优先级减去定义的值;
# 如果此值为正数 则代表当上面的脚本或命令执行成功时($?结果为0) 则将本节点的优先级加上定义的值
fall 2 # 脚本或命令执行几次失败后 将本节点标记为失败(进而进行减优先级操作)
rise 2 # 脚本或命令执行几次成功后 将本节点标记为成功(进而恢复节点)
user USERNAME # 以什么用户身份执行脚本
}
vrrp_instance VI_1 {
...
track_script {
script_name
}
}
1. 节点配置
本次使用两台虚拟机和一个虚拟IP进行配置:
主节点:192.168.71.183
备节点:192.168.71.253
虚拟IP:192.168.71.254
2. 主节点配置内容
[root@node1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 86
priority 100
unicast_src_ip 192.168.71.183
unicast_peer {
192.168.71.253
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
track_script {
check_nginx
}
}
2. 备节点配置内容
[root@node2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 86
priority 80
unicast_src_ip 192.168.71.253
unicast_peer {
192.168.71.183
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.71.254
}
track_script {
check_nginx
}
}
4. 配置检测脚本
分别在主节点和备节点编辑脚本,编辑/etc/keepalived/check_nginx.sh
脚本内容为:
[root@node2 keepalived]# pwd
/etc/keepalived
[root@node2 keepalived]# cat check_nginx.sh
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
# nginx # 此处为展示效果,在nginx出现故障后,注释不重启nginx。
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
为脚本添加执行权限:
chmod +x /etc/keepalived/check_nginx.sh
重启keepalived
5. 验证
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
② nginx服务故障
停止主节点nginx服务,主节点执行;
[root@node1 keepalived]# systemctl stop nginx
浏览器访问虚拟IP:192.168.71.254
页面实际访问地址为192.168.71.253,当前由于主节点资源故障,权重-30,优先级低于备用节点,备用节点启用,接管VIP流量。
③ nginx服务恢复
故障恢复
重新启动主节点nginx服务;
[root@node1 keepalived]# systemctl start nginx
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点nginx恢复,权重恢复,优先级高于备用节点,重新接管VIP流量。
5. 配置文件详解
keepalived只有一个配置文件keepalived.conf,主要由global_defs、vrrp_instance和virtual_server三个模块构成。
1. global_defs(全局定义块)
global_defs模块为keepalived全局配置模块,它包括以下内容:
① notification_email:可添加keepalived发生切换故障时发送邮件所对应的邮箱,可以分行添加多个邮箱;
② notification_email_from:可添加发送邮件的地址;
③ smtp_server:可添加邮件服务器地址;
④ smtp_connect_timeout:可设置邮件服务器连接超时时长;
⑤ router_id:每个keepalived节点的唯一标识,建议设置为当前主机名,并且多个节点重名时是不受影响的;
⑥ vrrp_skip_check_adv_addr:keepalived会以对所有通告报文都进行检查,进而比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器则跳过检查,默认值为全检查;
⑦ vrrp_strict:表示严格遵守VRRP协议,启用此项后以下状况将无法启动服务——
- a. 未设置VIP地址
- b. 配置了单播邻居
- c. 在VRRP的2版本中带有IPV6地址,如果开启了此项后没有设置vrrp_iptables则会自动开启iptables防火墙规则,导致VIP地址无法访问,建议不加此项
⑧ vrrp_garp_interval:可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0;
⑨ vrrp_gna_interval:设置非请求消息的发送延迟时间,默认为0;
⑩ vrrp_mcast_group4:可指定组播IP范围,可选择224.0.0.0到239.255.255.255之间的地址,默认为224.0.0.18;
⑪ vrrp_iptables:与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项。
2. vrrp_instance(VRRP实例定义块)
vrrp_instance模块可配置虚拟路由器,它包含以下内容:
① vrrp_instance模块后面的STRING为VRRP的实例名,一般设置为业务名称;
② state:可设置此虚拟路由器的初始状态,可选择MASTER或者BACKUP;
③ interface:可以绑定当前虚拟路由器所使用的物理接口,如eth0、bond0和br0等,可以和VIP地址不在同一张网卡上;
④ virtual_router_id:可设置每个虚拟路由器的唯一标识,取值范围为0-255,每个虚拟路由器的该项值必须是唯一的,否则无法启动服务,并且同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一;
⑤ priority:可设置当前物理节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高,每个keepalived节点取值不同;
⑥ advert_int:可设置VRRP通告的时间间隔,默认为1秒;
⑦ authentication:可设置认证机制,由以下两部分构成——
- a. auth_type为认证类型,可选择AH和PASS两种,AH为IPSC互联网安全协议认证,PASS为简单密码认证,推荐PASS认证
- b. auth_pass为预共享秘钥设置,仅前8位有效,同一虚拟路由器的多个keepalived节点auth_pass值必须保持一致
⑧ virtual_ipaddress:可添加虚拟路由器的VIP,并可设置VIP对应的子网掩码、网卡和标签等,生产中可能会在同一个虚拟路由器上添加上百个VIP,不同的VIP分行隔开,不指定网卡时默认添加在eth0上,不设置子网掩码时默认为32位。在添加VIP地址时,需确保将要使用的VIP不存在,即还没被使用。
3. virtual_server(虚拟服务器virtual_server定义块)
virtual_server模块用于虚拟服务器配置,将虚拟路由器中添加的VIP与后端real server对应起来,该模块包括以下内容:
①virtual_server后面需要跟上VIP地址和端口,即客户端是通过哪一个VIP和哪个端口向后端服务器发起访问;
② delay_loop:检查后端服务器的时间间隔;
③ lb_algo:可定义调度算法,如rr、wrr、lc、wlc、lblc、sh和dh等;
④ lb_kind:可定义集群的类型,如NAT、DR和TUN,注意要使用大写;
⑤ persistence_timeout:可设置持久连接时长;
⑥ protocol:可指定服务协议,如TCP、UDP和SCTP,一般使用TCP;
⑦ sorry_server:可设置当所有后端服务器都不可用时的备用服务器地址;
⑧ real_server:设置VIP所对应的后端服务器IP和端口,包括以下构成部分——
- a. weight可以设置对应后端服务器的权重
- b. SSL_GET、HTTP_GET、TCP_CHECK、SMTP_CHECK和MISC_CHECK等可以定义当前后端主机的健康状况检查方法
- c. connect_timeout表示客户端连接超时时长
- d. nb_get_retry表示重试次数
- e. delay_before_retry表示重试之前的延迟时长
4. 配置示例
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
}
virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.131
}
}
virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
6. VRRP协议介绍
1. 基本概念
网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要。在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的发生。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol
,即虚拟路由冗余协议
。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个一样,可以理解为在一个组中:主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
主路由器(MASTER):虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP 请求,ICMP数据转发等。
备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色, 继续提供对外服务,整个切换对用户来说是完全透明的。
2. VRRP选举机制
VRRP路由器在运行过程中有三种状态:
- Initialize [ɪˈnɪʃəlaɪz]:初始化状态:系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;
- Master状态;
- Backup状态;
一般主路由器处于Master状态,备份路由器处于Backup状态。
VRRP使用选举机制来确定路由器的状态,优先级选举:
-
1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
-
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
-
3.比较IP地址。在没有IP地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
3. VRRP工作过程
路由器使用VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master路由器,优先级低的成为Backup路由器。Master拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP报文,通知备份组内的其他设备自己工作正常;Backup路由器只接收Master发来的报文信息,用来监控Master的运行状态。当Master失效时,Backup 路由器进行选举,优先级高的Backup将成为新的Master 。
在抢占方式下,当Backup路由器收到VRRP报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master路由器;否则将保持Backup状态;
在非抢占方式下,只要Master路由器没有出现故障,备份组中的路由器始终保持Master或Backup状态,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器;
如果Backup路由器的定时器超时后仍未收到Master路由器发送来的VRRP报文,则认为Master路由器已经无法正常工作,此时Backup路由器会认为自己是Master路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master路由器,承担报文的转发功能。
4. VRRP的特点
-
VRRP是用来实现路由器冗余的协议。
-
VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。
-
VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能。
-
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是 BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。
-
VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整数;同一个组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0-255 的正整数。
7. Keepalived VS Heartbeat
heartbeat和keepalived有很多相同之处,但是也有区别:
-
Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单
-
Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能;
-
协议不同:Keepalived使用VRRP协议即虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP,l思科交换就是使用这个协议做双机)进行通信和选举。Heartbeat使用心跳(IBM POWER小型机就是用心跳线做双机)进行通信和选举;Heartbeat通过网络或串口通信