目录
-
通过高速网络将很多机器组织到一起,作为一个整体对外提供服务,在客户端看来就像只有一个服务器
-
集群在付出较低的情况下在扩展性、性能方面都可以做到很灵活
-
任务调度是集群系统中的核心技术
集群分类
-
负载均衡集群:Load Balance
(相当于客户太多让客户结账的时候走不同的通道一起结账)
-
高可用集群:High Availability
(有一台机器足够了,但不能保证这台机器永不宕机,就采用主备策略)
(相当于中午原本员工去吃饭,超市另外员工替班,保证通道一直可以结账)
-
高性能计算:High Performance Computing
(提高算数,速度)
集群的目的
-
提高性能(如:计算密集应用,天气预报,核试验模拟)
-
降低成本(如:相对百万美元级的计算机,价格便宜)
-
提高可扩展性(只要增加集群节点即可)
-
增强可靠性(多个节点完成相同功能,避免单点失败)
LVS
-
LVS:Linux Virtual Server,Linux虚拟服务器
-
k8s底层实现的负载均衡用的也是LVS
-
基于4层,实现负载均衡集群,nginx是基于7层,也实现了负载均衡
-
作者:章文嵩。国防科技大学读博士期间编写
-
LVS的工作模式:
-
NAT:网络地址转换(大并发访问时,调度器的性能成为瓶颈)
-
DR:路由模式(节点服务器需要配置VIP,注意MAC地址广播)
-
TUN:隧道模式
-
-
调度器:LVS服务器
-
真实服务器Real Server:提供服务的服务器
-
VIP:虚拟地址,提供给用户访问的地址
-
DIP:指定地址,LVS服务器上与真实服务器通信的地址
-
RIP:真实地址,真实服务器的地址
-
常见的调度算法,共10个,常用的有4个:
-
轮询rr:Real Server轮流提供服务
-
加权轮询wrr:根据服务器性能设置权重,权重大的得到的请求更多
-
最少连接lc:根据Real Server的连接数分配请求
-
(解释:顾客来结账,根据收银员速度和顾客带的量多少,去人少的地方排队结账)
-
加权最少连接wlc:类似于wrr,根据权重分配请求
LVS集群组成
负载均衡图解:
前端 | 中间 | 底端 |
负载均衡层 | 服务器群组层 | 数据共享存储层 |
由一台或多台负载调度器构成 | 由一组实际运行应用服务的服务器组成 | 提供共享存储空间的存储区域 |
配置LVS NAT模式(双网卡)
web服务器和存储都是一个网络,调度器是双网卡,
用户访问时,先访问到调度器的外网卡,
调度器根据调度算法,把它的请求发到某一台web器上,
然后web回应客户的时候也是先发送到调度器上,用内网卡再回复给客户。
通过网络地址转发实现的虚拟服务器;
大并发访问时,调度器的性能成为瓶颈
环境准备
-
client1:eth0->192.168.4.10,网关192.168.4.5
-
lvs1: eth0 -> 192.168.4.5;eth1->192.168.2.5
-
web1:eth1->192.168.2.100;网关192.168.2.5
-
web2:eth1->192.168.2.200;网关192.168.2.5
# 登陆之后,将以下内容粘贴到终端
hostnamectl set-hostname client1
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.10/24
nmcli connection down eth0
nmcli connection up eth0
echo a | passwd --stdin root
nmcli connection modify eth0 ipv4.gateway 192.168.4.5
nmcli connection down eth0
nmcli connection up eth0
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真机
# 真机通过ssh连接client1
[root@zzgrhel8 ~]# rm -f ~/.ssh/known_hosts
[root@zzgrhel8 ~]# ssh 192.168.4.10
配置2台web服务器
[root@web1 ~]# vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl=ftp://192.168.2.254/centos-1804
enabled=1
gpgcheck=0
[root@web2 ~]# vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl=ftp://192.168.2.254/centos-1804
enabled=1
gpgcheck=0
[root@web1 ~]# yum install -y httpd (安装web服务)
[root@web2 ~]# yum install -y httpd
# 创建测试页面
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web2 ~]# echo "apache web server2" > /var/www/html/index.html
[root@web1 ~]# systemctl enable httpd --now (启动apache)
[root@web2 ~]# systemctl enable httpd --now
# 在lvs1上测试到web服务器的访问
[root@lvs1 ~]# curl http://192.168.2.100/
192.168.2.100
[root@lvs1 ~]# ^100^200 # 将上一条命令中的100换成200,执行
curl http://192.168.2.200/
apache web server2
确保lvs1的ip转发功能已经打开。该功能需要改变内核参数
# 查看ip转发功能的内核参数
[root@lvs1 ~]# sysctl -a # 查看所有的内核参数
[root@lvs1 ~]# sysctl -a | grep ip_forward # 查看ip_foward参数
net.ipv4.ip_forward = 1 # 1表示打开转发,0表示关闭转发
# 永久设置打开ip_forward功能
[root@lvs1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@lvs1 ~]# sysctl -p
net.ipv4.ip_forward = 1
# 测试从客户端到服务器的访问
[root@client1 ~]# curl http://192.168.2.100/
192.168.2.100
[root@client1 ~]# curl http://192.168.2.200/
apache web server2
路由器ipv4和ipv6转发原理
路由器可以在其任何接口上接收数据包,并通过不同的接口把数据包转发出去,将其发送到目的地。数据包既可以从该接口进入路由器,也可以从该接口离开路由器。
当路由器收到一份IP数据报后,首先要对该报文进行判断,然后根据判断的结果在作进一步的处理。如果数据报是无效或错误的,路由器会把报文丢到,否则路由器会根据数据报的目的IP地址转发该报文。
IPv4是互联网协议第四版,是计算机网络使用的数据报传输机制,此协议是第一个被广泛部署的IP协议。每一个连接Internet的设备(不管是交换机、PC还是其他设备),都会为其分配一个唯一的IP地址,IPv4使用32位(4字节)地址,大约可以存储43亿个地址,但随着越来越多的用户接入到Internet,全球IPv4地址已于2019年11月已全数耗尽。这也是后续互联网工程任务组(IEIF)提出IPv6的原因之一。192.149.252.76这是一个IPv4地址,
IPv6是由IEIF提出的互联网协议第六版,用来替代IPv4的下一代协议,IPv6的地址长度为128位,可支持340多万亿个地址。IPv6地址通常分为8组,4个十六进制数为一组,每组之间用冒号分隔。3ffe:1900:fe21:4545:0000:0000:0000:0000,这是一个IPv6地址。
区别?
性能
与IPv4相比,IPv6将地址长度从32位增加到了128位,可支持更多的地址需求。
IP报头
IPv4根据提供的IP选项,有20~60个字节的可变长度;而IPv6拥有40个字节的固定长度,相对于IPv4而言报头简单。
网络安全
对于IPv4而言,互联网安全协议(IPsec)是可选的,但不一定是免费的,有的需要付费支持;但对于IPv6来说,互联网安全协议是必选项。此外,像身份验证、数据一致性和保密性的内容也加入到了IPv6中。由此说明,IPv6相对于IPv4来说,更加安全。
安装LVS
[root@lvs1 ~]# yum install -y ipvsadm
ipvsadm使用说明
[root@lvs1 ~]# ipvsadm
-A: 添加虚拟服务器
-E: 编辑虚拟服务器
-D: 删除虚拟服务器
-t: 添加tcp服务器
-u: 添加udp服务器
-s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc
-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器
-r: 指定真实服务器
-w: 设置权重
-m: 指定工作模式为NAT
-g: 指定工作模式为DR
配置LVS
# 为web服务器创建VIP,4.5的虚拟服务器,使用rr轮询调度算法
[root@lvs1 ~]# ipvsadm -A -t 192.168.4.5:80 -s rr
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln # L是列出,n是使用数字,而不是名字
# 向虚拟服务器中添加RIP,2.100;2.200
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1 -m #权重低是1
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 2 -m #权重高是2
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
# 验证
[root@client1 ~]# for i in {1..4}
> do
> curl http://192.168.4.5/
> done
apache web server2
192.168.2.100
apache web server2
192.168.2.100
# 删除配置。(如果配置有错,用以下命令删除重配置)
[root@lvs1 ~]# ipvsadm -D -t 192.168.4.5:80
# 修改调度模式为加权轮询
[root@lvs1 ~]# ipvsadm -E -t 192.168.4.5:80 -s wrr
# 验证配置
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.5/; done
apache web server2
apache web server2
192.168.2.100
apache web server2
apache web server2
192.168.2.100
配置LVS DR模式(单网卡)
(1)为了防止ip地址冲突:
我们决定在调度器eth0上配4.15,
两台web机器的lo环回地址(虚拟网卡)上配4.15.
(2)接下来还有一个问题:
就是客户端访问4.15的时候,三台机器访问哪一个?
所以,我们需要更改内核参数,更改后两台web机器发现虽然有4.15地址,
但是在lo环回地址(虚拟网卡)上面,所以,两台web机器便不做应答
(3)接下来调度器根据配置的规则,将数据发给4.100或者4.200
两台web机器便用4.15的身份回应客户端
LVS主机和web服务器都是单网卡。它们连在同一网络中,
用户访问时,让它去访问调度器,调度器把请求发给某一个web,
web直接回应客户端
修改实验环境
-
client1:eth0-> 192.168.4.10
-
lvs1:eth0->192.168.4.5,删除eth1的IP
-
web1:eth0->192.168.4.100,删除eth1的IP
-
web2:eth0->192.168.4.200,删除eth1的IP
# 删除lvs虚拟服务器配置
[root@lvs1 ~]# ipvsadm -D -t 192.168.4.5:80 #先把4.5上面的规则去掉
[root@lvs1 ~]# ipvsadm -Ln
# 删除lvs1上eth1的配置
[root@lvs1 ~]# nmcli connection modify eth1 ipv4.method disabled ipv4.addresses '' #把ip网卡设置为空
[root@lvs1 ~]# ifdown eth1 #去掉eth1
# 修改web1的配置:停掉eth1的地址。配置eth0的地址为192.168.4.100
# 进入网卡配置文件目录
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
# eth0网卡的配置文件叫ifcfg-eth0
[root@web1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0 ifcfg-eth1 ifcfg-eth2 ifcfg-eth3
# 配置eth0地址
[root@web1 network-scripts]# vim ifcfg-eth0
TYPE=Ethernet # 网络类型为以太网
BOOTPROTO=none # IP地址是静态配置的,也可以用static
NAME=eth0 # 为设备重命名
DEVICE=eth0 # 网卡设备名
ONBOOT=yes # 开机激活网卡
IPADDR=192.168.4.100 # IP地址
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.4.254 # 网关
[root@web1 network-scripts]# ifdown eth0; ifup eth0 # 禁用激活网卡
# 在web1上停掉eth1
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web1 ~]# ifdown eth1
# 修改web2的网络
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.200
NETMASK=255.255.255.0
GATEWAY=192.168.4.254
[root@web2 ~]# ifdown eth0; ifup eth0
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web2 ~]# ifdown eth1 # 终端卡住,关掉它,在新终端重新连
1.在lvs1的eth0上配置vip 192.168.4.15。通过为eth0创建逻辑端口的方式配置vip,为逻辑端口起名为eth0:0
[root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@lvs1 network-scripts]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
PREFIX=24
[root@lvs1 network-scripts]# ifup eth0:0
# 查看新的地址
[root@lvs1 network-scripts]# ifconfig
2.在2台web服务器的lo上配置vip 192.168.4.15
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.15 #环回地址
NETMASK=255.255.255.255 #子网掩码(这里表示我自己就是一个网络)
NETWORK=192.168.4.15
BROADCAST=192.168.4.15 #广播地址
ONBOOT=yes
NAME=lo:0
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# ifconfig
# 把web1的配置拷贝到web2上
[root@web1 network-scripts]# scp ./ifcfg-lo:0 192.168.4.200:/etc/sysconfig/network-scripts/
[root@web2 ~]# ifup lo:0
[root@web2 ~]# ifconfig
3.在2台web服务器上配置内核参数,使得它们不响应对192.168.4.15的请求
[root@web1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 0
[root@web1 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 0
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1 #有了这个lo的4.15便不会回应
net.ipv4.conf.lo.arp_ignore = 1 #有了这个lo的4.15便不会回应
net.ipv4.conf.all.arp_announce = 2 #有了这个lo的4.15便不会回应
net.ipv4.conf.lo.arp_announce = 2 #有了这个lo的4.15便不会回应
[root@web1 ~]# sysctl -p #生效
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# sysctl -p #生效
4.在lvs1上配置虚拟服务器
# 创建虚拟服务器,指定wlc调度算法,最少连接
[root@lvs1 ~]# ipvsadm -A -t 192.168.4.15:80 -s wlc
# 向虚拟服务器中加真实服务器
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -w 1 -g #权重1
[root@lvs1 ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -w 2 -g #权重2
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
# 客户验证
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
192.168.2.100
apache web server2
apache web server2
192.168.2.100
apache web server2
5.lvs本身没有应用服务器监控功能,如果web服务器出现问题,需要手工从规则中删掉
[root@web1 ~]# systemctl stop httpd
# 客户端访问时,转发到web1上的请求,将会拒绝连接
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
curl: (7) Failed connect to 192.168.4.15:80; 拒绝连接
apache web server2
apache web server2
curl: (7) Failed connect to 192.168.4.15:80; 拒绝连接
apache web server2
#ipvsadm的规则中删除web1
[root@lvs1 ~]# ipvsadm -d -t 192.168.4.15:80 -r 192.168.4.100
[root@client1 ~]# for i in {1..6}; do curl http://192.168.4.15/; done
apache web server2
apache web server2
apache web server2
apache web server2
apache web server2
apache web server2
总结
DR路由模式,用的相对多一点,
NAT网络地址转换,会受到速度性能的影响,
排错步骤:
# 在lvs上可以访问到web服务器
[root@lvs1 ~]# curl http://192.168.4.100/
192.168.2.100
[root@lvs1 ~]# curl http://192.168.4.200/
apache web server2
# 查看vip
[root@lvs1 ~]# ifconfig eth0:0
eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.15 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:0d:fb:79 txqueuelen 1000 (Ethernet)
[root@web1 ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.4.15 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
# 查看内核参数
[root@web1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
# 查看规则
[root@lvs1 ~]# 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.4.15:80 wlc
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 2 0 0