LVS

Posted 跪着行走的boY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS相关的知识,希望对你有一定的参考价值。

lvs

1、ARP协议简介

ARP全称:“Address Resolution Protocol”,中文名是地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地k址(MAC地址)。

在TCP/IP的网络环境下,每个联网的主机都会分配一个32位的ip地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网络上传输,还必须知道对方主机的物理地址(MAC)才行,这样就存在把IP地址变换为物理地址的地址装换问题。

我们以以太网环境为实例说明,为了正确的向目的的主机传送报文,必须把目标的32位ip地址转化为目标地址48位以太网mac地址,这就需要在互联网层上有一个服务或者功能将ip地址转换为相应的物理地址(mac地址),这个服务或者功能就是ARP协议。

所谓的地址解析,就是主机在发送帧之前将目标ip地址转换成为目标mac地址的过程,ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的mac地址,以保证主机之间相互通讯。

ARP与DNS优点相似之处,不同点是:DNS是在域名和IP之间解析,另外ARP协议不需要配置服务,而DNS需要配置服务。

注意:

1. ARP协议需要通信的主机必须在一个物理网段(即局域网环境)

2.实现局域网内通过ip获取主机的mac地址

3.ARP是OSI的第二层数据链路层协议

1.1、什么是ARP代理(ARP proxy)

 

 

ARP缓存表:

  arp –a   #查看所有

  arp –d   #清楚

  arp –s   #绑定IP和MAC地址

1.2、ARP缓存表

(1)       主机有了arp缓存表,可以加快arp的解析速度,减少局域网内广播风暴。

(2)       正是有了arp缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是arp欺骗攻击。

(3)       案例:切换路由器,负载均衡等设备,可能会导致短时网络中断。

1.3、ARP在生产环境的问题及解决办法

(1)ARP病毒,ARP欺诈

  排查

  1、  MAC地址登记部门人员对应,IP绑定,所有设备登记MAC地址

  2、  局域网出现arp中毒,特别是无法上网。

  3、  员工上网物理拓扑规范清晰,从交换机上

(2)高可用服务器对之间切换时要考虑ARP缓存的问题

(3)路由等设备无缝迁移时要考虑ARP缓存的问题,例如:更换办公室的路由器

1.4、为什么使用ARP协议

       OSI把网络分为7层,彼此之间不能打交道,只能通过接口。IP在3层,mac在2层,在发送数据包的时候,先要封装3层IP地址,然后封装2层的mac地址,但协议只知道目的节点的ip地址,不知道mac,又不能跨2,3层所以得用ARP协议,帮助获取mac地址

1.5、ARP小结

1、  ARP全称:“Address Resolution Protocol”

2、  实现局域网内通过IP地址获取主机的MAC地址

3、  MAC地址:48为主机的物理地址,局域网内唯一。

4、  ARP协议类似DNS服务,但不需要配置ARP服务

5、  ARP协议是OSI 7层模型第三层网络层协议

6、  ARP协议要求通讯的主机双方必须在同一物理网段(即局域网环境)

7、  arp欺骗的原理,arp欺骗的解决方法

8、  arp缓存表的案例:路由器、负载均衡切换

2、lvs负载均衡集群介绍

2.1、搭建负载均衡的需求

  负载均衡集群提供了一种廉价、透明、有效的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高灵活性和可用性。

那么在什么情况下,企业网站需要负载均衡服务呢?

  1. 单台计算机无法承受大规模的并发访问或者数据流量了,此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减少用户的响应时间又提升用户体验。
  2. 单个负载均衡的运算服务分担到多节点设备上做并行处理,每台节点设备处理完毕后,将结果汇总返回,系统处理能力和效率得到大幅度提高
  3. 7×24小时的服务保障,任意一个或者多个后端节点设备宕机,不影响整个业务的运行

2.2、lvs(ipvs)软件工作层次图

 

 

  从上图可以看出,lvs负载均衡调度技术是在Linux内核中实现的,因此,被称为Linux虚拟服务器,我们使用该软件配置lvs的时候,不能直接配置内核中的ipvs。而需要使用ipvs的管理工具ipvsadm进行管理,当然也可以通过keepalive软件之间管理ipvs,并不是通过ipvsadm来管理ipvs。

 

两个工具:

  1、  管理配置LVS的工具,ipvsadm.

  2、实现负载调度的工具ip_vs(不能直接操作的),只能通过ipvsadm管理ip_vs。

ip_vs工作在内核层面的

ipvsadm工作在应用层面

2.3、lvs技术点

1、真正实践调度的工具是ipvs,工作在Linux内核层面

2、lvs自带的ipvs命令行管理工具是ipvsadm

3、keepalive实现管理ipvs(配置文件)及负载均衡器的高可用

4、redhat工具piranhaWEB管理实现调度的工具IPVS

2.4、工作过程图

 

 

client 客户端对应的ip地址    cip(client ip address)

负载均衡                       dip网卡上的IP地址(用于连接内外网络的ip地址)

