提高性能
如计算密集型应用,如:天气预报、核试验模拟
降低成本
相对百万级别得超级计算机,价格便宜
提高可扩展性
只要增加集群节点即可
提高可靠性
多个节点完成相同功能,避免单点失败
高性能计算集群HPC
通过以集群卡法的并行应用程序,解决复杂的科学问题
负载均衡(LB)集群
客户端负载在计算机集群中尽可能平均分摊
高可用(HA)集群
避免单点故障,当一个系统发生故障时,可以快速迁移
符合以上部分需求的软件有LVS,keepalived等
前端:负载均衡层
由一台或多台负载调度器构成
中间:服务器群组层
由一组实际运行应用服务的服务器组成
底端:数据共享存储层
提供共享存储空间的存储区域
Director Server:调度服务器
将负载分发到Real Server服务器
有两个IP,一个为VIP,一个为DIP
Real Server:真实服务器
真正提供应用服务的服务器(RIP)
VIP: 虚拟IP地址
公布给用户访问的虚拟IP地址(一般为调度器的IP)
RIP:真实IP地址
集群节点上使用的IP地址
DIP:调度器连接节点服务器的IP地址
lvs原理是路由器(数据包转发)
工作流程:客户机访问lvs,lvs转发数据包给web服务器,web服务器回应数据包给客户端
nginx原理为代理(帮客户访问)
工作流程:客户机访问nginx代理服务器,代理服务器帮客户机访问web服务器,web服务器把内容返回给nginx代理服务器,通过代理服务器返回给客户端
lvs和路由器相比,比路由器多了一个调度功能,调度功能是集群的核心
lvs是内核层面的东西,相比较nginx(nginx是操作系统层面的软件),lvs的性能更高,但是他的一些功能更少,比如就缺少健康检查等
用户访问调度器,调度器把请求转给web1,web1从调度器回复用户
当用户访问量过多,所有的数据都会经过调度器,这时,网络的带宽就会成为整个集群的瓶颈。这种适合小规模的集群
调度器和服务器不在同一个网,例:用户访问地址在A的调度器,调度器转发到地址为B的web服务器,中间跨过公网,所以要在代理服务器和web服务器中间搭建隧道
用户访问调度器,调度器转发给web服务器,web服务器直接回复给用户
这种模式,缓解了调度器返回数据的压力,提高了并发访问量,适合较大规模的集群
LVS目前实现了10种调度算法
常用调度算法有四种
轮询(rr):将客户端请求平均分发到Real Server
加权轮询(wrr):根据Real Server权重值进行轮询调度
最少连接(lc):选择连接数最少的服务器
加权最少连接(wlc):根据Real Server权重值,选择连接数最少的服务器
其他调度算法
源地址散列算法:(sh)根据请求的目标IP地址,作为散列键(Hash Key)从静态分配到散列表中赵出对应的服务器,与nginx中的ip_hash效果一致(客户端IP不变,服务器集群中有固定服务器进行回应)
基于局部性的最少连接
带复制的基于局部性最少连接
目标地址散列(dh)
最短的期望的延迟
最少队列调度
LVS的IP负载均衡技术是通过IPVS模块实现的,这里需要使用ipvsadm命令
这里先进行实验前的准备
使用Linux服务器,安装ipvsadm软件包,练习使用ipvsadm命令,实现以下功能
安装ipvsadm软件包
常用ipvsadm命令语法如下所示
命令选项 | 含义 |
---|---|
ipvsadm -A | 添加虚拟服务器 |
ipvsadm -E | 修改虚拟服务器 |
ipvsadm -D | 删除虚拟服务器 |
ipvsadm -C | 清空所有 |
ipvsadm -a | 添加真实服务器 |
ipvsadm -e | 修改真实服务器 |
ipvsadm -d | 删除真实服务器 |
ipvsadm -L | 查看LVS规则表 |
-s [rr|wrr|lc|wlc|sh] | 指定集群算法 |
实例
命令 | 含义 |
---|---|
ipvsadm -A -t|u 192.168.19.10:80 -s [算法] | 添加虚拟服务器,协议为tcp(-t)或者udp(-u) |
ipvsadm -E -t|u 192.168.19.10:80 -s [算法] | 修改虚拟服务器,协议为tcp(-t)或者udp(-u) |
ipvsadm -D -t|u 192.168.19.10:80 | 删除虚拟服务器,协议为tcp(-t)或者udp(-u) |
ipvsadm -C | 清空所有 |
ipvsadm -a -t|u 192.168.19.10:80 -r 192.168.20.10 [-g|i|m] [-w 权重] | 添加真实服务器-g(DR模式)-i(隧道模式)-m(NAT模式) |
ipvsadm -e -t|u 192.168.19.10:80 -r 192.168.20.10 [-g|i|m] [-w 权重] | 修改真实服务器 |
ipvsadm -d -t|u 192.168.19.10:80 -r 192.168.20.10 | 删除真实服务器 |
ipvsadm -Ln | 查看LVS的规则表 |
1)创建LVS虚拟集群服务器(算法为加权轮询:wrr)
yum -y install ipvsadm #先安装相应的软件包
ipvsadm -A -t 192.168.19.130:80 -s wrr
ipvsadm -L
ipvsadm -Ln #以数字显示
2)为集群添加若干Real Server
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.10 -w 1
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.20 -w 1
ipvsadm -Ln
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.30 -w 1 -m #使用nat模式
ipvsadm -a -t 192.168.19.130:80 -r 192.168.20.40 -w 1 -i #使用隧道模式
#默认为dr模式
ipvsadm -Ln
#在forward中可以看出类型,router为dr模式,masq为nat模式,tunnel是隧道模式
3)修改集群服务器设置(修改调度器算法,将加权轮询修改为轮询)
ipvsadm -E -t 192.168.19.130:80 -s rr
ipvsadm -Ln
#ipvsadm -e 可以修改权重和工作模式
4)修改Read server(使用-g选项,将模式改为DR模式)
ipvsadm -e -t 192.168.19.130:80 -r 192.168.20.10 -g
5)查看LVS状态
ipvsadm -Ln
6)创建另一个集群(算法为最少连接算法:使用-m,设置工作模式为NAT模式)
ipvsadm -A 192.168.19.100:80 -s lc
ipvsadm -a -t 192.168.19.100:80 -r 192.168.20.30 -m
ipvsadm -a -t 192.168.19.100:80 -r 192.168.20.40 -m
7)永久保存所有规则
ipvsadm-save -n > /etc/sysconfig/ipvsadm-config
#在版本7中,这个配置文件为ipvsadm
8)清空所有规则
ipvsadm -C #在进行下面实验时,记得清空我们刚刚的练习
使用LVS实现NAT模式的集群调度服务器,为用户提供web服务
实验拓扑主机配置如下
主机名 | IP地址 |
---|---|
client | 192.168.19.1/24 |
proxy | eth0 :192.168.19.30/24 |
eth1:192.168.20.30/24 | |
web1 | 192.168.20.10 网关:192.168.20.30 |
web2 | 192.168.20.20 网关:192.168.20.30 |
注意:这里真实服务器的网关要设置为lvs连接真实主机的IP,否则会转发失败
需要4台虚拟机,1台作为Director调度器,2台作为Real Server服务器,一台作为客户机,拓扑结构如下
具体IP以表格为准
1)部署基础环境
web1
yum -y install httpd
echo "web1 我是192.168.20.10" > /var/www/html/index.html
web2
yum -y install httpd
echo "web2 我是192.168.20.20" > /var/www/html/index.html
2)启动web服务器软件(web1和web2同时操作 )
systemctl start httpd
3)关闭防火墙和SELinux(web1和web2同时操作)
systemctl stop firewalld
setenforce 0
4)测试网页
1)确认调度器的路由转发功能(如果已经开启,可以忽略)
echo 1 > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #修改配置文件,设置永久规则
2)创建集群服务器
yum -y install ipvsadm
ipvsadm -A -t 192.168.19.30:80 -s wrr #创建虚拟服务器
3)添加真实服务器
ipvsadm -a -t 192.168.19.30:80 -r 192.168.20.10:80 -w 1 -m
ipvsadm -a -t 192.168.19.30:80 -r 192.168.20.20:80 -w 1 -m
4)查看规则表,并保存规则
ipvsadm -Ln
ipvsadm-save -n > /etc/sysconfig/ipvsadm-config #永久保存规则
5)客户端测试
说明:
CIP是客户端的IP地址
VIP是对客户端提供服务的IP地址
RIP是后端服务器的真实IP地址
DIP是调度器与后端服务器通信的IP地址(VIP必须配置在虚拟接口)
使用四台虚拟机,1台作为客户端,1台作为Director调度器,2台作为Real Server,拓扑结构如下,
主机名 | 网络配置 |
---|---|
client | eth0 192.168.4.1/24 |
proxy | eth0 192.168.4.5/24 |
eth0:0 192.168.4.15/24 | |
web1 | eth0 192.168.4.100/24 |
lo:0 192.168.4.15/32 #注意子网掩码必须为32位 | |
web2 | eth0 192.168.4.200/24 |
lo:0 192.168.4.15/32 #注意子网掩码必须为32位 |
1)注意:为了防止冲突,VIP必须要配置在网卡的虚拟接口
为了完成实验,我清空了网络配置,重新进行配置,防止地址冲突
proxy的网络配置
nmcli connection add type ethernet con-name ens192 ifname ens192
nmcli connection modify ens192 ipv4.add 192.168.4.5/24 ipv4.dns 114.114.114.114 ipv4.gateway 192.168.4.2 ipv4.method manual
nmcli connection up ens192
nmcli connection add type ethernet con-name ens224 ifname ens224
nmcli connection modify ens224 ipv4.add 192.168.4.15/24 ipv4.dns 114.114.114.114 ipv4.gateway 192.168.4.2 ipv4.method manual
nmcli connection up ens224
2)设置web1服务器网络参数
nmcli connection add type ethernet con-name ens192 ifname ens192
nmcli connection modify ens192 ipv4.add 192.168.4.100/24 ipv4.dns 114.114.114.114 ipv4.gateway 192.168.4.2 ipv4.method manual
nmcli connection up ens192
接下来给web1配置VIP地址
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样
web1
ifconfig lo:10 192.168.4.15 netmask 255.255.255.255 broadcast 192.168.4.15 up
防止地址冲突问题
这里因为web1也配置与代理一样的VIP地址,默认肯定会出现地址冲突;sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这样也防止地址冲突的问题
web1
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1 #所有网卡
net.ipv4.conf.lo.arp_ignore=1 #lo回环 忽略arp请求包
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
#arp_ignore 忽略掉arp请求包
#arp_announce 声明宣告
#修改内核参数,关闭arp响应
#当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播
#本机不要向外宣告自己的lo回环地址是192.168.4.15
或者使用这种方式,也能完成上述功能
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
sysctl -p #刷新参数
重启网络服务,设置防火墙与SELinux
systemctl restart NetworkManager
ifconfig
systemctl stop firewalld
setenforce 0
3)接下来配置web2,web2的操作与web1操作一致
设置web2的服务器网络参数
nmcli connection add type ethernet con-name ens192 ifname ens192
nmcli connection modify ens192 ipv4.add 192.168.4.200/24 ipv4.dns 114.114.114.114 ipv4.gateway 192.168.4.2 ipv4.method manual
nmcli connection up ens192
接下来配置web的VIP地址
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样
ifconfig lo:10 192.168.4.15 netmask 255.255.255.255 broadcast 192.168.4.15 up
防止地址冲突问题
这里因为web1也配置与代理一样的VIP地址,默认肯定会出现地址冲突;sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这样也防止地址冲突的问题
web2
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1 #所有网卡
net.ipv4.conf.lo.arp_ignore=1 #lo回环 忽略arp请求包
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
#arp_ignore 忽略掉arp请求包
#arp_announce 声明宣告
#修改内核参数,关闭arp响应
#当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播
#本机不要向外宣告自己的lo回环地址是192.168.4.15
sysctl -p #刷新参数
重启网络服务,设置防火墙与SELinux
systemctl restart NetworkManager
ifconfig
systemctl stop firewalld
setenforce 0
1)安装软件(如果已经安装请忽略)
yum -y install ipvsadm
echo 1 > /proc/sys/net/ipv4/ip_forward
2)清理之前的实验规则,创建新的集群服务器规则
ipvsadm -C #清空所有规则
ipvsadm -A -t 192.168.4.15:80 -s wrr
3)添加真实服务器(-g参数设置LVS工作模式为DR模式,-w设置权重)
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 2
4)查看规则列表,并保存规则
ipvsadm -Ln
ipvsadm-save -n > /etc/sysconfig/ipvsadm-config #永久保存规则
客户端使用curl命令反复进行测试,查看访问的页面是否会轮询到不同的后端真实服务器
因为web2的权重为2,所以测试结果如上
扩展知识:默认LVS不带健康检查功能,需要自己手动编写动态检测脚本,实现该功能
参考脚本
vim check.sh
#! /bin/bash
VIP=192.168.4.15:80
RIP1=192.168.4.100
RIP2=192.168.4.200
while:
do
for IP in $RIP1 $RIP2
do
curl -s http://$IP &> /dev/null
if [ $? -eq 0 ];then
ipvsadm -Ln | grep -q $IP || ipvsadm -a -t $VIP -r $IP
else
ipvsadm -Ln | grep -q $IP && ipvsadm -d -t $VIP -r $IP
fi
done
sleep 1
done
用循环一直访问LVS集群,如果其中有web服务器发生故障,就把服务器从集群中删除,如果服务器回复正常,则再次添加