Cluster 简介:
系统扩展的方式:
scale up: 向上扩展
scale out: 向外扩展
集群类型:
LB: 负载均衡集群, Load Balancing
HA: 高可用集群, High Availability
HP: 高性能集群, High Performancing
Availability=90%,95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%
系统:
可扩展性
可用性
容量
性能
系统运维: 可用 --> 标准化 --> 自动化
www.top500.org
构建高可扩展性系统的重要原则: 在系统内部尽量避免串行化和交互;
- GSLB: Global Service Load Balancing
- SLB: Service Load Balancing
总结:
分层
分割
分布式
分布式应用
分布式静态资源
分布式数据和存储
分布式计算
LB 集群的实现:
硬件:
- F5 BIG-IP
- Citrix NetScaler
- A10 A10
- Array
- Redware
软件:
- lvs
- haproxy
- nginx
- ats (apache traffic server)
- perlbal
基于工作的协议层次划分:
传输层:
lvs, haproxy(mode tcp)
应用层:
haproxy, nginx, ats, perlbal
l4: 四层交换, 四层路由;
根据请求报文的目标 IP 和 PORT 将其转发至后端主机集群中的某一台主机(根据挑选算法);
- netfilter:
- PREROUTING --> INPUT
- PREROUTING --> FORWARD --> POSTROUTING
- OUTPUT --> POSTROUTING
- lvs:
- ipvsadm/ipvs
ipvsadm: 用户空间的命令行工具, 用于管理集群服务;
ipvs: 工作内核中 netfilter INPUT 钩子上;
支持 TCP, UDP, AH, EST, AH_EST, SCTP 等诸多协议;
lvs arch:
调度器: director, dispatcher, balancer
- RS: Real Server
- Client IP: CIP
- Director Virutal IP: VIP
- Director IP: DIP
- Real Server IP: RIP
- lvs type:
- lvs-nat
- lvs-dr(direct routing)
- lvs-tun(ip tunneling)
- lvs-fullnat
- lvs-nat:
多目标的 DNAT(iptables); 它通过修改请求报文的目标 IP 地址 (同时可能会修改目标端口) 至挑选出某 RS 的 RIP 地址实现转发;
(1) RS 应该和 DIP 应该使用私网地址, 且 RS 的网关要指向 DIP;
(2) 请求和响应报文都要经由 director 转发; 极高负载的场景中, director 可能会成为系统瓶颈;
(3) 支持端口映射;
(4) RS 可以使用任意 OS;
(5) RS 的 RIP 和 Director 的 DIP 必须在同一 IP 网络;
lvs-dr: direct routing
它通过修改请求报文的目标 Mac 地址进行转发;
- Director: VIP, DIP
- RSs: RIP, VIP
(1) 保证前端路由器将目标 IP 为 VIP 的请求报文发送给 director;
解决方案:
静态绑定
arptables
修改 RS 主机内核的参数
(2) RS 的 RIP 可以使用私有地址; 但也可以使用公网地址;
(3) RS 跟 Director 必须在同一物理网络中;
(4) 请求报文经由 Director 调度, 但响应报文一定不能经由 Director;
(5) 不支持端口映射;
(6) RS 可以大多数 OS;
(7) RS 的网关不能指向 DIP;
lvs-type:
lvs-nat: RIP 与 DIP 必须在同一网段;
lvs-dr:Director 与 RS 必须在同一物理网络;
lvs-tun:
不修改请求报文的 ip 首部, 而是通过在原有的 ip 首部 (cip<-->vip) 之外, 再封装一个 ip 首部(dip<-->rip);
(1) RIP, DIP, VIP 全得是公网地址;
(2) RS 的网关的不能指向 DIP;
(3) 请求报文必须经由 director 调度, 但响应报文必须不能经由 director;
(4) 不支持端口映射;
(5) RS 的 OS 必须支持隧道功能;
lvs-fullnat:
director 通过同时修改请求报文的目标地址和源地址进行转发;
(1) VIP 是公网地址; RIP 和 DIP 是私网地址, 二者无须在同一网络中;
(2) RS 接收到的请求报文的源地址为 DIP, 因此要响应给 DIP;
(3) 请求报文和响应报文都必须经由 Director;
(4) 支持端口映射机制;
(5) RS 可以使用任意 OS;
http: stateless
session 保持:
session 绑定:
- source ip hash
- cookie
session 集群:
session 服务器:
LVS 调度器:
lvs scheduler: #调度器
静态方法: 仅根据算法本身进行调度; #起点公平
RR:round robin, 轮调
WRR:weighted rr, 加权轮询
SH: source hash, 实现 session 保持的机制; 将来自于同一个 IP 的请求始终调度至同一 RS;
DH:destination hash, 将对同一个目标的请求始终发往同一个 RS;
动态方法: 根据算法及各 RS 的当前负载状态进行调度; #结果公平
- Overhead=
- LC:Least Connection #最小连接数
- Overhead=Active256+Inactive
- WLC: Weighted LC #加权最小连接数
- Overhead=(Active256+Inactive)/weight
- SED: Shortest Expection Delay #最短期望延迟
- Overhead=(Active+1)*256/weight
- NQ:Never Queue #永不排队
SED 算法的改进;
LBLC:Locality-Based LC, 即为动态的 DH 算法;
正向代理情形下的 cache server 调度;
LBLCR:Locality-Based Least-Connection with Replication, 带复制功能的 LBLC 算法;
ipvs 的集群服务:
tcp, udp, ah, esp, ah_esp, sctp
(1) 一个 ipvs 主机可以同时定义多个 cluster service; #cluster service 集群服务
tcp, udp
(2) 一个 cluster service 上至少应该一个 real server; #real server 后端主机
定义时: 指明 lvs-type, 以及 lvs scheduler; #lvs-type 集群类型 ; lvs scheduler 集群调度算法
ipvsadm 的用法:
管理集群服务
- ipvsadm -A|E -t|u|f service-address [-s scheduler] #增加命令
- ipvsadm -D -t|u|f service-address #删除命令
- service-address:
- tcp: -t ip:port
- udp: -u ip:port
- fwm: -f mark #防火墙标记
- -s scheculer: #指定调度器
默认为 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:
- ip[:port]
- lvs-type:
- -g: gateway, dr
- -i: ipip, tun
- -m: masquerade, nat
清空和查看:
- ipvsadm -C #清空命令
- ipvsadm -L|l [options] #查询命令
-n: numeric, 基于数字格式显示地址和端口;
-c: connection, 显示 ipvs 连接;
--stats: 统计数据
--rate: 速率
--exact: 精确值
保存和重载:
- ipvsadm -R #重载
- ipvsadm -S [-n] #保存
置零计数器:
ipvsadm -Z [-t|u|f service-address]
DR 模型实践:
lvs-dr:
两个内核参数:
arp_ignore #是否响应对方
参数: 0-8
0, 只要我收到请求, 我有我就响应
1, 请求报文从哪个接口进, 就从哪个接口出.
arp_announce #是否向对方通告
参数有 0,1,2
0, 通告所有网络
1, 尽量不要将我的网段通告给其他网段.
2, 只能用最佳网络地址向网络通告
- director:
- ~]# ifconfig eno16777736:0 172.16.100.10/32 broadcast 172.16.100.10 up
- ~]# route add -host 172.16.100.10 dev eno16777736:0
- RS:
- ~]# echo 1> /proc/sys.NET/ipv4/conf/all/arp_ignore
- ~]# echo 1> /proc/sys.NET/ipv4/conf/eth0/arp_ignore
- ~]# echo 2> /proc/sys.NET/ipv4/conf/all/arp_announce
- ~]# echo 2> /proc/sys.NET/ipv4/conf/eth0/arp_announce
- ~]# ifconfig lo:0 172.16.100.10/32 broadcast 172.16.100.10 up
- ~]# route add -host 172.16.100.10 dev lo:0
FWM 定义集群:
- netfilter:
- PREROUTING --> INPUT
- PREROUTING --> FORWARD --> POSTROUTING
- OUTPUT --> POSTROUTING
- ipvs: INPUT
- FWM:
- PREROUTING:
- -j MARK --set-mark 10
- ipvs:
- -A -f 10
通过 FWM 定义集群的方式:
(1) 在 director 上 netfilter 的 mangle 表的 PREROUTING 定义用于 "打标" 的规则
~]# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dports $port -j MARK --set-mark #
$vip: VIP 地址
$protocol: 协议
$port: 协议端口
(2) 基于 FWM 定义集群服务:
- ~]# ipvsadm -A -f # -s scheduler
- ~]#
功用: 将共享一组 RS 的集群服务统一进行定义;
会话保持, 持久连接
session 保持:
session 绑定
session 复制
session 服务器
session 绑定: lvs sh 算法
对某一特定服务;
lvs persistence:lvs 的持久连接 #在执行参数时, 加入 - p 选项即可进行持久连接设置, 该设置默认是 300s
- ipvsadm -A -t 192.168.0.10:0 -s rr -p
- ipvsadm -a -t 192.168.0.10:0 -r 172.168.100.21 -g
- ipvsadm -a -t 192.168.0.10:0 -r 172.168.100.22 -g
功能: 无论 ipvs 使用何种调度方法, 其都能实现将来自于同一个 Client 的请求始终定向至第一次调度时挑选出的 RS;
持久连接模板: 独立于算法
sourceip rs timer
对多个共享同一组 RS 的服务器, 需要统一进行绑定?
持久连接的实现方式:
每端口持久: PPC, 单服务持久调度
每 FWM 持久: PFWMC, 单 FWM 持久调度
PORT AFFINITY
每客户端持久: PCC, 单客户端持久调度
director 会将用户的任何请求都识别为集群服务, 并向 RS 进行调度
- TCP:1-65535
- UDP: 1-65535
- HA:
- SPOF: Single Point of Failure
director: 高可用集群;
realserver: 让 director 对其做健康状态检测, 并且根据检测的结果自动完成添加或移除等管理功能;
1, 基于协议层次检查
ip: icmp
传输层: 检测端口的开放状态
应用层: 请求获取关键性的资源
2, 检查频度 #取决用户层面或者业务架构层次
3, 状态判断
下线: ok --> failure --> failure --> failure
上线: failure --> ok --> ok
- 4,back server, sorry server
- LVS
来源: http://www.bubuko.com/infodetail-2915426.html