第十八周--作业
1、简述keepalived工作原理
keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 用户在某个列表页面选择筛选条件过滤出一份数据列表,由列表页面进入数据详情页面,再返回该列表页面,我们希望:列表页面可以保留用户的筛选(或选中)状态。 keep-alive就是用来解决这种场景。当然keep-alive不仅仅是能够保存页面/组件的状态这么简单,它还可以避免组件反复创建和渲染,有效提升系统性能。总的来说,keep-alive用于保存组件的渲染状态。 include定义缓存白名单,keep-alive会缓存命中的组件;exclude定义缓存黑名单,被命中的组件将不会被缓存;max定义缓存组件上限,超出上限使用LRU的策略置换缓存数据。 keep-alive在它生命周期内定义了三个钩子函数: created 初始化两个对象分别缓存VNode(虚拟DOM)和VNode对应的键集合 destroyed 删除 this .cache中缓存的VNode实例。我们留意到,这不是简单地将 this .cache置为 null ,而是遍历调用pruneCacheEntry函数删除。 删除缓存的VNode还要对应组件实例的destory钩子函数 mounted 在mounted这个钩子中对include和exclude参数进行监听,然后实时地更新(删除) this .cache对象数据。pruneCache函数的核心也是去调用pruneCacheEntry 第一步:获取keep-alive包裹着的第一个子组件对象及其组件名; 第二步:根据设定的黑白名单(如果有)进行条件匹配,决定是否缓存。不匹配,直接返回组件实例(VNode),否则执行第三步; 第三步:根据组件ID和tag生成缓存Key,并在缓存对象中查找是否已缓存过该组件实例。如果存在,直接取出缓存值并更新该key在 this .keys中的位置(更新key的位置是实现LRU置换策略的关键),否则执行第四步; 第四步:在 this .cache对象中存储该组件实例并保存key值,之后检查缓存的实例数量是否超过max设置值,超过则根据LRU置换策略删除最近最久未使用的实例(即是下标为0的那个key); 第五步:最后并且很重要,将该组件实例的keepAlive属性值设置为 true 。 |
2、编译安装haproxy
#下载依赖包 yum -y install gcc openssl-devel pcre-devel systemd-devel #解压源码包 tar xvf haproxy-2.4.15.tar.gz -C /usr/local/ cd /usr/local/src/haproxy-2.4.15/ #参考install文件进行编译安装 make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.4/src/ LUA_LIB=/usr/local/lua-5.4.4/src/ make install PREFIX=/apps/haproxy ln -s /apps/haproxy/sbin/haproxy /usr/sbin/ #准备haproxy启动文件 vim /usr/lib/systemd/system/haproxy.service [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p / var /lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID LimitNOFILE=100000 [Install] WantedBy=multi-user.target systemctl daemon-reload #创建自定义配置文件 mkdir /etc/haproxy vim /etc/haproxy/haproxy.cfg global maxconn 100000 chroot /apps/haproxy stats socket / var /lib/haproxy/haproxy.sock mode 600 level admin #uid 99 #gid 99 user haproxy group haproxy daemon #nbproc 4 #cpu-map 1 0 #cpu-map 2 1 #cpu-map 3 2 #cpu-map 4 3 pidfile / var /lib/haproxy/haproxy.pid log 127.0.0.1 local2 info defaults option http-keep-alive option forwardfor maxconn 100000 mode http timeout connect 300000ms timeout client 300000ms timeout server 300000ms listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:123456 listen web_port bind 10.0.0.7:80 mode http log global server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5 |
3、总结haproxy各调度算法的实现方式及应用场景
静态算法: static -rr(做了session共享的 web 集群) 基于权重的轮询调度,不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr first(使用较少) 根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效 动态算法: roundrobin(做了session共享的 web 集群) 基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。动态算法可以动态修改,使用socat实现 leastconn(数据库) 基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式, HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法,此算法使用广泛 random(做了session共享的 web 集群) 在1.9版本开始增加 random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求 其他算法: source(基于客户端公网 IP 的会话保持) 源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type选项进行更改 这个算法一般是在不插入Cookie的TCP模式下使用,也可给不支持会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景 源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash 一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动 Uri(http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯) 基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态算法,也可以通过hash-type 指定map-based和consistent,来定义使用取模法还是一致性hash。 url_param(http #可以实现session保持) url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server,如果无没key,将按roundrobin算法 hdr(基于客户端请求报文头部做下一步处理) 针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。 rdp-cookie(基于Windows主机,很少使用) rdp-cookie对远windows远程桌面的负载,使用cookie保持会话,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。 |
4、使用haproxy的ACL实现基于文件后缀名的动静分离
#准备两台后端web服务器,均安装并启动apache服务 在10.0.0.17服务器创建f1.jpg的静态文件 在10.0.0.27服务器上创建f1.php动态文件 #编译安装haproxy 略 #配置haproxy动静分离规则 vim /etc/haproxy/conf.d/test.cfg frontend static_php_80 bind 10.0.0.7:80 acl acl_static path_end -i .jpg .jpeg .png .gif .css .js .html acl acl_php path_end -i .php use_backend static_hosts if acl_static use_backend php_hosts if acl_php backend static_hosts server websv1 10.0.0.17:80 check inter 3000 fall 2 rise 5 backend php_hosts server websv2 10.0.0.27:80 check inter 3000 fall 2 rise 5 #测试 curl 10.0.0.7 //f1.jpg 10.0.0.17 curl 10.0.0.7 //f1.php 10.0.0.27 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通