|NO.Z.00009|——————————|^^ 构建 ^^|——|LBC构建.V3|——|2台server|
一、通用算法-调度
1、通用算法:
### --- 固定算法(静态调度算法):
~~~ 只根据算法本身去调度,不考虑服务器本身;消耗的资源比较少
### --- 动态算法(动态调度算法):
~~~ 出了考虑算法本身,还要考虑服务器状态;消耗的资源比较大
~~~ 调度算法也就意味着后期我们配置调度策略的规则
### --- 负载调度器:
~~~ 就是将不同的压力请求分散到不同的服务器
2、静态调度算法:
### --- RR 轮询:
~~~ 将每次用户的请求分配给后端的服务器,从第一台服务器开始到第N台结束,然后循环
### --- WRR加权轮询:
~~~ 按照权重的比例实现在多台主机之间进行调度:睡的权重越高,就负责的是当前的权重。
### --- SH(source hash)源地址散列:
~~~ 将同一个IP的用户请求,发送给同一个服务器: 根据源判断
### --- DH(destination hash)目标地址散列:
~~~ 将同一个目标地址的用户请求发送给同一个真是服务器(提高缓存的命中率)根据用户请求去判断
3、SH状态信息

### --- HTTP HTTPS:无状态协议:一次性传输:
~~~ 每次发起连接的时候,都不知道上一次发送的信息是什么
### --- www.taobao.com 用户信息 :若是无状态协议:
~~~ 刷新后状态就消失。
4、解决方案:
### --- cookie :用户端持久化:
~~~ 在客户端上添加一些cookie信息,若服务器端响应的话,
~~~ 拿我的请求加上我的cookie数据,
~~~ web服务器就会知道客户端访问过的信息是什么样的,都会有记录的,
~~~ cookie是存在客户端本机的,cookie信息是不安全的。
### --- session:服务器端持久化:
~~~ 对于服务器来说更希望把数据存储在服务端。
~~~ 理解为客户端持久化数据保存在了服务器端而已;
~~~ 每次连接后会保存我们需要的信息是什么;可以存储在数据库里面,
~~~ 可以存储在缓存里,也可以存储在分布式存储里面

### --- 不把session存储在后端服务器,
~~~ 直接存储在存储服务器中
~~~ 这样所有的数据读取不是从服务器中读取,而是从存储服务器读取
~~~ 以上为标准解决方案,这样就不要SH算法,
~~~ 若开发没有在nginx服务器上没有定义把session定义在后端的数据库中,
~~~ 我们只能吧session存放在临时的单独的服务器,不管客户端怎么访问,
~~~ 都会到session服务器中调用
二、DH的调度算法

