当前位置: 首页 > article >正文

【网站架构部署与优化】keepalived高可用

文章目录

keepalived高可用

前言

一个合格的群集应该具备的特性:

  1. 负载均衡:通过分配任务到不同的节点服务器,以平衡工作负载和提高整体性能。负载均衡器可以根据不同的策略(如轮询、最少连接、基于权重等)将请求分发到集群中的服务器。
  2. 健康检查(探针):用于监控调度器和节点服务器的运行状态。如果某个节点出现故障或无法响应,健康检查将能够检测到这种情况,并触发相应的故障处理机制。
  3. 故障转移:在主节点或服务器出现故障时,通过VIP(虚拟IP)漂移等技术实现主备切换,确保服务的连续性和可用性。故障转移机制可以自动或手动触发,具体取决于集群的配置和策略。

健康检查(探针)常用的工作方式:

  1. 发送心跳消息:通过发送vrrp报文(虚拟路由器冗余协议报文)或ping/pong消息来检测节点的存活状态。如果节点在一定时间内没有响应心跳消息,则认为该节点出现故障。
  2. TCP端口检查:向目标主机的IP地址和端口发起TCP连接请求。如果TCP连接能够成功建立(即三次握手成功),则认为该节点健康;否则,认为该节点异常。
  3. HTTP URL检查:通过HTTP协议向目标主机的特定URL路径发起GET请求。如果响应状态码为2XX或3XX(表示成功或重定向),则认为该节点健康;如果响应状态码为4XX或5XX(表示客户端或服务器端错误),则认为该节点异常。

keepalived

Keepalived是一个基于VRRP协议的高可用解决方案,它主要用于监控集群系统中各个服务节点的状态,并实现故障切换和负载均衡,以确保系统的高可用性和可靠性。

概述

Keepalived通过VRRP协议实现了服务器的故障切换和负载均衡功能。在LVS(Linux Virtual Server)服务集群中,Keepalived可以确保主服务器和备份服务器之间的无缝切换,从而提供不间断的服务。

Keepalived工作原理

  1. VRRP协议实现
    • Keepalived运行在每台服务器上,通过网络监听来自其他服务器的VRRP广播消息。
    • 当主服务器出现故障或网络异常时,备份服务器会检测到这个变化。
    • 根据VRRP优先级规则,备份服务器会选举出新的主服务器,并接管故障服务器的IP地址,成为新的虚拟IP(VIP)的拥有者。
    • 虚拟IP会被路由器配置为默认网关,从而实现了负载均衡和故障切换。
  2. 健康检查
    • Keepalived的check模块负责健康检查,通过不同的方式(如ICMP、TCP、HTTP等)检测后端服务器的状态。
    • 如果某个服务器出现故障,check模块会将其从集群中移除,以确保服务的连续性和可靠性。
  3. 故障切换
    • 当主服务器出现故障时,备份服务器会接管虚拟IP,并继续提供服务。
    • 当故障服务器恢复正常时,它会重新参与选举过程,并根据VRRP优先级规则决定是否成为新的主服务器。

Keepalived体系主要模块及其作用

  1. core模块
    • 为Keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
  2. vrrp模块
    • 实现VRRP协议,负责调度器之间的健康检查和主备切换。
    • 通过VRRP协议,Keepalived可以在主备服务器之间维持心跳,确保主服务器出现故障时备份服务器能够及时接管。
  3. check模块
    • 负责节点服务器的健康检查,常见的方式有端口检查及URL检查。
    • 通过定期检查服务器的健康状况,check模块可以及时发现并处理故障服务器,确保服务的高可用性。

Keepalived 工作模式

Keepalived 主要支持两种工作模式:

  1. 抢占模式
    • 这是 Keepalived 的默认模式。
    • 当 MASTER 节点从故障中恢复后,它会尝试将 VIP 从 BACKUP 节点抢占回来。
    • 抢占过程依赖于 VRRP 协议的优先级和广告间隔。
  2. 非抢占模式
    • 在这种模式下,MASTER 节点恢复后不会抢占 VIP。
    • 要实现非抢占模式,需要将主备节点的 state 都配置为 BACKUP,并在 Keepalived 配置中添加 nopreempt 选项。
    • 这样,当 MASTER 节点故障后,BACKUP 节点接管 VIP,而 MASTER 节点恢复后不会尝试重新获得 VIP。

Nginx + Keepalived 实现高可用