虚拟的ip地址                 vip提供服务的地址

节点(web)                 rip(集群节点(real server)上使用的ip地址,物理ip地址)

2.5、四种工作模式

LVS的四种工作模式:

  NAT(network address translation)

  TUN(tunneling)

  DR(direct routing)

  FULLNAT(full network address translation)

2.5.1、DR

支持高并发。

为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构:

 

我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包、数据帧的走向和转换过程。

官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。

实例场景设备清单:

说明:我这里为了方便,client是与vip同一网段的机器。如果是外部的用户访问,将client替换成gateway即可,因为IP包头是不变的,变的只是源mac地址

①        client向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:

 

 

②LVS根据负载均衡算法选择一台active的realserver(假设是192.168.57.122),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:

 

 

③ realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:

 

 

④ 如果client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户

特点:

1、通过在调度器lb上修改数据包的目的mac地址实现转发。注意,源ip地址仍然是cip,目的ip地址仍然是vip

2、请求的报文通过调度器,而rs响应处理后的报文无需经过调度器LB因此,并发访问量大时使用效率很高(和nat模式相比)

3、因为DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)

4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题

5、强调下:RS节点的默认网关不需要的是调度器LB的DIP,而直接是IDC机房分配的上级路由器的ip(这是RS带有外网ip地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网ip

6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)

7、当前,调度器LB支持所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统

8、总的来说DR模式效率很高,但是配置也比较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之,这符合运维的原则:简单、应用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy、nginx(LVS NAT模式)

9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:mysql,存储系统RS节点,最好只用内部IP地址

 

2.5.2、NAT

  1. 进来的时候数据包源ip是cip,目标ip是vip,lvs把目标ip改成rip
  2. 出来的时候数据包源ip是rip,目标ip是cip,lvs把源ip改成vip

 

 

特点:

  1. nat将请求报文(DNAT方式)和相应报文中的ip进行修改
  2. 每台RS节点的网关地址,必须配成LB的私有lan内物理网卡地址,这样才能确保数据包返回是经过LB
  3. 由于所有数据包返回都要经过LB,所以LB鸭梨大,成为了集群瓶颈
  4. nat模式支持对IP和端口的转换(DR和TUN不行)、
  5. 数据包来回都要经过LB,因此,要开启内核转发net.ipv4.ip_forward = 1,

2.5.3、FULLNAT

1、就是把数据包进来时CIP:VIP改为VIP:RIP

2、出去时:RIP:VIP改为VIP:CIP

2.5.4、TUN

就是在数据包的前面加包头的形式,什么都不改的情况下,添加IP头,到达节点把头去掉

也需要绑定VIP,抑制ARP,类似于DR模式

3、安装LVS

3.1、手动配置过程

安装软件:

1、查看LB和节点有没有安装(所有机器)

rpm -qa ipvsadm
yum –y install ipvsadm

2、做软连接,启动,验证(所有机器)

ln -s /usr/src/kernels/2.6.32-573.el6.x86_64 /usr/src/linux
ipvsadm
lsmod |grep ip_vs

手动配置负载均衡:

3、在lb机器上添加VIP(LB机器)

ip addr add 10.0.0.3/24 dev eth0 label eth0:0

4、配置规则,清理、添加规则、添加real server、查看验证(LB机器)

ipvsadm -C
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 300
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.70:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.80:80 -g -w 1
ipvsadm -Ln

5、RS服务器,配置VIP、添加路由记录、抑制ARP(RS所有机器)

ip addr add 10.0.0.3/32 dev lo label lo:0
或者ipconfig lo:0 10.0.0.3/32 up   <==子网掩码特殊
route add -host 10.0.0.3 dev lo
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

验证:

6、访问,查看

watch -n 1 ipvsadm -nL --stats

3.2、ipvsadm命令参数

-A                                  在内核的虚拟服务器表中添加一条新的虚拟服务器记录

-E                                    编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D                                 删除内核虚拟服务器表中的一条虚拟服务器记录。

-C                                   清除内核虚拟服务器表中的所有记录。

-R                                   恢复虚拟服务器规则

-S                                   保存虚拟服务器规则,输出为-R选项可读的格式

-a                                   在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。

-e                                   编辑一条虚拟服务器记录中的某条真实服务器记录

-d                                   删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l--list                                 显示内核虚拟服务器表

-Z--zero                         虚拟服务表计数器清零(清空当前的连接数量等)

--settcptcpfinudp                   设置连接超时值

--start-daemon                      启动同步守护进程。他后面可以是master或backup,用来说明LVSRouter是master或是backup。在这个功能上也可以采用keepalived的VRRP功能。

--stop-daemon                      停止同步守护进程

-h--help                           显示帮助信息

其他的选项:

-t --tcp-serviceservice-address           说明虚拟服务器提供的是tcp的服务

-u --udp-serviceservice-address         说明虚拟服务器提供的是udp的服务