### --- SQUID:
~~~ 后端的缓存服务器,它后端还有源服务器,有请求要缓存,缓存说没有,
~~~ 那它就会向源服务器要数据,SQUID服务器会把这个数据缓存在本机,并反馈给用户。
~~~ 若再来一个用户想访问这个数据,那它就可以直接把这个数据给客户端,
~~~ 而不用去向源服务器去要数据,减轻后端服务器压力。
~~~ 可以大大提高缓存并读率,客户端把数据提交给SQUID服务器,
### --- 缓存并读率:
~~~ 它到底有有多大缓存不需要到后端去要,
~~~ 采用DH算法之后可以大大提高缓存服务的缓存并读率,更便于整个并发提升。
三、动态调度算法:(不仅考虑算法本身,还需要考虑服务器的当前的状态,
### --- 动态的算法http连接分为两种:
### --- http活动连接:
~~~ 正在传输数据,正在握手或者传输数据呢;远大于非活动连接的资源消耗。
### --- http非活动连接:
~~~ 刚建立连接,还没有传输数据,或者刚传输完数据,还没有来得及断开。
### --- 动态调度算法分类
### --- LC(lest-connection)最少连接:
~~~ 将新的连接请求,分配给连接数最少的服务器,活动连接X256+非活动连接
### --- WLC加权最少连接:
~~~ 特殊的最少连接算法,权重越大承担的请求数越多(活动连接X256+非活动连接)/权重
### --- SED最短期望延迟:
~~~ 特殊的WLC算法(活动连接+1)*256/权重NQ永不排队,
~~~ 特殊的SED算法,无需等待,如果有真实服务器的连接数等于0那就直接分配不需要运算;
~~~ LVS能确定那台服务器的连接数等于0的情况下,会把请求直接分配过去。
### --- LBLC特殊的DH算法:
~~~ 即能提高缓存命中率,又要考虑服务器性能;没有问题的原因是没有考虑并发,
~~~ 前端时间鹿晗和关晓彤的恋情爆料,导致新浪服务器宕机,若1.jpeg访问量很大,
~~~ 采用了DH算法的话,访问1.jpeg的压力全部集中在SQUID中,SQUID很可能会导致宕机。
~~~ 若不采用SQUID的话,采用LBLCR LBLC算法。若访问量比较大的情况下,
~~~ 感觉SQUID的压力比较大的情况下,会再选一台SQUID的服务器作为缓存,
~~~ 可以持续添加,既可以保障缓存并读率,又可以防止某一台SQUID服务器压力比较大而导致宕机。
### --- LBLCR LBLC+缓存:
~~~ 竟可能提高负载均衡缓存命中率的折中方案;
~~~ 我们不管吧请求发送给那一台服务器,它直接是想后端的Apache服务器去要数据的。
~~~ 若开启LBLC的话,我们的缓存数据可以在多台SQUID服务器之间进行同步,
~~~ 而不再想后端的Apache去要。
### --- LC最少连接
~~~ 第一台服务器 10 1000 2560+1000
~~~ 第二台服务器 8 8000 8x256 8000
### --- WLC
~~~ 第一台服务器 1 0 0
~~~ 第二台服务器 2 0 0
四、LVS持久连接:扩展知识
### --- HTTPS
~~~ 安全/配置复杂/费用高/消耗性能/ssl握手设备(硬件设备)
### --- HTTPS:
~~~ 现在不可或缺的技术。
### --- http:
~~~ Apple的app-store在所有的应用数据传输的时候必须走https协议;
~~~ http不允许商家;chrome也会把https的规则添加进去了
~~~ https:消耗的资源还是较多。

### --- 拓扑说明
~~~ 假设连接的端口是443,走的是https连接,
~~~ 第一次数据请求获取后,那下一次的请求就有可能被LVS负载到了第二台Apache服务器,
~~~ 有需要进行握手,又要消耗资源。一次类推。
~~~ 这样的情况对Apache来说不太友好。消耗的最远非常大。
~~~ 可否第一次握手后,第一建立连接后,后期直接交给第一次后去数据的服务器,
~~~ 这样服务器性能的损耗会相对减少。
### --- 持久化连接
~~~ 持久化连接 LVS 类似于: SH 但它又不等同于SH算法
~~~ 优先于 LVS算的或者通用算法RR、LBLC
~~~ 先匹配到持久化连接,在匹配到通用算法。
~~~ 持久化连接会普遍的应用在https相关集群中。
~~~ 持久化连接:类似于ssh,在内存中扉页中采用了一块缓存,
~~~ 记录了我们的客户端数据与我们分配真实服务器的相关对应数据。
~~~ 保证客户端每一次连接都能建立持久化连接。
~~~ 这里的持久化是建立在固定的时间内,假设设置的是200秒,在200秒内可以进行持久化连接。
~~~ 最大不超过200秒。时间结束后不会再我们连接里不会再有持久化连接,
~~~ 在此连接的话又会是一个新的连接
~~~ 在设置lvs持久化连接的时候换需要定义一个时间。
### --- 第一点:功能类似于SH,
### --- 第二点:它优先级最大,高于通用算法,先匹配它,再匹配通用算法。
### --- 第三点:普遍应用于https连接中。
### --- LVS持久连接
### --- PCC(持久客户端连接):
~~~ 没客户端持久:将来自于同一个客户端的所有请求统统定向至此前选定的RS,
~~~ 也就是只要IP相同,分配的服务器始终相同:
### --- example:ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120 :0——>所有端口
~~~ 就是客户端访问LVS集群,LVS可以代理多个不同的多个集群。
~~~ 代理80的,代理443的集群。一般不会这样去配置。
~~~ 只要客户端访问过来。都把他递给同一台服务器(持久化),
~~~ 每一个客户端都会有一个模板,客户端都要匹配上,端口也需要匹配上。
### --- PPC(持久端口连接):每端口持久:
~~~ 将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的RS:
### --- example:ipvsadm -A -t 172.16.0.:80 -s rr -p 120 :80——>80端口
~~~ 假设客户端访问80端口,把它递给第一台服务器。
~~~ 假设客户端访问的是443端口,把它递给第二台服务器。
~~~ 若是在此访问的是80 ,还会递给第一台服务器。
~~~ 若再次访问443,若是一个新的连接,它可能会递给第一台服务器或者第二台服务器
~~~ 每一个端口都会有一模板
### --- PFMC:持久防火墙标记连接,将来自于同一客户端对指定服务(端口)的请求,
~~~ 始终定向至此选定的RS;不过它可以将两个毫不相干得端口定义为一个集群服务器
~~~ 防火墙会把每一个请求打一个标签,然后把它转给LVS集群,
~~~ LVS再根据它的标签去判断是交给那台RS服务器。
### --- LVS持久连接构建
~~~ -t mangle:mangle表中
~~~ -A PREROUTING:PREROUTING列里,OREROUT是路由器
~~~ -d 172.16.0.8:目的地址
~~~ -p tcp:tcp协议
~~~ -dport 80:目标端口是80 打个标记,MAC值为10;如果来了个连接,它的值为10的话,就建立持久化连接。
~~~ -j MARK:
~~~ --set-mark 10:
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --ser-mark 10
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --ser-mark 10
service iptables save
ipvsadm -A -f 10 -s wlc -p 120
五、实验专题:配置建立持久化连接
### --- 配置建立持久化连接:硬件规划
~~~ Windows:10.10.10.240:本地物理笔记本
~~~ HA-server1:10.10.10.11:LVS持久化连接
### --- 在LVS-NAT集群中,配置持久化连接。
### --- 删除LVS-NAT集群
[root@server11 ~]# ipvsadm -D -t 20.20.20.11:80
[root@server11 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
### --- 设置持久化连接集群;配置LVS
[root@server11 ~]# ipvsadm -A -t 20.20.20.11:80 -p 120 -s rr
[root@server11 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 20.20.20.11:80 0 0 0 0 0
### --- 添加集群RS端
[root@server11 ~]# ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
[root@server11 ~]# ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:80 -m
### --- 获取帮助信息
[root@server11 ~]# ipvsadm --help |grep conn
### --- 查看持久化连接的
[root@server11 ~]# ipvsadm -Ln --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 20.20.20.11:80 rr persistent 120 // 120表示持久化连接时间
-> 10.10.10.12:80 1 0 0 0
-> 10.10.10.13:80 1 0 0 0
### --- 查看当前的连接信息
[root@server11 ~]# ipvsadm -Ln -c
IPVS connection entries
pro expire state source//客户端 virtual //LVS集群 destination //RS目标主机
TCP 00:01 CLOSE 20.20.20.22:54801 20.20.20.11:80 10.10.10.13:80
TCP 00:01 CLOSE 20.20.20.22:54802 20.20.20.11:80 10.10.10.13:80
TCP 00:02 CLOSE 20.20.20.22:54805 20.20.20.11:80 10.10.10.13:80
TCP 00:02 CLOSE 20.20.20.22:54806 20.20.20.11:80 10.10.10.13:80
附录一:持久防火墙标记连接
### --- 持久防火墙标记连接
### --- 定义:
~~~ 将来自于统一客户端对指定服务(端口)的请求,始终定向至此选定RS,
~~~ 不过它可以将两个毫不相干的端口定义为一个集群服务
### --- 构建代码:
### --- 添加一个防火墙规则,当目标地址为172.16.0.8并且目标端口为80时给数据包打一个标记,设置Mark值为10
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
### --- 添加一个防火墙规则,当目标地址为172.16.0.8并且目标端口为443 时给数据包打一个标记,设置Mark值为10
iptables -t managle -A PREROUTING -d 172.16.0.8 -p tcp -dport 443 -j MARK --set-mark 10
### --- 添加一个负载调度器,当Mark值为10 时进行负载均衡使用wlc算法,持久化生效时间为120s
service iptables save //保存防火墙规则持久化生效
ipvsadm -A -f 10 -s wlc -p 120
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv001-lbchac
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通