说明:这章节我们不打算讲解LVS的原理,如果您对部分原来不是太了解,可以参考我的这篇博客
一、铺垫
思考1:TCP/IP 的七层模型与OSI 在四层模型区别?
核心:OSI 参考模型注重"通信协议必要的功能是什么",而 TCP/IP则更强调"在计算机上实现协议应该开发哪种程序"!
思考2:负载均衡的表现形式?
基于七层:DNS解析(虚拟主机)、反向代理(squid、varnish)、HTTP协议的URL请求头(varnish)的重定向和Apach http重定向
负载均衡常见的方式
#####################################
二、LVS的专业术语
三、LVS的实现
LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作!
(1)DR(Direct Routing)模式
1)DR模式图
1)客户端主机A向目标IP(VIP)发送,通过ARP的请求和响应确定了前端控制器的VIP的MAC地址!
说明:第一次会将其记录在ARP缓存表中,所以 arp -n vip的时候发现是前端服务器的MAC地址,而不是后端服务器的MAC地址
LVS的结构主要分为两部分:
工作在内核空间的IPVS模块,LVS的能力实际上都是由IVPS模块实现;
工作在用户空间的ipvsadm管理工具,其作用是向用户提供一个命令接口,用于将配置的虚拟服务、真实服务等传给IPVS模块。
IPVS的命令行参数
scheduler:调度算法
arptables 是一个用户空间工具(操作内核ARP表的接口),用于管理内核中的ARP规则表,规则检查处理的是ARP数据帧
说明:arptables 类似 iptable,但比iptables简单,它需要载入内核模块arptable_filter!
正常情况下,arptable_filter 只有一个表filter ,不指定-t 表名 时默认就是filter 表, filter 表有两个链
一个是IN,表示外面发进来的ARP包;另外一个是OUT ,表示本机发出的ARP包
说明:arptables 可以当作是linux下的ARP防火墙!
arp详细解释
核心:MAC地址的修改和IP的欺骗以及ARP的抑制!
DR和RS必须在同一个局域网原因:就是为了保证可以通过修改MAC地址而进行数据报文的转发!
作用域:工作在OSI模型的第二层,即工作在数据链路层!
特点:通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户
注意:客户端测试的时候MAC地址是后端服务器的MAC地址,而不是前端服务器的MAC地址!
核心:在转发的过程中,仅仅是修改了数据报文中的目标MAC地址,然后转发!
但是要求:调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境
arptables -A OUT -s 172.25.14.100 -j mangle --mangle-ip-s 172.25.14.2
##将真实的ip转换为vip,由于tcp三次握手,出去时仍要以vip地址形式才会握手-->
而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
说明:服务器的功能呢重叠,选择最好的和最合适的!
DR的实现
(1)说明:前端飘逸的现象
DR的解决策略 ---->后端服务器对ARP请求处理
两个后端服务器的配置
后端服务器两条命令的讲解
arptables -A IN -d -j DROP
# 进来的ARP请求包,如果目的(destination)IP是VIP的,丢弃
原因:防止客户端主机跃过集群的"前端主机"直接与后端服务器通信(失去了负载均衡的意义),防止直接穿透
补充:如果是通过前端服务器的调度则目的IP是真实的后端服务器ip,而不是VIP!
arptables -A OUT -s -j mangle --mangle-ip-s
举例“arptables -A OUT -s 172.25.14.100 -j mangle --mangle-ip-s 172.25.14.2
##将真实ip转换成vip,由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能!
# 将源是VIP的"ARP请求包"发给rs(真实的后端服务器),理论上rs发送数据包并且响应源IP是非VIP!
与内核ARP参数arp_ignore=1,arp_announce=2的作用是一样的
测试:正确的实验现象
细节问题:
(1)lvs前端控制器的ipvsadm的命令(lvs规则)和后端服务器的(arptables)
(2)lvs两条命令--->添加虚拟服务(A->Service)并设置调度(s)算法-->在虚拟的服务中添加真实的服务器(Server) 并设置模式(-g | -m | -i -->LVS模式为:DR | NAT | TUN)
配置一个VIP!
(3)后端服务器的配置
1)VIP
2)arptables
IN规则:不接受目的IP是VIP的ARP包(防止客户端直接穿越来访问,不经过前端控制器,通过前面的MAC地址就可以知道)!
OUT规则:扩展动作:mangle: mangle ARP包
含义:IP欺骗-->在发送数据包ARP的真实RIP改成VIP!
明白:欺骗的目的,由于是直接给客户端的,如果是RIP,就不会接受
注意:由于客户端中的目标MAC是前端服务器的,所以后续数据的交互还要经过前端控制器!
仅仅是修改了数据报文中的MAC地址,所以这也是为什么我们要求DR和RS必须在同一个物理网络内(网段-->广播,arp请求和响应),就是为了保证可以通过修改MAC!
说明:有点类似于于三层交换机(路由的功能)
对比:LVS的MAC地址
(2)VS/TUN模式
tunel:隧道
回头附加上老师的图!
核心:调度器通过对IP报文再封装一层IP报文,发后发送给后端服务器
说明:由于通信通过 TUNNEL 模式,不管是内网和外网都能通信(跨区域),所以不需要 lvs vip 跟 realserver 在同一个网段内!
实现方式:导入支持隧道模块,在隧道上建立虚拟的IP
注意:在隧道上添加VIP
添加规则
修改内核参数
客户端测试
说明:这里的IP欺骗方式(客户端)和DR模式中配置的一样,这里不再赘述!
IP欺骗的等价方式:源地址校验的问题
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
ipip的隧道技术
说明:由于DR和TUN模式响应数据包不经过前端调度器,所以必须设置后端服务器必须设置VIP!
(3)NAT
感觉:有点像路由的功能!
特点:原路返回!
前端控制器配置
注意:添加了网卡,默认网卡不开启;说明:如果是临时配置IP,又没有以配置文件的形式开启,默认网卡是不开启的!
报错:curl: (7) Failed connect to server1:80; Connection timed out
开启方式:ip link set up eth1
其次:保证原生的环境,删除之前的配置,因为环境越复杂,排错的难度更大,而且错误不可控!
其次一定要注意:RS的网关要和VS的一致!
后端服务器的配置
测试结果
弊端:请求和响应都经过前端服务器,并发能力特别差,一般支持10~15左右!
三种模式对应的参数
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
LVS三种模式的区别及负载均衡算法
说明:上述提及几条链!
四、其它方式
full-nat!
tunel和full-nat不太常用!
需要编译内核!
细节问题:接收和发送消息(同一个局域网的数据链路层),(同一个局域网ip的问题)!
(2) 解决LVS中的ARP问题
方式1
arptables -A IN -d -j DROP
# 进来的ARP请求包,如果目的(destination)IP是VIP的,丢弃
原因:防止客户端主机跃过集群的"前端主机"直接与后端服务器通信(失去了负载均衡的意义),防止直接穿透
补充:如果是通过前端服务器的调度则目的IP是真实的后端服务器ip,而不是VIP!
arptables -A OUT -s -j mangle --mangle-ip-s
举例“arptables -A OUT -s 172.25.14.100 -j mangle --mangle-ip-s 172.25.14.2
##将真实ip转换成vip,由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能!
# 将源是VIP的"ARP请求包"发给rs(真实的后端服务器),理论上rs发送数据包并且响应源IP是非VIP!
与内核ARP参数arp_ignore=1,arp_announce=2的作用是一样的。
注意
LVS 的VIP 和 realserver 必须在同一个网段,不然广播后所有的包都会丢掉;所有的realserver 都必须绑定VIP的IP地址;
说明:客户端测试的时候最终arp -n的ip 和 MAC地址是后端服务器的!
arp欺骗
四、硬件的负载均衡
链接1
连接2
核心:独立于操作系统!
连接3
连接4
吞吐率
五、
LVS负载均衡NAT和fullnat模式区别
连接2
LVS 原理(调度算法、四种模式的实现、四层负载均衡和七层 的区别)
四层、七层负载均衡的区别