Linux云计算架构-使用LVS-NAT搭建集群实现负载均衡

Linux云计算架构-使用LVS-NAT搭建集群实现负载均衡

1. 集群

先看看比较正规的理解:

集群是一组各自相互独立且又相互依赖的,通过高速网络互联的,由计算机组成的一个计算机组, 以单一的系统模式加以管理, 为用户提供服务。对用户来说, 用户只会认为对方是一个服务。 在这个集群里面, 一组计算机的一台计算机就是集群的一个节点。

再来看看不那么正规的理解:

场景介绍:市民拨打12345政府服务热线,由热线机构的话务员接听。热线话务员将工单登记提交,再由派单员转派给承办单位处理。

在以上环境中,热线机构+承办单位组成了一个集群,为市民提供服务。市民对接的仅有热线的话务员,对其他人员是不知道其存在的。每一个承办单位,都是这个集群里面的一个节点。

集群的优点:可伸缩性、可靠性、可管理性

什么时候才需要集群?

当并发访问量小于一台web服务器所能提供的响应量时,返回的状态码都是200,即都能响应。而当并发访问量超过一台web服务器所能提供的响应量时,就会存在丢失请求的情况,返回的状态码可能时200、304、301、500、400。这时说明一台web服务器已经不足以提供服务了。

为了解决上述问题,可以为这台web服务器,添加CPU、内存、带宽、SSD,这种方法称之为“向上扩展”,当出现单点故障时,就无法提供服务了。另一种方法就是集群,通俗地说就是添加服务器。同时使用多台服务器为用户提供服务,也叫“向外扩展”。

根据集群的作用,可分为以下几种:

负载均衡(Load Balance)集群,简称 LB:一起扛

实现方法:①硬件(负载调度器);②软件(LVS[4层,传输层]Nginx[7层,应用层])

高可用(High Availability)集群,简称 HA 集群:你挂了我来扛

高性能计算(High Perfermance Computing)集群,简称 HPC 集群:CPU多,计算速度快

2. LVS集群

上面说了,可以使用LVS搭建负载均衡集群LVS(Linux Virtual Server) 即Linux虚拟服务器,主要是对传输层进行操作。拓扑图如下:

在这里插入图片描述

①调度器(Load Balancer,Director,也叫负载均衡器):集群的对外主机,负责接收用户的请求,并根据调度算法,将请求转发到后端真实的web服务器上,客户端会认为服务是由一个IP地址提供的,可以称之为VIP,即虚拟IP地址。(热线的话务员)

②web服务器池(Server Pool): 真正为用户提供服务的服务器,每一台服务器都是真实的。称之为RS。

③共享存储(Shared Storaged): 类似共享目录,保证RS每次都能获取到相同的内容,提供相同的服务,保证数据的一致性。

分发器为了把用户请求,转发给RS,需要指定转发方式。转发方式有以下三种:

①NAT(网络地址映射):

DNAT: 目标地址转换,改变的是目标地址

SNAT: 原地址转换,改变的是原地址

LVS-NAT 就是使用的 SNAT 和 DNAT 完成报文的转发

NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,但是整个系统的性能受到限制。

因为执行 NAT 每次需要重写包,有一定的延迟;另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

②IP Tunneling(IP隧道):

director(分发器)分配请求到不同的RS。RS处理请求后直接回应给用户,这样director 负载均衡器仅处理客户机与服务器的一半连接。、

IP Tunneling 技术极大地提高了 director 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。

RS可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的 IP 地址用于与客户机直接通信,并且所有服务器必须支持 IP 隧道协议。

③Direct Routing(直接路由):

与 IP Tunneling 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing 与 IP Tunneling 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在一个物理网段。

3. 部署LVS-NAT集群

3.1 LVS-NAT原理

LVS-NAT模式工作原理

客户端访问调度器时,调度器通过网络地址转换(NAT),重写请求报文的目标地址,根据调度器内预设的调度算法,将请求派给后端真实的服务器。真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户端,完成整个负载调度过程。

优缺点:

  • 仅需一个公网IP即可搭建集群,较安全。
  • 请求报文和响应报文都会经过调度器,这是一个瓶颈
  • 调度器挂了,集群就挂了。
  • 不具有健康状态监测或者具有较弱的监测,不适合生产。

3.2 部署LVS-NAT

CIP-VIP-DIP-RIP(发起请求)
CIP  客户端IP:发起请求的IP
VIP  调度器的虚拟IP:接收客户端发起的请求
DIP  调度器的真实IP:VIP通过NAT转换成DIP
RIP  后端服务器的真实IP:接收来自DIP发来的请求,并响应。

RIP-DIP-VIP-CIP(响应)
RIP:发起响应报文
DIP:由调度器的真实IP收到,并对源地址重写为VIP
VIP:发送响应报文给客户端
CIP:接收来自VIP的响应报文
# 一台主机作为调度器,两台主机作为后端真实服务器
# 调度器配置
调度器内网IP:192.168.10.10
调度器外网VIP:192.168.8.154

