1 集群Cluster
集群:上图这样的组合叫做集群
原因:一台主机满足不了我们的需求
左边两台是客户端,右边两台为服务端,中间的主机作用:负责调度、接收所有的客户访问流量,但是不处理,这就是lvs。
Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统Cluster 常见的三种类型:LB : LoadBalancing (负载均衡)由多个主机组成,每个主机只承担一部分访问HA : High Availiablity (高可用) SPOF ( single Point Of failure )MTBF:Mean Time Between Failure 平均无故障时间,正常时间MTTR:Mean Time To Restoration ( repair )平均恢复前时间,故障时间A=MTBF/ ( MTBF+MTTR ) (0,1) : 99%, 99.5%, 99.9%, 99.99%, 99.999%SLA : Service level agreement (服务等级协议)是在一定开销下为保障服务的性能和可用性,服 务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在 常规的领域中,总是设定所谓的三个9 ,四个 9 来进行表示,当没有达到这种水平的时候,就会有一 些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外 停机时间HPC : High-performance computing (高性能计算,国家战略资源)
1.1 高可用-HA
高可用(HA-high-availiablity):有两台lvs,一台为主,一台为备,这样的组合为高可用。
1.2 分布式
分布式:把一个复杂的请求,使用不同主机来完成。如一台计算1+1、另一台2+3、第三台将其相加。
分布式存储 :Ceph , GlusterFs , FastDFS , MogileFs分布式计算 :hadoop , Spark分布式常见应用分布式应用 - 服务按照功能拆分,使用微服务分布式静态资源 -- 静态资源放在不同的存储集群上 分布式数据和存储 -- 使用 key-value 缓存系统分布式计算 -- 对特殊业务使用分布式计算,比如 Hadoop 集群
1.3 集群和分布式的区别
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率, 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败。
2 LVS概念
VS : Virtual ServerRS : Real ServerCIP : Client IPVIP: Virtual serve IP VS 外网的 IPDIP: Director IP VS 内网的 IPRIP: Real server IP访问流程: CIP <--> VIP == DIP <--> RIP 3.4.lvs 集群的类型lvs-nat : 修改请求报文的目标IP, 多目标 IP 的 DNATlvs-dr : 操纵封装新的 MAC 地址lvs-tun : 在原请求IP 报文之外新加一个 IP 首部lvs-fullnat : 修改请求报文的源和目标 IP
2.1 nat模式
Ivs-nat:本质是多目标 IP 的 DNAT ,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和 PORT实现转发RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址 ;RS 的网关要指向 DIP请求报文和响应报文都必须经由 Director 转发, Director 易于成为系统瓶颈支持端口映射,可修改请求报文的目标 PORTVS 必须是 Linux 系统, RS 可以是任意 OS 系统
2.2实验(nat模式)
2.2.1 lvs主机
实验准备:
克隆rhel 9 名为LVS 需要两张网卡 有一张仅主机,一张为NAT
分别为这两张网卡设置IP
vmsrt.sh eth0 172.25.254.100 lvs.jingwen.org
vmset.sh eth1 192.168.0.100 lvs.jingwen.org
[root@lvs ~]# cd /boot/
[root@lvs boot]# ls
[root@lvs boot]# IPVS scheduler
[root@lvs boot]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@lvs boot]# nmcli connection reload
[root@lvs boot]# nmcli connection up eth0
[root@lvs boot]# 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;
[root@lvs boot]# nmcli connection reload
[root@lvs boot]# nmcli connection up eth1、
#注意要修改虚拟网络编辑器和其一致
#把内核路由功能打开
[root@lvs boot]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
#使其生效
[root@lvs boot]#sysctl -p
2.2.2 webserver1主机
实验准备: 克隆rh9 名为webserver1 网卡仅主机 vmset.sh etho 192.168.0.10 webserver1.jingwen.org
[root@webserver1 ~]# cat /etc/NetworkManager/systemconnections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;
[root@webserver1 ~]# nmcli connection reload
[root@webserver1 ~]# nmcli connection up eth0
2.2.3 webserver2主机
实验准备 克隆rh9 名为webserver2 网卡仅主机 vmset.sh etho192.168.0.20 webserver2.jingwen.org
[root@webserver1 ~]# yun install httpd -y
[root@webserver2 ~]# yun install httpd -y
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd
[root@webserver2 ~]# echo webserver1 - 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
#检测环境是否ok(lvs去访问这两台主机):
[root@lvs boot]# curl 192.168.0.10
webserver1 - 192.168.0.10
[root@lvs boot]# curl 192.168.0.20
webserver2 - 192.168.0.20
在主机lvs上:
#安装lvs软件
[root@lvs boot]# cd /boot/
[root@lvs boot]# dnf search lvs
[root@lvs boot]# dnf install ipvsadm
#查看有没有策略
[root@lvs boot]# ipvsadm -Ln
[root@lvs boot]# cat /etc/sysconfig/ipvsadm
#-A:增加一个虚拟server -s:指定一个算法
[root@lvs boot]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs boot]# ipvsadm -Ln
#-m:用的lvs模式是nat的 -w:指定权重
[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
#查看LVS(Linux Virtual Server)负载均衡配置的详细信息
[root@lvs boot]# ipvsadm -Ln
#测试 循环10次
[root@lvs boot]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
#保存 因为没有本地解析所以时间比较久 [root@lvs boot]# ipvsadm-save > /etc/sysconfig/ipvsadm
2.3 lvs部署命令介绍
lvs软件相关信息 程序包:ipvsadm Unit File: ipvsadm.service 主程序:/usr/sbin/ipvsadm 规则保存工具:/usr/sbin/ipvsadm-save 规则重载工具:/usr/sbin/ipvsadm-restore 配置文件:/etc/sysconfig/ipvsadm-config ipvs调度规则文件:/etc/sysconfig/ipvsadm ipvsadm命令 核心功能: 集群服务管理:增、删、改 集群服务的RS管理:增、删、改 查看 命令参数 管理集群服务 ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \ service-address(集群地址) \ [-s scheduler(调度算法)] \ [-p [timeout]] \ [-M netmask] \ [--pepersistence_engine] \ [-b sched-flags] ipvsadm -D -t|u|f service-address 删除 ipvsadm –C 清空 ipvsadm –R 重载 ipvsadm -S [-n] 保存 管理集群中的real server ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w weight](权重) ipvsadm -d -t|u|f service-address -r server-address 删除RS ipvsadm -L|l [options] 查看rs lvs集群中的增删改 1.管理集群服务中的增删改 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] -A #添加 -E #修改 -t #tcp服务 -u #udp服务 -s #指定调度算法,默认为WLC -p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver -f #firewall mask 火墙标记,是一个数字 管理集群中RealServer的增删改 ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight] ipvsadm -Z [-t|u|f service-address] 清楚计数器 #增加 [root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr [root@DR-server ~]# ipvsadm -A -f 66 -p 3000 #修改 [root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000 #删除 [root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80 [root@DR-server ~]# ipvsadm -D -f 66 -a #添加realserver -e #更改realserver -t #tcp协议 -u #udp协议 -f #火墙 标签 -r #realserver地址 -g #直连路由模式 -i #ipip隧道模式 -m #nat模式 -w #设定权重 -Z #清空计数器 -C #清空lvs策略 -L #查看lvs策略 -n #不做解析 --rate :输出速率信息 pvs规则:/proc/net/ip_vs ipvs连接:/proc/net/ip_vs_conn #添加 [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
dr模式解决的vs的压力
dr只到了二层
3、实验(dr模式)
这是企业最常用的模式
实验准备: 左1 client 左2 router 左3 lvs 右边的三台网关都为192.168.0.100 最左边的网关为172.25.254.100
3.1 lvs
实验环境准备: 需要一张仅主机的网卡
#先把上一题的两个网卡删掉
[root@lvs ~]# nmcli connection delete eth1
[root@lvs ~]# nmcli connection delete eth0
[root@lvs ~]# vmset.sh eth1 192.168.0.50 lvs.jingwen.org
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth1
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
dns=114.114.114.114;
#内核路由功能打开
[root@lvs]# sysctl -a | grep ip_forward
[root@lvs]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
#使其生效
[root@lvs ]#sysctl -p
3.2 路由器
实验准备: 克隆rhel9 名为router 需要两张网卡 有一张仅主机,一张为NAT 分别为这两张网卡设置IP vmset.sh eth0 172.25.254.100 router.jingwen.org vmset.sh eth1 192.168.0.100 router.jingwen.org
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up eth0
[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;
[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up eth1
3.3 client
实验准备: 克隆rhel9 名为client 只有一张网卡 vmset.sh eth0 172.25.254.200 client.jingwen.org
#修改网关
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
dns=114.114.114.114;
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
此时实验准备好了,可以在client上ping其它的四台,能通说明环境没有问题。
开始实验
#使rs主机中vip不对外响应
#在RS1和RS2中解决响应问题
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#清楚lvs之前的策略
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
#在lvs、webserver1、webserver2上加vip
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
#分别都查看一下是否成功
[root@lvs ~]# ip a
#lvs设定策略
ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
ipvsadm -Lr
ip a a 192.168.0.200/32 dev lo
#测试
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
必须要搞清楚原理
4、lvs调度算法
1、静态调度算法
lvs需要做的:根据访问地址来调度
2、动态调度算法
5 实验-防火墙标签解决轮询调度问题
#在两台server上安装 [root@webserver1 ~]# yum install mod_ssl -y [root@webserver1 ~]# systemctl restart httpd [root@webserver1 ~]# systemctl restart httpd [root@webserver2 ~]# yum install mod_ssl -y [root@webserver2 ~]# systemctl restart httpd [root@webserver1 ~]# systemctl restart httpd
#lvs /boot [root@lvs boot]# ipvsadm -Ln [root@lvs boot]# ipvsadm -A -t 192.168.0.200:443 -s rr [root@lvs boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:445 -g [root@lvs boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:445 -g [root@lvs boot]# ipvsadm -Ln #没有实现要求所以删除 ##报错没有证书、忽略证书加上-k [root@lvs boot]# ipvsadm -C
测试结果(没有实现要求,都是访问的20)
#在webserver1和webserver2和lvs上添加vip [root@lvs ~]# ip a a 192.168.0.200/32 dev lo [root@lvs ~]# ip a [root@lvs boot]# ipvsadm -C [root@lvs boot]# iptables -t mangle -nL [root@lvs boot]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m m-dports 80,443 -j MARK --set-mark 66 [root@lvs boot]# iptables -t mangle -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination MARK tcp -- 0.0.0.0/0 192.168.0.200 multiport dportsRK set 0x42
#设定调度规则 [root@lvs boot]# ipvsadm -A -f 66 -s rr [root@lvs boot]# ipvsadm -a -f 66 -r 192.168.0.10 -g [root@lvs boot]# ipvsadm -a -f 66 -r 192.168.0.20 -g [root@lvs boot]# ipvsadm -Ln #出现问题 #客户端访问vip始终为webserver [root@client ~]# curl 192.168.0.200 webserver2 - 192.168.0.20 #解决办法 #在RS1和RS2中解决响应问题 [root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore