1.集群和分布式
当多个用户当用户访问一个服务器时,服务器server1可能就会崩,假如这时候我们新加一个服务器server2来缓解server1的压力,那么就需要一个调度器lvs来分配,所以现在就是用户的访问就需要通过调度器之后到达服务器,这一整个体系我们叫集群
1.1系统性能扩展方式
-
scale UP:向上扩展,增强(增强设备硬件等)
-
scale Out:向外扩展,增加设备,调度分配,cluster
1.2 集群cluster
集群是为了解决某个特定问题将计算机组合起来形成单个系统
集群常见的三中类型
-
LB:LoadBalancing(负载均衡):由多个主机组成,每个主机只承担一部分访问。解决访问压力问题
-
HA:High Availiablity(高可用):简单来说就是如果现在只有一台lvs,那么他出故障了系统就会崩,为了避免这个问题,我们采用两个lvs形成主备,一个坏了另一台顶替工作。解决不出故障问题
-
HPC:High-performance computing(高性能计算,国家战略资源)
1.3分布式
把一个请求拆分,使用微服务完成,就比如说计算1+2+3+3,当其在一台计算机上完场时,压力很大,我们可以将其拆分成三步走。1+1给server1 3+3给server2 然后我们将1+1的结果和3+3的结果在server3上完成相加
分布式存储:Ceph,GlusterFs,FastDFS,MogileFs
分布式计算:hadoop,Spark
分布式常见应用
-
分布式应用-服务按照功能拆分,使用微服务
-
分布式静态资源--静态资源放在不同的存储集群上
-
分布式数据和存储--使用key-value缓存系统
-
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.4集群和分布式区别
-
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
-
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
-
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率,
-
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
2.lvs
LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。
2.1 lvs概念
-
vs:Virtual Server
-
rs:Real Server
-
cip:Client IP
-
vip:Virtual serve IP VS外网的IP
-
dip:Director IP VS内网的IP
-
rip:Real server IP
访问流程:CIP <--> VIP == DIP <--> RIP
2.2lvs集群的类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
2.2.1 nat 模式
在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群。
nat模式的数据逻辑
2.2.2 DR模式
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构。
在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群。
DR模式数据逻辑
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和lvs 上都要有vip
DR模式的数据传输过程
1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC 3.RS1得到
2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
特点
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修败)
2.2.3 tun模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)
该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群。
TUN模式数据逻辑
TUN模式的数据传输过程
1.客户端发送请求数据包,包内有源IP+vip+dport
2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client
特点
1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
2.2.4 fullnat模式
注意:此类型kernel默认不支持
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射
2.2.5 lvs工作模式总结
nat模式 | DR模式 | TUN模式 | |
RS操作系统 | 不限 | 支持隧道 | 禁用arp |
调度器和服务器网络 | 可跨网络 | 可跨网络 | 不可跨网络 |
调度服务器数量服务器数量 | 少 | 多 | 多 |
RS服务器网关 | 指向到调度器DIP | 指向到路由 | 指向到路由 |
2.3 lvs调度算法
2.3.1lvs调度算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
轮询调度(Round Robin)RR:将请求依次分配给每个后端服务器。
加权轮询调度(Weighted Round Robin)WRR:根据服务器的权重将请求分配给后端服务器
SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)
2、WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3、SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
2.4 lvs部署命令介绍
2.4.1lvs相关软件信息
程序包:ipvsadm Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config ipvs
调度规则文件:/etc/sysconfig/ipvsadm
2.4.2lvs中的增删改
.管理集群服务中的增删改
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.250.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000
#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.250.100:80 -s wrr -p 3000
#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.250.100:80
[root@DR-server ~]# ipvsadm -D -f 66
管理集群中RealServer的曾增删改
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :输出速率信息
#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2
#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1
#删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
[root@DR-server ~]# ipvsadm -Ln
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.100:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0
[root@DR-server ~]# ipvsadm -C
[root@DR-server ~]# ipvsadm -Z -t 172.25.254.20:80
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.20:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0
3.实战
nat模式
实验前提
除了测试主机,其他三台主机都需要添加或修改网卡,修改如以下显示
lvs主机
server1主机和server2主机
创建实验环境
lvs主机
[root@lvs ~]# vmset.sh eth0 172.25.250.100 lvs
[root@lvs ~]# vmset.sh eth1 192.168.0.100 lvs
###########eth1仅主机网卡
[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
##########eth0 NAT网卡
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.250.100/24,172.25.250.2
method=manual
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
[root@lvs ~]# nmcli connection up eth1
################打开内核路由,使eth1和eth0通信
[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@lvs ~]# echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf
[root@lvs ~]# sysctl -p //使其生效
net.ipv4.ip_forward = 1
server1主机
[root@server1 ~]# vmset.sh eth0 192.168.0.10 server1
[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100 //server1主机网关指向lvs主机
method=manual
[root@server1 ~]# nmcli connection reload
[root@server1 ~]# nmcli connection up eth0
server2主机
[root@server2 ~]# vmset.sh eth0 192.168.0.20 server1
[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100 //server2主机网关指向lvs主机
method=manual
[root@server2 ~]# nmcli connection reload
[root@server2 ~]# nmcli connection up eth0
开始实验(基于httpd)
lvs主机下载安装ipvsadm
[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# ipvsadm -Ln //查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
布置策略
[root@lvs ~]# ipvsadm -A -t 172.25.250.100:80 -s rr
// -A 添加 // -t 指定TCP协议 //-s 指定算法 rr // 轮寻(你一个我一个....静态)
[root@lvs ~]# ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.250.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
server1,server2主机
[root@server1 ~]# yum install httpd -y //安装httpd
[root@server1 ~]# echo this is server1 > /var/www/html/index.html
[root@server2 ~]# echo this is server2 > /var/www/html/index.html
测试
[root@rhel9 ~]# for i in {1..10}
> do
> curl 172.25.250.100
> done
this is server1
this is server2
this is server1
this is server2
this is server1
this is server2
this is server1
this is server2
this is server1
this is server2
DR模式
创建环境
client主机
[root@client ~]# vmset.sh 172.25.250.200 client
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.250.200/24,172.25.250.100
method=manual
dns=114.114.114.114;
router主机
[root@router ~]# vmset.sh 172.25.250.100 router
[root@router ~]# vmset.sh 192.168.0.100 router
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.250.100/24,172.25.250.2
method=manual
dns=114.114.114.114;
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
dns=114.114.114.114;
################打开内核路由,使eth1和eth0通信
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@router ~]# echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf
[root@router ~]# sysctl -p //使其生效
net.ipv4.ip_forward = 1
lvs主机
[root@lvs ~]# nmcli connection delete eth0 //删掉eth0网卡ip,我们用lo环回来做一次性ip
[root@lvs ~]# vmset.sh eth1 192.168.0.200 lvs
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.200/24,192.168.0.100 //网关指向路由
method=manual
dns=114.114.114.114;
[root@lvs ~]# ip a a 192.168.0.50/32 dev lo //环回添加一次性ip
server1、server2主机
#############server1主机
[root@server1 ~]# vmset.sh eth0 192.168.0.10 server1
[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100 // //网关指向路由
method=manual
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@server1 ~]# ip a a 192.168.0.50/32 dev lo //临时ip
############server2主机
[root@server2 ~]# vmset.sh eth0 192.168.0.20 server2
[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100 //网关指向路由
method=manual
[root@server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@server2 ~]# ip a a 192.168.0.50/32 dev lo //临时ip
开始实验
lvs主机上安装ipvsadm
[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# ipvsadm -Ln //查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
布置策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.50:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.10:80 -g -w 2 //权重2
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.20:80 -g -w 1 //权重1
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.50:80 wrr
-> 192.168.0.10:80 Route 2 0 0
-> 192.168.0.20:80 Route 1 0 0
测试
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.50
> done
this is server1
this is server1
this is server2
this is server1
this is server1
this is server2
this is server1
this is server1
this is server2
this is server1
4.防火墙标签解决轮询错误
4.1轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
在RS1和RS2中安装mod_ssl并重启apache
]# yum install mod_ssl -y
]# systemctl restart httpd
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.0.50:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.50:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.20:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:443 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.50:443 -r 192.168.0.20:80 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.50:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.50:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
测试问题
[root@client ~]# curl http://192.168.0.50;curl -k https://192.168.0.50
this is server1
this is server1
当访问vip时两次调度都到了server1
4.2防火墙标记解决轮询调度问题
FWM:FireWall Mark MARK
target 可用于给特定的报文打标记,
--set-mark value
其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度
在lvs调度器中设定端口标签,认为80和443是一个整体
]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666
设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
###测试
[root@client ~]# curl -k https://192.168.0.100
RS2 server - 192.168.0.102
[root@client ~]# curl -k https://192.168.0.100;curl 192.168.0.100
this is server1
this is server2