Linux云计算架构-使用LVS- DR实现负载均衡

Linux云计算架构-使用LVS-DR实现负载均衡

1. LVS-DR和LVS-IP TUN集群对比

  • Direct Routing(直接路由): 当客户端发送请求给调度器(director),调度器根据指定的调度算法,分配请求到不同的后端真实服务器(real server)。后端真实服务器处理请求后直接回应用户,这样调度器仅处理客户机与服务器的一半连接,避免了因调度器所带来的新的性能瓶颈,同时增加了系统的可伸缩性。直接路由采用了数据链路层(修改 MAC 地址)技术,因此所有服务器(调度器、后端真实服务器)都必须在一个物理网段中。

  • IP Tunneling(IP 隧道): 当客户端发送请求给调度器(director),调度器根据指定的调度算法,分配请求到不同的后端真实服务器(real server)。后端真实服务器处理请求后直接回应用户,这样调度器仅处理客户机与服务器的一半连接。IP Tunneling 技术极大地提高了调度器的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。后端真实服务器可以在任何 LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器(调度器、后端真实服务器)必须拥有正式的公网IP地址用于与客户机直接通信,并且所有服务器必须支持 IP 隧道协议。

2. LVS-DR网络拓扑图

在这里插入图片描述
  • LVS-DR网络拓扑图来说,所有的服务器都必须拥有公网IP地址。本文实验采用局域网模拟公网进行实验。

  • 由于使用的是DR直接路由(2层转发,子网内广播)方式转发数据包,那客户端和服务器、服务器和服务器之间的数据传输都必须要知道对方的MAC地址,而vlan具有隔离广播的功能,故LVS服务器不能处于不同的vlan中,即所有的LVS服务器都必须处于同一物理网段和同一广播域中

  • 在每一次传输数据前,数据包中都会记录源MAC地址和目标MAC地址,而DR采用了数据链路层技术(修改MAC地址),所以数据包在传输的过程中不断转换源主机和目标主机的MAC地址,以便目标主机接收该数据包。

  • LVS-DR是基于2层数据链路层转发的,较于LVS-NAT基于3层网络层转发,效率大大的提高了。LVS-DR也是所有模式中效率最好的。

3. 部署LVS-DR

再次声明,为了能够部署LVS-DR集群,所有的LVS服务器都必须处于同一物理网段和同一广播域中,这里用小型局域网来模拟外网。生产中,要求部署LVS的服务器都能连通外网。

3.1 调度器IP地址配置

调度器(director):两个网络配置文件,两个IP。
e34 VIP:192.168.10.50
e32 DIP:192.168.10.10

在这里插入图片描述

3.2 配置LVS-DR规则

# 配置并挂载本地yum源
[root@server10-50 ~]# df -h
文件系统                        容量  已用  可用 已用% 挂载点
/dev/mapper/centos_master-root   17G  3.9G   14G   23% /
devtmpfs                        894M     0  894M    0% /dev
tmpfs                           910M     0  910M    0% /dev/shm
tmpfs                           910M   11M  900M    2% /run
tmpfs                           910M     0  910M    0% /sys/fs/cgroup
/dev/sda1                      1014M  179M  836M   18% /boot
tmpfs                           182M  4.0K  182M    1% /run/user/42
tmpfs                           182M   28K  182M    1% /run/user/0
/dev/sr0                        4.3G  4.3G     0  100% /media/cdrom
[root@server10-50 ~]# tail -1 /etc/fstab 
UUID="2018-11-25-23-54-16-00" /media/cdrom iso9660 defaults 0 0
[root@server10-50 ~]# cat /etc/yum.repos.d/centos7.repo 
[centos7]
name=centos7
baseurl=file:///media/cdrom/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

# 安装ipvsadm服务
[root@server10-50 ~]# yum install ipvsadm -y

