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、搭建负载均衡的需求
负载均衡集群提供了一种廉价、透明、有效的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高灵活性和可用性。
那么在什么情况下,企业网站需要负载均衡服务呢?
- 单台计算机无法承受大规模的并发访问或者数据流量了,此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减少用户的响应时间又提升用户体验。
- 单个负载均衡的运算服务分担到多节点设备上做并行处理,每台节点设备处理完毕后,将结果汇总返回,系统处理能力和效率得到大幅度提高
- 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
- 进来的时候数据包源ip是cip,目标ip是vip,lvs把目标ip改成rip
- 出来的时候数据包源ip是rip,目标ip是cip,lvs把源ip改成vip
特点:
- nat将请求报文(DNAT方式)和相应报文中的ip进行修改
- 每台RS节点的网关地址,必须配成LB的私有lan内物理网卡地址,这样才能确保数据包返回是经过LB
- 由于所有数据包返回都要经过LB,所以LB鸭梨大,成为了集群瓶颈
- nat模式支持对IP和端口的转换(DR和TUN不行)、
- 数据包来回都要经过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
其他导致负载不均衡的原因:
- lvs自身的会话保持参数设置(-p,persistent)。
- lvs调度算法设置,例如:rr,wrr,wlc,lc
- 后端RS节点的会话保持参数
- 访问量少的情况,不均衡现象更加明显
- 用户发送请求时间短,请求资源的多少大小
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