要实现 Nginx 作为负载均衡器与 Keepalived 的高可用组合,可以按照以下步骤进行:

  1. 准备健康检查脚本
    • 编写一个脚本,用于定期检查 Nginx 进程的状态。
    • 如果 Nginx 进程未运行,则脚本应返回非零值,表示 Nginx 故障。
  2. 修改 Keepalived 配置文件
    • 在 Keepalived 配置文件中,使用 vrrp_script 指令定义健康检查脚本的路径。
    • 使用 track_script 指令调用该脚本,并将其与 VRRP 实例关联。
    • 根据脚本的返回值,Keepalived 可以动态调整 VRRP 实例的优先级或触发故障转移。
  3. 启动 Nginx 和 Keepalived
    • 在所有相关节点上启动 Nginx 和 Keepalived 服务。
    • 确保 Keepalived 配置文件正确无误,并且健康检查脚本具有执行权限。

实验

keepalived + LVS-DR

LVS-DR(Direct Routing)即直接路由模式,是LVS(Linux Virtual Server)负载均衡技术中的一种模式。在此模式下,数据包的路由过程主要通过修改MAC地址来实现,而IP地址保持不变。keepalived结合LVS-DR可以实现高可用性的负载均衡解决方案。

  1. 实验环境准备
    • 两台服务器(或虚拟机)作为LVS调度器,分别安装keepalived和ipvsadm。
    • 多台后端服务器作为实际提供服务的节点。
    • 网络配置:确保所有服务器在同一网络中,并能相互通信。
  2. 实验步骤
    • 在LVS调度器上配置keepalived,设置VRRP实例,指定虚拟IP地址(VIP)。
    • 配置LVS的DR模式,包括指定调度算法(如WRR、RR等)和后端服务器。
    • 在后端服务器上配置VIP作为本地回环地址(lo:0),并设置路由禁锢,确保VIP的数据包仅在本地处理。
    • 启动keepalived和ipvsadm服务,验证VIP的绑定和负载均衡效果。
  3. 验证
    • 通过客户端访问VIP,验证负载均衡是否正常工作。
    • 模拟LVS调度器故障,观察备用调度器是否接管VIP,继续提供服务。
keepalived + nginx

Nginx是一个高性能的HTTP和反向代理服务器,也可以作为负载均衡器使用。keepalived与nginx结合,可以实现高可用性的反向代理和负载均衡解决方案。

  1. 实验环境准备
    • 两台服务器(或虚拟机)作为nginx负载均衡器,分别安装keepalived和nginx。
    • 多台后端服务器作为实际提供服务的节点。
    • 网络配置:确保所有服务器在同一网络中,并能相互通信。
  2. 实验步骤
    • 在nginx负载均衡器上配置keepalived,设置VRRP实例,指定虚拟IP地址(VIP)。
    • 配置nginx的负载均衡策略,包括指定后端服务器和调度算法(如轮询、最小连接等)。
    • 启动keepalived和nginx服务,验证VIP的绑定和负载均衡效果。
    • 可选:配置nginx的健康检查功能,确保后端服务器的可用性。
  3. 验证
    • 通过客户端访问VIP,验证nginx的负载均衡是否正常工作。
    • 模拟nginx负载均衡器故障,观察备用负载均衡器是否接管VIP,继续提供服务。
keepalived + haproxy

HAProxy是一个高性能的代理服务器,支持7层和4层代理,具有负载均衡、健康检查等多种特性。keepalived与haproxy结合,可以实现高可用性的负载均衡解决方案。

  1. 实验环境准备
    • 两台服务器(或虚拟机)作为haproxy负载均衡器,分别安装keepalived和haproxy。
    • 多台后端服务器作为实际提供服务的节点。
    • 网络配置:确保所有服务器在同一网络中,并能相互通信。
  2. 实验步骤
    • 在haproxy负载均衡器上配置keepalived,设置VRRP实例,指定虚拟IP地址(VIP)。
    • 配置haproxy的负载均衡策略,包括指定后端服务器、调度算法(如轮询、最小连接等)和健康检查机制。
    • 启动keepalived和haproxy服务,验证VIP的绑定和负载均衡效果。
  3. 验证
    • 通过客户端访问VIP,验证haproxy的负载均衡是否正常工作。
    • 模拟haproxy负载均衡器故障,观察备用负载均衡器是否接管VIP,继续提供服务。

脑裂故障问题及其解决方案

