使用lvs实现负载均衡原理以及配置详解中(lvs-nat 模式)

6.2LVS/NAT原理和特点:

1. 重点理解NAT方式的实现原理和数据包的改变。
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 
此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,
然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时
报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。
 此时报文的源IP为VIP,目标IP为CIP

这里写图片描述

2. LVS-NAT模型的特性:

RS应该使用私有地址,RS的网关必须指向DIP
DIP和RIP必须在同一个网段内,
请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
支持端口映射
RS可以使用任意操作系统
缺陷:对Director Server压力会比较大,请求和响应都需经过director server

3.iptables之四表五链(我们得知道数据包的流向):

filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理

INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据
包出来的时侯都先由这个链处理)

4.lvs-nat模式流程:

NAT模型:地址转换类型,主要是做地址转换,类似于iptablesDNAT类型,它通过多目标地址转换,来实现负载均衡,
一个Director最多负载提供10Real Server主机

1> client发送requestLVSVIP上,VIP选择一个Real-server,并记录连接信息到hash表中,然后修改clientrequest的目的IP地址为Real-server的地址,将请求发给Real-server;

2> Real-server收到request包后,发现目的IP是自己的IP,于是处理请求,然后发送replyLVS;

3> LVS收到reply包后,修改reply包的的源地址为VIP,发送给client;

4> client来的属于本次连接的包,查hash表,然后发给对应的Real-server5> client发送完毕,此次连接结束或者连接超时,那么LVS自动从hash表中删除此条记录。

5.路由重定向的前提:

数据包的入接口和路由后的指定的出接口是同一个接口。(vip)
数据包的源IP地址和该包应走的下一跳IP地址属于同一个网段。
数据报非源路由的(这种情况应该比较少见了,源路由多见于Token Ring)。
系统开启重定向功能。

6.lvs-nat 模式配置:

NAT工作路径源路经返回,只需要指定网关即可。
server1依旧是调度器只是算法不同而已:在server1添加两块网卡内网:172.25.84.4
外网:172.25.254.100
server2:172.25.84.2网关:172.25.84.4
server2:172.25.84.3网关:172.25.84.4

server1作为调度器:

[root@server1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:8a:d4:d6 brd ff:ff:ff:ff:ff:ff
    inet 172.25.84.4/24 brd 172.25.84.255 scope global eth0   内网
    inet6 fe80::5054:ff:fe8a:d4d6/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:1b:c4:71 brd ff:ff:ff:ff:ff:ff
    inet 172.25.254.100/24 scope global eth1    外网
    inet6 fe80::5054:ff:fe1b:c471/64 scope link 
       valid_lft forever preferred_lft forever

这里写图片描述

server2依旧作为后端服务器:

[root@server2 ~]# ip addr add 172.25.254.100 dev eth0  添加虚拟IP
[root@server2 ~]# ip addr  查看添加成功
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:ee:d7:80 brd ff:ff:ff:ff:ff:ff
    inet 172.25.84.2/24 brd 172.25.84.255 scope global eth0
    inet 172.25.254.100/32 scope global eth0
    inet6 fe80::5054:ff:feee:d780/64 scope link 
       valid_lft forever preferred_lft forever
[root@server2 ~]# /etc/init.d/httpd start  开启httpd
Starting httpd: 
[root@server2 ~]# /etc/init.d/httpd status  查看阿帕其状态为运行
httpd (pid  1099) is running...
[root@server2 ~]# cat /etc/sysconfig/network  设置网关
NETWORKING=yes
HOSTNAME=server2
GATEWAY=172.025.84.4
[root@server2 ~]# route -n  查看网关,NAT工作路径源路经返回,只需要指定网关即可。
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.25.84.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         172.25.84.4     0.0.0.0         UG    0      0        0 eth0

这里写图片描述

server3同样作为后端服务器:

[root@server3 ~]# ip addr add 172.25.254.100 dev eth0  添加虚拟IP
[root@server3 ~]# ip addr  查看添加成功
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:42:fc:3a brd ff:ff:ff:ff:ff:ff
    inet 172.25.84.3/24 brd 172.25.84.255 scope global eth0
    inet 172.25.254.100/32 scope global eth0
    inet6 fe80::5054:ff:fe42:fc3a/64 scope link 
       valid_lft forever preferred_lft forever
[root@server3 ~]# /etc/init.d/httpd start  开启httpd
Starting httpd: 
[root@server3 ~]# /etc/init.d/httpd status  查看阿帕其运行状态
httpd (pid  1147) is running...
[root@server3 ~]# route -n  查看网关
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.25.84.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         172.25.84.4     0.0.0.0         UG    0      0        0 eth0

这里写图片描述

在server1添加ipvsadm策略:

[root@server1 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t  172.25.254.100:80 -r 172.25.84.2:80 -m  -m表示NAT模式
[root@server1 ~]# ipvsadm -a -t  172.25.254.100:80 -r 172.25.84.3:80 -m
[root@server1 ~]# service ipvsadm save  保存策略
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
[root@server1 ~]# ipvsadm  查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:http rr
  -> 172.25.84.2:http             Masq    1      0          0         
  -> 172.25.84.3:http             Masq    1      0          0 

这里写图片描述

在server1开启路由机制:

[root@server1 ~]# vim /etc/sysctl.conf  编辑配置文件
[root@server1 ~]# sysctl -p  刷新已经开启路由机制
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

这里写图片描述

在server1加载NAT模块开启服务:

[root@server1 ~]# modprobe iptable_nat :如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超
时现象
[root@server1 ~]# /etc/init.d/ipvsadm start  开启服务
ipvsadm: Clearing the current IPVS table:                  [  OK  ]
ipvsadm: Applying IPVS configuration:                      [  OK  ]

这里写图片描述

在真机进行测试:

[root@foundation84 Desktop]# curl 172.25.254.100  会发生轮询
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.254.100
www.westos.org
[root@foundation84 Desktop]# curl 172.25.254.100
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.254.100
www.westos.org

这里写图片描述

在真机添加解析:

[root@foundation84 Desktop]# vim /etc/hosts

这里写图片描述

在网页测试每刷新一次网页会发生轮询:

这里写图片描述
这里写图片描述

当后端服务器server2的httpd关闭:

[root@server2 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]

这里写图片描述

在真机测试:

[root@foundation84 Desktop]# curl 172.25.254.100
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.254.100
curl: (7) Failed connect to 172.25.254.100:80; Connection refused
[root@foundation84 Desktop]# curl 172.25.254.100
bbs.westos.org
[root@foundation84 Desktop]# curl 172.25.254.100
curl: (7) Failed connect to 172.25.254.100:80; Connection refused

这里写图片描述

当后端服务器server3的httpd关闭:

[root@server3 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]

这里写图片描述

在真机测试会报错,server1不会出来顶替工作:

[root@foundation84 Desktop]# curl 172.25.254.100
curl: (7) Failed connect to 172.25.254.100:80; Connection refused
[root@foundation84 Desktop]# curl 172.25.254.100
curl: (7) Failed connect to 172.25.254.100:80; Connection refused
[root@foundation84 Desktop]# curl 172.25.254.100
curl: (7) Failed connect to 172.25.254.100:80; Connection refused

这里写图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/81286059