1 集群的概念
- Cluster的概念
- 当系统的性能实在是不够用,一般的系统的扩展方式
Scale Up: 向上扩展,增强
Scale Out: 向外扩展,增加设备,但是存在调度问题
Cluster: 集群,为解决某个特定的问题将多台计算机组合起来形成的单个系统
Linux Cluster类型:
LB: Load Balancing, 负载均衡
HA: High Availiablity,高可用,解决SPOF(Single Point Of Failuer)单点故障
HPC: High-performance computing,高性能计算
分布式系统:
分布式存储:云盘
分布式计算: hadoop, Spark
- Cluster 的分类
硬件:
F5 Big-IP
Citrix Netscaler
A10
软件:
LVS: Linux Virtual Server
nginx: 支持四层调度
haproxy:支持四层调度
基于工作的协议层次划分:
传输层(通用):DPORT
lvs,nginx(stream),haproxy(mode tcp)
应用层(专用):对特定的协议
proxy server(代理服务器)
http: nginx, httpd, haproxy(mode http)
fastcgi: nginx, httpd
mysql: mysql-proxy
- 与Cluster相关的一些问题及解决
会话保持: 负载均衡
1 session sticky: 同一个用户调度固定的服务器
Source IP: LVS sh 算法(对特定的服务而言)
Cookie
2 session replication: 每一台拥有的全部的session
session multicast cluster
3 session server: 专门的session服务器
Memcached, Redis
HA集群实现方案:
keepalived:基于 vrrp(虚拟冗余路由协议)
ais:application interface standard(应用接口规范)
heartbeat, cman+rgmanager, corosync+pacemaker
2 LVS的介绍
- LVS: Linux Virtual Server,负载调度器,集成内核(在netfileter的框架上),由章文嵩研发
lvs:基于四层调度,根据一定的算法将客户端的请求分发给后端的服务器
工作原理: VS根据请求的报文的目标IP和目标协议及端口将其调度转发到某RS,根据调度算法来挑选RS
iptables/netfilter:
iptables:用户空间的管理工具
netfileter: 内核空间的框架
流入: PREROUTING --> INPUT
流出: OUTPUT --> POSTROUTING
转发: PREROUTING --> FORWARD --> POSTROUTING
查看内核是否支持ipvs
grep -i -A 20 'ipvs' /boot/config-xxx
- LVS的概念:
- LVS中的一些术语
VS: VIrtual Server,Director Server(DS)
Dispatcher(调度器),Load Balancer
RS: Real Server(lvs), upstream server(在nginx中叫), backend server(在haproxy叫)
CIP: Client IP
VIP: Virtual server IP VS外网的IP
DIP: Direcor IP VS内网的IP
RIP: Real server IP 真是服务器的IP地址
访问流程: CIP <--> VIP==DIP <-->RIP
- LVS 集群的类型:
lvs: ipvsadm/ipvs
ipvsadm: 用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer
ipvs: 工作于内核空间netfilter的INPUT钩子上的框架
支持的协议: tcp udp ah_esp esp ah sctp
lvs集群的类型:
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标
- lvs-nat
lvs-nat
多目标DNAT(iptables) 他通过修改报文的目标IP地址(同时可能会修改目标端口)至挑选出来某RS的RIP地址实现转发
1 RS 应该使用私有网络地址,且RS的网关指向DIP(DIP和RIP之间可以使用路由器)
2 请求和相应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈
3 支持端口映射
4 RS 可以使用任意操作系统
5 RS的RIP和Director的DIP在同一IP网络,也可以不在同一个网段
- lvs-dr
1 保证前端路由器将目标IP为VIP的请求报文发送给director
解决方案
静态绑定
arptables 后台主机不能使windows
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
修改RS主机内核参数
arp_announce
arp_ignore
2 RS的RIP可以使用私有地址,但是也可以使用公网地址
3 RS跟Director必须在同一物理网络中
4 请求报文经由Director 调度,但响应报文一定不能经由Director;
5 不支持端口映射
6 RS 可以是大多数操作系统
7 RS的网关不能指向DIP
- 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: 这种类型kernel不支持,所以也就不做介绍了
-
LVS工作模式的总结
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat: DIP的网关指向DIP
lvs-fullnat: DIP和RIP未必在同一个网络,但要能够通信
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr: 通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun: 通过在原IP报文封装新的IP头,实现转发,支持远程通信
- ipvs scheduler: lvs的调度算法
根据是否考虑各个RS的负载状态,可分为两种:动态算法和静态算法
静态算法:四种
1 RR: roundrobin,轮训
2 WRR: weight RR, 加权的轮训
3 SH: source hashing,实现 session sticky,源地址hash,将来自统一个IP的地址的请求始终发送给第一次挑中的RS,从而实现会话绑定,粒度比较粗
4 DH: destination hashing: 目标地址hash,将发往同一个目标地址的请求始终发至第一次挑中的RS,典型的场景是正向代理缓存场景中的负载均衡
动态算法:
1 LC: least connections 适用于长连接使用 overhead=active*256+inactiveconns
2 WLC: weight LC: 默认调度算法 overhead=(activeconns*256+inactiveconns)/weight
3 SED: shortest Expection Delay: 初始连接权重优先 overhead=(activeconns+1)*256/weight
4 NQ: nerver queue: 第一次均匀分配,后续SED
5 LBLC: locality-based lc,动态的DH算法,场景:根据负载状态实现正向代理
6 LBLCR: LBLC with Replication,带复制功能的LBLC,解决LBLC不均匀问题,从负载重的复制到负载轻的RS
- ipvsadm
ipvsadm 用法同iptables
管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] E 修改
ipvsadm -D -t|u|f service-address
service-address
tcp: -t ip:port
udp: -u ip:port
fwm: -f mark
-s scheduler
管理集群服务中的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 numberic 基于数字格式显示地址和端口
-c connetcion 显示ipvs连接
--rate 速率
--stats 统计数据
--exact 精确值
保存和重载
ipvsadm -R
ipvsadm -S [n]
置零计数器
ipvsadm -Z [-t|u|f service-address]
3 LVS的实现
-
lvs-nat
1 布置此环境的时候,使用linux的主机进行实现
2 route的转发的功能需要实现,Director的核心转发就不需要打开
3 将RIP1和RIP2的网关指向DIP
4 然后在Director上写转发规则
5 在各RS布置上服务如,mysql或httpd的服务
6 在Director上写规则,使用的是mysql和http并且是使用的轮训的算法
ipvsadm -A -t 192.168.8.3:80 -s rr
ipvsadm -a -t 192.168.8.3:80 -r 172.18.23.71:80 -m -w 1
ipvsadm -a -t 192.168.8.3:80 -r 172.18.23.72:80 -m -w 2
ipvsadm -A -t 192.168.8.3:3306 -s rr
ipvsadm -a -t 192.168.8.3:3306 -r 172.18.23.71:3306 -m -w 1
ipvsadm -a -t 192.168.8.3:3306 -r 172.18.23.72:3306 -m -w 2
- lvs-dr
DIP和VIP是同网段的地址,如果用到生产环境,会需要很多的公网IP
1 布置此环境的时候,使用linux的主机进行实现
2 ,Director,route的转发的功能需要实现
3 将Director,RIP1和RIP2的网关指向router 2
4 在各个RS的服务器上修改内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 172.18.23.100/32 broadcast 172.18.23.100 up
route add -host 172.18.23.100 dev lo:0
5 在Director上配置IP地址
ifconfig ens33 172.18.23.100/32 broadcast 172.18.23.100 up
route add -host 172.18.23.100 dev ens33
6 在Director上写ipvs规则
ipvsadm -A -t 172.18.23.100:80 -s rr
ipvsadm -a -t 172.18.23.100:80 -r 172.18.23.71:80 -g -w 1
ipvsadm -a -t 172.18.23.100:80 -r 172.18.23.72:80 -g -w 2
ipvsadm -A -t 172.18.23.100:3306 -s rr
ipvsadm -a -t 172.18.23.100:3306 -r 172.18.23.71:80 -g -w 1
ipvsadm -a -t 172.18.23.100:3306 -r 172.18.23.72:80 -g -w 2
DIP和VIP是同网段的地址,可以使用内网IP
1 布置此环境的时候,使用linux的主机进行实现
2 Director,router的转发的功能需要实现,并且router上还应当有192.168.80.0/24地址,否则可能会有问题
3 将Director,RIP1和RIP2的网关指向router 2
4 在各个RS的服务器上修改内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.8.8/32 broadcast 192.168.8.8 up
route add -host 192.168.8.8 dev lo:0
5 在Director上配置IP地址
ifconfig ens33 192.168.8.8/32 broadcast 192.168.8.8 up
route add -host 192.168.8.8 dev ens33
6 这种方式,需要在前段路由器上添加一条路由规则,执行vip,通过route2 的网卡
7 在Director上写规则
ipvsadm -A -t 192.168.8.8 -s rr
ipvsadm -a -t 192.168.8.8:80 -r 172.18.23.71:80 -g -w 1
ipvsadm -a -t 192.168.8.8:80 -r 172.18.23.72:80 -g -w 2
ipvsadm -A -t 192.168.8.8:3306 -s rr
ipvsadm -a -t 192.168.8.8:3306 -r 172.18.23.71:80 -g -w 1
ipvsadm -a -t 192.168.8.8:3306 -r 172.18.23.72:80 -g -w 2
对于上面三种lvs的实现:可以使用FWM即:基于防火墙标记进行统一调度,请自行进行调节
iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK 10
iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 3306 -j MARK 10
ipvsadm -A -f 10 rr
ipvsadm -a -f 10 -r 172.18.23.71 -g
ipvsadm -a -f 10 -r 172.18.23.72 -g