脑裂故障现象

  • 主服务器和备服务器都同时拥有相同的 VIP。
  • 这通常发生在主备服务器之间的通信中断时,备服务器无法收到主服务器的 VRRP 报文,从而误认为主服务器已经故障。
    原因
  • 主备服务器之间的通信链路故障。
  • 系统防火墙或安全策略阻止了 VRRP 报文的传输。
    解决方案
  • 关闭其中一个节点的 Keepalived 服务:在发生脑裂故障时,可以手动关闭其中一个节点的 Keepalived 服务,以确保只有一个节点拥有 VIP。
  • 预防措施
    • 关闭或配置防火墙规则,以允许 VRRP 组播地址(如 224.0.0.18)的传输。
    • 在主备服务器之间添加双链路通信或做链路聚合,以提高通信链路的可靠性。
    • 使用脚本定时判断主备服务器之间的通信链路是否中断,并在链路中断时自行关闭主服务器的 Keepalived 服务。
    • 利用第三方应用或监控系统检测是否发生了脑裂故障,并在确认后关闭其中一个节点的 Keepalived 服务。

LVS+Keepalived 高可用群集部署指南

环境概述

  • 主DR服务器:192.168.80.10
  • 备DR服务器:192.168.80.11
  • Web服务器1:192.168.80.12
  • Web服务器2:192.168.80.13
  • 虚拟IP(VIP):192.168.80.188
  • 客户端:192.168.80.200

LVS部署步骤

1. 配置负载调度器(主、备相同)
systemctl stop firewalld.service
setenforce 0

yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
2. 配置Keepalived

主DR服务器(192.168.80.10)
编辑/etc/keepalived/keepalived.conf

# 定义全局参数
global_defs {
    # 指定SMTP服务器地址,用于发送故障通知邮件
    smtp_server 127.0.0.1
    # 指定路由器ID,用于标识主DR服务器
    router_id LVS_01
}

# 定义VRRP热备实例参数
vrrp_instance VI_1 {
    # 指定热备状态,MASTER表示为主服务器
    state MASTER
    # 指定承载VIP地址的网络接口
    interface ens33
    # 指定虚拟路由器的ID号,每个热备组保持一致
    virtual_router_id 10
    # 指定优先级,数值越大优先级越高
    priority 100
    # 指定VRRP通告间隔秒数(心跳频率)
    advert_int 1
    # 定义认证信息,每个热备组保持一致
    authentication {
        # 指定认证类型
        auth_type PASS
        # 指定验证密码,主备服务器保持一致
        auth_pass abc123
    }
    # 指定群集VIP地址
    virtual_ipaddress {
        192.168.80.188
    }
}

# 定义虚拟服务器地址(VIP)、端口,以及负载均衡策略和后端真实服务器
virtual_server 192.168.80.188 80 {
    # 健康检查的间隔时间(秒)
    delay_loop 6
    # 指定调度算法,rr表示轮询
    lb_algo rr
    # 指定群集工作模式,DR表示直接路由
    lb_kind DR
    # 连接保持时间(秒),0表示不保持连接
    persistence_timeout 0
    # 应用服务采用的协议类型
    protocol TCP
    # 定义第一个真实服务器的地址、端口及权重
    real_server 192.168.80.12 80 {
        # 权重,用于负载均衡
        weight 1
        # TCP健康检查配置
        TCP_CHECK {
            # 检查的目标端口
            connect_port 80
            # 连接超时时间(秒)
            connect_timeout 3
            # 重试次数
            nb_get_retry 3
            # 重试间隔(秒)
            delay_before_retry 3
        }
    }
    # 定义第二个真实服务器的地址、端口及权重
    real_server 192.168.80.13 80 {
        # 权重,用于负载均衡
        weight 1
        # TCP健康检查配置
        TCP_CHECK {
            # 检查的目标端口
            connect_port 80
            # 连接超时时间(秒)
            connect_timeout 3
            # 重试次数
            nb_get_retry 3
            # 重试间隔(秒)
            delay_before_retry 3
        }
    }
}

备DR服务器(192.168.80.11)
编辑/etc/keepalived/keepalived.conf

# 全局配置
global_defs {
    # 指定SMTP服务器地址,用于发送VRRP通知邮件
    smtp_server 127.0.0.1
    # 指定路由器ID,用于标识备份DR服务器
    router_id LVS_02
}

# VRRP实例配置
vrrp_instance VI_1 {
    # 指定VRRP实例的状态,BACKUP表示备份状态
    state BACKUP
    # 指定承载VIP地址的网络接口
    interface ens33
    # 指定虚拟路由器的ID号,每个VRRP实例必须唯一
    virtual_router_id 10
    # 指定备份DR服务器的优先级,数值越低优先级越低
    priority 90
    # 指定VRRP通告间隔秒数(心跳频率)
    advert_int 1
    # 定义VRRP实例的认证信息
    authentication {
        # 指定认证类型
        auth_type PASS
        # 指定验证密码,主备DR服务器必须相同
        auth_pass abc123
    }
    # 指定虚拟IP地址,即VIP
    virtual_ipaddress {
        192.168.80.188
    }
}

