Cluster:计算机集合,为解决某个特定问题组合起来形成的单个系统。
LB:Load Balancing # 负载均衡
HA:High Availiablity # 高可用
A=MTBF/(MTBF+MTTR) # 计算公式
HP:High Performance # 高性能
硬件
F5 Big-IP
Citrix Netscaler
A10
软件
lvs # Linux Virtual Server
nginx
haproxy
ats # apache traffic server
perlbal
pound
传输层(通用):(DPORT)
lvs
nginx:(stream)
haproxy:(mode tcp)
应用层(专用):(自定义的请求模型分类)
proxy server:
http:nginx(http), httpd, haproxy(mode http), ...
fastcgi:nginx, httpd, ...
mysql:ProxySQL, ...
...
LVS 是一个四层路由器或四层交换机(针对于OSI 7层模型),VS(Virtual Server)根据请求报文的目标IP和目标协议及端口将其调度转发至某RS(Real Server),根据调度算法来挑选RS。
iptables # 用户空间的管理工具
netfilter # 内核空间上的框架
三种数据流向:
流入 # PREROUTING --> INPUT
流出 # OUTPUT --> POSTROUTING
转发 # PREROUTING --> FORWARD --> POSTROUTING
nat table:
DNAT # 目标地址转换---PREROUTING
SNAT # 源地址转换---POSTROUTING
LVS 使用 ipvsadm/ipvs 来实现。
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
VS:Virtual Server, Director, Dispatcher, Balancer
RS:Real Server, upstream server, backend server
CIP:Client IP
VIP: Virtual server IP
RIP: Real server IP
DIP: Director IP
CIP <--> VIP == DIP <--> RIP
lvs-nat # 修改请求报文的目标IP;多目标IP的DNAT
lvs-dr # 操纵封装新的MAC地址
lvs-tun # 在原请求IP报文之外新加一个IP首部
lvs-fullnat # 修改请求报文的源和目标IP
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
注意事项:
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
注意事项:
Director和各RS都得配置使用VIP
确保前端路由器将目标IP为VIP的请求报文发往Director:
(a) 在前端网关做静态绑定;
(b) 在RS上使用arptables;
(c) 在RS上修改内核参数以限制arp通告及应答级别
arp_announce
arp_ignore
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
RS跟Director要在同一个物理网络
请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client
不支持端口映射
针对此类型的一些问题和解决方法:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。
注意事项:
通过同时修改请求报文的源IP地址和目标IP地址进行转发。
注意事项:
lvs-nat, lvs-fullnat:请求和响应报文都经由Director
lvs-nat # RIP的网关要指向DIP
lvs-fullnat # RIP和DIP未必在同一IP网络,但要能通信
lvs-dr, lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr # 通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun # 通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信
根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种。
静态方法:仅根据算法本身进行调度。根据算法本身进行调度,不考虑后端服务器的运行状态,负载的效果有限。
动态方法:主要根据每RS当前的负载状态及调度算法进行调度。根据算法及各RS的当前的负载状态进行评估,如果负载较小的会负载下一个请求,其根据overhead值来分配请求。
LC : least connection(最少连接),如果RS的连接数都一样,会进行轮循,overhead值小的将会接收下一次请求
overhead计算公式: active(活动连接数)*256+inactive(非活动连接数)
缺点: 不能根据服务器的性能进行分发请求
WLC : weighted LC ,overhead小的将接收下一次请求
overhead计算公式: active*256+inactive/weight
缺点: 当两台活动连接都为0,将进行轮循,如果正好轮循到了权重小的响应,这样是不理想的
SED算法就是解决这个问题的
SED : shortest expction delay, 最短期望延迟,是WLC算法的改进
overhead计算公式:(active+1)*256/weight
缺点: 如果权重差别很大的情况下, 权重小的就空闲了
NQ : Nerver Queue(它是SED算法的改进,当用户请求进来的时候, 服务器事先根据用户的请求,依照权重大小依次分配,随后再根据SED算法分配)
LBLC : Locality-based LC(它是一个动态的DH算法,客户端请求一个目标地址时,当没有目标地址的连接记录,将挑选一个负载小的网关发送, 其也是正向代理时使用的算法)
LBLCR : LBLCR with replication, 带复制的LBLC(当有一个目标地址被一个缓存服务器大量缓存, 而用户又大师的请求此目标地址,此时另一台缓存服务器就过于空闲,此时LBLCR算法就会通过将压力大的缓存服务器内容复制一份到空闲的缓存服务器)
在Web服务通信中,HTTP本身是无状态协议,不能标识用户来源,此时出现了一个问题,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,你之前的登陆的信息就都丢失了。在LVS中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器。
共享存储
NAS # network attached storage(文件级别存储服务器)
SAN # Storage Area Network(块级别存储)
DS # Distributed Storage(分布式文件级别存储)
数据同步
Rsync
LVS分为两个部件:ipvs 和 ipvsadm。
集群和集群之上的各RS是分开管理的;集群定义和RS定义使用不同的命令。
如何确认 Linux 内核是否支持 IPVS?
可通过查看内核的配置文件来进行查看:
~]# grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64
支持的协议:TCP, UDP, AH, ESP, AH_ESP, SCTP
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
命令核心功能:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
增、改:
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
-p :
持久连接模式
增、改:
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]
选项:
lvs类型:
-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
# ipvsadm -L|l [options]
--numeric, -n # numeric output of addresses and ports,数字格式显示地址和端口
--exact # expand numbers (display exact values),精确值
--connection,-c # output of current IPVS connections,显示ipvs的连接
--stats # output of statistics information,统计数据
--rate # output of rate information,速率
# ipvsadm -ln -c # 连接追踪结果,能够显示哪些主机进行访问
[root@Neo_Tang ~]# ipvsadm -ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:15 TIME_WAIT 192.168.1.10:57778 192.168.1.11:80 192.168.10.13:80
TCP 00:21 TIME_WAIT 192.168.1.9:33258 192.168.1.11:80 192.168.10.12:80
TCP 00:21 TIME_WAIT 192.168.1.9:33256 192.168.1.11:80 192.168.10.12:80
TCP 00:15 TIME_WAIT 192.168.1.10:57774 192.168.1.11:80 192.168.10.13:80
TCP 00:21 TIME_WAIT 192.168.1.9:33262 192.168.1.11:80 192.168.10.12:80
TCP 00:21 TIME_WAIT 192.168.1.9:33254 192.168.1.11:80 192.168.10.12:80
TCP 00:15 TIME_WAIT 192.168.1.10:57776 192.168.1.11:80 192.168.10.13:80
TCP 00:15 TIME_WAIT 192.168.1.10:57770 192.168.1.11:80 192.168.10.13:80
TCP 00:21 TIME_WAIT 192.168.1.9:33260 192.168.1.11:80 192.168.10.12:80
TCP 00:15 TIME_WAIT 192.168.1.10:57772 192.168.1.11:80 192.168.10.13:80
ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
清除规则:
# ipvsadmin -C
保存:
# ipvsadm -S = ipvsadm-save
# ipvsadm -R = ipvsadm-restore
# ipvsadm-save > /PATH/TO/IPVSADM_FILE
# ipvsadm -S > /PATH/TO/IPVSADM_FILE
# systemctl stop ipvsadm.service
重载:
# ipvsadm -R = ipvsadm-restore
# ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
# ipvsadm -R < /PATH/FROM/IPVSADM_FILE
# systemctl restart ipvsadm.service
计数器清零:
# ipvsadm -Z [-t | u | f server-address]
查看命令帮助:
# ipvsadm -h # 命令帮助
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
其它命令示例:
一般可以保存至 /etc/sysconfig/ipvsadm 中
# ipvsadm -S -n > /etc/sysconfig/ipvsadm # 进行规则保存,使用 -n 不进行反解,速度更快
删除规则后,可以进行重载
# ipvsadm -C
# ipvsadm -ln
# ipvsadm -R < /etc/sysconfig/ipvsadm
第二种重载规则的方法:
# ipvsadm -C
# ipvsadm -ln
# systemctl start ipvsadm.service # 启动程序时,会去 /etc/sysconfig/ipvsadm 中进行规则重载
第二种保存规则的方法:
# rm -rf /etc/sysconfig/ipvsadm
# systemctl stop ipvsadm.service # 停止程序时,会自动进行保存
# cat /etc/sysconfig/ipvsadm
(1) Director不可用,整个系统将不可用;SPoF
解决方案:高可用
keepalived
heartbeat/corosync
(2) 某RS不可用时,Director依然会调度请求至此RS
解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用
keepalived
heartbeat/corosync, ldirectord
检测方式:
(a) 网络层检测
(b) 传输层检测,端口探测
(c) 应用层检测,请求某关键资源
Daemon to monitor remote services and control Linux Virtual Server. ldirectord is a daemon to monitor and administer real servers in a cluster of load balanced virtual servers. ldirectord typically is started from heartbeat but can also be run from the command line.
配置示例
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=no
virtual=5
real=172.16.0.7:80 gate 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request="index.html"
receive="CentOS"
NAS:Network Attached Storage
nfs/cifs
文件系统接口
SAN:Storage Area Network
“块”接口