LVS 是 Linux Virtual Server ,Linux 虚拟服务器;是一个虚拟的服务器集群【多台机器 LB IP】。LVS 集群分为三层结构:
a. 负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上 执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP】
b. 服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS
c. 共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相 同的服务
共有4中模式:LVS-DR,LVS-NAT,LVS-FULLNAT,LVS-TUN
client发送一个请求到VIP,LVS服务器根据VIP选择对应的realServer的pool,根据算法,在pool中选择一台realServer,将包广播到vip的局域网,同时LVS在hash表中记录该次连接,realServer收到包之后,处理完请求,把应答包直接传给client;当client继续发包过来时,LVS根据更才记录的hash表的信息,将属于此次连接的请求直接发到刚才选择的realServer上;当连接中止或者超时,hash表中的记录将被删除。
假设client,director,vip,realServer的ip及mac地址如下
client | director | vip | realServer | |
IP | 192.168.138.20 | 192.168.143.231 | 192.168.143.122 | 192.168.143.82 |
MAC | X:X:X:X:X:5d | X:X:X:X:X:96 | X:X:X:X:X:96 | X:X:X:X:X:82 |
第一步:client向vip发起请求,director接收到请求,ip包头的信息如下
source mac | dst mac | ... | source ip | dst ip | ... |
X:X:X:X:X:5d | X:X:X:X:X:96 | ... | 192.168.138.20 | 192.168.143.122 | ... |
第二步:LVS根据负载均衡算法,选择一台realServer,修改dst mac地址为realServer的mac地址,将数据包转发到局域网,此时ip包头信息如下
source mac | dst mac | ... | source ip | dst ip | ... |
X:X:X:X:X:96 | X:X:X:X:X:82 | ... | 192.168.138.20 | 192.168.143.122 | ... |
第三步:realServer接收到包,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网,IP包头及数据帧头信息如下
source mac | dst mac | ... | source ip | dst ip | ... |
X:X:X:X:X:82 | X:X:X:X:X:5d | ... | 192.168.143.122 | 192.168.138.20 | ... |
第四步:如果,通过路由将包路由到client
a. LVS必须与realServer在同一个局域网,因为LVS收到数据包后,只修改了dst mac地址,然后广播出去,如果LVS与realServer不在统一网段,realServer永远收不到数据包
b. LVS-DR不需要路由转发,同一局域网内,不经过路由
c. realServer需呀配置 vip
假设client,vip,realServer的ip地址如下
client | vip | realServer | |
IP | 192.168.138.20 | 192.168.143.122 | 192.168.143.82 |
第一步:client 发送包到LVS服务器的VIP上
... | source ip | dst ip | ... |
... | 192.168.138.20 | 192.168.143.122 | ... |
第二步:VIP选择一个realServer,并记录连接信息到hash表中,然后修改client的request的目的IP地址为realServer的地址,将请求发给realServer
... | source ip | dst ip | ... |
... | 192.168.138.20 | 192.168.143.82 | ... |
第三步:realServer收到请求包后,发现目的IP是自己的IP,于是处理请求,然后发送reply给LVS,回复包如下
... | source ip | dst ip | ... |
... | 192.168.143.82 | 192.168.138.20 | ... |
第四步:LVS收到reply包后,修改reply包的的源地址为VIP,发送给client;以后从client来的属于本次连接的包,查hash表,然后发给对应的realServer
... | source ip | dst ip | ... |
... | 192.168.143.122 | 192.168.138.20 | ... |
a. NAT修改的是dst ip,不需要vip与realserver在同一个网段内
b. NAT模式包的进出都需要经过LVS ;因此LVS 的可能会成为一个系统瓶颈问题
LVS-FULLNAT在client请求VIP 时,不仅替换了数据包的dst ip,还替换了数据包的 source ip;但VIP 返回给client时也替换了source ip
假设client,vip,realServer的ip地址如下
client vip realServer
IP 192.168.138.20 192.168.143.122 192.168.143.82
第一步:client 发送包到LVS服务器的VIP上
... source ip dst ip ...
... 192.168.138.20192.168.143.122 ...
第二步:VIP 收到数据包后,会根据LVS设置的LB算法选择一个合适的realserver,然后把数据包的dst ip修改为realserver的ip;把sorce ip 改成 LVS的vip
... source ip dst ip ...
... 192.168.143.122 192.168.143.82 ...
第三步: realserver 收到这个数据包后判断dst ip 是自己,处理完后把这个包发送给LVS VIP
... source ip dst ip ...
... 192.168.143.82 192.168.143.122 ...
第四步: LVS 收到这个数据包后把sorce ip改成VIP的IP,dst ip改成 client ip然后发送给client
... source ip dst ip ...
... 192.168.143.122 192.168.138.20 ...
3.2 注意事项
a. FULLNAT修改的是dst ip,不需要vip与realserver在同一个网段内
b. FULLNAT能保证回包一定能回到LVS
c. 因为FULLNAT要更新sorce ip 所以性能NAT模式低
假设client,vip,realServer的ip地址如下
client vip realServer
IP 192.168.138.20 192.168.143.122 192.168.143.82
第一步:client 发送包到LVS服务器的VIP上
... source ip dst ip ...
... 192.168.138.20 192.168.143.122 ...
第二步:VIP 收到数据包后,会根据LVS设置的LB算法选择一个合适的realserver;并把client发送的数据包包装到一个新的IP包里面;新的IP包的dst是realserver的IP
... source ip dst ip ...
... 192.168.143.122 192.168.143.82 ...
第三步: realserver 收到这个数据包后判断dst ip 是自己,然后解析出来的数据包的dst是VIP;会检测网卡上是否帮了VIP的ip地址;如果帮了就会处理这个包,如果没有直接丢掉。 一般在realserver上面 lo:0 绑定了VIP的ip地址,就可以处理。处理完成后,直回给client
... source ip dst ip ...
... 192.168.143.82 192.168.138.20 ...
a. TUN模式必须在所有的realserver机器上面绑定VIP的IP地址
b. TUN模式的包通信通过TUN模式,不管是内网和外网都能通信,所以不需要lvsvip跟realserver 在同一个网段内
c. TUN模式 realserver会把数据包直接发给client 不会给lvs了
d. TUN模式走的隧道模式,所以运维起来比较难,所以一般不用