LVS工作原理
讲iptables,提到过DNAT,把目标地址作为转换,适用于从互联网网络中访问企业内部网络(先是用户的请求,连接公网的地址,公网地址得到请求后转发到企业内部私网地址服务,但是DNAT是一对一,是能把公网请求转发的一个服务器上去,不能转发到多个服务器上去,只能实现单一的一个主机的转发,做不到调度功能,把用户的请求根据某种算法调度到后端的多个服务器上去
充当调度器,LVS只是其中一种,nginx也可以,haproxy
后端真正提供服务的是real serve叫RS,在nginx里可以叫上游服务器upstream server
叫haproxy叫backend server 后端服务器
作为调度器可能有一个公网地址VIP,还有一个连接内网的内网地址DIP
**调度器连接内网的地址
**
访问流程,客户端连接VIP,vip转发的时候走DIP,再到后端真正服务的RIP(real server ip)
要实现LVS,就需要使用对应相应工具
ipvsadm就是软件包,作用类似于iptable,(LVS内核级的功能)ipvsadm是一个命令行工具,通过命令行工具可以定义ipvsadm规则
ipvs就是再内核里涉及到的执行lvs的框架,也是一个钩子函数(iptable5个钩子,链,prerouting,postrouting,forward,input,output)
一旦lvs发现用户请求就截住,触发规则,通过 路由表转发到内部服务器
分四种集群,
nat,(类似之前的DNAT)只不过实现了多目标的DNAT
dr,
tun,了解原理即可
fullnat,了解原理即可
DNAT工作原理,目标地址替换
**第一种工作原理,NAT,响应报文和请求报文都要经过LVS服务器,所有的服务器来回都要经过lvs服务器,这样就造成lvs服务器压力大。
**
中间没有遇到DIP 说明通讯的过程中不一定是要再一个网段的,可以在中间加上路由器,但是路由器是带宽比较低的设备,一般是交换机比较多,不过一般没有必要加
1.可以不在同一网络,应当在同一网络,但是不是必须的,内部用的是私网ip,但是非要用公网ip也不是不行,可以用,但是没有必要用,用私网地址足够了,就意味着RS的网关没有必要指着DIP了,如果是交换机就需要指向DIP,因为要从DIP出去,
用路由器的话,就用路由器作为网关
内部的机器可以不是80端口,可以不一样,互联网访问的端口,和真正提供服务器的端口可以不一样
中间的lVS必须是linux 系统,后端的real server 就没有要求了
客户端发请求到,先到达企业和互联网之前的路由器,源地址CIP,目标地址VIP,
中间是lVS服务器,上面配置了VIP地址,先到达prerouting,检查路由表,如果是到自己的,就到了INPUT钩子函数上,截获住了,到达路由表,从postrouting转出去 了,进来的时候还是VIP,出去的时候目标地址已经对应某个RIP了,
real server 需要响应数据报文,源地址就变成 了RIP,目标地址变成了CIP,这个数据报文就回来了 ,回来的时候LVS服务器收到了再把RIP替换成VIP,目标地址替换成CIP,
NAT模式就是多端口的DNAT
DR模式,应用更加广泛,比较复杂,direct routing直接路由,是LVS的默认模式
工作原理
涉及到一个mac地址的变化
调度的时候非常特殊,源地址不变,目标地址仍然不变,但是mac地址变了
怎么知道rs1的mac地址,就需要LVS用ARP广播来找,既然用广播就需要用到swith隔断
RS1收到广播,但是ip地址不是它的,所以就需要RS1,2都配上VIP
怎么让这些ip地址不冲突(地址冲突是因为,当你采用这个地址,网络服务一启动,它回向网络种发ARP广播(询问,机器上配的地址,网络中有没有人也使用,如果有人配置了这个地址,就会回应这个广播,说我在使用,一回应就知道有人在使用,就地址冲突了)
避免冲突
1.不发广播,默默使用
2.不回应广播
第一不向外部发布自己的地址,第二也不打理别人的询问
这就是在配置一个地址在多个主机上的一种手段
**这个路由器如果不解决地址冲突的问题,就会把请求直接转发到rs1,2上去,不经过你的调度器了
**
可以换一种思路,在路由器绑死了,VIP可以绑定上MACLVS
但有缺点,需要配置路由,万一LVS服务器宕机 ,还需要修改路由器配置,不灵活,路由器配置一般运维工程师是没有能力进行修改的
这种冲突需要在内核级上修改响应级别
arp_ignore(忽略,别人问不搭理),arp_announce(发布,自己也不发布自己地址
也有第三种方法,用arptables工具
一般都用第三种方法,让三台主机都不发布主机的地址
rs1收到请求后,需要回应数据包,源地址就变成VIP mac地址rs1,目标CIP ,MAC2(路由器2的mac地址)
源地址再变成VIP ,MAC1,目标是CIP MACC
真正的通讯过程,
客户端发送请求,先三次握手 ,SYN请求到达LVS,LVS服务器收到请求后就转到RS1了,把数据包的mac地址改了,改了以后到达RS1,同步请求,等于走了两次才实现了第一次握手
第二次握手,直接回来,SYN ,ACK两个标记为
**第三次握手,ACK,只要是请求报文必须经跟LVS,响应报文不需要经过它
**
抓包才能深入研究
查看一些特性
整个工作中,并没有涉及到RIP,所以公网还是私网这个并没有关系,所以RIP一般采用私有地址
但是采用私有地址就有点问题,物理上在一个网段,但是逻辑上是在两个网段(交换机相连就是在一个网段),所以这个时候在路由器上应该有两个地址(一个是公网的网关,一个是私网的网关)再加上对外一个地址,在路由器上有三个地址(对外的网卡配置一个地址,对内的网卡需要配置2个地址)
不支持端口映射,改的是mac地址,IP地址没有改变过,端口也没有变过,改的是mac地址,所以不支持端口映射
没有修改ip报文,只改了数据链路层的报文头部
应该些路由器接口的mac地址
应该是路由器接口的mac地址
源mac因该是real-server的mac地址,目标是路由器接口mac
DR模式优势就是响应报文不经过LVS服务器了,这样性能负载就小多了
谷歌一天PV才几十亿
生产中一般都是这么分的,调度器2个F5(或者LVS) 高可用
下面是反向代理服务器
(调度器,如果访问www。网站,就调度到nginx服务器上去,如果是app手机应用,就调度到另外的服务器上去
比如wap,手机浏览器,就转发的haproxy
反向代理服务器(说白了也是调度器)还有一堆服务器,这样无论多少的并发都能接受