LVS-NAT

LVS-NAT
简单的可以看作是:有算法的可以DNAT多个目标的DNAT
所有学员
 |
 |
调度器
 |
路由器1 路由器3   路由器3
 |
 |
外网
客户端 172.16.2.9
| 外网 172.16.2.10
[lvs负载均衡调度器]
| | 内网 192.168.122.10
| |
| |
| |
WEB1 WEB2
192.168.122.11 192.168.122.12
--web1和web2网关都要指向192.168.122.10
SIP:172.16.2.9 DIP:172.16.2.10
到达LVS调度器后,通过算法调给后台web(realserver),假设调给了web1
SIP:172.16.2.9 DIP:192.168.122.11
到达web1后,返回
SIP:192.168.122.11 DIP:172.16.2.9
通过网关指向回给LVS调度器
SIP:192.168.122.11 DIP:172.16.2.9
因为进来时做了DNAT,所以回去时自动SNAT
SIP:172.16.2.10 DIP:172.16.2.9
问题:
上图中的调度器能否只有一个网卡,也就是没有内外网双网卡之分?
答案:不行,NAT的意思就是从一个网段转换到另一个网段,单网段不符合;
如果真的整个架构全部是同一网段,LVS也能帮你调度,但回来的时候,realserver会直接回到客户端(因为它和客户端也是同一网段,是直通的),而不会经过调度器回到客户端
实验前准备:(centos7.3平台)
1,静态ip
2,主机名配置和绑定
3,时间同步
4,关闭iptables,selinux
5,配置yum (本地iso镜像yum源)
6,准备客户端,只需要有firefox或elinks命令就可以了
第一大步:
lvs调度器上的配置
1,在调度器上打开ip转发,因为在上面架构图中,调度器会用到两个IP段的转发
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p 使之生效
2,在调度器(director)上安装软件包
安装ipvsadm
yum install ipvsadm
3:按照架构图来配置lvs进程调度
ipvsadm -A -t 172.16.2.10:80 -s rr --A参数增加服务,s参数后接调度算法,这里先使用rr
ipvsadm -a -t 172.16.2.10:80 -r 192.168.122.11:80 -m --a参数增加真实服务器,-r代表后接一个realserver;-m代表NAT架构
ipvsadm -a -t 172.16.2.10:80 -r 192.168.122.12:80 -m
--上面三条写的就是访问172.16.2.10的80端口的访问会以rr算法调给192.168.122.11的80和192.168.122.12的80;如果你服务的端口不一样,直接按上面的规则修改就可以
# ipvsadm -ln --查看ipvsadm调度规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 rr
-> 192.168.122.11:80 Masq 1 0 0
-> 192.168.122.12:80 Masq 1 0 0
# ipvsadm -Sn > /etc/sysconfig/ipvsadm --规则保存到此文件或者使用ipvsadm -Sn > /etc/sysconfig/ipvsadm
# cat /etc/sysconfig/ipvsadm
-A -t 172.16.2.10:80 -s rr
-a -t 172.16.2.10:80 -r 192.168.122.11:80 -m -w 1
-a -t 172.16.2.10:80 -r 192.168.122.12:80 -m -w 1
# systemctl start ipvsadm
# systemctl enable ipvsadm
第二大步:
1,在realserver(web1和web2)上安装httpd
并在不同的web服务器上建立不同的主页文件内容(方便测试),并启动httpd,网关指回192.168.122.10
在web1服务器上做
# yum install httpd httpd-devel
# echo 'web1'> /var/www/html/index.html
# systemctl start httpd
# systemctl enable httpd
# route add default gw 192.168.122.10 --这是临时加网关,永久加网关就请配置到网络配置文件里
在web1服务器上做
# yum install httpd httpd-devel
# echo 'web2'> /var/www/html/index.html
# systemctl start httpd
# systemctl enable httpd
# route add default gw 192.168.122.10 --这是临时加网关,永久加网关就请配置到网络配置文件里
第四大步:
在clinet端进行访问验证
# elinks 172.16.2.10
验证结果为web1主页和web2主页轮循
===========================================================
验证一:
健康检查
在后面web1上systemctl stop httpd
客户端 elinks 172.16.2.10的结果就只有web2了,说明健康检查ok
验证二:
数据一致
这里我是为了测试方便,所以两个web主页内容不一致
实际情况应该要做成一致,方法有
rsync drbd glusterfs nfs...等
验证三:
lvs能调度哪些服务?
答案:lvs是四层调度,可以说只要有ip,端口,就可以调度
验证调度mysql服务
1, 两台realserver装两个mysql(yum install mariadb mariadb-server),启动服务(systemctl start mariadb)分别建两个不同名的库,方便测试
2,两个mysql授权,这里授权的IP应该为客户端的IP172.16.2.9(可以通过IP包的原理分析得到)
MariaDB [(none)]> grant all on *.* to 'abc'@'172.16.2.9' identified by '123';
MariaDB [(none)]> flush privileges;
3,加ipvsadm的调度规则
# ipvsadm -A -t 172.16.2.10:3306 -s rr
# ipvsadm -a -t 172.16.2.10:3306 -r 192.168.122.11:3306 -m
# ipvsadm -a -t 172.16.2.10:3306 -r 192.168.122.12:3306 -m
4,客户端172.16.2.9上使用(mysql -h 172.16.2.10 -u 授权用户名 -p授权密码 )来测试
5,测试完了,我这里把mysql的调度给删除了
# ipvsadm -D -t 172.16.2.10:3306
验证四:
会话保持:永久粘贴和持续性的比较
sh算法实现永久会话粘贴(类似nginx的ip_hash)
# ipvsadm -E -t 172.16.2.10:80 -s sh
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 sh
-> 192.168.122.11:80 Masq 1 0 11
-> 192.168.122.12:80 Masq 1 0 0
客户端测试结果:如果客户端第一次访问的是web1,那么永远访问的是web1(web1挂了还是访问web1,这里健康检查就无效了)
通过持续性persistent实现非永久性的会话粘贴
# ipvsadm -E -t 172.16.2.10:80 -s rr -p 10
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 rr persistent 10
-> 192.168.122.11:80 Masq 1 0 0
-> 192.168.122.12:80 Masq 1 0 0
TCP 172.16.2.10:3306 rr
-> 192.168.122.11:3306 Masq 1 0 0
-> 192.168.122.12:3306 Masq 1 0 0
关于persistent 10的讨论
# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:06 NONE 172.16.2.9:0 172.16.2.10:80 192.168.122.11:80
TCP 01:56 TIME_WAIT 172.16.2.9:39353 172.16.2.10:80 192.168.122.11:80
通过上面的命令看到客户端172.16.2.9访问了一次172.16.2.10:80,被调度给了192.168.122.11:80
当一个client访问vip的时候,ipvs或记录一条状态为NONE的信息,NONE状态前的面expire值是persistence_timeout的值(我这里设为10,所以从10开始计算),然后根据时钟主键变小,在以下记录存在期间,同一client ip连接上来,都会被分配到同一个后端。
FIN_WAIT的值就是tcp tcpfin udp的超时时间,当NONE的值为0时,如果FIN_WAIT还存在,那么NONE的值会从新变成60秒,再减少,直到FIN_WAIT消失以后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到统一real server。
也就是说,客户端172.16.2.9第一次访问了被调度给192.168.122.11:80,要等2*60+10=130秒左右再做第二次访问才可能被调度给另一个real server.
测试结果总结:假设第一次访问web1,在一定的时间内都是访问web1(如果web1挂了,在此时间内仍然访问web1,时间过了,就会按rr算法访问web2了)
验证五:
算法
1,rr 轮循
2,wrr 加权轮循
# ipvsadm -E -t 172.16.2.10:80 -s wrr
# ipvsadm -e -t 172.16.2.10:80 -r 192.168.122.11:80 -m -w 2
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 wrr
-> 192.168.122.11:80 Masq 2 0 0
-> 192.168.122.12:80 Masq 1 0 0
客户端使用elinks 172.16.2.10测试,结果为两次web1,一次web2
或者使用ab命令直接测试1000次连接
# ab -n 1000 -c 1000 http://172.16.2.10/
# ipvsadm -ln --然后使用客户端看后面的inactconn的数量大概为2:1
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 wrr
-> 192.168.122.11:80 Masq 2 0 669
-> 192.168.122.12:80 Masq 1 0 337
3,lc-通过实时的链接数来判定,链接数少的会被分配更多请求.这样更能保证负载均衡地分配
4,wlc-加权的lc(加权是为了考虑服务器性能),是最常用的算法(并且是lvs默认算法)
5,dh-目标地址散列,假如调度器的后面是两台缓存服务器A,B而不是真正的REALSERVER,则会尽可能的把相同请求或者把同一用户的请求转发到同一个缓存服务器上面以提高缓存命中率(类似nginx的url_hash算法)
客户端
client1 client2
     lvs调度
