有了分布式架构+负载均衡,业务可用性越来越强,能承受住很高的流量
但是问题出现了——所有流量都打在 nginx代理上,你的nginx容易出现性能瓶颈
突然有一天,你的 nginx 撑不了那么大的流量,出现了宕机故障,那么用户发起的所有请求都到不了你的后端 web 服务器上
那么该如何解决 nginx 单点问题呢?
你想到了将 nginx 做成分布式+ keepalived 的方式
如果 nginx master 出现宕机,keepalived则会将服务切到 nginx slave上,保证业务不受影响
这样就可以避免 nginx 单机故障问题,以此来实现高可用
keepalived服务简单来说,就是用来防止单点故障的。
所谓的单点故障就是,主服务器挂了之后从服务器充当主服务器,原来的主服务器恢复后,当从服务器来使用,保证服务的高可用性。
环境配置
首先需要四台设备,分别时KA1,KA2 web1和web2
KA1 IP:172.25.254.10
KA2 IP:172.25.254.20
web1IP:172.25.254.110
web2IP:172.25.254.120
在web1和web2中下载httpd服务和写入信息
在web1中
echo 172.25.254.110 > /var/www/html/index.html
在web2中
echo 172.25.254.110 > /var/www/html/index.html
keepalived的虚拟路由管理
首先在KA1和KA2中下载keepalived服务
在KA1中进入配置文件
vim /etc/keepalived/keepalived.conf
notification_email表示keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区
在KA2中,参数同上
使用ip a命令查看VIP是否生效(由于KA1为主设备,所以只有KA1中有VIP,KA2中没有VIP)
ip a
在KA1中使用抓包命令来进行测试VIP是否生效
tcpdump -i eth0 -nn host 224.0.0.18
systemctl stop keepalived
systemctl start keepalived
keepalived开启通信功能和独立日志
开启通信功能
TCP可以提供可靠的数据传输服务,IP地址和端口代表一个TCP连接的一个连接端。 要获得TCP服务,须在发送机的一个端口上和接收机的一个端口上建立连接。 而Keepalived在传输层就是利用TCP的端口连接和扫描技术来判断集群节点是否正常的
进入keepalived配置文件,加入vrrp_iptables,两台keep主机都要配置,或者同时注释掉vrrp_strict和vrrp_iptables
(两台keep主机都要做)
vim /etc/keepalived/keepalived.conf
访问VIP,172.25.254.100
生成日志
Keepalived日志记录了服务运行期间的各种事件和状态变更,这些信息对于监控服务健康状况、诊断问题和审计目的至关重要。通过分析日志文件,管理员可以了解服务的启动和关闭消息、配置文件解析结果、VRRP状态变更、故障检测与恢复、系统通知以及内部错误与警告等关键信息。这些日志数据有助于及时发现和解决潜在的问题,确保网络服务的稳定可靠运行。
进入keepalived的日志配置文件
vim /etc/sysconfig/keepalived
在文件底部加入以下参数
-S后的数字范围0-7
进入日志文件,配置日志接收范围和生成文件路径和名字等
vim /etc/rsyslog.conf
重启服务查看日志
cat /var/log/keepalived.log
keepalived独立子配置文件
在复杂的生产环境中,Keepalived的主配置文件可能会包含大量的集群配置信息,这使得配置文件难以管理和维护。为了解决这个问题,可以将不同集群的配置分割到独立的子配置文件中。通过在主配置文件中通过include指令引入这些子配置文件,可以实现模块化管理,使得每个集群的配置更加清晰,便于单独编辑和更新。这种做法提高了配置文件的可读性和可维护性,同时也降低了因配置错误导致的风险
vim /etc/keepalived/keepalived
使用unclude设置子配置文件路径
创建文件路径及文件
mkdir -p /etc/keepalived/conf.d
vim /etc/keepalived/conf.d/172.25.254.100.conf
写入以下配置
独立子配置文件完成
非抢占模式
Keepalived的非抢占模式是指在高可用性集群中,当主节点(Master)出现故障并恢复后,它不会主动夺回虚拟IP地址(VIP),而是继续作为备份节点(Backup)运行。这种模式适用于那些不希望因为主节点的恢复而触发不必要的VIP迁移的场景。在非抢占模式下,只有当备份节点完全失效,主节点的优先级才能决定其是否接管VIP。这样可以减少服务中断的次数,提高系统的稳定性。
在配置非抢占模式时,通常需要确保所有节点的状态都设置为BACKUP,并且至少有一个节点配置了nopreempt
参数。此外,所有节点的优先级应当保持一致,或者至少确保主节点的优先级不是最高的,以便在主节点恢复时能够保持在BACKUP状态
在KA1和KA2中同时配置以下参数
在KA1中测试:
KA1优先级更高,但并没有VIP
KA2中,由于配置了非抢占模式,所以KA2中纯在VIP而且不会被KA拿去
当关掉KA2 keepalived服务后,VIP才会回到KA1中
延迟抢占
Keepalived的延迟抢占模式是一种高级配置选项,它允许在主节点(Master)恢复后,设置一个特定的延迟时间,在这个时间内,即使主节点的优先级高于备份节点(Backup),它也不会尝试夺回虚拟IP地址(VIP)。这种模式特别适用于那些需要确保主节点完全稳定并且能够可靠地提供服务之前,不发生VIP切换的场景。通过设置preempt_delay
参数,管理员可以控制抢占行为发生的时机,从而减少因过早切换导致的潜在服务中断风险
在KA1和KA2中同时设置preempt_delay
测试,得先让VIP在KA2中,因为KA1本来就为主设备,如果KA1中有VIP就无法抢占,将VIP放在KA2可以更好观测到效果
5s后VIP从KA2回到KA1
组播变单播
在默认的组播模式下,Keepalived会向特定的组播地址发送VRRP广告信息。这种方式虽然适用于多节点环境,但在某些网络环境中可能不适用,例如当网络不支持组播或者出于安全考虑需要限制组播流量时。此外,组播模式可能会在局域网中产生大量无用信息,引起干扰和冲突。
将Keepalived的组播模式改为单播模式可以解决这些问题。在单播模式下,Keepalived不再向组播地址发送广告信息,而是直接向预设的单播地址发送,通常是主备节点的私有IP地址。这样可以减少网络流量,提高效率,并避免潜在的冲突。同时,单播模式不需要关闭vrrp_strict
选项,这是组播模式下的一个额外要求,以确保VRRP协议的正确执行.
在配置单播模式时,需要在Keepalived的配置文件中指定unicast_src_ip
(单播的源地址)和unicast_peer
(单播的目标地址)。这样配置后,Keepalived会在主备节点之间建立单播通信,确保VRRP广告信息的传递,从而维护高可用性集群的正常运行。
进入keepalived配置文件
vim /etc/keepalived/keepalived.conf
在unicast_src_ip 为发送方的IP地址
unicast_peer 为接收方IP地址
此配置需在KA1和KA2上都配置
用抓包进行查看
tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20
tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10
keepalived通知脚本(邮件通知)
邮件通知脚本在Keepalived中的作用是在特定事件发生时,如主备角色转换或故障发生,自动向系统管理员发送通知邮件。这样,管理员可以及时得知服务状态的变化,并采取相应的维护措施。邮件通知脚本通常包含以下几个关键部分:
- 脚本定义:脚本以shell脚本的形式编写,定义了在不同状态下需要执行的操作。
- 邮件发送函数:脚本中定义了一个函数,用于构建邮件的主题和正文,并使用邮件命令(如
mail
)发送邮件。 - 状态判断逻辑:脚本通过传递不同的参数来判断当前的状态(如master、backup或fault),并根据这些状态执行相应的邮件发送操作。
- 执行权限:脚本需要具有执行权限,以便Keepalived能够在检测到状态变化时运行脚本。
在Keepalived的配置文件中,可以通过notify_master
、notify_backup
和notify_fault
指令来指定在不同状态变化时执行的邮件通知脚本及其参数.
首先需要在windows中开启邮件服务(我用的qq邮箱)
登录qq邮箱后点击右上角账号与安全
点击安全设置
发送短信
可获得安全码
在KA1和KA2中下载mailx邮件服务
yum install mailx -y
进入mail配置文件
vim /etc/keepalived/mail.sh
在文件最后加入以下内容,from和user后为自己的真实邮件地址,在passwd后粘贴在qq邮箱中获得的安全码
创建邮箱脚本(内容如下)
vim /etc/keepalived/mail.sh
vim /etc/keepalived/keepalived.conf
调用配置脚本
以上配置:vim /etc/keepalived/mail.sh , vim /etc/keepalived/mail.sh ,vim /etc/keepalived/keepalived.conf
在KA2中同样需要配置,配置内容和KA1一样
配置完成,开始测试
重启KA1keepalive服务
KA1会在qq邮箱中发送以下消息
停止KA1的keepalived服务,KA2会发送邮件
启动KA1的keepalived服务后KA1又会发送邮箱
keepalived双主架构
Keepalived双主架构的原理
Keepalived是一个用于实现高可用性的开源软件,它通常与虚拟化路由器冗余协议(VRRP)一起使用,以确保网络服务的连续性和可靠性。在双主架构中,两台服务器都运行Keepalived守护进程,并通过VRRP协议相互通信,以维护一个共享的虚拟IP地址。这两台服务器可以同时在线提供服务,但在任何时候只有一台服务器持有虚拟IP地址,并对外提供服务。
双主架构的作用
双主架构的主要作用是消除单点故障,提高系统的可用性和可靠性。在这种配置中,两台服务器都可以承担主服务器的角色,即使一台服务器出现故障,另一台服务器也能立即接管虚拟IP地址,继续提供服务,从而确保服务的连续性。此外,双主架构还可以平衡负载,提高整体性能,因为两台服务器可以共同处理传入的流量。
在实际应用中,双主架构可以用于多种场景,例如构建高可用的Web服务器、数据库服务器或其他关键网络服务。通过这种方式,组织可以减少因服务器故障导致的服务中断风险,保障业务的稳定运行。
进入配置文件
vim /etc/keepalived/keepalived.conf
KA1:
KA2:
这样两台主机都有VIP
KA1:
KA2:
同样的,一台keepalived设备停机,VIP会给到另一个
KA1停掉后,KA2有两个VIP,分别为100和200
keepalived+LVSDR模式
Keepalived结合LVS(Linux Virtual Server)的DR(Direct Routing)模式是一种常用于构建高可用负载均衡集群的解决方案。在这种模式下,Keepalived负责管理虚拟IP(VIP)和监控LVS负载均衡器的状态,确保在主负载均衡器出现故障时能够无缝切换到备用负载均衡器。
Keepalived+LVS DR模式的主要作用是提供一个稳定、高效且高可用的负载均衡解决方案。它适用于需要处理大量并发连接和提供连续服务的场景,如Web服务器集群、数据库服务器集群等。通过使用Keepalived,可以确保在任何单一组件失败的情况下,系统仍然能够继续提供服务,从而提高了整体的可靠性和业务连续性
在relserver1和2中
配置arp和VIP
进入keepalived配置文件
vim /etc/keepalived/keepalived.conf
KA1:
KA2:
用ipvsadm -Ln查看策略是否生效
KA1:
KA2:
使用windows访问测试:
由于设置的轮询都为1,所以各自访问一个
停止KA1后,仍能访问
该结果还是可以呈现出客户想访问的结果
keepalived+haproxy
当Keepalived和Haproxy结合使用时,它们共同提供了一个高可用性的负载均衡解决方案。Keepalived管理VRRP组的虚拟IP,确保即使主Haproxy节点失败,服务也能通过备用节点继续提供。同时,Haproxy负责实际的流量分发和后端服务器健康检查。这种配置允许即使在主节点出现故障的情况下,客户端的请求也能无缝地重定向到备用节点,从而最小化服务中断的影响
在KA1和KA2中下载haproxy
进入配置文件写入主机VIP
vim /etc/haproxy/hapory.cfg
在两个ka1和ka2两个节点启用内核参数
刷新
在ka1和ka2中编写检测脚本
在ka1和ka2中配置keepalived添加shell脚本
vim /etc/keepalived/keepalived.conf
KA1vip为100
KA2VIP为200
测试:
关闭KA1haproxy服务,100VIP进入KA2
KA1无VIP
KA2有两个VIP,分别为100和200
访问同样生效
开启KA1haproxy服务后,100VIP回到KA1
KA2无100VIP
实验完成