客户端访问服务端整个互联网架构:
- Android/iOS/Win/Mac 客户端访问
- CDN(Content Dilivery Network):基于GSLB(Global Server LB)实现全局LB:如:DNS
- firewall
- LVS/HAProxy决定访问哪个服务器 (LVS集群: VIP)(keepalived)
- 服务端偏运维基础:
- 来到Nginx:L7反向代理
- 企业内部DNS, NTP, Harbor等基础服务
- HA私有云管理: Openstack管VM,K8S管docker
- LAMP企业门户
- 静态资源
- 静态资源缓存集群
- 静态资源服务器, nginx集群
- 资源存储服务器, e.g. NFS, ceph
- 商业存储服务器, e.g. NAS, SAN
- 动态资源
- Java SOA
- 微服务管理中心
- 生产者微服务集群
- 消费者微服务集群
- DB
- MQ: Kafka, RabbitMQ
- NoSQL: mongoDB
- 分布式注册中心: Eureka, ZK
- Cache服务器集群: Redis
- RDBMS: Mysql, etc.
- monitor:
- Prometheus
- Zabbix
- CICD:
- Jenkins
- Gitlab
- Log: ELK: 分析日志 (大数据运维)
- Hadoop/Hive数仓
- Spark(RDD)/Flume
LVS(调度功能)
- LVS模型
- LVS调度算法
- LVS实现
- Idirectord
集群和分布式
集群:
- LB:
- e.g. mysql主从:
- LVS: Linux Virtual Server: 属于LB;
- LVS:可能有单点故障问题(SPOF)
- LVS SPOF:用keepalived解决LVS单点失败问题
- LVS+keepalived
- HA,避免SPOF(Single Point Of Failure)
- e.g. mysql: MHA: Perl脚本快速“副”变为“主”
- MTBF: Mean Time Between Failure
- MTTR: Mean Time To Restoration
- A:= MTBF/(MTBF+MTTR)
- SLA: Service Level Agreement
- HPC
- LB:
分布式系统:
- 分布式存储: Ceph,GlusterFS,FastDFS,MogileFS
- 分布式计算: hadoop, Spark
- 分布式系统最典型: DNS服务
- 分布式常见应用
- 分布式应用: MS
- 分布式静态资源: 静态资源放在不同存储集群上
- 分布式数据和存储: 使用KV缓存系统,e.g. Redis集群
- 分布式计算: 特殊业务使用分布式计算:比如hadoop集群
分布式一般以缩短单个任务的执行时间提升效率,而集群通过提高单位时间内执行的任务数量提升效率
集群设计实现
- 基础设施层面
- 提升硬件资源性能:从入口防火墙到后端web server均使用更高性能的硬件资源
- 多域名: DNS轮询A记录解析
- 多入口: 将A记录解析到多个公网IP入口
- 多机房: 同城+异地容灾
- CDN(Content Delivery Network):基于GSLB实现全局LB:DNS
- 业务层面
- 分层: 安全层 负载层 静态层 动态层 缓存层 存储层 持久化
- 分割: 基于功能分割大业务为小服务
- 分布式: 对于特殊场景服务,使用分布式计算
- LB Cluster:
- 硬件
- F5 Big-IP
- …
- 软件
- LVS: 4层, AliL4 SLB使用
- nginx: 支持L7调度, AliL7 SLB使用Tengine
- nginx:可做代理服务器,或者web服务器
- haproxy: L7
- ats: Apache Traffic Server…
- …
- 基于工作的协议层次划分:
- 传输层(通用): DNAT && DPORT
- LVS
- nginx: stream
- haproxy: mode tcp
- 应用层(专用): 针对特定协议,常称proxy server
- http: nginx, httpd, haproxy
- fastcgi: nginx, …
- mysql: mysql-proxy…
- 传输层(通用): DNAT && DPORT
- LB会话保持:
- session sticky: 同一用户调度固定服务器
- Source IP: LVS sh算法(缺点:同一个地方IP相同: SNAT)
- Cookie(更好,基于浏览器, LVS L4不能用cookie)
- 访问一台服务器,如果这台服务器宕机:
- session replication: 每台服务器拥有全部session
- session multicast cluster: 占内存
- session server: 专门的session服务器
- Redis
- memcached
- redis 集群…
- session sticky: 同一用户调度固定服务器
- 硬件
- HA 高可用集群实现
- keepalived VRRP协议
- Ais: heartbeat …(不怎么用了)
LVS: 4种工作模式和10种调度算法
LVS架构的NAT和DR模型实现原理
常: L4: LVS; L7: nginx
- 术语:
- VS: Virtual Server: 只负责调度, Director Server(DS), Dispatcher(调度器), LB
- RS: Real Server(lvs), upstream server(nginx), backend server(haproxy)
- CIP: Client IP
- VIP: Virtual server IP
- DIP: Director IP (VIP,DIP都是LVS服务器地址)
- RIP: Real server IP
- 访问流程:
CIP<-->VIP=(in LVS)=DIP<-->RIP
- 查看:
grep -i -C 10 ipvs /boot/config-3.10.0-1127.el7.x86_64
LVS集群体系架构:
- 交换机: 接入交换机->[汇聚交换机]->核心交换机
- real server->Director(LVS,多,keepalived)->接入交换机
- 核心交换机->路由器->防火墙->外网
功能: 单独LVS只能实现LB,不能实现HA; 多LVS+keepalived实现HA
- 扩展应用
- 消除SPOF(keepalived)
- LVS本质就是一个调度器
LVS集群工作模式和相关命令
- LVS集群工作模式
lvs-nat
:修改请求报文的目标IP,i.e.多目标IP的DNAT;lvs-dr
:操纵封装新的MAC地址lvs-tun
:在原请求IP报文外新加一个IP首部lvs-fullnat
:修改请求报文的源和目标IP
LVS-NAT
-
- LVS和后端服务器: 在一个网络中,一般用Switch(交换机),用Router(路由器)效率低 - 问题: LVS服务器单点问题: 既没有HA,也容易出现性能瓶颈 - LVS && iptables五链: ![lvs-iptables](/Users/xialei/Desktop/notes/LVS-iptables.png)
LVS-DR
DR模型:
- 显然的问题: 多个RS绑定同一个VIP: 多台服务器相同IP?
- 地址冲突底层逻辑: 免费ARP(gratutious ARP)
- CIP-VIP -> LVS-> RS: 还是CIP-VIP,但是还加了一个RS的MAC地址看是哪一个具体的RS;
- ip得到MAC: RIP->MAC;
- MAC:设备<->设备; IP: 网络<->网络;->->
- 如果隐藏RS自己的VIP?
- ignore: 不响应别人的请求
- announce: 不主动说 (实际上是kernel中的两个参数)
- 解决了LVS-NAT模式的LVS返回通过的瓶颈
- ARP: 基于广播,把IP解析到MAC;
- MAC地址在路由过程中一段一段不断切换,但是IP地址是不变的
DR原理:
详解发送报文的IP和MAC地址:
(MAC1:路由器进口MAC地址; MAC2:路由器出口MAC地址)
src IP/MAC | dest IP/MAC | stage |
---|---|---|
CIP:x, MAC_C | VIP:80, MAC1 | 客户端到路由器 |
CIP:x, MAC2 | VIP:80, MAC_LVS | 路由器到LVS服务器 |
CIP:x, MAC_LVS | VIP:80, MAC_RS1 | LVS服务器到RS1 |
VIP:80, MAC_RS1 | CIP:xx, MAC2 | DR模型:RS1返回报文到路由器 |
VIP:80, MAC1 | CIP:xx, MAC_C | 路由器到客户端 |
DR模型特点:
- 请求报文响应报文不需要都经过LVC服务器(其实是响应报文)
- LVS服务器要和后端服务器都在同一个网段:
- RIP和Director必须在同一个网段
- RIP,DIP和VIP:不一定要在同一个网段
- LVS服务器配置
ingore
和announce
两个参数
RIP和VIP: 可以都配在物理网卡上,eth0
; 但是因为要配置ignore
和announce
内核参数,所以这样也去掉了RIP的广播功能; 所以可以把VIP配置到lo
这个虚拟回环网卡上; 因为网络设备是工作在内核上面的,所以lo
是可以的
LVS-Tunnel : 类似跨网络的LVS-DR
TUN模式特点:
- DIP, VIP, RIP可以是公网地址(跨互联网)
- RS的网关一般不指向DIP(要不就没有必要用路由器和tunnel模式)
- 请求报文要经由director,但是响应不经过director
- 不支持端口映射(因为只是加了报文,并没有修改/转发)
- RS的OS支持隧道功能
LVS-fullnat
Kernel默认不支持。
和NAT模式没有太大区别,只是src地址也转化了; 而且请求报文和相应报文还是都经过Director,所以和NAT相比都没有显著性的提升;一般都不怎么用
LVS工作模式总结和比较
VS/NAT | VS/TUN | VS/DR | |
---|---|---|---|
Server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low(10-20) | high(100) | high(100) |
server gateway | load balancer | own router | own router(因为都是直接返回给客户端不经过LVS) |
LVS调度算法
静态方法: 仅根据算法本身调度
- RR
- WRR: RR机器性能不同加weight
- SH: Source Hashing,源地址哈希; 实现session sticky,源IP地址hash; 将来自同一个IP地址的请求始终发往第一次挑中的RS,实现会话绑定:
- DH: Destination Hashing,目标地址哈希;第一次轮训调度到RS,后续将发往同一个目标地址的请求始终发到第一次挑中的RS, 典型使用场景是正向代理缓存场景中的LB, i.e. client->Redis->Mysql集群; mysql集群假如ABCD四个服务器, Redis1对应AB, Redis2对应CD, 那么如果之前访问的是A,下次客户端访问就是Redis1, 因为Redis1对应的A
动态算法: 根据当前RS负载状态和调度算法进行调度Overhead=value比较小的RS将被调度(LVS知道后面RS的负载情况)
- LC: least connections: 适用长连接应用;
Overhead=activeconns*256+inactiveconns
, 没有考虑到后端服务器的性能: 改进: WLC - WLC: 默认调度算法;
Overhead=(activeconns*256+inactiveconns)/weight
: 权重越大,Overhead越小,优先调度 - SED: Shortest Expection Delay: 解决#conn为0的问题:
Overhead=(activeconns+1)*256/weight
: weight设置可能不合理 - NQ: Never Queue: 第一轮均匀分配, 后续SED: 解决第一轮问题
- LBLC: Locality-Based LC, 动态DH, 根据负载状态考虑
- LBLCR: LBLC with Replication; 5中的mysql可能均衡但是前面的Redis不均衡,所以Replication:解决LBLC负载不均衡问题,从负载中的复制到负载轻的RS
- LC: least connections: 适用长连接应用;
Kernel4.15后新增的调度算法
- FO(静态): Weighted FailOver: FO算法中遍历Virtual Server(VS)关联的真实服务器列表,找到还没有标记过载(未设置
IP_VS_DEST_F_OVERLOAD
标志)并且权重最高的真RS调度 - OVF(Overflow-Connection)(动态): FO+activeconn
- FO(静态): Weighted FailOver: FO算法中遍历Virtual Server(VS)关联的真实服务器列表,找到还没有标记过载(未设置