目录
[二.lvs(Linux virtual server) 运行原理](#二.lvs(Linux virtual server) 运行原理)
一.集群和分布式简介
1.系统性能扩展方式
Scale UP :向上扩展 , 增强
Scale Out :向外扩展 , 增加设备,调度分配问题, Cluster
2.集群Cluster
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(高性能计算,国家战略资源,不在课程范围内)
3.分布式
分布式存储 **:**Ceph , GlusterFs , FastDFS , MogileFs
分布式计算 **:**hadoop , Spark
分布式常见应用
分布式应用------ 服务按照功能拆分,使用微服务
分布式静态资源------ 静态资源放在不同的存储集群上 分布式数据和存储 -- 使用 key-value 缓存系统
分布式计算------ 对特殊业务使用分布式计算,比如 Hadoop 集群
4.集群和分布式
- 集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
- 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
- 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率,
- 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
二.lvs(Linux virtual server) 运行原理
1.lvs介绍
LVS:linux Virtual Server,负载调度器,内核集成,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
LVS只能做到四层负载无法做到七层
LVS 官网 : http://www.linuxvirtualserver.org/
LVS 相关术语
- VS: Virtual Server,负责调度
- RS:RealServer,负责真正提供服务
2.lvs集群体系结构
用户(user)请求通过网络到达lvs(load balance),两个共同组成了高可用,一个出问题另一个立即顶替,保证了稳定性,然后负责将请求调度到真正的real server上, 调度也有四种方式(lvs-nat, lvs-dr,lvs-tun,lvs-fullnat)。调度过来到底给那台,用到lvs的算法。
3.LVS****概念
VS : Virtual Server
RS : Real Server
CIP : Client IP
VIP: Virtual serve IP VS 外网的 IP(对客户开放)
DIP: Director IP VS 内网的 IP (对real server开放)
RIP: Real server IP (real server自身ip)
访问流程: CIP <--> VIP == DIP <--> RIP
4.lvs****集群的类型
lvs-nat : 修改请求报文的目标IP, 多目标 IP 的 DNAT (就是user访问到lvs,lvs做了个转换,直接访问real server)
lvs-dr : 操纵封装新的 MAC 地址
lvs-tun : 在原请求IP 报文之外新加一个 IP 首部
lvs-fullnat : 修改请求报文的源和目标 IP
nat模式
Ivs-nat:
- 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
nat模式数据逻辑
- 客户端发送访问请求,请求数据包中含有请求来源( cip ),访问目标地址( VIP )访问目标端口
( 9000port )
2.VS 服务器接收到访问请求做 DNAT 把请求数据包中的目的地由 VIP 换成 RS 的 RIP 和相应端口
3.RS1 相应请求,发送响应数据包,包中的相应保温为数据来源( RIP1 )响应目标( CIP )相应端口
( 9000port )
4.VS 服务器接收到响应数据包,改变包中的数据来源( RIP1-->VIP ) , 响应目标端口( 9000-->80 )
5.VS 服务器把修改过报文的响应数据包回传给客户端
6.lvs 的 NAT 模式接收和返回客户端数据包时都要经过 lvs 的调度机,所以 lvs 的调度机容易阻塞
lvs-nat模式原理及部署方法
实验环境部署
设备 角色 ip
rhel9-lvs lvs vip:192.168.10.129/24
dip: 192.168.94.130/24
rhel9-ndoe1 RS1 rip: 192.168.94.135/24
rhel9-node2 RS2 rip: 192.168.94.140/24
rhel9-node3 Client cip: 192.168.10.160/24
rhel9-lvs
rhel-node1,rhel-ndoe2
rhel-node3
注:nat模式和仅主机模式是为了区分网络。(nat模式看作外网,仅主机模式看作内网)
rhel-lvs :
由于lvs两个网卡上的ip属于两个网段,是不通信的,所以需要打开其内核路由功能
bash
[root@rhel9-lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1 # 这里默认的是0,需要改成1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
bash
[root@rhel9-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
# 在配置文件的最后一行加上
bash
[root@rhel9-lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
# 加上配置参数后不回立刻生效,需要输入以上指令,才回生效
rhel-node1,rhel-node2的网关必须指向lvs(就是192.168.94.130)
bash
[root@rhel-node1 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
# 修改配置文件中的网关
[root@rhel-node1 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.135/24,192.168.94.130
[root@rhel-node1 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@rhel-node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.130 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
bash
[root@node2 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@node2 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.140/24,192.168.94.130
[root@node2 ~]# nmcli connection reload
[root@node2 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@node2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.130 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
在rhel-node1和rhel-node2上安装web服务
bash
[root@rhel-node1 ~]# systemctl stop firewalld.service
[root@rhel-node1 ~]# setenforce 0
[root@rhel-node1 ~]# getenforce
Permissive
# 关闭防火墙和selinux
[root@rhel-node1 ~]# yum install httpd -y
[root@rhel-node1 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
# 开机自启加启动
[root@rhel-node1 ~]# echo node1 - 192.168.94.135 > /var/www/html/index.html
# 将内容写入共享目录
[root@rhel-node1 ~]# systemctl restart httpd
bash
[root@rhel-node2 ~]# systemctl stop firewalld.service
[root@rhel-node2 ~]# setenforce 0
[root@rhel-node2 ~]# getenforce
Permissive
# 关闭防火墙和selinux
[root@rhel-node2 ~]# yum install httpd -y
[root@rhel-node2 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
# 开机自启加启动
[root@rhel-node2 ~]# echo node2 - 192.168.94.140 > /var/www/html/index.html
# 将内容写入共享目录
[root@rhel-node2 ~]# systemctl restart httpd
注:在实验当中两个服务器内容不一样是为了更清晰的展现效果,在工作中两个服务器内容应当一致。
在rhel-lvs主机中检测:
bash
[root@rhel9-lvs ~]# curl 192.168.94.135
node1 - 192.168.94.135
[root@rhel9-lvs ~]# curl 192.168.94.140
node2-192.168.94.140
#lvs主机应当看可以正常范围到两个web服务器中的内容
以上均为实验开始前的环境部署
实验流程
在lv主机上安装lvs软件包
bash
[root@rhel9-lvs ~]# yum install ipvsadm -y
查看当前策略
bash
[root@rhel9-lvs ~]# ipvsadm -Ln
# 查看当前策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 当前无策略
在lvs主机上开始写入策略
bash
[root@rhel9-lvs ~]# ipvsadm -A -t 192.168.10.129:80 -s rr
# -A 表示增加虚拟server, -t 表示增加的调度是tcp协议的服务
# 后面输入的ip是客户访问此ip时开始调度:后加访问的端口
# -s 是指定你的调度算法 rr 是轮巡(静态算法)
[root@rhel9-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.10.129:80 rr
# 该策略有了之后,后段需要调度那些主机,需要继续写出来
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.135:80 -m
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.140:80 -m
[root@rhel9-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.10.129:80 rr
-> 192.168.94.135:80 Masq 1 0 0
-> 192.168.94.140:80 Masq 1 0 0
# -r 表示real server 真实主机
# -m 表示我们当前用的lvs的模式是nat ,同理,-g 则表示直连路由, -i表示tun,隧道模式
# -w 指定权重,就是给谁多给谁少, 因为此时的算法是rr,和-w 冲突,所以不生效,要想生效算法应写wr
检测:当访问192.168.10.129时,他真正访问的应该是后端的服务器
注意,lvs主机的防火墙和selinux也要关闭
bash
[root@rhel9-lvs ~]# for i in {1..10}
> do
> curl 192.168.10.129
> done
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
# 因为是轮循的算法,所以是你一次我一次
# 在企业中两次访问结果应是一致的,以上只是测试,为了更好的提现效果
bash
[root@rhel9-lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
# 保存策略
原理
客户把流量打到了vip上,vip得到流量以后去读取我们lvs的规则策略,看是给谁的,然后查看调度算法是什么,得到调度算法后,按照调度算法对后端的real server(rs)进行调度,调度后rs得到了请求,rs看到的请求是cip, 但是rs无法仍过来数据请求,所以他只能向网关里面扔数据请求,而rs的网关恰恰是lvs的dip,网关处理扔过来的数据请求,最后通过lvs主机的vip来转发到我们的客户。
三.lvs部署命令介绍
1.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
2.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
ipvsadm -Z [-t|u|f service-address] 清楚计数器