本系列博文是个人学习笔记,非原创,只加工,较粗糙,不喜勿喷。
本文是第一部分的最后篇章。
描述
LB1是VRRP【注 1】的master(配置了keepalived),LB2用来备份。两者同时监听HAProxy进程,在遇到故障时降低优先级,并将工作转到另一个节点。LB1以IP地址192.168.1.1【注 2】接收客户端请求。
两个负载均衡器都以本地IP发送信息。
如果有不含session的request,就会被转发到任意可用服务器。
如果有JESSIONID,就会添加服务器名称作为前缀,以~分割。
当有JESSIONID=A~xxx,LB1将获知这条请求必须投递给服务器A。在投递之前,服务器名会被抽离。
如果webA宕机了,请求会被发送到另一台服务器,cookie重置。【注 3】
数据流
(client) (haproxy) (server A)
>-- GET /URI1 HTTP/1.0 ------------> |
( no cookie, haproxy forwards in load-balancing mode. )
| >-- GET /URI1 HTTP/1.0 ---------->
| X-Forwarded-For: 10.1.2.3
| <-- HTTP/1.0 200 OK -------------<
( no cookie, nothing changed )
<-- HTTP/1.0 200 OK ---------------< |
>-- GET /URI2 HTTP/1.0 ------------> |
( no cookie, haproxy forwards in lb mode, possibly to another server. )
| >-- GET /URI2 HTTP/1.0 ---------->
| X-Forwarded-For: 10.1.2.3
| <-- HTTP/1.0 200 OK -------------<
| Set-Cookie: JSESSIONID=123
( the cookie is identified, it will be prefixed with the server name )
<-- HTTP/1.0 200 OK ---------------< |
Set-Cookie: JSESSIONID=A~123 |
>-- GET /URI3 HTTP/1.0 ------------> |
Cookie: JSESSIONID=A~123 |
( the proxy sees the cookie, removes the server name and forwards to
server A which sees the same cookie as it previously sent )
| >-- GET /URI3 HTTP/1.0 ---------->
| Cookie: JSESSIONID=123
| X-Forwarded-For: 10.1.2.3
| <-- HTTP/1.0 200 OK -------------<
( no cookie, nothing changed )
<-- HTTP/1.0 200 OK ---------------< |
( ... )
注意
有些情况下,服务器场中有性能较强的主机,举例而言,如果webA的CPU主频是1GHz,webC的CPU 主频是3GHz,从CPU性能看,这两个服务器性能比可能差3倍。HAProxy为了处理这些情况,提供了 weight选项,分级,1~256,可以配置这个选项以获得更理想的负载分配。
server webA 192.168.1.11:80 cookie A weight 12 check server webB 192.168.1.12:80 cookie B weight 12 check server webC 192.168.1.13:80 cookie C weight 26 check server webD 192.168.1.14:80 cookie D weight 26 check
===========================================================
第一部分到此结束,下篇博文开始第二部分。
注解
【1】VRRP,虚拟路由器冗余协议,控制虚拟路由器地址的路由器成为主路由器,负责转发数据包到虚拟IP。注意,主机也可以是路由器,实际上,路由器本身就是一台简化电脑。
【2】LB1和LB2的共享IP,LB1是VRRP的master,