LVS-DR模式+Keepalived

本文介绍LVS-DR模式的工作原理及其特点,深入解析Keepalived的实现机制,包括健康检查和VRRP协议的应用。通过具体步骤指导如何搭建LVS-DR模式与Keepalived结合的负载均衡系统。

LVS-DR模式+Keepalived

一,LVS-DR工作原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogNIaMOW-1648540791243)(C:\Users\KK\AppData\Roaming\Typora\typora-user-images\1648540759388.png)]

1.工作流程

1.客户端发送请求到Director server (负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
2.Director Server和Real server在同一个网络中,数据通过二层数据链路层来传输。
3.内核空间判断数据包的目标IP是本机VIP,此时IPVS (IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为Director Server的MAC地址,修改目标MAC地址为Real Server的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。
4.到达Real server的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过 lo 接口传送给物理网卡ens33然后向外发出。
5.Real Server 直接将响应报文传送到客户端。

2.数据包流向

1.客户端发送请求到Director Server (负载均衡器),请求的数据报文到达内核空间。
报文:
源IP:客户端的IP               目标IP:VIP
源MAC:客户端的MAC             目的MAC:Director Server的MAC
2.内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。然后将数据包发送给根据负载均衡算法选择的Real Server。(Director Sever和Real Server在同一个网络中,数据通过二层数据链路层来传输。)
报文:
源IP:客户端的IP                    目标IP:VIP
源MAC:Director Server的MAC        目的MAC:Real Server的MAC
3.到达Real server的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文,将响应报文通过lo接口传送给物理网卡然向外发出。
报文:
源IP:VIP                    目标IP:客户端的IP
源MAC:Real Server的MAC      目的MAC:客户端的MAC
4.通过交换机和路由器将响应报文传送到客户端。客户端收到回复报文,得到想要的服务,但是不会知道是哪台服务器处理的。

3.DR模式的特点

1.Director Server和Real Server必须在同一个物理网络中。
2.Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。
3.Director Server作为群集的访问入口,但不作为网关使用。
所有的请求报文经由Director Server,但回复响应报文不能经过Director Server
4.Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server。
5.Real Server上的l0接口配置VIP的IP地址。

4.LVS-DR中的ARP问题

1.在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址。在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
解决思路:
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同网络上,它们都会接收到ARP广播。只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。
对节点服务器进行处理,使其不响应针对VIP的ARP请求。
解决方法:
使用虚接口lo:0承载VIP地址
设置内核参数arp_ignore=1:系统只响应目的IP为本地lP的ARP请求

RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址。
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址如:ens33
路由器收到ARP请求后,将更新ARP表项
原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效解决方法:
对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址。解决ARP的两个问题的设置方法

二,Keepalived

1.keepalived是什么

keepalived是集群管理中保证集群高可用的一个服务软件,它的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后,自动将web服务器加入到服务器集群中。解决了静态路由的单点故障问题。

Keepalived:早期的时候,就是为LVS 的HA高可用来设计
1.支持故障自动切换通过VIP虚拟地址漂移;

2.支持节点健康状态检查(Health Checking);
【keepalived健康检查的方式:
1.ping,只能知道对方的网卡或机器有没有宕机,没法检测lvs或nginx服务本身服务有没有挂掉(节点上的服务是否异常)
2.scripts脚本,周期检查,过滤服务的状态信息 if $? = 0 ,查看完后,停止或启动keepalived,邮件告警】
健康检查意义(目的):为了服务可以正常对外暴露,为了用户可以正常访问。

3.判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点(优先级),VIP漂移至优先级高的节点。

2.Keepalived实现原理

keepalived采用VRRP热备份协议实现Linux 服务器的多机热备功能;
VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案;
由多台路由器组成一个热备份组,通过共用的虚拟IP地址对外提供服务;
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态;
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务。

3.keepalived主要模块

core模块为keepalived的核心,负责主进程的启动、维护、以及全局配置文件的加载和解析。
check模块负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。

4.keepalived脑裂问题

Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。

三,DR+Keepalived部署

搭建环境:
DR 服务器(负载调度器)192.168.38.145  | ens33:0 (VIP):192.168.38.100
Web节点服务器1 192.168.38.143 | lo:0 (VIP):192.168.38.100
Web节点服务器2 192.168.38.144 | lo:0 (VIP):192.168.38.100

负载调度器(主/备)

(1)关防火墙,加载ip_vs模块
systemctl stop firewalld.service 
systemctl disable firewalld.service 
setenforce 0
#加载ip_vs模块,并安装ipvsadm工具
modprobe ip_vs
cat /proc/net/ip_vs
yum install -y ipvsadm
(2)配置虚拟 IP 地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.38.100
NETMASK=255.255.255.255
 
ifup ens33:0
ifconfig ens33:0

在这里插入图片描述
在这里插入图片描述

(3)调整 proc 响应参数
#由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭Linux 内核的重定向参数响应,不充当路由器,
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

在这里插入图片描述

(4)配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
或者
ipvsadm --save > /etc/sysconfig/ipvsadm

systemctl start ipvsadm.service

#清除原有策略
ipvsadm -C
ipvsadm -A -t 192.168.38.100:80 -s rr
ipvsadm -a -t 192.168.38.100:80 -r 192.168.38.143:80 -g #如果这里是隧道模式,直接将-g替换成-i即可
ipvsadm -a -t 192.168.38.100:80 -r 192.168.38.144:80 -g
#查看节点状态,Route代表 DR模式
ipvsadm -ln

在这里插入图片描述

两台web服务器

Web1和web2配置相同
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

配置虚拟 IP 地址
#此地址仅用做发送 Web 响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。
#因此使用虚接口 lo:0 来承载 VIP 地址,并为本机添加一条路有记录,将访问 VIP 的数据限制在本地,以避免通信紊乱。

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.38.100
NETMASK=255.255.255.255
ONBOOT=yes

ifup lo:0
ifconfig lo:0

#设置临时的路由,重启失效;禁锢路由
route add -host 192.168.38.100 dev lo:0
#查看路由
route -n

#开机自动添加路由,生产环境应该用这个
vim /etc/rc.local
/sbin/route add -host 192.168.38.100 dev lo:0
chmod +x /etc/rc.d/rc.local
调整内核的ARP 响应参数以阻止更新 VIP 的MAC 地址,避免发生冲突
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

sysctl -p

yum install -y httpd
systemctl start httpd.service
systemctl enable httpd.service

这里我临时的和永久的都设置了
在这里插入图片描述

yum -y install httpd
systemctl start httpd
systemctl enable httpd

Web1上:
echo 'this is test1 web!' > /var/www/html/index.html
Web2上:
echo 'this is test2 web!' > /var/www/html/index.html

在这里插入图片描述

部署 Keepalived 主
搭建DR基础上
部署keepalived主
yum -y install keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf

global_defs {
​      router_id lvs_01  #这里是01
}
vrrp_instance vi_1 {
​      state MASTER
​      interface ens33
​      virtual_router_id 51
​      priority 110  #优先级
​      advert_int 1
​      authentication {
​           auth_type PASS
​           auth_pass 6666
 }
virtual_ipaddress {
​      192.168.38.100
}
}
virtual_server 192.168.38.100 80 { 
​      lb_algo rr
​      lb_kind DR
​      persistence_timeout 6
​      protocol TCP
real_server 192.168.38.143 80 {
​      weight 1
​      TCP_CHECK {
​          connect_port 80
​          connect_timeout 3
​          nb_get_retry 3
​          delay_before_retry 3
   }
}
real_server 192.168.38.144 80 {
​      weight 1
​      TCP_CHECK {
​          connect_port 80
​          connect_timeout 3
​          nb_get_retry 3
​          delay_before_retry 3
   }
}
} 
部署keepalived 备
搭建DR基础上
部署keepalived备
yum -y install keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
 
global_defs {
​      router_id lvs_02  #这里是02
}
vrrp_instance vi_1 {
​      State BACKUP
​      interface ens33
​      virtual_router_id 51
​      priority 100  #优先级
​      advert_int 1
​      authentication {
​           auth_type PASS
​           auth_pass 6666
 }
virtual_ipaddress {
​      192.168.38.100
}
}
virtual_server 192.168.38.100 80 { 
​      lb_algo rr
​      lb_kind DR
​      persistence_timeout 6
​      protocol TCP
real_server 192.168.38.143 80 {
​      weight 1
​      TCP_CHECK {
​          connect_port 80
​          connect_timeout 3
​          nb_get_retry 3
​          delay_before_retry 3
   }
}
real_server 192.168.38.144 80 {
​      weight 1
​      TCP_CHECK {
​          connect_port 80
​          connect_timeout 3
​          nb_get_retry 3
​          delay_before_retry 3
   }
}
}

在这里插入图片描述

测试

最后配置完成

systemctl start keepalived.service

负载均衡器主关闭keepalived后。在负载均衡器备上,ip addr查看VIP地址是否漂移

  • 开启主keepalived 飘逸前

在这里插入图片描述

  • 关闭主 备 自动开启

在这里插入图片描述

  • 这时候访问网页

在这里插入图片描述

可以看到他飘逸到备份上去了

总结

  • 实验前的初始化必不可少(关闭防火墙、核心防护、配置网卡之类的)
  • 在配置keepalived时,必须要分清楚主备服务器的编号以及主备服务器的优先级(默认情况下主服务器停机时,优先级会降低10,如果备份服务器优先级相同会导致无法访问,这时候需要重启服务)
  • 虚拟ip,也就是浮动ip必须要相同

这里附上我遇到的问题

当配置keepalived的虚拟ip出现/etc/sysconfig/network-scripts/ifup-eth: Error, some other host already uses address时,可以使用以下方法
https://blog.youkuaiyun.com/weixin_30408309/article/details/95630443

<think>嗯...用户这次明确要求了解LVS-NAT模式Keepalived的组合应用,看来是在搭建高可用负载均衡环境。从引用内容看,用户已经接触过具体配置片段(连yum安装命令都有),但需要系统性的原理说明。 用户可能是个运维工程师,正在部署生产环境。ta特意提到"使用方法、配置、原理",说明既要理论支撑又要实操指导。注意到上次对话历史里强调过技术文档的LaTeX格式要求,这次回答要特别注意数学表达式的规范——虽然网络配置中公式不多,但涉及调度算法时得用$w_i$这样的行内公式。 比较棘手的是用户提供的两个引用内容有点割裂:引用[1]是具体配置,引用[2]却是目录框架。需要把这两块碎片信息融合起来:用引用[1]的配置示例说明NAT模式特点,用引用[2]的术语体系解释原理。特别要注意keepalived的VRRP协议部分在引用里没展开,需要补充。 技术层面要突出三个重点: 一是LVS-NAT的端口映射机制,这个必须用IP包结构图说明DNAT过程; 二是keepalived的健康检查如何联动IPVS,这里可以复用引用[1]里的配置片段; 三是脑裂问题解决方案,用户给的引用完全没提这点,但生产环境必须考虑。 最后考虑设计几个实用问题:"会话保持配置"针对电商类用户,"DR模式对比"给进阶优化参考,"防火墙配置"解决实际部署痛点。毕竟从ta提供的配置看,明显漏了firewalld规则设置。 </think>以下是关于LVS-NAT模式Keepalived整合的使用方法、配置及原理的详细说明: --- ### **一、LVS-NAT 模式原理** 1. **工作流程** - 客户端访问虚拟IP(VIP): $C \rightarrow \text{VIP}$ - 调度器(Director)进行DNAT:将目标IP改为真实服务器IP(RIP) $\text{VIP} \xrightarrow{\text{DNAT}} \text{RIP}$ - 真实服务器处理请求后,响应数据包返回调度器 - 调度器执行SNAT:将源IP改为VIP,返回客户端 $\text{RIP} \xrightarrow{\text{SNAT}} \text{VIP} \rightarrow C$ 2. **核心特性** - 调度器需**双向处理流量**(请求 & 响应),易成为性能瓶颈 - 真实服务器可使用任意操作系统,只需配置网关指向调度器 - RIP通常为私有IP,VIP为公网IP --- ### **二、Keepalived 作用** 1. **核心功能** - 通过**VRRP协议**实现调度器高可用(主备切换) - 监控真实服务器健康状态,自动剔除故障节点 - 管理LVS规则(自动生成/删除IPVS规则) 2. **故障切换流程** ```mermaid graph LR A[主调度器] -- VRRP心跳检测 --> B[备调度器] A故障--> B接管VIP及IPVS规则 ``` --- ### **三、配置实战(主调度器示例)** #### **1. 安装依赖** ```bash yum -y install ipvsadm keepalived # 引用[1] ``` #### **2. Keepalived 配置 (`/etc/keepalived/keepalived.conf`)** ```nginx global_defs { router_id lvs-keepalived-master # 标识节点名称 } vrrp_instance VI_1 { state MASTER # 主节点角色 interface eth0 # 监听网卡 virtual_router_id 51 # 集群ID(主备需一致) priority 100 # 优先级(主>备) advert_int 1 # 心跳间隔(秒) authentication { # 认证配置 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 虚拟IP池 192.168.1.100/24 } } virtual_server 192.168.1.100 80 { # 定义LVS虚拟服务 delay_loop 6 # 健康检查间隔 lb_algo rr # 轮询调度算法 lb_kind NAT # NAT模式 persistence_timeout 50 # 会话保持时间 protocol TCP real_server 192.168.2.10 80 { # 真实服务器1 weight 1 TCP_CHECK { # TCP健康检查 connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.2.11 80 { # 真实服务器2 weight 1 TCP_CHECK { ... } } } ``` > **关键参数说明** > - `lb_kind NAT`: 指定LVS工作模式 > - `TCP_CHECK`: 通过TCP连接探测后端服务存活 > - `persistence_timeout`: 维持同一客户端会话到固定后端(单位:秒) #### **3. 真实服务器要求** - 配置网关指向调度器内网IP(如 `192.168.2.1`) - 开启路由转发:`sysctl net.ipv4.ip_forward=1` --- ### **四、脑裂问题规避** 1. **多播检测** 配置防火墙允许VRRP组播通信: ```bash firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent ``` 2. **脚本监控** 使用自定义脚本检测调度器状态,异常时强制降级。 --- ### **五、典型应用场景** 1. 中小规模Web集群负载均衡 2. 需隐藏后端服务器真实IP的环境 3. 混合操作系统后端(Windows/Linux共存) > **局限性**: > 调度器易成单点瓶颈,建议千兆网络下后端服务器≤20台[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值