# 打开调度器的路由转发功能,添加以下行,或0改为1
[root@virtual ~]# vim /etc/sysctl.conf 
 11 net.ipv4.ip_forword=1
# 立即生效
[root@virtual ~]# sysctl -p
net.ipv4.ip_forward = 1

# 安装LVS管理工具ipvsadm,这里使用yum安装
[root@virtual ~]# yum install ipvsadm.x86_64 -y[root@virtual ~]# cd /run/media/root/CentOS\ 7\ x86_64/Packages
[root@virtual Packages]# ll ipvs*
-rw-rw-r--. 1 root root 45760 3月  14 2015 ipvsadm-1.27-7.el7.x86_64.rpm
[root@virtual ~]# rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/ipvsadm-1.27-7.el7.x86_64.rpm 
ipvsadm参数作用
-A添加虚拟服务器
-t指定调度器的VIP及端口号,VIP:PORT
提供的是tcp的服务
-u指定调度器的VIP及端口号,VIP:PORT
提供的是udp的服务
-s指定调度算法,rr指round-robin轮询
-a添加真实服务器
-r指定真实服务器的IP地址及端口号,RIP:PORT
-m指定masquerade,即NAT方式
-L-L -n -L -n -c
-n查看ipvs配置,查看内核虚拟服务器表
-c查看客户端连接调度器和真实服务器的情况
–stats查看分发情况
–rate查看速率
-Z – zero虚拟服务器计数表清零(清空当前的连接数量)
-C --clear清空IPVS数据和信息
# 添加虚拟服务器
[root@virtual ~]# ipvsadm -A -t 192.168.8.154:80 -s rr
# 添加真实服务器
[root@virtual ~]# ipvsadm -a -t 192.168.8.154:80 -r 192.168.10.20 -m
[root@virtual ~]# ipvsadm -a -t 192.168.8.154:80 -r 192.168.10.30 -m
# 查看内核IPVS表和算法
[root@virtual ~]# 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.8.154:80 rr
  -> 192.168.10.20:80             Masq    1      0          0         
  -> 192.168.10.30:80             Masq    1      0          0  
# 查询以上ipvsadm的配置信息(虚拟服务器和真实服务器)
# ipvsadm --save 与 ipvsadm -S 结果一样
[root@virtual ~]# ipvsadm -S
-A -t virtual:http -s rr
-a -t virtual:http -r 192.168.10.20:http -m -w 1
-a -t virtual:http -r 192.168.10.30:http -m -w 1
# 保存配置信息,以便之后查看
[root@virtual ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@virtual ~]# cat /etc/sysconfig/ipvsadm
-A -t virtual:http -s rr
-a -t virtual:http -r 192.168.10.20:http -m -w 1
-a -t virtual:http -r 192.168.10.30:http -m -w 1

