LVS集群理论、负载均衡


一、集群和分布式

1.集群

1.1群集的含义

Cluster,集群、群集
由多台主机构成,但对外只表现为一个整体

问题:
互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器力不从心

解决方法:
Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,Cluster

1.2集群分为三种类型

LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
LB的负载分配依赖于主节点的分流算法

HA: High Availiablity,高可用,避免 SPOF(single Point Of failure)
提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
HA的工作方式包括双工和主从两种模式

HPC: High-performance computing,高性能
提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力

1.3 SLA

SLA:服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。

1.4 分流算法

轮询(Round Robin):将收到的访问请求按照顺序轮流分配给群集中的各节点,均 等地对待每台服务器,而不管服务器实际的连接数和系统负载。

加权轮询(Weighted Round Robin):根据调度器设置的权重值来分发请求,权重 值高的节点优先获得任务并且分配的请求越多,这样可以保证性能高的节点承担更 多请求。

最少连接(Least Connections):根据真实服务器已建立的连接数进行分配,将收 到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地均衡负载。

加权最少连接(Weighted Least Connections):在服务器节点的性能差异较大的 情况下,调度器可以根据节点服务器负载自动调整权重,权重较高的节点将承担更 大比例的活动连接负载。

IP_Hash根据请求来源的IP地址进行Hash计算,得到后端服务器,这样来自同一个IP的请求总是会落到同一台服务器上处理,以致于可以将请求上下文信息存储在这个服务器上,

url_hash 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。具体没研究过

fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。也就是根据后端服务器时间来分配用户请求,响应时间短的优先分配

2.分布式

分布式存储:Ceph,GlusterFS,FastDFS,MogileFS

分布式计算:hadoop,Spark

分布式常见应用:
分布式应用-服务按照功能拆分,使用微服务(单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值服务)
分布式静态资源–静态资源放在不同的存储集群上
分布式数据和存储–使用key-value缓存系统
分布式计算–对特殊业务使用分布式计算,比如Hadoop集群

集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务

二、Linux Virtual Server简介

1.LVS介绍

LVS:Linux Virtual Server,负载调度器,内核集成

2.LVS工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”

3.LVS集群类型中的术语

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(lvs服务器)
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)(真实服务器)
CIP:Client IP(客户机IP)
VIP:Virtual serve IP VS外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP (真实IP)

访问流程:CIP <–> VIP == DIP <–> RIP

三、LVS工作模式和相关命令

1.LVS集群的工作模式

lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址(直接路由)
lvs-tun:隧道模式

1.1 LVS的NAT模式

在这里插入图片描述
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某处的RS的RIP和

PORT实现转发

(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标PORT

(4)VS必须是Linux系统,RS可以是任意OS系统

1.2 IP隧道

在这里插入图片描述

  1. RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP, VIP, RIP可以是公网地址。

  2. RealServer的通道接口上需要配置VIP地址,以便接收DIP转发过来的数据包,以及作为响应的报文源IP。

  3. DIP转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP

  4. 请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成

  5. 不支持端口映射

  6. RS的OS须支持隧道功能

1.3 直接路由

直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN
模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。

负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道直接路由,LVS默认模式,应用最广泛,通过请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

在这里插入图片描述

四、ipvsadm 工具

-A: 添加虚拟服务器
-D: 删除整个虚拟服务器
-s: 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc)
-a: 添加真实服务器(节点服务器)
-d: 删除某一个节点
-t: 指定VIP地址及TCP端口
-r: 指定RIP地址及TCP端口
-m: 表示使用NAT群集模式
-g: 表示使用DR模式
-i: 表示使用TUN模式
-w: 设置权重(权重为0时表示暂停节点)
-p 60: 表示保持长连接60秒
-l: 列表查看 LVS虚拟服务器(默认为查看所有)
-n: 以数字形式显示地址、端口等信息,常与"-l“选项组合使用。ipvsadm -ln

五、NAT模式 LVS负载均衡部署

负载调度器:配置双网卡 内网:192.168.47.100(ens33) 外网卡:12.0.0.1(ens37)
二台WEB服务器集群池:192.168.47.102、192.168.47.103
一台NFS共享服务器:192.168.47.104
客户机:12.0.0.100