-f --fwmark-servicefwmark                  说明是经过iptables标记过的服务类型。

-r --real-serverserver-address            真实的服务器

-s --schedulerscheduler                     使用的调度算法,rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc.

-p--persistent[timeout]                        持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout的默认值为300秒。

-g--gatewaying            指定LVS的工作模式为直接路由模式(也是LVS默认的模式)

-i --ipip                                                指定LVS的工作模式为隧道模式

-m --masquerading                             指定LVS的工作模式为NAT模式

-w--weightweight                                真实服务器的权值

--mcast-interfaceinterface                 指定组播的同步接口

-c--connection                                   显示LVS目前的连接如:ipvsadm-L-c

--timeout                                           显示tcptcpfinudp的timeout值如:ipvsadm-L--timeout

--daemon                                          显示同步守护进程状态

--stats                                          显示统计信息

--rate                                           显示速率信息

--sort                                           对虚拟服务器和真实服务器排序输出

--numeric-n                                 输出IP地址和端口的数字形式

3.3、lvs+keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance LVI_40 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:1
    }
}

virtual_server 10.0.0.4 80 {                 #vip
    delay_loop 6                              
    lb_algo wlc                                     #算法
    lb_kind DR                                      #模式
    nat_mask 255.255.255.0                 #子网掩码
   # persistence_timeout 50                #保持会话
protocol TCP                                  #-t TCP协议

    real_server 10.0.0.70 80 {                #节点IP
        weight 1                                      #权重
              TCP_CHECK {                         #TCP的健康检查
                     connect_timeout 3         #超时时间
                     nb_get_retry 3                #
                     delay_before_retry 3      #重复的次数
                     connect_port 80             #检查的端口
              }
    }

    real_server 10.0.0.80 80 {
        weight 1
              TCP_CHECK {
                     connect_timeout 3
                     nb_get_retry 3
                     delay_before_retry 3
                     connect_port 80
              }
    }
}

3.4、lvs相关脚本

lvs启动脚本

!#/bin/bash
VIP=(
10.0.0.3
)

. /etc/rc.d/init.d/functions

case "$1" in
start)
       for ((i=0; i<`echo ${#VIP[*]}`;i++))
       do
              interface="lo:`echo ${VIP[$i]}|awk -F . \'{print $4}\'`"
              /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
       done
       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
       action "Start LVS of RearServer.by oldboy "
;;

stop)
       for ((i=0;i<`echo ${#VIP[*]}`;i++))
       do
              interface="lo:`echo ${VIP[$i]}|awk -F . \'{print $4}\'`"
              /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
       done
       echo "Close LVS Directorserver"
       action "Start LVS of RearServer.by oldboy "
       if [ ${#VIP[*]} -eq 1 ];then
              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
       fi
       action "Start LVS of RearServer.by oldboy "
;;

*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

lvs健康检查脚本

#!/bin/sh
VIP=10.0.0.29
PORT=80
RIP=(
10.0.0.80
10.0.0.70
)
while true
do
       for ((i=0;i<`echo ${#RIP[*]}`;i++))
       do
              PORT_COUNT=`nmap ${RIP[$i]} -p $PORT|grep open|wc -l`
              [ $PORT_COUNT -ne 1 ]&&{
              ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
              echo "${RIP[$i]}" >>/tmp/rx.log
              }
       done
       sleep
done

3.5、lvs集群分发请求RS不均衡的解决方法

生产中ipvsadm -L -n发现两台RS的负载不均衡,一台多一台没有,并且RS测试服务正常,lo:VIP也有。就是没有请求

问题原因:

       persistent10的原因,persistent会话保持

IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port               Forward  Weight    ActiveConn     InActConn
TCP  10.0.0.3:80  wrr

-> 10.0.0.70:80                        Route      1            0                   0         
-> 10.0.0.80:80                        Route      1            0                   0

解决办法:

       注释keepalive的配置文件# persistence_timeout字段,然后reload

其他导致负载不均衡的原因:

  1. lvs自身的会话保持参数设置(-p,persistent)。
  2. lvs调度算法设置,例如:rr,wrr,wlc,lc
  3. 后端RS节点的会话保持参数
  4. 访问量少的情况,不均衡现象更加明显
  5. 用户发送请求时间短,请求资源的多少大小

3.6、生产排错和思路

1、确定调度器的调度规则和IP的正确性

2、RS节点上的VIP绑定和ARP抑制的检查

       生产思路:把RS绑定的VIP做实时监控,把RS绑定的VIP做成配置文件

例如:/etc/sysconfig/network-scripts/lo:0

3、tcpdump,ping

tcpdump 详解https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

以上是关于LVS的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡集群相关LVS介绍LVS调度算法LVS NAT模式搭建

LVS配置

LVS负载均衡地址转换使用轮询算法实验(结尾代码随记)

LVS四层负载均衡器原理和DR模式的搭建

LVS的工作模式介绍和NAT模式&DR模式实验步骤

linux,centos7上搭建LVS负载均衡