一,集群介绍
1,什么是集群
集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统;简单解释就是将多台计算机组合成一台超级计算机,来防止单个计算机提供服务"死掉"后客户无法进行访问。
2,集群的分类
常见的集群分为三大类:负载均衡集群(LB)、高可用集群(HA)、高性能计算集群(HPC)。
负载均衡集群:公司最常用的集群,目的是为了分摊压力,本文讲到的LVS就属于负载均衡集群。
高可用集群:通常采用主备方式部署,目的是为了保障服务不中断。
高性能计算集群:目的是为了保证计算速度够快。
二,LVS(理论)
1,LVS的作用
LVS是最经典的负载均衡集群,它的作用基本上可以用一下几点概况:
(1)进行流量的分发,将客户的请求根据权重、轮询等方法分发给后端的服务器
(2)具备容灾能力,LVS会主动提出有问题的后端服务器保障服务器的可用性
(3)只向外提供唯一的VIP地址,不提供后端服务器地址
2,LVS模式
LVS具有nat、DR、TUN、fullnat四种模式
(1)nat模式:不管是用户的请求还是后端服务器的响应都经过LVS,比较适合并发量不大的服务器

(2)DR模式:只有用户的请求经过LVS,后端服务器响应后直接返回给客户

(3)TUN模式:IP隧道模式,突破了距离限制,可以跨地域调取

(4)fullnat模式:为NAT模式加强版,虽然经过了LVS但是完全隐藏了客户的IP,经过LVS时会修改IP
三,LVS(实验)
以下实验虚拟机的IP如下(所有虚拟机都是在root下做的实验,且火墙和SELINUX,仓库配置完成)
客户:natIP:172.25.250.10,网关:172.25.250.100
router:natIP:172.25.250.100,仅主机IP:172.25.254.100
LVS:仅主机IP:172.25.254.50,VIP:172.25.254.200/32 ,网关:172.25.254.100
RS1:仅主机IP:172.25.254.10,lo:172.25.254.200/32,网关:172.25.254.100
RS2:仅主机IP:172.25.254.20,lo:172.25.254.200/32,网关:172.25.254.100
1,LVS算法(4种静态,6种动态,2种4.15版本后新增)
实验条件
对于RS1+RS2
bash
#VIP配置
[root@RS1+RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1+RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1+RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=172.25.254.200/32
method=manual
[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
#arp禁止响应配置
[root@RS1+RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1+RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1+RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1+RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#安装apache服务
[root@RS1+RS2 ~]# dnf install -y httpd #这里也可以选择安装nginx,都可以通过80端口提供web服务
[root@RS1 ~]# echo RS1 172.25.254.10 > /var/www/html/index.html #注意主机名字
[root@RS2 ~]# echo RS2 172.25.254.20 > /var/www/html/index.html #注意主机名字
[root@RS1+RS2 ~]# systemctl start httpd
#nginx的命令如下
[root@RS1+RS2 ~]# echo RS1 172.25.254.10 > /usr/share/nginx/html/index.html
对于LVS
bash
#配置VIP
[root@root ~]# cd /etc/NetworkManager/system-connections/
[root@root system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@root system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1==127.0.0.1/8
address2=172.25.254.200/32
[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
#下载调度策略
[root@root ~]# dnf install -y ipvsadm
对于router
bash
#设定内核路由功能
[root@router ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
#数据转发策略
[root@router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.25.254.100
[root@vsnode ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.250.100
(1)静态算法(算法全部配置在LVS上)
a,RR
roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
bash
[root@root ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10 -g 1
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20 -g 1

查看在客户机上查看

b,WRR
Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
bash
[root@root ~]# ipvsadm -A -t 172.25.254.200:80 -s wrr
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10 -g 1
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20 -g 2
#如果是对上文的RR算法进行更改的话命令如下
[root@root ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr
[root@root ~]# ipvsadm -e -t 172.25.254.200:80 -r 172.25.254.10 -g 1
[root@root ~]# ipvsadm -e -t 172.25.254.200:80 -r 172.25.254.20 -g 2


c,SH
Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往
第一次挑中的RS,从而实现会话绑定
bash
[root@root ~]# ipvsadm -A -t 172.25.254.200:80 -s sh
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10 -g 1
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20 -g 1


d,DH
Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请
求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
bash
[root@root ~]# ipvsadm -A -t 172.25.254.200:80 -s dh
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10 -g 1
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20 -g 1


(2)动态算法(这里只做介绍,本次实验构建的虚拟服务器数量过少,实验结果显示同静态算法区别过小)
a,LC:least connections(最少链接发)
适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活
动链接数)
b,WLC:Weighted LC(权重最少链接)
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
c,SED:Shortest Expection Delay
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
d,NQ:Never Queue
第一轮均匀分配,后续SED
e,LBLC:Locality-Based LC
动态的DH算法,使用场景:根据负载状态实现正向代理
f,LBLCR:LBLC with Replication
带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
(3)4.15后新增算法
1.FO(Weighted Fai Over)调度算法
常用作灰度发布,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度,当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。
2.OVF(Overflow-connection)调度算法
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。
2,多端口轮询问题解决
在RS1和RS2上下载mod_ssl包(下载命令为dnf install -y mod_ssl),然后重启httpd服务
(1)出现轮询问题
bash
[root@root ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.10:80 -g
[root@root ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.254.20:80 -g
[root@root ~]# ipvsadm -A -t 172.25.254.200:443 -s rr
[root@root ~]# ipvsadm -a -t 172.25.254.200:443 -r 172.25.254.10:443 -g
[root@root ~]# ipvsadm -a -t 172.25.254.200:443 -r 172.25.254.20:443 -g

如何让客户机去使用curl命令查看请求返回情况

可以发现返回的都是20的响应,这代表出现了轮询问题
(2)解决轮询问题
bash
[root@root ~]# ipvsadm -C #这步作用是先清除之前做的算法调度策略
[root@root ~]# iptables -t mangle -A PREROUTING -d 172.25.254.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@root ~]# ipvsadm -A -f 6666 -s rr
[root@root ~]# ipvsadm -a -f 6666 -r 172.25.254.10 -g
[root@root ~]# ipvsadm -a -f 6666 -r 172.25.254.20 -g


3,会话粘滞问题解决
下述命令为会话粘滞时间定时一分钟
bash
[root@root ~]# ipvsadm -A -f 6666 -s rr -p 1


然后使用watch -n 1 ipvsadm -Lnc命令在LVS上查看,可以看到红框出的时间倒计时