部署共享存储(NFS服务器:192.168.47.104)

关闭防火墙

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

安装nfs服务

[root@localhost ~]# yum install -y nfs-utils rpcbind

开启服务

[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start nfs

新建目录,并创建站点文件

[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir wwd benet
[root@localhost opt]# chmod 777 wwd/ benet/
[root@localhost opt]# echo "this is wwd" > /opt/wwd/index.html
[root@localhost opt]# echo "this is benet" > /opt/benet/index.html

设置共享策略

[root@localhost opt]# vim /etc/exports
/opt/wwd 192.168.47.0/24(rw,sync)
/opt/benet 192.168.47.0/24(rw,sync)

发布服务

[root@localhost opt]# exportfs -rv
exporting 192.168.47.0/24:/opt/benet
exporting 192.168.47.0/24:/opt/wwd

开启服务

[root@localhost opt]# systemctl restart nfs

节点服务器

第一台
关闭防火墙

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

查看nfs服务

[root@localhost ~]# showmount -e 192.168.47.104
Export list for 192.168.47.104:
/opt/benet 192.168.47.0/24
/opt/wwd   192.168.47.0/24

安装http服务

[root@localhost ~]# yum install -y httpd

挂载站点

[root@localhost ~]# mount 192.168.47.104:/opt/wwd /var/www/html/
[root@localhost ~]# cat /var/www/html/index.html 
this is wwd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
IPADDR=192.168.47.102
NETMASK=255.255.255.0
GATEWAY=192.168.47.100

重启网卡

[root@localhost ~]# systemctl restart network

第二台

关闭防火墙

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

查看nfs服务

[root@localhost ~]# showmount -e 192.168.47.104
Export list for 192.168.47.104:
/opt/benet 192.168.47.0/24
/opt/wwd   192.168.47.0/24

安装http服务

[root@localhost ~]# yum install -y httpd

挂载站点

[root@localhost ~]# mount 192.168.47.104:/opt/benet /var/www/html/
[root@localhost ~]# cat /var/www/html/index.html 
this is benet
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
IPADDR=192.168.47.103
NETMASK=255.255.255.0
GATEWAY=192.168.47.100

重启网卡

[root@localhost ~]# systemctl restart network

调度服务器

关闭防火墙

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cp ifcfg-ens33 ifcfg-ens37

去掉网关重启服务

[root@localhost network-scripts]#vim ifcfg-ens33
[root@localhost network-scripts]#vim ifcfg-ens37
[root@localhost network-scripts]# systemctl restart network

#打开路由转发功能

[root@localhost network-scripts]#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 
[root@localhost network-scripts]#sysctl -p
net.ipv4.ip_forward = 1

防火墙
查看策略

[root@localhost network-scripts]# iptables -nL -t nat

清空策略

[root@localhost network-scripts]# iptables -F

添加策略

[root@localhost network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.47.0/24 -o ens37 -j SNAT --to 12.0.0.1

查看策略

[root@localhost network-scripts]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.47.0/24      0.0.0.0/0            to:12.0.0.1

加载内核模块

[root@localhost network-scripts]# cat /proc/net/ip_vs
cat: /proc/net/ip_vs: 没有那个文件或目录
[root@localhost network-scripts]# modprobe ip_vs
[root@localhost network-scripts]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn

安装软件

[root@localhost network-scripts]# yum install ipvsadm* -y

保存配置文件

[root@localhost network-scripts]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@localhost network-scripts]# systemctl start ipvsadm.service

清空策略

[root@localhost network-scripts]# ipvsadm -C

指定IP地址 外网的入口 -s rr 轮询

[root@localhost network-scripts]# ipvsadm -A -t 12.0.0.1:80 -s rr

先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式

[root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.102:80 -m
[root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.103:80 -m

启动

[root@localhost network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  12.0.0.1:http rr
  -> 192.168.47.102:http          Masq    1      0          0         
  -> 192.168.47.103:http          Masq    1      0          0     

查看策略

[root@localhost network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  12.0.0.1:80 rr
  -> 192.168.47.102:80            Masq    1      0          0         
  -> 192.168.47.103:80            Masq    1      0          0

客户机

可以看见已经成功了
在这里插入图片描述
等一会后会轮询

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值