部署 LVS + keepalived 高可用负载均衡集群
一 LVS + keepalived 集群概述
在这个高度信息化的 IT 时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求不断提高,以便提供持续的、不间断的计算机系统或网络服务。
Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
1.1 Keepalived工具介绍
专为LVS和HA设计的一款健康检查工具
• 支持故障自动切换(Failover)
• 支持节点健康状态检查(Health Checking)
• 官方网站:http://www.keepalived.org/
1.2 工作原理
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
keepalived 采用VRRP热备份协议实现Linux服务器的多机热备功能
1.3 VRRP (虚拟路由冗余协议)
- 是针对路由器的一种备份解决方案
- 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
1.4 故障转移机制
Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。
而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
1.5一个完善的集群的特点
一个集群要满足3个 特点,才能是一个完善的集群
负载均衡,健康检查,故障切换
对于节点服务器,健康检查 如果发现有故障的节点,就会将其隔离或者提出集群待其恢复后,在重新加入到集群中
对于负载均衡器,健康检查 会定时检查主的状态(包括主机和服务的状态),如果主故障,就自动切换到备用服务器上,待主的回复,再重新让主去承载业务请求
二 keepalive的 主配置文件介绍
2.1 全局配置
复制vim /etc/keepalived.conf
#全局配置,针对整个keepalived 生效的配置
global_defs {
notification_email { #设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc ##设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
smtp_server 192.168.200.1 #指定发送邮件的smtp服务器。
smtp_connect_timeout 30 #设置smtp连接超时时间,单位为秒。
router_id LVS_DEVEL #是运行keepalived的一个表示,多个集群router_id设置不同。
}
2.2 VRRPD 配置
复制#VRRPD 配置,主要有vrrp 同步组合 vrrp 实例两个部分组成。想要使用vrrp 高可用选举,就必须配置vrrp 实例,在实例中定义vip,服务器角色等
#用来做健康检查,当时检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_script checkha {
script "/home/check.sh" #一句指令或者一个脚本文件,需返回0(成功)或非0(失败),keepalived以此为依据判断其监控的服务状态。如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
interval 1 #健康检查周期
weight -10 # 优先级变化幅度,如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。 一个节点在集群中的角色,是由”weight“ 值和 ”priority“值控制。如果不设置weight值,集群优先级的选择将由Keepalived配置文件中的“priority“值决定
}
-------------------------------------------------------------------------
#VRRP同步组。 当服务器有两个网段,一个内网,一个外网 ,每个网段开启一个VRRP实例。当VRRP检测为内网,但是当外网出现故障,VRRPD 任然认为自己健康,就不会进行主备切换。所以把两个实例都加入到一个同步组中,当任何一个实例出现问题,都会进行主备切换
vrrp_sync_group VG_1 { #监控多个网段的实例
group {
VI_1 #实例名
VI_2
.......
}
notify_master "/path/xx.sh" #keepalived进入master状态时需要执行脚本
netify_backup "/path/xx.sh" # keepalived进入backup状态时需要执行脚本
notify_fault "path/xx.sh VG_1" #keepalived进故障时执行的脚本
notify_stop "/path/xx.sh" # keepalived程序终止时需要执行脚本
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
#Vrrp 实例配置,用来定义对外提供服务的vip 区域及相关属性
vrrp_instance VI_1 {
state MASTER #指定设立初始状态,实际的master 和 backup 时选举决定的
interface eth0 #指定承载VIP地址的物理接口
virtual_router_id 51 #设置vrid 标记,多个集群不可以重复(1..255),同集群主备必须保持一致,否则会发生脑裂现象
priority 100 #设置优先级。优先级最高的成为master
nopreempt #设置为不抢占
advert_int 1 #设置检测的时间间隔,默认1s
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证方式,支持PASS和AH,官方建议使用PASS
auth_pass 1111 #认证的密码,主备服务器保持一致
}
virtual_ipaddress { #定义集群vip 地址
192.168.200.100
}
}
1 “weight”值为正数时
在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为:
Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。
Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。
2 “weight”值为负数时
在“vrrp_script”中指定的脚本如果检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,因此切换策略为:
Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。
Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。
2.3 LVS 配置介绍
复制#LVS 配置,这里的配置是用来管理lvs的,实现keepalived 和 lvs 的结合的模块。ipvsadm 命令的功能,这里都可以实现
virtual_server 192.168.200.100 443 { #vip 地址,和vrrp_insttance 模块中的virtual_ipaddress地址一致
delay_loop 6 #健康检查时间间隔
lb_algo rr #lv 调度算法(wrr|rr | lc |wlc | sh | dh | )
lb_kind NAT #指定集群工作模式 ( NAT | DR | RUN
persistence_timeout 50 #连接保持时间(秒)
protocol TCP #应用服务采用协议TCP
real_server 192.168.201.100 443 {
weight 1 #设置为1,0失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
TCP_CHECK { #常用,TCP检查, 配置项还有HTTP_GET | SSL_GET ,SMTP_CHECK MISC_CHECK
connect_port 80 #TCP 检查的端口
connect_timeout 3 #连接超时时间
nb_get_retry 3 #连接重试次数
delay_before_retry 3 #重试的间隔时间
}
}
}
三:部署 keepalived + LVS 的高可用集群
keepalived + LVS 集群
主DR服务器: 192.168.23.103
备用DR 服务器: 192.168.23.104
节点服务器: 192.168.23.12 ; 192.168.23.13
vip :192.168.23.100
共享存储服务器:192.168.23.11
3.1 部署负载调度器
复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
3.1.1 配置keepalived
修改 global_defs 部分
复制cd /etc/keepalived/
cp keepalived.conf{,.bak}
vim keepalived.conf
global_defs {
......
smtp_server 127.0.0.1 #第10行 修改邮件服务指向本地
router_id LVS_01 #第 12 行,修改服务器(路由器)名称,主备服务器名称不可以相同
# vrrp_skip_check_adv_addr #第13 到 第16 行注释。
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
修改 vrrp_instance 部分
复制vrrp_instance VI_1 {
20 state MASTER # 修改主服务器为MASTER,备服务器为BACKUP
----- 第20 行 stat 设置, 备用服务器设置为BACKUP --------‘
21 interface ens33 #修改承载vip 的网卡为 ens33
22 virtual_router_id 10 #修改ID 号,主备必须一致
23 nopreempt #添加设置为非抢占模式,防止脑裂,主备都要设置
#如果要设置为非抢占模式,主备的state都必须设置为BACKUP
24 priority 100 #设置优先级,优先级高的为主
------ 第 24 行,priority 设置,备用设置优先级为 90 ---------
25 advert_int 1
26 authentication {
27 auth_type PASS
28 auth_pass abc123 #修改密码为abc123,主备要相同
29 }
30 virtual_ipaddress {
31 192.168.23.100 #指定集群vip 地址
32 }
}
virtual_server 部分设置
复制virtual_server 192.168.23.100 80 { #指定虚拟服务器地址和端口
delay_loop 6
lb_algo rr #使用轮询rr 调度算法
lb_kind DR #集群工作模式为DR
#persistence_timeout 50 #长连接保持,实验时候需要注释,否则会在一段时间内连续访问同一台后端服务器
protocol TCP
real_server 192.168.23.12 80 { #添加第一个web 服务器的地址端口
weight 1 #权重设置为1
TCP_CHECK { #删除原来的SSL_GET所有设置吗,使用TCP_CHECK
connect_port 80 #健康检查,检查80端口
connect_timeout 3 #连接超时时间 3 秒
nb_get_retry 3 #重试次数3
delay_before_retry 3 #重试间隔时间 3 秒
}
}
real_server 192.168.23.13 80 { #添加第二个web 服务器的地址和端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#删除后面所有的多余配置
重启服务,查看网卡
复制systemctl restart keepalived
#吐槽,有时候keepalived 配置不对,比如说少个大括号,启动也不报错。
ip addr #注意,必须使用 ip addr 的命令,使用 ifconfig 查看不到 ens33 上面的虚拟ip
复制#主服务器 192.168.23.103 停止 keepalived 服务,然后再分别查看网卡
systemctl stop keepalived
ip addr
3.1.2 启动 ipvsadm 服务
复制ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln
#查看有没有分发策略,如果没有则重启keepalived
#systemctl restart keepalived
#ipvsadm -l
3.1.3 关闭调度器proc 响应参数
复制vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p #加载参数
3.2 配置NFS 共享存储
复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install rpcbind nfs-utils
mkdir /opt/{mynet,benet}
echo "this is mynet web" > /opt/mynet/index.html
echo "this is benet web" > /opt/benet/index.html
chmod 777 /opt/{mynet,benet}
vim /etc/exports
/opt/mynet 192.168.23.0/24(ro,sync)
/opt/benet 192.168.23.0/24(ro,sync)
systemctl start rpcbind
systemctl start nfs
exportfs -rv
3.3 配置节点服务器
复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install httpd
yum -y install rpcbind nfs-utils
systemctl start rpcbind
-------- 192.168.23.12------
mount.nfs 192.168.23.11:/opt/mynet /var/www/html
---------------------------------------------------’
------- 192.168.23.13 ------------------
mount.nfs 192.168.23.11:/opt/benet /var/www/html
-----------------------------------------------
df -h
vim /etc/sysconfig/network-scripts//ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.23.100
NETMASK=255.255.255.255
systemctl restart network
route add -host 192.168.23.100 dev lo:0
vim /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
3.4 访问测试
复制#再客户端访问 测试
curl http://192.168.23.100
复制#在调度器上 使用ipvsadm -ln 命令查看
ipvsadm -ln
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现