# 如果不想配置本地yum源的,可以上传ipvsadm的rpm包,通过rpm安装。
[root@server10-50 ~]# ll /media/cdrom/Packages/ipvsadm-1.27-7.el7.x86_64.rpm 
-rw-rw-r--. 1 root root 45760 3月  14 2015 /media/cdrom/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
[root@server10-50 ~]# rpm -ivh /media/cdrom/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
# 添加虚拟服务器作为集群
[root@server10-50 ~]# ipvsadm -A -t 192.168.10.50:80 -s rr
# 添加两台真实服务器作为集群节点
[root@server10-50 ~]# ipvsadm -a -t 192.168.10.50:80 -r 192.168.10.20 -g 
[root@server10-50 ~]# ipvsadm -a -t 192.168.10.50:80 -r 192.168.10.30 -g 
-g --gatewaying                         指定LVS的工作模式为直接路由模式(也是LVS 默认的模式) 
-i --ipip                               指定LVS 的工作模式为隧道模式 
-m --masquerading                       指定LVS 的工作模式为NAT 模式 
# 查看下虚拟服务器列表
[root@server10-50 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.50:80 rr
  -> 192.168.10.20:80             Route   1      0          0         
  -> 192.168.10.30:80             Route   1      0          0   
# 保存虚拟服务器列表配置
[root@server10-50 ~]# ipvsadm -S
-A -t server10-50:http -s rr
-a -t server10-50:http -r 192.168.10.20:http -g -w 1
-a -t server10-50:http -r 192.168.10.30:http -g -w 1
[root@server10-50 ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@server10-50 ~]# cat /etc/sysconfig/ipvsadm
-A -t server10-50:http -s rr
-a -t server10-50:http -r 192.168.10.20:http -g -w 1
-a -t server10-50:http -r 192.168.10.30:http -g -w 1

# 开放虚拟服务器的80端口号
[root@server10-50 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@server10-50 ~]# firewall-cmd --reload 
success

3.3 后端真实服务器IP地址配置

# 对realserver1:192.168.10.20进行配置
# 配置lo回环接口地址,地址为VIP:192.168.10.50
# 修改lo回环接口地址配置文件时,最好先备份一份。
# 修改lo回环接口的IP地址为VIP,可以让RS能接收来自VIP的包,并能够将响应发送给client
# 不可以在RS的出口网卡设置VIP,会影响到client的ARP请求,导致直接跳过集群服务器,来访问后端真实服务器,以致影响到整个集群都不能正常工作。
[root@server20 network-scripts]# pwd 
/etc/sysconfig/network-scripts
[root@server20 network-scripts]# cat ifcfg-lo
DEVICE=lo
IPADDR=192.168.10.50
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback

# 修改网关地址为192.168.10.1,该地址为公网出口的路由IP
[root@server20 network-scripts]# cat ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens32
UUID=d0e02b53-7203-4be3-af84-7665b207780f
DEVICE=ens32
ONBOOT=yes   # 激活使用该网卡
IPV6_PRIVACY=no
ZONE=public
IPADDR=192.168.10.20   # IP地址
PREFIX=24   # 子网掩码
GATEWAY=192.168.10.1   # 网关地址
DNS1=192.168.10.1   # DNS地址

# 安装httpd服务,开放80端口号,修改index.html文件生成测试数据
[root@server20 ~]# yum install httpd -y
[root@server20 ~]# echo "this is server20" >> /var/www/html/index.html
[root@server20 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
Warning: ALREADY_ENABLED: 80:tcp   # 这里已经开放了。。。
success
[root@server20 ~]# firewall-cmd --reload 
success
[root@server20 ~]# systemctl restart httpd

# 在一个广播域里,不允许配置多个相同的IP,如果要配置多个相同的IP,那就必须让外网客户端无法发现整个IP的存在。
# 由于在RS上配置了lo回环接口地址为VIP,故需隐藏它
# 在linux中,可以修改内核参数,实现接口IP的广播不响应、不广播。
# 关闭ARP响应,即不做地址转换
[root@server20 ~]# ll /proc/sys/net/ipv4/conf/ens32/arp_*
-rw-r--r--. 1 root root 0 7月  22 22:08 /proc/sys/net/ipv4/conf/ens32/arp_accept
-rw-r--r--. 1 root root 0 7月  22 22:08 /proc/sys/net/ipv4/conf/ens32/arp_announce
-rw-r--r--. 1 root root 0 7月  22 22:08 /proc/sys/net/ipv4/conf/ens32/arp_filter
-rw-r--r--. 1 root root 0 7月  22 22:08 /proc/sys/net/ipv4/conf/ens32/arp_ignore
-rw-r--r--. 1 root root 0 7月  22 22:08 /proc/sys/net/ipv4/conf/ens32/arp_notify
[root@server20 ~]# vim /etc/sysctl.conf 
11 net.ipv4.conf.ens32.arp_ignore = 1
12 net.ipv4.conf.ens32.arp_announce = 2
[root@server20 ~]# sysctl -p
net.ipv4.conf.ens32.arp_ignore = 1
net.ipv4.conf.ens32.arp_announce = 2

# arp_ignore: 定义哪个IP才会响应apr请求
0:响应对本机任意网卡上的IP地址的ARP请求 
1:只响应目标IP地址为接收网卡上的本地IP地址的arp请求【DR用】【回环IP地址的不响应】
2:只响应目标IP地址为接收网卡上的本地IP地址的arp请求,并且apr请求的源IP地址必须于接收网卡的本地IP地址同网段
# arp_announce:定义发送arp请求的源IP地址
0:允许使用任意网卡上的IP地址作为arp请求的源IP地址
1:同一子网的IP地址才可作为arp请求的源IP地址
2:忽略IP数据包的源IP地址,选择最合适的本地网卡IP地址作为源IP地址【DR用】
# 对realserver2:192.168.10.30进行配置,配置和192。168.10.20一致。

3.4 测试负载均衡效果

[root@server40 ~]# yum install -y elinks.x86_64
[root@server40 ~]# elinks 192.168.10.50 --dump   # 报这个错请检查下192.168.10.50的80端口号是否开放
ELinks: 没有到主机的路由
# 客户端上访问192.168.10.50,每次访问的结果都不一样,说明每次派发的后端真实服务器都不一样。
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@server40 ~]# elinks 192.168.10.50 --dump
   this is server30

# 在虚拟服务器上查看被访问结果
# 20被访问6次,30被访问7次
[root@server10-50 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.50:80 rr
  -> 192.168.10.20:80             Route   1      6          0         
  -> 192.168.10.30:80             Route   1      7          0       
# InBytes和OutBytes表示访问是否经过了虚拟服务器,可以看到请求有,应答无
[root@server10-50 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.50:80                   13       65        0     5395        0
  -> 192.168.10.20:80                    6       30        0     2490        0
  -> 192.168.10.30:80                    7       35        0     2905        0
  
# 客户端打开firefox浏览器,输入http://192.168.10.50,查看下显示情况。

在这里插入图片描述

4. LVS的多种调度模式及实战解析

# 查看ipvsadm有哪些调度算法
[root@server10-50 ~]# ipvsadm -h | grep scheduler
--scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
# 在配置虚拟服务器时配置调度算法,配置立即生效。
调度模式方法
rrround robin 1:1轮循,无线循环
wrrWeighted Round Robin 带权重的轮循,权重为0的服务器不会收到新的连接请求
lcLeast-Connection 最少连接,优先分配给连接数最少的服务器
wlc带权重的最少连接
lblc基于本地的最小连接法,本地有缓存优先分配给本地
dh目标散列法
sh源散列法,来自同一IP的请求会分配给同一个后端真实服务器,让客户端总能访问到自己的会话信息,即会话保持。
sed最短预期延迟法,(连接数+1)/w越小的服务器优先分配
nq永不排队法
# 清空ipvs虚拟服务器列表
[root@server10-50 ~]# ipvsadm -C
[root@server10-50 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

# wrr带权重的轮循
[root@server10-50 ~]# ipvsadm -A -t 192.168.10.50:80 -s wrr
[root@server10-50 ~]# ipvsadm -a -t 192.168.10.50:80 -r 192.168.10.20 -g -w 10
[root@server10-50 ~]# ipvsadm -a -t 192.168.10.50:80 -r 192.168.10.30 -g -w 20
[root@server10-50 ~]# ipvsadm --save > /etc/sysconfig/ipvsadm

# 测试
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server20
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server30
[root@client40 ~]# elinks 192.168.10.50 --dump
   this is server20
# ActiveConn比例为1:2,InPkts有进来的包,OutPkts无出去的包
[root@server10-50 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.50:80 wrr
  -> 192.168.10.20:80             Route   10     4          0         
  -> 192.168.10.30:80             Route   20     8          0   
[root@server10-50 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.50:80                   12       60        0     4980        0
  -> 192.168.10.20:80                    4       20        0     1660        0
  -> 192.168.10.30:80                    8       40        0     3320        0
ipvsadm -D -t 192.168.10.50:80   # 删除集群
ipvsadm -d -t 192.168.10.50:80 -r 192.168.10.20  # 删除后端真实服务器
ipvsadm -C  # 清空虚拟服务器列表
ipvsadm -Z  # 清除历史数据,清零
ipvsadm -e -t 192.168.10.50:80 -r 192.168.10.20 -g -w 30   # 编辑后端真实服务器
ipvsadm -L -n   # 查看ipvs配置
ipvsadm -L -n --stats   # 查看ipvs配置的统计信息
ipvsadm -L -n --rate    # 查看速率
ipvsadm -L -n -c   # 查看连接情况
ipvsadm --save > /etc/sysconfig/ipvsadm   # 保存ipvs配置信息
ipvsadm -S > /etc/sysconfig/ipvsadm   # 保存ipvs配置信息
ipvsadm -R < /etc/sysconfig/ipvsadm   # 导入ipvs配置信息

5. linux下使用ab网站压力测试命令

# 系统限制每个进程打开的最大文件数为1024
[root@client40 ~]# ulimit -a | grep open
open files                      (-n) 1024

# -n 请求总个数
# -c 一次产生的请求个数
# -n 1000 -c 1000即一次产生1000个请求
# 在linux服务器中,参数net.ipv4.tcp_syncookies可以防止洪水攻击,设置为0标识禁止防止洪水攻击,也就是可以进行洪水攻击。洪水攻击即大并发访问,超1000的。
[root@client40 ~]# ab -n 1000 -c 1000 http://192.168.10.50/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.50 (be patient)
Completed 100 requests
apr_socket_recv: Connection reset by peer (104)
Total of 144 requests completed
# 触发了系统安全防护,禁用防止洪水攻击的参数
# 此参数是为了防止洪水攻击的,对于大并发系统,要禁用此设置
# ll /proc/sys/net/ipv4/ 用于查看有哪些系统配置
[root@client50 ~]# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 0
[root@server10-50 ~]# sysctl -p
net.ipv4.tcp_syncookies = 0

# 再使用ab工具测试一遍
[root@client40 ~]# ab -n 1000 -c 1000 http://192.168.10.50/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.50 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.4.6   # httpd服务器版本
Server Hostname:        192.168.10.50  # 服务器主机名
Server Port:            80   # 服务器端口号

Document Path:          /index.html   # 测试页面
Document Length:        17 bytes   # 测试页面大小

Concurrency Level:      1000   # 并发数
Time taken for tests:   13.231 seconds  # 并发花费的时间
Complete requests:      1000   # 完成的请求数量
Failed requests:        0    # 失败的请求数量
Write errors:           0    # 
Total transferred:      277000 bytes   # 总传输字节数
HTML transferred:       17000 bytes   # html传输量
Requests per second:    75.58 [#/sec] (mean)  # 每秒访问请求数
Time per request:       13230.747 [ms] (mean)   # 平均请求响应时间
Time per request:       13.231 [ms] (mean, across all concurrent requests)   # 每个请求实际运行的时间
Transfer rate:          20.45 [Kbytes/sec] received   # 传输速率

Connection Times (ms)   # 连接时间
              min  mean[+/-sd] median   max
Connect:        1  271 334.0    123    1095
Processing:    29 3223 3543.7   2095   12983
Waiting:        1 3215 3547.6   2092   12983
Total:         86 3495 3554.3   2209   13190

Percentage of the requests served within a certain time (ms)  # 在一定的时间内,提供服务的请求的百分比(毫秒)
  50%   2209
  66%   3999
  75%   4340
  80%   6732
  90%   7355
  95%  13079
  98%  13094
  99%  13102
 100%  13190 (longest request)
 
 # 综上:整个场景中,每个请求都有一个响应请求。50%的用户响应时间小于2209毫秒,80%的用户响应时间小于 6732。【额。。。。感觉响应有点慢啊】
# 总共1000个访问,每次100个并发访问。
[root@client40 ~]# ab -n 1000 -c 100 http://192.168.10.50/index.html
Percentage of the requests served within a certain time (ms)
  50%     74
  66%    152
  75%   1891
  80%   1906
  90%   1951
  95%   1985
  98%   1991
  99%   2003
 100%   2240 (longest request)
# 也就是两个节点支持100的并发访问就已经有点hold不住了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值