第十八周学习内容:haproxy
第十八周作业:
1、简述四层和七层负载均衡的特点及Haproxy与LVS之间的对比 。
四层负载均衡工作在OSI模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体类型,然后经过负载均衡内部的调度算法转发至要处理请求的服务器。四层负载均衡单纯的提供了终端到终端的可靠连接,并将请求转发至后端,连接至始至终都是同一个。LVS就是很典型的四层负载均衡。
七层负载均衡工作在OSI模型的第七层应用层,所以七层负载均衡可以基于请求的应用层信息进行负载均衡,例如根据请求的资源类型分配到后端服务器,而不再是根据IP和端口选择。七层负载均衡的功能更丰富更灵活,也能使整个网络更智能。如上图所示,在七层负载均衡两端(面向用户端和服务器端)的连接都是独立的。
总之,四层负载均衡就是基于IP+端口实现的,七层负载均衡就是通过应用层资源实现的。
LVS优点:(1)抗负载能力强,因为是工作在四层之上,没有流量的产生,这个特点也决定了其性能是最强的,对内存和cpu资源消耗比较低。(2)工作稳定,因其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived等。(3)应用范围比较广,因为LVS工作在四层,所以它几乎可以对所有应用做负载均衡。
LVS缺点:(1)不支持正则表达式。(2)面对大型应用,排错困难。
HAproxy优点:(1)支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机。(2)负载均衡策略比较多。(3)支持会话保持,Cookie引导,同时支持通过获取指定的url来检测后端服务器的状态。
HAproxy缺点:(1)性能不及LVS。(2)多进程模式支持不够好。
2、简述Haproxy常见的负载均衡调度算法及应用场景详解 。
准备实验环境:一台主机xiaomao1运行HAproxy,后端两台主机xiaomao2和xiaomao3运行httpd,提供简单的web服务。
HAproxy安装完成后核心程序是/usr/sbin/haproxy,主配置文件是/etc/haproxy/haproxy.cfg。
主配置文件分成两部分:全局配置和代理配置。前者用来描述程序自身的运行参数,安全参数,性能参数等,后者包含了defaults,frontend,backend,listen四块配置内容。其中frontend用来定义前端,即面向客户的配置;banckend用来定义后端,即面向真实服务器的配置,在frontend中可以调用backend;listen是可以在一个配置中包含前端和后端,以上三种配置有些参数是公用的,就可以在defaults段中定义了。
先定义前端:frontend+名字,给前端起一个名字,haproxy的所有配置都需要起名字;bind表示绑定的端口,也就是监听的端口;default_backend+名字,表示调用的后端的主机
再定义后端:backend+名字,为后端起一个名字;server表示后端主机的真实地址,当然也要有一个名字;balance表示调度算法,这里是最基础的调度算法,轮询。
这样最简单的haproxy配置就完成了,可以启动服务实验了。
加权轮询:balance还是选择roundrobin,在server后加上weight+权重。
静态轮询(static-rr):轮询的静态版,不支持权重运行时调整,也不支持慢启动,优势在于对后端服务器的数量无限制,而普通的轮询最多支持4095个。
最少连接(leastconn):计算后端负载,分配给负载最小的,也可以加上权重。
first:表示按顺序依次把服务器打满,只有在某些特殊环境下才会使用。
源地址哈希(source):工作原理和lvs、nginx的源地址哈希轮询规则一样,只是要靠hash-type参数来设定具体的哈希方式,consistent是一致性哈希,map-based是取模法。在需要保持会话的情况下,可以使用。
uri:绑定uri,特别能提高缓存命中率,童谣可以由hash-type参数调整哈希算法。
url-param:通过url中的某个参数进行调度,只要这个参数相同就会被调往同一台服务器,这个参数必须跟在配置命令之后。
hdr:根据首部名称进行调度,首部名称必须跟在配置命令之后,也有hash-type可调。
3、通过Haproxy的ACL规划实现智能负载均衡,并简述tcp、http、health的配置示例。
ACL:访问控制列表,此为haproxy的核心组件,功能十分强大。基本格式:acl+名字+检查项+[标记]+[条件判断]+[值],比如acl xiaomao src 10.0.0.8,表示抓取或叫匹配源地址为10.0.0.8的数据包。
值:有布尔型、整数、IP地址、字符串、正则表达式、十六进制数据块等。
标记:有-i忽略大小写;-n禁止主机名反解;-u不可重名,默认是可以的,重名的acl做或运算;--表示结束标记位。
条件难断:有eq,ge,gt,le,lt,exact match,substring match,prefix match,suffix match等。
检查项:有dst,目标地址;dst-port,目标端口;src,源地址;src-port,源端口;dst-conn,目标套接字连接数量;path,相对路径,在path下还有许多变种,path-beg表示前缀匹配,path-end表示后缀匹配,path-sub表示子串匹配等;url,匹配url,也有各种变种;hdr,请求报文的指定首部等。
当定义好ACL,可以调用他们了,调用相关的指令有use_bakcend+后端名字+if或unless+ACL名字,表示仅当匹配到此ACL才启用此后端;block+if或unless+ACL名字,表示组织匹配到的报文;http_request+allow或deny+if或unless+ACL名字表示基于7层的访问控制;tcp_request+allow或deny+if或unless+ACL名字表示基于4层的访问控制。
上面的例子,在配置段中添加上ACL和访问控制列表就可以阻止某台设备的访问。
haproxy的工作模式:tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;http:仅当代理的协议为http时使用;health:只做健康状态检查。默认是tcp,但如果使用编译好的包进行安装,会发现在default段的默认配置中把工作模式又定义成为了http。
4、LNMT实现动静分离实战。
准备实验环境:一台主机xiaomao1运行HAproxy,后端两台主机xiaomao2和xiaomao3,一台运行httpd提供静态web服务,一台运行httpd-php提供动态web服务。
配置HAproxy配置文件
重启服务后可以测试
动静分离实现,生产环境中一般动和静的后端都将多部署几台主机,并做合理的调度算法,在测试环境下就是用一台设备代替了。