【负载均衡】3.Keepalived+lvs DR模式部署
一、规划
角色
|
IP |
安装软件
|
VIP
|
master
|
192.168.42.135
|
keepalived+lvs
|
192.168.42.136
|
backup
|
192.168.42.129
|
keepalived+lvs
|
|
web1 |
192.168.42.130
|
nginx-web1
|
|
web2
|
192.168.42.133
|
nginx-web2
|
|
1、部署后端webserver
在web1、web2上部署nginx,并且因为环境冲突,Nginx监听端口都用8080,创建不同的index.html,以便后续验证。
[root@node2 ~]# yum install nginx -y [root@node2 ~]# echo "web-server1" > /usr/share/nginx/html/index.html [root@node1 ~]# yum install nginx -y [root@node1 ~]# echo "web-server2" > /usr/share/nginx/html/index.html
配置realserver lo网卡和arp抑制
[root@node1 ~]# vim realserver VIP=192.168.42.136case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac [root@node1 ~]# chmod +x realserver [root@node1 ~]# ./realserver start
2、部署keepalived
在master和backup上部署keepalived,安装ipvs管理工具
[root@master ~]# yum install -y keepalived [root@master ~]# lsmod |grep ip_vs #查看ip_vs是否加载 [root@master ~]# modprobe ip_vs #加载ip_vs模块 [root@master ~]# cat /proc/net/ip_vs #查看ip_vs信息 [root@master ~]# yum -y install ipvsadm
修改keepalived配置文件
[root@master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived 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_connect_timeout 30 router_id LVS_MASTER vrrp_skip_check_adv_addr #vrrp_strict #记得注释,不然VIP绑定了网卡,也无法被ping通 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。backup此处应配置为BACKUP interface ens33 #指定实例绑定的网卡 virtual_router_id 91 #设置VRID标记,多个集群不能重复(0..255) priority 100 #设置优先级,优先级高的会被竞选为Master,backup此处应配置小于100 advert_int 1 #检查的时间间隔,默认1s nopreempt #禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了 #nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.42.136 } } virtual_server 192.168.42.136 8080 { delay_loop 6 #健康检查时间间隔 lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh等 lb_kind DR #lvs工作模式 persistence_timeout 0 #会话保持时间,设置为0方便后面测试 protocol TCP real_server 192.168.42.130 8080 { weight 1 HTTP_GET { //检测方法除HTTP_GET外还支持TCP_CHECK,脚本,SSL_GET等。 url { path /index.html status_code 200 } connect_timeout 3 #连接超时时间 nb_get_retry 3 #重试次数 delay_before_retry 3 #重连间隔时间 } } real_server 192.168.42.133 8080 { weight 1 HTTP_GET { url { path /index.html status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
#主从启动keepalived
[root@node3 ~]# systemctl restart keepalived
查看master的ens33网卡上是否有VIP

查看lvs后端情况:
[root@node3 ~]# ipvsadm -ln

[root@node3 ~]# ipvsadm -lnc

测试负载均衡轮询:
[root@master ~]# curl http://192.168.42.136:8080/
测试高可用,停用master上的keepalived,观察VIP是否漂移到backup上。

三、问题整理
问题1:keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
问题2:使用curl测试负载均衡时,能够轮询调度到不同的后端主机,但是使用浏览器时却不行,总是访问到同一个后端。原因是,curl命令请求时,每次请求都从不同的端口发请求,所以每次lvs都当做一个新的客户端来处理,而且curl请求完后,就关闭了tcp连接;而浏览器则不然,每次刷新很可能还是以同一个端口发出请求,而且tcp连接也会保持,所以lvs就会认为是同一个客户端,每次刷新就会指向同一rs。
如果要想浏览器测试也能达到轮询效果,则需要将lvs的连接处于空闲状态的超时时间设置的很短。
[root@node3 ~]# ipvsadm --list --timeout (默认过期时间分别是900 120 300)
[root@node3 ~]# ipvsadm --set 1 1 1

四、补充
1、Linux修改内核参数
方法1:
echo value > /proc/sys/path 例: echo 0 > /proc/sys/net/ipv4/ip_nonlocal_bind
方法2:
sysctl -w kernel.name=value 修改值
sysctl -a 查看
方法3:
vim /etc/sysctl.conf #将内容写入sysctl.conf文件
sysctl -p #使文件内容的修改立即生效
2、内核模块的操作
查看内核模块:lsmod
移除模块: modprob -r 模块名 或者 rmmod 模块名
装载模块: modprob 模块名 或者 insmod 模块名
查看模块详细信息:modinfo 模块名
3、ipvsadm命令行选项
-A 添加一个虚拟服务,使用ip地址、端口号、协议来唯一定义一个虚拟服务 -E 编辑一个虚拟服务 -D 删除一个虚拟服务 -C 清空虚拟服务列表 -R 从标准输入中还原虚拟服务列表 -S 保存虚拟服务规则至标准输出,输出规则可使用-R选项还原 -L 显示虚拟服务列表 -Z 虚拟服务器列表计数器清零(清空当前连接数) -a 添加一台真实服务器 -e 编辑一台真实服务器 -d 减少一台真实服务器 -t 使用TCP服务,该参数后需加主机与端口信息 -u 使用UDP服务,该参数后需加主机与端口信息 -s 指定lvs的调度算法 -r 设置真实服务器IP与端口 -g 设置lvs工作模式为DR直连路由 -i 设置lvs工作模式为TUN隧道 -m 设置lvs工作模式为NAT地址转换模式 -w 指定真实服务器权重 -c 连接状态,配和-L使用 -n 数字格式显示 --stats 显示统计信息 --rate 显示速率信息 --sort 对虚拟服务器和真实服务器排序输出 --set tcp tcpfin udp 设置ipvs连接超时值,三个参数分别代表tcp会话超时时间、收到FIN包后tcp会话超时时间、udp超时时间 --timeout 显示tcp tcpfin udp的timeout值 --start-daemon 启动同步守护进程 --stop-daemon 停止同步守护进程
4、lvs持久性连接介绍
(1)把同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控制,单位为秒。 persistence_granularity 参数是配合persistence_timeout的,在某些情况特别有用,他的值是子网掩码,表示持久连接的粒度,默认是 255.255.255.255,也就是单独的client ip,如果改成,255.255.255.0就是client ip一个网段的都会被分配到同一个real server。
设置方式:
persistence_timeout 可以通过"ipvsadm -p timeout" 来设置,默认360秒
# ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中红色标记的80端口,表示同一客户端访问服务器的80端口,会被定义到同一个real server,如果把80端口改为0,那么同一客户端访问服务器的任何服务都会被转发到同一real server。
修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60
(2)一个连接创建后空闲时的超时时间,这个时间为3种
① tcp的空闲超时时间
② lvs收到客户端tcp fin的超时时间
③ udp的超时时间
设置方式:
# tcp tcpfin udp 可以通过"ipvsadm --set 对应超时时间"来设置
ipvsadm --set tcp tcpfin udp
建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)