1. LVS
(LVS)linux virtual server
- 调度性能极高
- 对客户端请求进行调度
- 没有web服务,并不提供对外服务
- LVS调度器会有一个HA集群,防止调度器down导致崩溃
LVS介绍
LVS : 负载调度器、集成内核(发明人章文嵩阿里)
- 官网: http://www.linuxvirtualserver.org/
调度器
- VS: Virtual Server ,负责调度
- DS:Director Server
RS: Real Server ,负责真正提供服务
- nginx:叫upstream server
- haproxy:叫backend server
- CIP:客户端IP
调度器IP
- VIP:VS外网的IP
- DIP:VS内网的IP
- RIP:提供服务的服务器IP
- 访问流程: CIP<—> VIP == DIP <—>RIP
- L4:四层路由器或交换机
工作原理
- VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS ,根据调度算法来挑选RS

LVS工作原理
Ivs: ipvsadm/ipvs
- ipvsadm :用户空间的命令行工具,规则管理器、用于管理集群服务及RealServer
- ipvs 策略:工作于内核空间netfilter的INPUT上的框架,因为LVS服务器不提供服务,只负责转发,不能让请求通过INPUT,所以会通过DNAT将VIP改成RIP
Lvs集群的工作模式
- Ivs-nat :修改请求报文的目标IP,多目标IP的DNAT
- Ivs-dr :操纵封装新的MAC地址
- Ivs-tun :在原请求IP报文之外新加一个IP首部
- Ivs-fullnat :修改请求报文的源和目标IP
LVS-NAT模式
DNAT(目标地址转换)
- 源地址和端口不变,目标地址替换成要转发的那个服务器地址(RIP)
- 互联网用户访问局域网(私网)
- 本质是多目标IP的DNAT ,通过将请求报文中的目标地址和目标端口修改为某挑
出的RS的RIP和PORT实现转发 - lvs和rs直接可以加路由器(不建议)
- RIP和DIP应在同一个IP网络,且应使用私网地址;- RS的网关要指向DIP- 请求报文和响应报文都必须经由vs转发,vs易于成为系统瓶颈- 支持端口映射,可修改请求报文的目标PORT- VS必须是Linux系统,RS可以是任意OS系统
LVS-DR模式
LVS-DR : Direct Routing,直接路由;LVS默认模式,应用最广泛
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT ,以及目标IP/PORT均保持不变
1.请求报文必须经过LVS,响应报文不需要(LVS压力小很多)2.RS的RIP可以使用私网地址,也可以是公网地址; RIP与DIP在同一IP网络;3.RIP的网关不能指向DIP ,以确保响应报文不会经由Director4.RS和Director要在同一个物理网络5.请求报文要经由Director ,但响应报文不经由Director ,而由RS直接发往Client6.不支持端口映射(端口不能修改),改的是MAC地址7.RS可使用大多数OS系统
Director和各RS都配置有VIP;解决冲突方法:
确保前端路由器将目标IP为VIP的请求报文发往Director
在前端网关做静态绑定VIP和Director的MAC地址(不常用)
在RS上使用arptables工具(不常用)
arptables -A IN -d $VIP j DROParptables -A OUT -S $VIP j mangle --mangle-ip-s $RIP
-
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
LVS-TUN模式
- 远程调度;大企业
- 转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP ),而在原IP报文
之外再封装一个IP首部 (源IP是DIP,目标IP是RIP ) , 将报文发往挑选出的目标
RS ; - RS直接响应给客户端(源IP是VIP,目标IP是CIP )
(1) DIP, VIP, RIP都应该是公网地址
(2) RS的网关一般不能指向DIP
(3)请求报文要经由Director ,但响应不能经由Director
(4)不支持端口映射
(5) RS的OS须支持隧道功能