# 如果发现ipvsadm规则制定错误,可以清空重新制定
[root@virtual ~]# ipvsadm -C
[root@virtual ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
# 配置真实服务器
# 后端真实服务器1 IP:192.168.10.20 网关地址为192.168.10.10
# 后端真实服务器2 IP:192.168.10.30 网关地址为192.168.10.10
# 为两台真实服务器分别配置httpd服务,并修改index.html
# 不懂如何在没有外网的情况下安装httpd服务的,可以看附件1
[root@server1 ~]# yum install httpd -y
[root@server1 ~]# systemctl start httpd
[root@server1 ~]# systemctl enable httpd
[root@server1 ~]# echo "this is server1" > /var/www/html/index.html
[root@server1 ~]# cat /var/www/html/index.html
this is server1

[root@server2 ~]# yum install httpd -y
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# systemctl enable httpd
[root@server2 ~]# echo "this is server2" > /var/www/html/index.html
[root@server2 ~]# cat /var/www/html/index.html 
this is server2
# 安装elinks测试负载均衡情况
[root@virtual ~]# yum install elinks -y
# 先测试真实服务器地址是否可以访问
[root@virtual ~]# elinks 192.168.10.20 --dump
   this is server1
[root@virtual ~]# elinks 192.168.10.30 --dump
ELinks: 没有到主机的路由
# server2不通,查看下对应的防火墙80端口号,确实没打开,而server1的打开了,把server2的也打开。
# 打开后就没问题了
[root@server2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@server2 ~]# firewall-cmd --reload 
success
[root@virtual ~]# elinks 192.168.10.30 --dump
   this is server2
# 负载均衡的权重weight都为1,所以是平均分配的。一人一次。
# InActConn 为分配的次数,下一次分配应该是192.168.10.20
# elinks 192.168.8.154 --dump
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server2
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server1
[root@virtual ~]# elinks 192.168.8.154 --dump
   this is server2
[root@virtual ~]# 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.8.154:80 rr
  -> 192.168.10.20:80             Masq    1      0          10        
  -> 192.168.10.30:80             Masq    1      0          11  

# 物理机作为客户端访问服务器的外网地址,看界面是否会变换。
# 由于浏览器带有缓存功能,所以可以打开多个网页,输入http://192.168.8.154/ 看每次的内容是不是都会变换
# 在虚拟服务器上开放80端口号,清空iptables
[root@virtual ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@virtual ~]# firewall-cmd --reload 
success
[root@virtual ~]# iptables -F

在这里插入图片描述
通过lvs-nat集群,可以使得用户请求按需分配给不同的后端真实服务器,以减轻对虚拟服务器的压力。

4. ipvsadm命令详解

参数:

-A --add-service      在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 
-E --edit-service     编辑内核虚拟服务器表中的一条虚拟服务器记录。 
-D --delete-service   删除内核虚拟服务器表中的一条虚拟服务器记录。 
-C --clear            清除内核虚拟服务器表中的所有记录。 
-R --restore          恢复虚拟服务器规则 
-S --save             保存虚拟服务器规则,输出为-R 选项可读的格式 
-a --add-server       在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 
-e --edit-server      编辑一条虚拟服务器记录中的某条真实服务器记录 
-d --delete-server    删除一条虚拟服务器记录中的某条真实服务器记录 
-L|-l --list          显示内核虚拟服务器表 
-Z --zero             虚拟服务表计数器清零(清空当前的连接数量等) 
--set tcp tcpfin udp  设置连接超时值 
--start-daemon        启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是 aster 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 
--stop-daemon         停止同步守护进程 
-h --help             显示帮助信息 

其他的选项: 

-t --tcp-service service-address        说明虚拟服务器提供的是tcp的服务[vip:port] or [real-server-ip:port] 
-u --udp-service service-address        说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port] 
-f --fwmark-service fwmark              说明是经过iptables 标记过的服务类型。 
-s --scheduler scheduler                使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc. 
-p --persistent [timeout]               持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask                            指定客户地址的子网掩码
-r --real-server server-address         真实的服务器[Real-Server:port] 
-g --gatewaying                         指定LVS的工作模式为直接路由模式(也是LVS 默认的模式) 
-i --ipip                               指定LVS 的工作模式为隧道模式 
-m --masquerading                       指定LVS 的工作模式为NAT 模式 
-w --weight weight                      真实服务器的权值 
--mcast-interface interface             指定组播的同步接口 
-c --connection                         显示LVS目前的连接 如:ipvsadm -L -c 
   --timeout                               显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
   --daemon                            显示同步守护进程状态 
   --stats                             显示统计信息 
   --rate                              显示速率信息 
   --sort                              对虚拟服务器和真实服务器排序输出 
   --numeric -n                        输出IP 地址和端口的数字形式 
-6:                                   如果fwmark用的是ipv6地址需要指定此选项。   

附件1:配置本地yum源安装httpd服务

# 由于真实服务器没有连接外网,只能使用本地yum源
# 编辑本地yum源配置文件
# 查看本地镜像挂载目录,如果不是yum源内的目录,可以重新挂载。
[root@server2 ~]# ll /etc/yum.repos.d/centos7.repo 
-rw-r--r--. 1 root root 121 7月  19 16:02 /etc/yum.repos.d/centos7.repo
[root@server2 ~]# cat /etc/yum.repos.d/centos7.repo 
[centos7]
name=centos7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@server2 ~]# umount /dev/sr0
[root@server2 ~]# mkdir /media/cdrom
[root@server2 ~]# mount /dev/cdrom /media/cdrom/
[root@server2 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-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   20K  182M    1% /run/user/0
/dev/sr0                 4.3G  4.3G     0  100% /media/cdrom
[root@server2 ~]# yum install httpd -y

附件2:ipvsadm命令演示

# 查看虚拟服务器表的规则
# 轮询方式为rr
# InActConn 访问次数
[root@virtual ~]# 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.8.154:80 rr
  -> 192.168.10.20:80             Masq    1      0          2         
  -> 192.168.10.30:80             Masq    1      1          1  
# 每一次访问虚拟服务器外网地址时,显示客户端、虚拟服务器、后端真实服务器的IP地址
[root@virtual ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:41  FIN_WAIT    192.168.8.102:52620 192.168.8.154:80   192.168.10.20:80
TCP 01:52  FIN_WAIT    192.168.8.102:52657 192.168.8.154:80   192.168.10.20:80
TCP 01:40  FIN_WAIT    192.168.8.102:52621 192.168.8.154:80   192.168.10.30:80
TCP 01:56  FIN_WAIT    192.168.8.102:52674 192.168.8.154:80   192.168.10.30:80
# 查看分发状态
[root@virtual ~]# 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.8.154:80                    9       59       45     6017     5303
  -> 192.168.10.20:80                    4       30       22     3533     2490
  -> 192.168.10.30:80                    5       29       23     2484     2813
# 查看速率
[root@virtual ~]# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.8.154:80                    0        0        0        0        0
  -> 192.168.10.20:80                    0        0        0        0        0
  -> 192.168.10.30:80                    0        0        0        0        0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值