目录
一、集群与分布式
1.1 集群介绍
1.2 分布式系统
1.3 集群设计原则
二、LVS
2.1 lvs工作原理
2.2 lvs集群体系架构
编辑
2.3 lvs功能及组织架构
2.4 lvs集群类型中术语
三、LVS工作模式和命令
3.1 lvs集群的工作模式
3.1.1 lvs的nat模式
3.1.2 lvs的dr模式
3.1.3 工作模式总结比较
3.2 lvs调度算法
四、ipvsadm工具
4.1 ipvsadm工具选项
五、LVS DR模式部署
编辑
5.1 环境配置
一、集群与分布式
1.1 集群介绍
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
Cluster分为三种类型:
-
LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
-
HA: High Availiablity,高可用,避免 SPOF(single Point Of failure) 单点故障
-
HPC: High-performance computing,高性能
1.2 分布式系统
分布式存储:Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark
分布式常见应用
-
分布式应用-服务按照功能拆分,使用微服务(单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值服务)
-
分布式静态资源--静态资源放在不同的存储集群上
-
分布式数据和存储--使用key-value缓存系统
-
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.3 集群设计原则
-
可扩展性—集群的横向扩展能力
-
可用性—无故障时间 (SLA service level agreement)
-
性能—访问响应时间
-
容量—单位时间内的最大并发吞吐量(C10K 并发问题)
二、LVS
2.1 lvs工作原理
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS(真实服务器),根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”。
2.2 lvs集群体系架构
2.3 lvs功能及组织架构
负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性。
2.4 lvs集群类型中术语
-
VS(代理服务器):Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(lvs服务器) 代理服务器
-
RS(真实服务器):Real Server(lvs), upstream server(nginx), backend server(haproxy)(真实服务器)
-
CIP:Client IP(客户机IP) 客户机的ip
-
VIP:Virtual serve IP VS外网的IP 代理服务器的 外网ip
-
DIP:Director IP VS内网的IP 代理服务器的 内网ip
-
RIP:Real server IP 真实服务器的 ip地址
访问流程:CIP <--> VIP == DIP <--> RIP
三、LVS工作模式和命令
3.1 lvs集群的工作模式
-
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
-
lvs-dr:操纵封装新的MAC地址(直接路由)
-
lvs-tun:隧道模式
-
lvs-fullnat:修改请求报文的源和目标IP
3.1.1 lvs的nat模式
1 当客户端 发起请求报文是:
源ip:客户端的ip地址(cip)
目的地址: vip(代理服务器的外网地址)
2.当数据包到达我们的 代理服务器 源ip不变, 需要修改目的ip及端口号
源ip:客户端的ip地址(cip)
目的地址: rip (后端真实服务器ip)
3 .真实服务器 收到报文后 构建响应报文
源ip:改成真实服务器自己的ip(vip 是内网地址)
目的地址: cip 外网客户端地址
4.再发给代理服务器, 代理服务会修改 源ip 将内网地址 改成外网地址
源ip:代理服务器的 外网ip (vip)
目的地址: cip (外网客户端的地址)
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某处的RS的RIP和PORT实现转发
(1)RIP(真实服务器)和DIP(代理服务器的内网地址)应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由lvs服务器转发,lvs服务器易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
3.1.2 lvs的dr模式
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN
模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道
直接路由,LVS默认模式,应用最广泛,通过请求报文重新封装一个MAC首部
进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
DR模式的特点:
-
Director和各RS都配置有VIP
-
确保前端路由器将目标IP为VIP的请求报文发往Director
-
在前端网关做静态绑定VIP和Director的MAC地址
-
在RS上使用arptables工具
4. RS和Director要在同一个物理网络
5. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
6. 不支持端口映射(端口不能修改)
7. 无需开启 ip_forward
8. RS可使用大多数OS系统
3.1.3 工作模式总结比较
DR | TUN | DR | |
---|---|---|---|
优点 | 端口转换 | WAN | 性能最好 |
缺点 | 性能瓶颈 | 服务器支持隧道模式 | 不支持跨网段 |
真实服务器要求 | any | Tunneling | Non-arp device |
支持网络 | private(私网) | LAN/WAN(私网/公网) | LAN(私网) |
真实服务器数量 | low (10~20) | High (100) | High (100) |
真实服务器网关 | lvs内网地址 | Own router(网工定义) | Own router(网工定义) |
3.2 lvs调度算法
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态
分为两种:
静态方法: 不管后端真实服务器的 状态,根据自身 算法进行调度
动态方法: 会根据后端服务器的状态来进行调度
仅根据算法本身进行调度
静态:
1、RR:roundrobin,轮询,较常用
2、WRR:Weighted RR,加权轮询,较常用 先算总权重 再用自己的 权重去除以 总权重
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存 缓存
动态: 一个参考值 来确定服务器是否忙 这个值越小 代表服务器 闲 就会优先调度给闲的服务器
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、LC:least connections 适用于长连接应用 最小连接数 不考虑权重
Overhead=activeconns*256+inactiveconns
2、WLC:Weighted LC,默认调度方法,较常用 默认调度 加权最小连接数 第一轮不合理 都是 一样的 优先级
Overhead=(activeconns*256+inactiveconns)/weight
3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接 权重小的 空闲的
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等 检查 后端服务器忙不忙
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
四、ipvsadm工具
4.1 ipvsadm工具选项
-A: 添加虚拟服务器
-D: 删除整个虚拟服务器
-C: 清空所有
-R: 重新加载,同ipvsadm-restore
-s: 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc)
-a: 添加真实服务器(节点服务器)
-d: 删除某一个节点
-t: 指定VIP地址及TCP端口
-r: 指定RIP地址及TCP端口
-m: 表示使用NAT群集模式
-g: 表示使用DR模式
-i: 表示使用TUN模式
一w: 设置权重(权重为0时表示暂停节点)
-p 60: 表示保持长连接60秒
-l: 列表查看 LVS虚拟服务器(默认为查看所有)
-n: 以数字形式显示地址、端口等信息,常与"-l“选项组合使用。ipvsadm -ln
ipvsadm使用yum安装即可
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
五、LVS DR模式部署
客户机发起请求,经过调度服务器(lvs),经过算法调度,去访问真实服务器(RS)
由于不原路返回,客户机不知道,真实主机的ip地址,
所以只能通过调度服务器的外网ip(vip)去反回报文信息。
第一次访问完整(不考虑实际问题)
客户端---->外网地址12.0.0.100 12.0.0.100---->客户端
#12.0.0.18-----客户端 客户端会直接丢弃
对每台真实服务器配置外网地址 12.0.0.100
12.0.0.100------>客户端问题1
多台服务器配置同一虚拟IP地址会导致IP地址冲突解决:
路由器发送ARP请求(广播)
ARP---->广播去找ip地址解析成mac地址
默认使用调度服务器上的外网地址(vip地址)响应,
在真实服务器上修改内核参数
使真实服务器只对自己服务器上的真实IP地址响应ARP解析。第二次再有访问请求
问题2
路由器上绑定了 真实服务器1的mac信息,请求到达真实服务器解决:
在真实服务器上修改内核参数
只对所有服务器真实网卡上的地址进行反馈,解析
5.1 环境配置
DR服务器:192.168.254.100
web服务器1:192.168.254.101
web服务器2:192.168.254.102
客户端:192.168.254.200
vip(虚拟回环):192.168.254.188
DR服务器
systemctl stop firewalld setenforce 0yum install -y ipvsadmcd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens33:0vim ifcfg-ens33:0 NAME=ens33:0 DEVICE=ens33:0 IPADDR=192.168.254.188 NETMASK=255.255.255.255systemctl restart networkifup ifcfg-ens33:0vim /etc/sysctl.conf net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0sysctl -pipvsadm-save > /etc/sysconfig/ipvsadmsystemctl start ipvsadm ipvsadm -Cipvsadm -A -t 192.168.254.188:80 -s rr ipvsadm -a -t 192.168.254.188:80 -r 192.168.254.101:80 -g ipvsadm -a -t 192.168.254.188:80 -r 192.168.254.102:80 -gipvsadm-save > /etc/sysconfig/ipvsadm
web1服务器:
yum install -y httpdifconfig lo:0 192.168.254.188/32 route add -host 192.168.254.188 dev lo:0vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 sysctl -p
web2服务器:
yum install -y httpdifconfig lo:0 192.168.254.188/32 route add -host 192.168.254.188 dev lo:0vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 sysctl -p
客户端:
curl 192.168.254.188