目录
[1. Keepalive与VRRP](#1. Keepalive与VRRP)
[2. VRRP相关技术](#2. VRRP相关技术)
[3. 工作原理](#3. 工作原理)
[4. 模块](#4. 模块)
[5. 架构](#5. 架构)
[6. 安装](#6. 安装)
[7. Keepalived 相关文件](#7. Keepalived 相关文件)
[7.1 配置组成](#7.1 配置组成)
[7.2 全局配置](#7.2 全局配置)
[7.3 VRRP实例配置(lvs调度器)](#7.3 VRRP实例配置(lvs调度器))
[7.4 虚拟服务器与真实服务器配置](#7.4 虚拟服务器与真实服务器配置)
[1. 环境准备](#1. 环境准备)
[2. 实际操作](#2. 实际操作)
[1. 非抢占与延时抢占](#1. 非抢占与延时抢占)
[2. 单播与多播](#2. 单播与多播)
[3. 通知脚本](#3. 通知脚本)
[4. 日志功能](#4. 日志功能)
[5. 模拟脑裂](#5. 模拟脑裂)
[6. 实现其它应用的高可用性 VRRP Script](#6. 实现其它应用的高可用性 VRRP Script)
[6.1 VRRP Script 配置](#6.1 VRRP Script 配置)
[6.2 定义 VRRP script](#6.2 定义 VRRP script)
一、Keepalive基础介绍
1. Keepalive与VRRP
Keepalive 是一种用于监视系统或服务是否处于活动状态的机制。在网络环境中,它通常指定一个周期性的信号或数据包,用于检测设备、服务或连接是否仍然处于活动状态。如果设备或服务停止响应,相应的监视器将触发警报或采取预定义的操作。
VRRP 是一种用于提供冗余路由器功能的协议,通过允许多个路由器共享同一个虚拟 IP 地址来提供冗余。这样,即使其中一个路由器失效,网络流量仍然可以被另一个路由器接管,从而保证了网络的连通性和可用性。
这两种技术通常结合使用,因为 Keepalive 可以用于监视 VRRP 路由器的活动状态。如果 VRRP 主要路由器失效,备份路由器可以通过接收不再有主要路由器发送的 keepalive 信号来检测到这一事件,并迅速接管虚拟 IP 地址,从而确保网络的连通性。
2. VRRP相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式,延迟抢占模式
安全认证:如没有安全认证,不在集群中的keeplive服务器设置超高的优先级,会造成事故
工作模式:
-
主/备:单虚拟路径器
-
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2
3. 工作原理
Keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议,保证集群高可用的一个服务软件,用来防止单点故障。将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。
IPV4总共三种通信方式:单播,组播,广播。组播是指以224.0.0.0地址作为通信地址的一种方式。
4. 模块
分别是core、check和vrrp。
- core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
- check负责健康检查,包括常见的各种检查方式。
- vrrp模块是来实现VRRP协议的。
5. 架构
用户空间核心组件:
① vrrp stack:VIP消息通告,用来管理虚拟ip
② checkers:监测real server(简单来说 就是监控后端真实服务器的服务)是否存活
③ system call:实现 vrrp 协议状态转换时调用脚本的功能
④ SMTP:邮件组件(报警邮件)
⑤ IPVS wrapper:生成IPVS规则(直接生成ipvsadm)
⑥ Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)
⑦ WatchDog:监控进程(整个架构是否有问题)
⑧ 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
⑨ IO复用器:针对网络目的而优化的自己的线程抽象
⑩ 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
6. 安装
① yum安装:yum install keepalived -y
② 官网下载安装包,编译安装:Keepalived for Linux
7. Keepalived 相关文件
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File单元文件:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived CentOS
7.1 配置组成
/etc/keepalived/keepalived.conf 配置组成
① 全局配置:这部分包括全局参数的定义,例如进程 ID 文件、日志文件路径、通知邮箱地址等。全局配置通常用于指定整体行为和设置。
② 模块配置:Keepalived 配置文件中会包含关于 VRRP 或者 LVS 模块的配置。对于 VRRP 模块,需要定义虚拟路由器的标识符、优先级、虚拟 IP 地址以及监视其他路由器可用性所需的健康检查。对于 LVS 模块,需要定义负载均衡器的设置,包括虚拟服务器、后端服务器池、负载均衡算法等。
③ VRRP 实例配置:在 VRRP 模式下,配置文件中会包含一个或多个 VRRP 实例的配置。每个实例都会定义一个独立的虚拟路由器,包括其标识符、优先级、虚拟 IP 地址、健康检查设置等。
④ LVS 实例配置:在 Load Balancer 模式下,配置文件中会包含一个或多个 LVS 实例的配置。每个实例会定义一个独立的负载均衡服务,包括虚拟服务器、后端服务器池、负载均衡算法等设置。
⑤ 状态转换脚本:Keepalived 允许用户定义状态转换时执行的自定义脚本,这些脚本可以在主备切换时执行特定的操作,如通知管理员、启动或停止相关服务等。
7.2 全局配置
全局配置参数定义了邮件通知设置、路由器标识符以及 VRRP 的一些行为特性,确保在需要时可以进行状态通知,并控制 VRRP 协议的一些细节行为。
bash
global_defs {
notification_email { #定义了接收通知邮件的邮箱地址列表
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc 指定了发送通知邮件的邮箱地址
smtp_server 192.168.200.1 #设置 SMTP 服务器的地址为 192.168.200.1
smtp_connect_timeout 30 #SMTP 连接超时时间为 30 秒
router_id LVS_DEVEL #指定了路由器的标识符为 LVS_DEVEL
vrrp_skip_check_adv_addr #表示在 VRRP 状态转换时跳过对广播地址的检查
vrrp_strict #启用严格模式,要求 VRRP 实例只能在其配置的网络接口上工作
vrrp_garp_interval 0 #设置 Gratuitous ARP(GARP)消息发送的间隔时间为 0,即禁用 GARP
vrrp_gna_interval 0 #设置 Gratuitous Neighbor Advertisement(GNA)消息发送的间隔时间为 0,即禁用 GNA
#GARP 是指发送者在不请求的情况下主动发送 ARP 响应消息
#GNA 是 IPv6 网络中的类似协议,它也是主动发送者在不请求的情况下向网络上的其他设备发送邻居通告消息。类似于 GARP
vrrp_mcast_group4 224.0.0.18
#指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18;建议使用特有的组播地址或者改为单播
vrrp_iptables
#此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}
7.3 VRRP实例配置(lvs调度器)
共同定义了一个 VRRP 实例的属性、身份验证设置以及与其关联的虚拟 IP 地址,使得 Keepalived 能够管理虚拟路由器的状态,并确保在故障时能够进行适当的状态转换。
bash
vrrp_instance VI_1 { #定义了一个名为 VI_1 的 VRRP 实例,用于创建一个虚拟路由器实体(lvs虚拟调度器)
state MASTER #指定该实例的初始状态为 MASTER,即主服务器状态。在 VRRP 中,可以将路由器配置为主服务器或备份服务器。
interface eth0 #指定了 VRRP 实例所使用的网络接口,这里是 eth0
virtual_router_id 51 #为 VRRP 实例指定了一个唯一的虚拟路由器 ID。该 ID 在同一广播域内必须是唯一的,范围:0-255
priority 100 #设置了该实例的优先级为 100。在 VRRP 中,具有最高优先级的路由器将被选举为主服务器
advert_int 1 #指定了 VRRP 报文的发送间隔为 1 秒。这决定了 VRRP 路由器之间交换状态信息的频率
authentication { #这个部分定义了 VRRP 实例的身份验证设置(认证机制)
auth_type PASS #指定了使用密码进行身份验证
auth_pass 1111 #设置了用于身份验证的密码为 1111
auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
auth_pass <PASSWORD> #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #列出了该 VRRP 实例关联的虚拟 IP 地址列表。这些 IP 地址将会在主服务器和备份服务器之间切换,确保始终有一台服务器能够接收流量并处理数据包。生产环境可能指定上百个IP地址
192.168.200.16 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认为/32
192.168.200.17/24 dev eth1 #指定了一个带子网掩码的虚拟 IP 地址,并且明确地指定了它要绑定到的网络接口(eth1)
192.168.200.18/24 dev eth2 label eth2:1 #指定VIP的网卡label,即将这个虚拟ip绑在eth2的虚拟网卡上
}
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT(失败)状态实现地址转移
eth0
eth1
...
}
注意:当生产环境中虚拟IP过多,可以在 virtual_ipaddress{ }前加入子配置文件声明,如:include /etc/keepalived/conf.d/*.conf,删除或注释主配置文件virtual_ipaddress{ }虚拟IP部分,最后每个项目生成一个子文件夹。
7.4 虚拟服务器与真实服务器配置
定义虚拟服务器的行为,包括负载均衡算法、持久化会话设置以及用于检查真实服务器健康状态的参数。同时,您还可以为每个真实服务器定义权重和健康检查的详细规则,以确保负载均衡系统能够有效地分发流量并监控后端服务器的状态。
bash
virtual_server 192.168.200.100 443 { #定义了一个虚拟服务器,监听 IP 地址为 192.168.200.100,端口为 443
delay_loop 6 #设置检测真实服务器状态的时间间隔为 6 秒
lb_algo rr #指定了负载均衡算法为 Round Robin(轮询)方式
lb_kind NAT #指定了负载均衡的类型为 NAT。NAT 模式将客户端的请求通过 NAT 转换后发送到后端服务器
persistence_timeout 50 #设置了持久化会话的超时时间为 50 秒
protocol TCP #指定了虚拟服务器所使用的协议为 TCP
real_server 192.168.201.100 443 { #定义了一个真实服务器,其 IP 地址为 192.168.201.100,端口为 443
weight 1 #设置了该真实服务器的权重为 1,用于负载均衡算法
SSL_GET { #这一部分定义了用于检查真实服务器健康状态的 SSL GET 请求的参数
url { #指定了要进行健康检查的 URL 路径,并提供了对应的摘要信息
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
TCP_CHECK {
connect_port 443 #检查目标端口
connect_timeout 3 #设置了连接超时时间为 3 秒
nb_get_retry 3 #指定了在失败时尝试重新连接的次数为 3 次
delay_before_retry 3 #设置了重试前的延迟时间为 3 秒
}
}
}
real_server 192.168.91.105 80 { #定义第二台真实服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
二、Keepalived结合LVS负载均衡
Keepalived结合LVS构建的负载均衡系统不仅可以提高系统的可靠性和性能,还能简化管理并降低成本,是企业构建稳定、高效的网络架构的重要组成部分。
1. 环境准备
2. 实际操作
① 代理服务器7-0,7-1关闭防火墙,安装ipvsadm,keepalived
bash
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]#yum install ipvsadm keepalived -y
② 修改代理服务器7-0keepalived服务配置
bash
[root@localhost ~]#cd /etc/keepalived/
[root@localhost keepalived]#cp keepalived.conf keepalived.conf.bak #备份配置文件
[root@localhost keepalived]#vim keepalived.conf
10 smtp_server 127.0.0.1
12 router_id LVS_01
14 #vrrp_strict
21 interface ens33
27 auth_pass 123123
29 virtual_ipaddress {
30 192.168.190.188
31 }
34 virtual_server 192.168.190.188 80 {
37 lb_kind DR
38 persistence_timeout 0
删除43-51行,58行往后全部删除
后端真实服务器配置如下:
real_server 192.168.190.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.190.103 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
③ 加载IPVS模块、保存当前的IPVS配置,并且查看当前系统上的IPVS配置信息
bash
[root@localhost keepalived]# modprobe ip_vs #加载 IP 虚拟服务器 (IPVS) 模块
[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm #将当前 IPVS 的配置保存到 /etc/sysconfig/ipvsadm 文件中
[root@localhost keepalived]# systemctl start ipvsadm.service
[root@localhost keepalived]# systemctl restart keepalived.service
[root@localhost keepalived]# ipvsadm -ln #列出当前系统上的 IPVS 配置信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 127.0.0.1:80 rr
TCP 192.168.190.188:80 rr
-> 192.168.190.102:80 Route 1 0 0
-> 192.168.190.103:80 Route 1 0 0
④ 修改代理服务器7-1keepalived服务配置
bash
192.168.190.101,7-1:
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# ls
192.168.190.100,7-0:
[root@localhost keepalived]# scp keepalived.conf 192.168.190.101:/etc/keepalived/
The authenticity of host '192.168.190.101 (192.168.190.101)' can't be established.
ECDSA key fingerprint is SHA256:aIqKteFz37bh8tOF7A07YElsVqfHgBSbxwkKXK9dfks.
ECDSA key fingerprint is MD5:9c:5a:7f:ec:d9:0c:2a:b2:9d:9e:03:77:f3:87:36:d4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.190.101' (ECDSA) to the list of known hosts.
root@192.168.190.101's password:
keepalived.conf
#远程传输配置文件
192.168.190.101,7-1:
[root@localhost keepalived]# vim keepalived.conf
12 router_id LVS_02
20 state BACKUP
23 priority 80
[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost keepalived]# systemctl start ipvsadm.service
[root@localhost keepalived]# systemctl start keepalived.service
[root@localhost keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.190.188:80 rr
-> 192.168.190.102:80 Route 1 0 0
-> 192.168.190.103:80 Route 1 0 0
⑤ 查看虚拟IP在代理服务器7-0还是7-1
⑥ web服务器7-2,7-3分别添加web文件,开启httpd服务,添加路由
bash
192.168.190.102,7-2:
[root@localhost ~]# echo 7-2 > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ifconfig lo:0 192.168.190.188 netmask 255.255.255.255
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
192.168.190.103,7-3:
[root@localhost ~]# echo 7-2 > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ifconfig lo:0 192.168.190.188 netmask 255.255.255.255
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
⑦ 客户端7-4访问代理服务器VIP
bash
[root@localhost ~]# curl 192.168.190.188
7-2
[root@localhost ~]# curl 192.168.190.188
7-3
[root@localhost ~]# curl 192.168.190.188
7-2
[root@localhost ~]# curl 192.168.190.188
7-3
注意:如果PC端浏览器访问VIP,刷新没有变化需要关闭apache长连接设置
bash
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
keepalive off
三、Keepalived优化
1. 非抢占与延时抢占
默认配置为立即抢占,效果如下:
关闭7-0keepalived服务,观察客户端访问情况,并查看虚拟IP所处位置
bash
7-0代理lvs1:
[root@localhost keepalived]# systemctl stop keepalived.service
7-4客户端:
[root@localhost ~]# curl 192.168.190.188
7-3
[root@localhost ~]# curl 192.168.190.188
7-2
非抢占模式:
① 两台LVS代理服务器均需要修改keepalived服务配置
bash
[root@localhost keepalived]# vim keepalived.conf
19 vrrp_instance VI_1 {
20 state BACKUP #均改为BACKUP
21 nopreempt #添加此行
[root@localhost keepalived]# systemctl restart keepalived.service
② 默认虚拟IP在LVS1上,修改完LVS1配置后,查看虚拟IP已转移到LVS2上
bash
[root@localhost keepalived]# hostname -I
192.168.190.101 192.168.190.188 192.168.122.1
延迟抢占:
① 两台LVS代理服务器均需要修改keepalived服务配置
bash
[root@localhost keepalived]# vim keepalived.conf
19 vrrp_instance VI_1 {
20 state BACKUP
21 preempt_delay 10
[root@localhost keepalived]# systemctl restart keepalived.service
② 先前测试非抢占模式,目前虚拟IP位于LVS2上,修改LVS1实例配置,并查看延迟抢占
bash
[root@localhost keepalived]# vim keepalived.conf
19 vrrp_instance VI_1 {
20 state BACKUP
21 preempt_delay 10 #抢占延迟模式,默认延迟300s
[root@localhost keepalived]# systemctl restart keepalived.service
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.190.188 192.168.122.1
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.190.188 192.168.122.1
2. 单播与多播
- 单播模式:在单播模式下,VRRP 报文是通过单播方式进行传输的。这意味着每个 VRRP 实例的主机都会向其他 VRRP 实例的主机发送单独的 VRRP 报文。这种方式需要占用更多的网络带宽,但可以提供更高的可靠性和安全性。
- 多播模式:在多播模式下,VRRP 报文是通过多播方式进行传输的。这意味着每个 VRRP 实例的主机都会向一个多播地址发送 VRRP 报文。这种方式需要占用更少的网络带宽,但可能会受到网络中的其他设备的影响,从而导致可靠性和安全性下降。
因此,单播模式相对于多播模式来说,更加稳定和安全,但需要占用更多的网络带宽。多播模式则更加节省网络带宽,但可能会受到其他因素的影响,从而导致可靠性和安全性下降。在实际应用中,需要根据具体的网络环境和需求来选择适合的 VRRP 模式。
抓包查看vrrp报文:可见密码没什么意义
抓包查看单播地址:在 ens33 网卡上抓取源 IP 地址为 192.168.190.100 的网络流量
修改多播:
① 分别修改LVS1,LVS2 keepalived配置文件
bash
[root@localhost keepalived]# vim keepalived.conf
global_defs {
vrrp_mcast_group4 234.6.6.6
[root@localhost keepalived]# systemctl restart keepalived.service
② 抓拍查看报文
修改单播:
① 分别修改LVS1,LVS2 keepalived配置文件
bash
LVS1,192.168.190.100:
vrrp_instance VI_1 {
......
unicast_src_ip 192.168.190.100 #本机IP,master100,backup101
unicast_peer {
192.168.190.101 #指向对方主机IP 如果有多个keepalived,再下面加其它节点的IP
}
LVS2,192.168.190.101:
vrrp_instance VI_1 {
......
unicast_src_ip 192.168.190.101
unicast_peer {
192.168.190.100
}
② 抓包,在 ens33 网卡上抓取源 IP 地址为 192.168.190.100,目标 IP 地址为 192.168.190.101 的网络流量
3. 通知脚本
通知脚本(notification script)是用来在状态转换发生时通知管理员或执行特定操作的脚本。当Keepalived监测到故障或状态变化时,例如主服务器故障或切换到备用服务器,它会触发通知脚本。记录状态变化和事件日志,并发送电子邮件或短信通知给管理员或运维团队等操作。
① 编写脚本
bash
[root@localhost opt]# vim keepalive.sh
#!/bin/bash
#
contact='num@qq.com' #qq邮箱
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
[root@localhost opt]# chmod +x keepalived.sh
② 修改LVS1keepalived配置文件
bash
[root@localhost opt]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
......
notify_master "/opt/keepalive.sh master"
notify_backup "/opt/keepalive.sh backup"
notify_fault "/opt/keepalive.sh fault"
}
[root@localhost opt]# systemctl restart keepalived.service
③ 配置邮箱
bash
[root@localhost ~]# vim /etc/mail.rc
set from=num@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=num5@qq.com
set smtp-auth-password=******* #POP3/IMAP/SMTP/Exchange/CardDAV 授权码
④ 模拟master故障
bash
[root@localhost opt]# systemctl restart keepalived.service
[root@localhost opt]# killall keepalived
⑤ 查收邮件
4. 日志功能
开启单独日志功能
① 设置日志输出的设施
bash
[root@localhost opt]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
② 将local6设备的所有日志消息重定向到/data/keepalived.log文件中。
bash
[root@localhost opt]# vim /etc/rsyslog.conf
local6.* /data/keepalived.log
[root@localhost opt]# systemctl restart rsyslog.service
[root@localhost opt]# systemctl restart keepalived.service
[root@localhost opt]# ls /data
keepalived.log
#查看生成日志文件
5. 模拟脑裂
bash
[root@localhost keepalived]#iptables -A INPUT -s 192.168.190.100 -j REJECT
#在备份主机LVS1中加入此项
[root@localhost keepalived]#ip a
#可以在主备上都发现vip地址
都有哪些原因导致脑裂?
① 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
② 因心跳线坏了(包括断了,老化)。
③ 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
④ 因心跳线间连接的设备故障(网卡及交换机)
⑤ 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
⑥ 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
⑦ 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
⑧ 多组keepalive服务器造成 组播冲突 1.换组播地址 2.改成单播
如何解决keepalived脑裂问题?
同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息。即多拉一条网线。
6. 实现其它应用的高可用性 VRRP Script
keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能。
6.1 VRRP Script 配置
① 定义脚本
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点
格式:
bash
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS
}
② 调用脚本
track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script
格式:
bash
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
6.2 定义 VRRP script
bash
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell命令或脚本路径(注意执行权限)
interval <INTEGER> #间隔时间,单位为秒,默认1秒
timeout <INTEGER> #超时时间
weight <INTEGER:-254..254> #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
fall <INTEGER> #执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise <INTEGER> #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
操作:keepalived+nginx实现反向代理集群
① 两台代理服务器安装nginx,修改配置文件,配置反向代理
bash
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install nginx -y
[root@localhost ~]# vim /etc/nginx/nginx.conf
23 upstream web {
24 server 192.168.190.102;
25 server 192.168.190.103;
26 }
48 location / {
49 proxy_pass http://web;
50 }
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# scp /etc/nginx/nginx.conf 192.168.190.101:/etc/nginx/nginx.conf
② 编写脚本
bash
[root@localhost ~]# vim /etc/keepalived/ng.sh
killall -0 nginx
[root@localhost ~]# chmod +x /etc/keepalived/ng.sh
③ 编辑keepalived配置文件
bash
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
# 全局配置下配置,平级
vrrp_script check_down {
script "/etc/keepalived/ng.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}
vrrp_instance VI_1 {
......
track_script {
check_down
}
}
④ 模拟故障,关闭代理服务器1nginx服务,访问页面需要多次刷新,同时观察VIP在哪台机器