haproxy实现动静分离

HAProxy简介:

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是一款开源的、快速并且可靠的反向代理的解决方案。HAProxy特别适用于那些负载特大的web站点,而这些站点通常又需要保持会话或七层处理(最常用的如动静分离)。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进现有的架构中,同时可以保护后端的web服务器不被暴露在网络上。

HAProxy使用的是事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端实现这些任务,所以没有这些问题。

HAProxy特性:

HAProxy是开源、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案。

HAProxy目前有两个主要版本:

1.4-提供较好的弹性,衍生于1.2版本,提供了额外的新特性:

支持客户端一侧的长连接(client-side keep-alive)

支持TCP加速(TCP speedups)

支持响应池(response buffering)

支持RDP协议

支持基于源的粘性(source-based stickiness)

支持更好的统计数据接口(a much better stats interfaces)

支持更详细的健康状态检测机制(more verbose health checks)

支持基于流量的健康评估机制(traffic-based health)

支持基于HTTP认证

支持服务器管理命令行接口(server management from the CLI)

支持基于ACL的持久性(ACL-based persistence)

支持日志分析器

1.3-内容交换和超强负载:衍生于1.2版本,并提供额外的新特性:

内容交换(content switching):基于任何请求标准挑选服务器池;

ACL:编写内容交换规则;

负载均衡算法(load-balancing algorithms):更多的算法支持;

内容探测(content inspection):组织非授权协议;

透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;

内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务器端之间转发数据以实现数G级别的数据速率;

分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制以及更便捷的演进能力;

快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现更好的Qos;

会话速率限制(session rate limiting):适用于托管环境;

HAProxy的性能:

HAProxy有很好的性能是因为它借助于OS上几种常见的技术来实现性能上的最大化:

1、单进程、事件驱动模型显著降低了上下文切换的开销以及内存占用。

2、O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

3、在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽。

4、借助于splice()系统调用,可以实现零复制转发。

5、内存分配器在固定大小的内存池中可实现即时内存分配,能够显著减少创建一个会话的时长。

6、树形存储:使用弹性二叉树,实现以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列。

7、优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域。


模拟实验:

使用HAProxy实现将用户请求按请求资源类型的不同调度至不同的服务器进行响应,通常资源的类型被分为静态资源和动态资源,实验中实现的效果即动静分离。

实验环境:

三台虚拟机:

node1:eth0:172.16.103.1(模拟为外网IP),eth1:192.168.1.1(内网IP,与后端RealServer通信使用)

node2:eth0:192.168.1.2 (提供动态页面内容)

node3:eth0:192.168.1.3 (提供静态页面内容)

实验简易拓扑:

    wKiom1Qf9aiRcMe0AACmAzA2Toc666.jpg

实验过程:

前端HAProxy代理服务器上安装haproxy程序包

# yum -y install haproxy

为了能在后端服务器均出现故障时,能提供提示性信息,在haproxy所在主机启动httpd服务,并提供主页文件,内容编辑为:

# vim /etc/httpd/conf/httpd.conf

Listen 8080   #修改一个默认的监听地址,与后端的RealServer不一致,因为haproxy地址监听的通常设置为80,设置这个监听地址的目的就是为了避免在本机不同进程使用同一端口,而产生冲突。

# vim /var/www/html/index.html

<h1>Site under Maintaince</h1>

RS1主机提供动态页面的访问,安装有httpd和php程序包并提供主页文件

# yum -y install httpd php
# vim /var/www/html/index.php
<h1>php Page</h1>
<?php
   phpinfo();
?>
# vim /var/www/html/index.html  #为了之后测试可以在node2这台提供动态页面访问服务的主机上创建一个静态页面文件,与node3上的文件名称相同,但内容不同,在访问相同名称的文件时,可以测试是否能始终将静态内容调度到静态内容服务器node3上。
# vim /var/www/html/index.html
<h1>node2.cluster.com</h1>

RS2上仅提供静态页面内容,只安装httpd程序

# yum -y install httpd
# vim /var/www/html/index.html
<h1>node3.cluster.com</h1>

配置前端的haproxy,使得用户请求时,动态页面内容调度至RS1,请求静态内容时会调度到RS2,在配置文件中的添加如下内容: 

frontend  main    #定义前端的haproxy工作特性
    maxconn 6000  #支持的并发连接数
    bind :80      #监听的端口
    acl url_static path_beg -i /p_w_picpaths /stylesheets /videos /css /javascript   #定义访问控制列表
    acl url_static path_end -i .jpg .html .css .js .png .gif  #定义访问控制列表,以便在条件匹配时调用
    use_backend static if url_static    #调用之前定义的访问控制列表,之前定义的访问控制列表指定的内容是开头以图片,样式表,视频,css文件及java脚本开头的和以.jpg.html等文件结尾的文件时会使用后端以static定义的服务器组。
    default_backend webservers   #定义默认的访问调度服务器,用户请求的资源部是acl定义的资源类型时,由默认的webserver响应
backend static
    balance roundrobin   #使用的调度算法 
    server static1 192.168.1.3 check port 80  #提供静态页面内容的服务器定义在static组中
    server b1 127.0.0.1:8080 backup check port 8080
backend webservers
    balance roundrobin
    server s1 192.168.1.2 check port 80 # 提供动态页面内容的服务器定义在默认的服务器组中
    server b1 127.0.0.1:8080 backup check port 8080   #定义了一个backup server,当后端的各RealServer都出现故障时,会使用haproxy所在的主机提供的web服务来响应,显示服务器在维护中的信息。

启动haproxy服务:

# service haproxy start


实现动静分离时定义的效果:当访问默认主页时,使用默认的backend定义的webserver服务器响应,这个服务器上提供的是php页面文件,也是动态页面的内容:

wKiom1QgDUmDgGsWAARWg1wwAMc133.jpg

多次刷新测试后访问的还是同一个页面的内容,如果访问的是静态文件的内容,比如index.html,即使在node2上有相同名称的页面文件,也不会调度到node2上,而是只显示node3上的文件:

wKioL1QgDjDzbQNCAAEkKhHRmFY480.jpg

实现了动态页面和静态页面分离的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章