一、什么是keepalived
Keepalived 是一个用于实现服务器高可用性(High Availability,简称 HA)的软件。
简单来说,它的主要作用是检测服务器的状态,并在主服务器出现故障时,自动将服务切换到备份服务器上,以确保服务的持续可用。
Keepalived 基于虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称 VRRP)来工作。VRRP 协议可以在一组路由器中选举出一个主路由器,其他的作为备份路由器。当主路由器出现故障时,备份路由器能够迅速接替其工作,保证网络的连通性。
在实际应用中,Keepalived 通常用于以下场景:
-
负载均衡器的高可用:例如在使用 LVS(Linux Virtual Server)作为负载均衡器时,通过 Keepalived 确保负载均衡器的持续运行。
- 比如,一个网站使用 LVS 进行负载均衡,如果主 LVS 服务器宕机,Keepalived 会立即将流量切换到备份的 LVS 服务器上,保证用户的访问不受影响。
-
应用服务器的高可用:对于关键的应用服务器,Keepalived 可以监控服务器的健康状态,实现故障自动切换。
- 假设一个在线支付系统的服务器,通过 Keepalived 配置,当主服务器因硬件故障或软件崩溃无法响应时,备份服务器能够立即接管服务,确保支付流程不中断。
二、什么是VRRP
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 是一种容错协议,用于在局域网中提供网关的冗余性。
VRRP 允许一组路由器共同构成一个虚拟路由器。在这个虚拟路由器中,会选举出一台主路由器(Master Router),其他的则为备份路由器(Backup Router)。
主路由器负责处理发往虚拟路由器的数据包转发工作。备份路由器则处于监听状态,实时监测主路由器的状态。
当主路由器出现故障时,备份路由器中优先级最高的那台会迅速切换成为新的主路由器,接管数据包的转发工作,从而保证网络的连续性和稳定性。
例如,在一个企业网络中,有多台路由器连接到同一个局域网。通过配置 VRRP,将这些路由器组成一个虚拟路由器。用户的设备只需要将网关设置为这个虚拟路由器的 IP 地址,而无需关心实际哪台路由器在工作。
假设最初主路由器为 Router A,当它发生故障时,Router B(优先级较高的备份路由器)会在短时间内接替成为新的主路由器,用户的网络访问不会受到明显影响。
VRRP 为网络提供了一种高可用性的解决方案,避免了单点故障对网络通信造成的影响,确保了网络服务的持续可靠运行。
三、VRRP相关技术
通告:
- 心跳:VRRP 中通过发送心跳消息来告知其他路由器自身的状态。
- 优先级:决定了路由器在虚拟路由器中的角色,优先级高的更有可能成为主路由器。
周期性:
VRRP 协议的各种消息通常是周期性发送的,以确保各路由器之间的状态同步和及时感知变化。
工作方式:
- 抢占式:当备份路由器的优先级高于当前主路由器时,会抢占成为主路由器。
- 非抢占式:即使备份路由器优先级更高,也不会主动抢占主路由器的角色,除非当前主路由器故障。
安全认证:
- 无认证:在一些对安全性要求不高的场景中使用,存在一定风险。
- 简单字符认证:通过预共享密钥进行认证,相对简单但能提供一定的安全性。
- MD5:使用 MD5 算法进行认证,安全性更高。
工作模式:
- 主/备(单虚拟路由器):一个主路由器负责转发数据包,备份路由器处于待命状态。
- 例如,在一个小型网络中,只有一台主路由器正常工作,备份路由器等待主路由器出现故障时进行切换。
- 主/主(主/备(虚拟路由器 1),备/主(虚拟路由器 2)):实现了负载分担和冗余备份的双重功能。
- 比如在一个较大规模的网络中,一部分流量通过虚拟路由器 1 的主路由器转发,另一部分流量通过虚拟路由器 2 的主路由器转发,同时各自有对应的备份路由器保障可靠性。
四、keepalived部署
1、Keepalived 相关文件
2、环境说明
2、两台需要安装keepalived的虚拟机:172.25.254.128、172.25.254.152
两台http服务器:172.25.254.153、172.25.254.154
3、keepalived实验环境配置
两台http服务器安装http服务
测试一下
五、keepalived虚拟路由的配置
keepalived安装
配置文件组成部分
配置文件: /etc/keepalived/keepalived.conf配置文件组成GLOBAL CONFIGURATIONGlobal definitions : 定义邮件配置, route_id , vrrp 配置,多播地址等VRRP CONFIGURATIONVRRP instance(s) :定义每个 vrrp 虚拟路由器LVS CONFIGURATIONVirtual server group(s)Virtual server(s) :LVS 集群的 VS 和 RS
全局配置
! Configuration File for keepalivedglobal_defs {notification_email {594233887@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个timiniglee-zln@163.com}notification_email_from keepalived@KA1.timinglee.org # 发邮件的地址smtp_server 127.0.0.1 # 邮件服务器地址smtp_connect_timeout 30 # 邮件服务器连接 timeoutrouter_id KA1.timinglee.org # 每个 keepalived 主机唯一标识# 建议使用当前主机名,但多节点重名不影响vrrp_skip_check_adv_addr # 对所有通告报文都检查,会比较消耗性能# 启用此配置后,如果收到的通告报文和上一个报文是同一 # 个路由器,则跳过检查,默认值为全检查vrrp_strict # 严格遵循 vrrp 协议# 启用此项后以下状况将无法启动服务 :#1. 无 VIP 地址#2. 配置了单播邻居#3. 在 VRRP 版本 2 中有 IPv6 地址# 建议不加此项配置vrrp_garp_interval 0 # 报文发送延迟, 0 表示不延迟vrrp_gna_interval 0 # 消息发送延迟vrrp_mcast_group4 224.0.0.18 # 指定组播 IP 地址范围:}
测试一下
默认为抢占模式
六、keepalived虚拟路由通讯设定
注意vrrp_strict和vrrp_iptables这两行,要么同时开启,要么同时关闭
七、keepalived日志分离
[root@ka1 ~]# vim /etc/sysconfig/keepalived
[root@ka1 ~]# vim /etc/rsyslog.conf
八、keepalived独立子配置文件
[root@ka1 ~]# systemctl restart keepalived.service
九、keepalived非强制和延迟抢占
非抢占模式 nopreempt
抢占延迟模式 preempt_delay
十、keepalived单播模式设定
十一、keepalived邮件通知
十二、keepalived双主模式
ka1
ka2
测试一下
十二、keepalived-ipvs设定
IPVS相关配置
虚拟服务器配置结构
virtual_server IP port {...real_server {...}real_server {...}…}
virtual server (虚拟服务器)的定义格式
virtual_server IP port # 定义虚拟主机 IP 地址及其端口virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群virtual_server group string # 使用虚拟服务器组
虚拟服务器配置
virtual_server IP port { #VIP 和 PORTdelay_loop <INT> # 检查后端服务器的时间间隔lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写persistence_timeout <INT> # 持久连接时长protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCPsorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址real_server <IPADDR> <PORT> { #RS 的 IP 和 PORTweight <INT> #RS 权重notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状态检测方法}}# 注意 : 括号必须分行写 , 两个括号写在同一行 , 如 : }} 会出错
应用层监测
HTTP_GET|SSL_GET {url {path <URL_PATH> # 定义要监控的 URLstatus_code <INT> # 判断上述检测机制为健康状态的响应码,一般为 200}connect_timeout <INTEGER> # 客户端请求的超时时长 , 相当于 haproxy 的 timeout servernb_get_retry <INT> # 重试次数delay_before_retry <INT> # 重试之前的延迟时长connect_ip <IP ADDRESS> # 向当前 RS 哪个 IP 地址发起健康状态检测请求connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求bindto <IP ADDRESS> # 向当前 RS 发出健康状态检测请求时使用的源地址bind_port <PORT> # 向当前 RS 发出健康状态检测请求时使用的源端口}
TCP监测
TCP_CHECK {connect_ip <IP ADDRESS> # 向当前 RS 的哪个 IP 地址发起健康状态检测请求connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址bind_port <PORT> # 发出健康状态检测请求时使用的源端口connect_timeout <INTEGER> # 客户端请求的超时时长# 等于 haproxy 的 timeout server}
两台http服务器配置VIP和设定ARP广播
keepalived安装ipvsadm
轮询正常
测试一下
随便停掉一个http服务
再启动
随便停掉一个keepalived服务
正常访问
再启动
正常访问
十三、keepalived-vrrp脚本控制VIP
VRRP Script 配置
定义脚本
vrrp_script <SCRIPT_NAME> {script <STRING>|<QUOTED-STRING> # 此脚本返回值为非 0 时,会触发下面 OPTIONS 执行OPTIONS}
调用脚本
track_script {SCRIPT_NAME_1SCRIPT_NAME_2}
定义 VRRP script
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 # 设置默认标记为失败状态,监测成功之后再转换为成功状态}
调用 VRRP script
vrrp_instance test {... ...track_script {check_down}}
编写脚本
现在VIP在ka1上
VIP跳到了ka2上
然后我们把/mnt/tc这个文件删掉
VIP又回到了ka1
十四、keepalived+haproxy的高可用集群
在ka1和ka2上安装haproxy
配置haproxy
ka1和ka2开启内核参数