squid1 squid2
100 100
 web1 web2
6,sh-源地址散列算法.同一个源IP地址来的请求都会被调度到同一个realserver,保持会话一致(类似nginx的ip_hash算法)。但这样做,如果后台realserver挂掉,与它连接的所有会话会down掉。(建议使用持久性来做)
客户端
LVS调度
web1 web2
firewall1 firewall2
lvs
内网客户端1 内网客户端2
iptables (NEW established)
外网客户端1 外网客户端2
lvs
firewall1 firewall2
内网服务器
lblc-在dh的基础上面考虑后台服务器的连接数(dh+lc)
lblcr-在lblc的基础上,假设有A,B两台缓存服务器,某个用户第一次访问被重定向到A,第二次访问时A负载很大,B过于空闲这时也会打破原来的规则把客户的第二次访问重定向给B
sed-Shortest Expected Delay Scheduling
The shortest expected delay scheduling algorithm assigns network connections to the server with the shortest expected delay. The expected delay that the job will experience is (Ci + 1) / Ui if sent to the ith server, in which Ci is the number of connections on the the ith server and Ui is the fixed service rate (weight) of the ith server.
nq-The never queue scheduling algorithm adopts a two-speed model.
When there is an idle server available, the job will be sent to the idle server, instead of waiting for a fast one.
When there is no idle server available, the job will be sent to the server that minimize its expected delay (see the Shortest Expected Delay Scheduling algorithm).
lvs
北京      深圳
posted @ 2018-06-19 22:19  Sky-wings  阅读(143)  评论(0编辑  收藏  举报