LVS-FULLNAT模式
- Lvs- fullnat :通过同时修改请求报文的源IP地址和目标IP地址进行转发
lvs和rs直接可以加路由器
- CIP —> DIP
- VIP —> RIP
(1) VIP是公网地址, RIP和DIP是私网地址,且通常不在同一IP网络;因此,
RIP的网关一般不会指向DIP
(2) RS收到的请求报文源地址是DIP ,因此,只需响应给DIP ;但Director还
要将其发往Client
(3)请求和响应报文都经由Director
(4)支持端口映射
注意:此类型kernel默认不支持
总结
| LVS-NAT | LVS-TUN | LVS-DR | |
|---|---|---|---|
| Server | any | Tunneling | Non-arp device |
| server network | private | LAN/WAN | LAN |
| server number | low(10-20) 因为要原路返回,lvs压力比较大 | high(100) | high(100) |
| server gateway | load banlancer / router | own router | own router |
lvs-nat与Ivs- fullnat :请求和响应报文都经由Director
- Ivs-nat : RIP的网关要指向DIP
- Ivs-fullnat : RIP和DIP未必在同- -IP网络,但要能通信
Ivs-dr与lvs-tun :请求报文要经由Director ,但响应报文由RS直接发往Client
- Ivs-dr :通过封装新的MAC首部实现,通过MAC网络转发
- Ivs-tun :通过在原IP报文外封装新IP头实现转发,支持远距离通信
2. ipvs
运行在LVS下的提供负载均衡功能的一种技术
LVS的IP负载均衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,
它的主要作用是:
- 安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。
- 访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
Ipvs具体实现是由ipvsadm这个程序来完成,因此判断一个系统是否具备ipvs功能,只需要察看ipvsadm 程序是否被安装。
支持的协议: TCP,UDPI, AH ,ESP,AH_ ESP, SCTP
ipvs集群:
- 管理集群服务
- 管理RS
安装
yum install -y ipvsadm
程序包: ipvsadm
Unit File: ipvsadm.service
主程序: /usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
配置文件: /etc/sysconfig/ipvsadm-config
scheduler(调度算法)
ipvs scheduler :调度时是否考虑各RS当前的负载状态
- 两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度
- RR : round robin ,轮询
- WRR : Weighted RR ,加权轮询
- SH : (Source Hashing) 实现session sticky (会话粘性)。源IP地址hash运算得出摘要;将来自于同一个IP地址的请求始终发往第一次挑中的RS ,从而实现会话绑定。
- DH : (Destination Hashing );目标地址哈希,将发往同一个目标地址的请求
始终转发至第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡,
如:宽带运营商
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead =value
较小的RS将被调度- LC : (least connections)最少连接;适用于长连接应用;连接数最少就调度
公式:Overhead= activeconns256+ inactiveconns(活动连接数256+非活动连接数) - WLC : (Weighted LC) ,默认调度方法;带权重的最少连接
公式:Overhead =(activeconns 256+ inactiveconns)/weight(活动连接数256+非活动连接数)/ 权重 - SED : Shortest Expection Delay(最短期望延迟),初始连接高权重优先
Overhead=(activeconns+ 1)* 256/weight - NQ : Never Queue ,第一轮均匀分配,后续SED
- LBLC : Locality-Based LC ,动态的DH算法,使用场景:根据负载状态实现
正向代理,动态调度 - LBLCR : LBLC with Replication ,带复制功能的LBLC ,解决LBLC负载不均衡
问题,从负载重的复制到负载轻的RS
- LC : (least connections)最少连接;适用于长连接应用;连接数最少就调度
ipvsadm命令
核心功能:
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看
IPVS规则:/proc/net/ip_vs
ipvs连接:/proc/net/ip_vs_conn
管理集群服务主要操作及命令:增、删、改
#增、改(针对VIP):
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
##删除:
ipvsadm -D -t|u|f service- address
##参数
service-address :
-t|u|f :
-t: TCP协议的端口, VIP:TCP_ PORT
-u: UDP协议的端口, VIP:UDP_ PORT
-f : firewall MARK ,标记,一个数字
[-s scheduler] :指定集群的调度算法,默认为wlc
- 管理集群上RS服务器主要操作及命令:增、删、改
##增、改:
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
server-address :
rip[:port] 如省略port ,不作端口映射
#选项:
Ivs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight :权重
#清空定义的所有内容:
ipvsadm -C
#清空计数器:
ipvsadm -Z [-t|u|f service-address]
#查看:
ipvsadm | [options]
--numeric, -n :以数字形式输出地址和端口号
--exact :扩展信息,精确值
--connection,-C :当前IPVS连接输出
--stats :统计信息
--rate :输出速率信息
保存及重载规则
保存
- 建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save -n > /PATH/TO/IPVSADM_ FILE
ipvsadm -Sn > /PATH/TO/IPVSADM_ _FILE
systemctl stop ipvsadm.service
- 重载
ipvsadm-restore -n < /PATH/FROM/IPVSADM_ _FILE
ipvsadm -Rn < /PATH/FROM/IPVSADM_ FILE
systemctl restart ipvsadm.service
3. LVS-nat实战
配置lvs-nat模型实现管理web服务器
- 网络拓扑
- 选中一台做LVS服务器,并且配置两块网卡
记得编辑虚拟网络编辑器!!!!
- 桥接模式下的网络设置必须跟物理机相同且IP地址要跟物理机的在同一网段
##DIP网卡为ens33,相关配置
DIP地址:192.168.244.128
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="276a0e65-4af7-4be9-92bb-2ecb0300299c"
DEVICE="ens33"
ONBOOT="yes"
#VIP网卡为ens37,相关配置
VIP地址:10.138.171.40
#添加网卡后查看信息
[root@lvs ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens33 276a0e65-4af7-4be9-92bb-2ecb0300299c ethernet ens33
有线连接1 44fbba3f-d64a-3cec-8c10-4418d0568e5e ethernet ens37
#修改名字为ens37
[root@lvs ~]# nmcli connection modify 有线连接\ 1 con-name ens37
#修改网络设置
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
HWADDR=00:0C:29:C7:F2:9D
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=44fbba3f-d64a-3cec-8c10-4418d0568e5e
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
IPADDR=10.138.171.40
NETMASK=255.252.0.0
GATEWAY=10.139.255.254
#关闭防火墙和selinux
[root@lvs ~]# setenforce 0
[root@lvs ~]# vim /etc/selinux/config
[root@lvs ~]# systemctl stop firewalld
[root@lvs ~]# yum install -y ipvsadm
- 配置两台RS
#RS1
1.先下载httpd服务
[root@RS1 ~]# yum install -y httpd
[root@RS1 ~]# systemctl start httpd
[root@RS1 ~]# systemctl enabled httpd
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
2.网络配置,设置网关
[root@r1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=066d8f30-5f27-40b7-909b-3b2e040cf992
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.244.139
NETMASK=255.255.255.0
GATEWAY=192.168.244.128
[root@RS1 ~]# systemctl restart network
#RS2
1.先下载httpd服务
[root@RS2 ~]# yum install -y httpd
[root@RS2 ~]# systemctl start httpd
[root@RS2 ~]# systemctl enabled httpd
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
2.网络配置,设置网关
[root@r2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="276a0e65-4af7-4be9-92bb-2ecb0300299c"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.244.135
NETMASK=255.255.255.0
GATEWAY=192.168.244.128
[root@RS2 ~]# systemctl restart network
- LVS相关命令
#lvs添加路由转发
[root@lvs ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward
#管理lvs以及管理RS
[root@lvs ~]# ipvsadm -A -t 10.138.171.40:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.139:80 -m
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.135:80 -m
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.138.171.40:80 rr
-> 192.168.244.135:80 Masq 1 0 0
-> 192.168.244.139:80 Masq 1 0 0
- 测试
#算法是RR
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
- 修改策略为WRR
#调整策略是WRR,先全部删除再添加
[root@lvs ~]# ipvsadm -A -t 10.138.171.40:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.135:80 -m -w 1
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.139:80 -m -w 2
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.138.171.40:80 wrr
-> 192.168.244.135:80 Masq 1 0 0
-> 192.168.244.139:80 Masq 2 0 0
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
4. LVS-DR实战
DR模型中各主机上均需要配置VIP (在lo环回接口配置),解决地址冲突的方式有三种:
- 在前端网关做静态绑定
- 在各RS使用arptables
- 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别: arp_ ignore
- 0 :默认值,表示可使用本地任意接口上配置的任意地址进行响应
- 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口.上时,才给予响应
限制通告级别: arp_ _announce
- 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
- 1 :尽量避免将接口信息向非直接连接网络进行通告
- 2 :必须避免将接口信息向非本网络进行通告
5. 集群(cluster)
cluster
- 集群,为解决某个特定问题将多台计算机组合起来形成的单个系统,提供单一功能
linux 集群类型
- LB : (Load Balancing )负载均衡,将访问请求根据一定的算法,均匀地分散在不同的服务器上,提升性能。
HA : (High Availiablity)高可用,例如MHA(主服务器宕机后,会有从服务器升级为主服务器); 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%, 9999%
- HPC : (High-performance computing) 高性能。www.top500.org
集群分类
负载均衡集群实现
- 硬件(成本高)
- F5、A10
软件
- LVS:支持四层调度
- nginx:支持七层调度
- haproxy:支持七层调度
- ats:apache traffic server
- 基于工作协议
传输层(通用):目的端口号
- LVS
- nginx:stream
- haproxy
应用层(专用):针对特定协议,自定义的请求模型分类
proxy server:
- http:nginx,httpd,haproxy
- mysql:mysql-proxy
保持会话
会话保持:负载均衡
session sticky:同一用户调度固定服务器;缺点是消耗资源过高
- source IP:LVS sh算法
- cookie
session replication :每台服务器拥有全部session
- session multicast cluster
- session server :专门门的session服务器
- Memcached、Redis
分布式系统
分布式存储:云盘;把数据分散在不同服务器上
分布式计算: hadoop , Spark,云计算;把复杂的任务分成许多小任务给许多服务器计算
