LVS模式一:DR模式(ipvsadm)

    xiaoxiao2023-11-30  155

    负载均衡(Load Balance 简称LB)分为硬件负载均衡和软件负载均衡

    硬件负载均衡:F5:太贵软件负载均衡:lvs(4层):haproxynginx (七层)httpd(proxy balance)varnish

    lvs 基础知识

    lvs指的是Linux虚拟服务器,是一个虚拟的服务器集群系统。其主要用于多服务器的负载均衡。

    优点: 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。 易用,配置非常简单,且有多种负载均衡的方法。 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。 另外可扩展性也非常好。

    lvs的定义:

    LVS的全称是Linux virtual server,即Linux虚拟服务器,它是封装在linux的内核中的。之所以是虚拟服务器,是因为LVS自身是个负载均衡器,不接受处理请求,而是将请求转发至位与它后端真正的服务器realserver上。LVS是四层(传输层tcp/udp),七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。ipvs是集成在内核中的框架,可以通过用户空间的程序ipvsadm工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter关系一样。

    lvs数据流向:附着于netfiler:从外部进来第一层经过防火墙(三表五链)

    第一种方式:PREROUTING —> INPUT(流向内部)第二种方式:PREROUTING----> FORWARD —> POSTROUTING(转发)—>OUTPUT—>POSTROUTING(流向外部)当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间(kernel space)PREROUTING链首先会接收到用户请求,判断目标IP确定是否为本机IP,是的化将数据包发往INPUT链IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

    lvs是由两部份组成的:

    ipvs(ip virrual server):一段代码(工作在内核)是真正生效实现调度的代码ipvsadm(工作在用户空间,负责为ipvs内核框架编写规则) ipvsadm(工作在用户空间的命令行工具 写具体的规则 用于管理集群服务)/ipvs(工作在内核中的netfilter input函数上)

    lvs 相关术语

    DS:Director Server。指的是前端负载均衡器节点。

    RS:Real Server。后端真实的工作服务器。

    VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址(目的IP)。

    DIP:Director Server IP,主要用于和内部主机通讯的IP地址。

    RIP:Real Server IP,后端服务器的IP地址。

    CIP:Client IP,访问客户端的IP地址(源IP)。

    lvs 四种工作模式

    DR(直接路由)模式

    TUN(隧道)模式

    NAT (网络地址转换)模式

    Full-Nat模式

    LVS模式一:DR(Direct Routing)直接路由模式

    DR模式工作的数据流向: Client–>PREROUTING —> INPUT(将CIP的MAT地址,改成CIP的MAT地址,(lvs在此强行改变数据流向))—>ipvs(VIP的MAT地址转为RS的MAT地址)—>POSTROUTING—> RS—>lo—>eth0 -->CIP

    客户端请求 VIP 时,通过因特网先到达调度器,调度器会根据调度算法将这个请求转发给真实的服务器,转发的过程中仅仅是修改了数据报文中的 MAC地址。当真实服务器接受到数据请求后进行处理,然后发送响应给客户端,但此时的源 IP 为真实的服务器 IP,即 RIP,目标 IP 为客户端 IP,即 CIP,但是客户端并没有请求RIP,所以客户端是不会接收数据响应,所以,就要修改源 IP 为 VIP,但是不可以将 VIP 设置在出口网卡上,否则会响应客户端的 arp 请求。失去了调度的意义,因此要在 lo 接口配置 VIP,并且将 VIP 隐蔽,即设置 NETMASK 为255.255.255.255,这样,数据响应从真实服务器出去的时候的源 IP 是 VIP,目的 IP 是 CIP,客户端就会接收次数据响应,从真实服务器到客户端是通过Internet。

    DR 模式需要调度器与真实服务器在同一个物理网络。即通过交换机或者高速的HUB相连,中间没有隔有路由器。

    VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文。

    所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。

    优点:性能最高 缺点:要求调度器的网卡必须与物理网卡在一个物理网段上

    DR模式工作原理:

    (1)客户端发送请求被director接收后,director根据负载均衡算法改写数据帧的目标MAC地址为后端某RS的MAC地址,并将该数据包转发给该RS(实际上是往整个局域网发送,但只有该MAC地址的RS才不会丢弃) (2)RS接收到数据包后,发现数据包的目标IP地址为VIP,而RS本身已经将VIP配置在了自身的某个接口上,因此RS会接收这个数据包并进行处理。 (3)处理完毕后,RS直接将响应报文响应给客户端。此时数据包源IP为VIP,目标IP为CIP。

    DR模式时的基本属性和要求:

    Realserver的RIP和Director的DIP必须处于同一网段中,以便使用MAC地址进行通信。realserver上必须配置VIP地址,以便接收director转发过来的数据包,以及作为响应报文的源IP。realserver响应给客户端的数据包的源和目的IP为VIP—>CIPdirector只处理入站请求,响应请求由realserver完成。

    实验环境: rhel6 selinux and iptables disabled 主机环境:

    主机名IPhetoto1172.25.12.1hetoto2172.25.12.2hetoto3172.25.12.3

    配置hetoto2 1.安装apache

    [root@hetoto2 ~]# yum install httpd -y

    2.编写前端文件

    [root@hetoto2 ~]# cd /var/www/html [root@hetoto2 html]# vim index.html <h1>www.westos.org - hetoto2</h1>

    配置hetoto3:同上

    [root@hetoto3 ~]# yum install httpd -y [root@hetoto3 ~]# cd /var/www/html [root@hetoto3 html]# vim index.html <h1>www.westos.org - hetoto3</h1> Load Balance: 172.25.12.1(hetoto1)Virtual IP:172.25.12.100RealServer1:172.25.12.2 (hetoto2)RealServer2:172.25.12.3(hetoto3)物理机内网 : 172.25.12.250

    一、配置 ipvsadm

    1.在虚拟服务器上配置更高级yum源

    [root@hetoto1 ~]# vim /etc/yum.repos.d/rhel-source.repo [rhel-source] name=Red Hat Enterprise Linux $releasever - $basearch - Source baseurl=http://172.25.12.250/rhel6.5 enabled=1 gpgcheck=0 [LoadBalancer] ##负载均衡 name=LoadBalancer baseurl=http://172.25.12.250/rhel6.5/LoadBalancer enabled=1 gpgcheck=0

    [root@hetoto1 yum.repos.d]# yum clean all [root@hetoto1 yum.repos.d]# yum repolist

    2.在hetoto1(虚拟服务器)上安装ipvsadm(调度器)

    [root@hetoto1 yum.repos.d]# yum install ipvsadm -y

    3.添加策略

    (1)添加一台虚拟设备

    -A   增加一台虚拟设备 -a   添加真实服务器的操作 -t   tcp服务地址 -s   调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq) -r   对应的真实ip -g   rh(路由) rr   调度算法:轮询

    (2)添加后端实际服务器

    [root@hetoto1 ~]# ipvsadm -A -t 172.25.12.100:80 -s rr [root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.2:80 -g [root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -g

    (3)保存策略

    [root@hetoto1 ~]# /etc/init.d/ipvsadm save ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]

    4.显示调度次数ipvsadm -L (-n不解析)

    [root@hetoto1 ~]# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.12.100:http rr -> hetoto2:http Route 1 0 0 -> hetoto3:http Route 1 0 0 [root@hetoto1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.12.100:80 rr -> 172.25.12.2:80 Route 1 0 0 -> 172.25.12.3:80 Route 1 0 0

    5.添加VIP 给所有的服务器把 VIP 地址配置在各自的 Non­ARP 网络设备上

    [root@hetoto1 ~]# ip addr add 172.25.12.100/24 dev eth0 [root@hetoto2 html]# ip addr add 172.25.12.100/32 dev eth0 [root@hetoto3 html]# ip addr add 172.25.12.100/32 dev eth0

    6.将hetoto2,和hetoto3的httpd服务都打开

    [root@hetoto2 html]# /etc/init.d/httpd start [root@hetoto3 html]# /etc/init.d/httpd start

    7.测试:

    以上情况,hetoto1,2,3都有可能被访问到 如果绑定的MAC地址是hetoto1,则在hetoto2,3轮询 如果绑定的MAC地址是hetoto2或hetoto3的,那么我们会发现,在测试端根本不会形成轮询,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)

    绑定的MAC地址是hetoto2或hetoto3的情况 arp -an | grep 100 查看绑定的MAC地址

    发现绑定的就是hetoto3的MAC地址

    删除现有绑定MAC地址 [root@foundation12 kiosk]# arp -d 172.25.12.100 arp -an | grep 100 查看绑定的MAC地址 绑定的MAC地址是hetoto1的情况

    如何避免这种情况实现?

    要避免这种情况,要求只能绑定hetoto1(调度器)的MAC地址,所以我们要配置hetoto2和hetoto3的arp路由策略在hetoto2和hetoto3中下载yum install -y arptables_jf为arptables网络的用户控制过滤的守护进程 防止在物理机中测试时直接访问hetoto2和hetoto3

    配置hetoto2

    [root@hetoto2 html]# yum install arptables_jf -y # 当网内广播需要172.25.12.100这个ip时,它丢弃所有网内的请求 [root@hetoto2 html]# arptables -A IN -d 172.25.12.100 -j DROP # 当它自身需要在网内发包时,伪装为自己原本的ip172.25.12.2 [root@hetoto2 html]# arptables -A OUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.2 #保存添加的两条策略 [root@hetoto2 html]# /etc/init.d/arptables_jf save #打开arptables服务 [root@hetoto2 html]# /etc/init.d/arptables_jf start

    配置hetoto3:

    ##hetoto3和hetoto2一样 [root@hetoto3 html]# yum install arptables_jf -y [root@hetoto3 html]# arptables -A IN -d 172.25.12.100 -j DROP [root@hetoto3 html]# arptables -A OUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.3 [root@hetoto3 html]# /etc/init.d/arptables_jf save [root@hetoto3 html]# /etc/init.d/arptables_jf start

    再次测试: 1.先删除现有绑定MAC地址

    [root@foundation12 kiosk]# arp -d 172.25.12.100

    2.测试端测试curl 172.25.12.100(出现轮叫,且数据经过调度器)、

    最新回复(0)