启动Keepalived服务:

systemctl start keepalived
ip addr show
3. 启动ipvsadm服务

主DR服务器(192.168.80.10)

ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln

备DR服务器(192.168.80.11)

ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln
4. 调整内核参数

编辑/etc/sysctl.conf

# 设置所有接口的发送重定向消息的属性为0,表示不发送重定向消息
net.ipv4.conf.all.send_redirects = 0
# 设置默认接口的发送重定向消息的属性为0,表示不发送重定向消息
net.ipv4.conf.default.send_redirects = 0
# 设置ens33接口的发送重定向消息的属性为0,表示不发送重定向消息
net.ipv4.conf.ens33.send_redirects = 0

应用更改:

sysctl -p

配置节点服务器

1. 安装HTTPD服务
systemctl stop firewalld
setenforce 0

yum -y install httpd
systemctl start httpd
2. 配置本地回环接口

Web服务器1(192.168.80.12)
编辑/etc/sysconfig/network-scripts/ifcfg-lo:0

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.80.188
NETMASK=255.255.255.255

重启网络服务:

# 重启网络服务以应用新的网络配置
service network restart
# 启用lo:0接口,这是一个虚拟接口,用于承载VIP地址
ifup lo:0
# 查看lo:0接口的配置情况,包括IP地址等信息
ifconfig lo:0
# 添加一条路由规则,将VIP地址192.168.80.188的流量定向到lo:0接口
# 这样做的目的是为了让本机上的所有进程都能正确访问VIP地址
route add -host 192.168.80.188 dev lo:0

编辑/etc/sysctl.conf

# 设置本地回环接口(lo)的ARP忽略属性为1,表示忽略来自其他设备的ARP请求
net.ipv4.conf.lo.arp_ignore = 1
# 设置本地回环接口(lo)的ARP宣告属性为2,表示宣告自己的IP地址和MAC地址
# 2表示使用标准的ARP宣告方式,即宣告自己的IP地址和MAC地址
net.ipv4.conf.lo.arp_announce = 2
# 设置所有接口的ARP忽略属性为1,表示忽略来自其他设备的ARP请求
net_ipv4.conf.all.arp_ignore = 1
# 设置所有接口的ARP宣告属性为2,表示宣告自己的IP地址和MAC地址
# 2表示使用标准的ARP宣告方式,即宣告自己的IP地址和MAC地址
net.ipv4.conf.all.arp_announce = 2

应用更改:

sysctl -p

Web服务器2(192.168.80.13)
配置步骤与Web服务器1相同。
编辑/etc/sysconfig/network-scripts/ifcfg-lo:0

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.80.188
NETMASK=255.255.255.255

重启网络服务:

service network restart
ifup lo:0
ifconfig lo:0
route add -host 192.168.80.188 dev lo:0

编辑/etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

应用更改:

sysctl -p

测试验证

在客户端访问http://192.168.80.188/,确认能够正常访问Web页面。
然后在主DR服务器上停止Keepalived服务:

systemctl stop keepalived

再次访问http://192.168.80.188/,确认服务能够自动切换到备DR服务器上。

小问答

Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP?
Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。

keepalived的抢占与非抢占模式?
抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
非抢占式俩节点state必须为bakcup,且必须配置nopreempt。
注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。


http://www.kler.cn/news/341206.html

相关文章:

  • 深度学习常见问题
  • SQL第15课挑战题
  • C#中的static关键字:静态成员与单例模式的实现
  • 【读书笔记·VLSI电路设计方法解密】问题7:什么是基于标准单元的专用集成电路 (ASIC) 设计方法论
  • C# 字符串(string)三个不同的处理方法:IsNullOrEmpty、IsInterned 、IsNullOrWhiteSpace
  • 网络高危端口
  • 怎么在单片机裸机程序中移植EasyLogger?
  • 作业4-23
  • springboot网站开发-mysql数据库字段varchar类型存储汉字的长度关系
  • Qt C++设计模式->模板方法模式
  • Gin项目的初始化步骤和常见错误记录
  • python爬虫题目
  • Pymysql cur.fetchall() 返回 None
  • 哪个编程工具让你的工作效率翻倍?
  • 前端页面模块修改成可动态生成数据模块——大部分数据为GPT生成(仅供学习参考)
  • Oceanbase学习之—手工搭建oceanbaes测试
  • Pikachu-目录遍历
  • Mac上功能全面,免费好用的解压缩工具
  • Elasticsearch Suggester
  • 算法:位运算