Keepalived+HAProxy 搭建高可用负载均衡(二)

本文涉及的产品
简介: Keepalived+HAProxy 搭建高可用负载均衡

3.3 安装与配置

3.3.1 安装

HAProxy支持源码安装,同时也可以通过不同操作系统安装工具进行安装,本文以CentOS的yum工具为例进行安装介绍,分别在两台已安装并配置好kkeepalived的服务器上执行以下命令进行安装。

yum install -y haproxy

3.3.2 基本配置

yum安装后,HAProxy将生成配置文件:/etc/haproxy/haproxy.cfg,利用文本编辑器进行配置修改。

vi /etc/haproxy/haproxy.cfg
  1. 全局段定义(global)
    全局参数配置将配置于所有HAProxy服务器上。
global                               
log  /dev/log local0 info             
chroot    /var/lib/haproxy
pidfile    /var/run/haproxy.pid
maxconn     4000
user      haproxy                      
group     haproxy                        
daemon 
  1. log设置全局日志配置,语法为log  ,上例中指定使用本机上的syslog服务中的local0日志设备,记录日志等级为info的日志。chroot设置HAProxy工作目录,pidfile设置HAProxy的pid文件位置,maxconn设置每个HAProxy进程可用的最大连接数,user及group设置HAProxy进程所属的用户及用户组,daemon关键字表示以守护进程方式运行haproxy。
  2. 默认段定义(defaults)
    默认段的作用是为后续前端代理及后端代理设置默认值。
defaults
mode      http    
log        global
option      httplog
option      dontlognull  
    option      http-server-close  
    option forwardfor   except 127.0.0.0/8 
    option     redispatch  
    retries     3 
timeout http-request        10s  
timeout queue             1m
timeout connect           10s 
timeout client             1m 
timeout server             1m
timeout http-keep-alive      10s
timeout check             10s
  1. mode表示HAProxy的工作模式,设置tcp时为4层模式,设置http时为7层模式。log设置日志输出方式,配置为global表示将采用全局段log的配置。
    option httplog关键字表示记录HTTP详细日志,包括HTTP请求、session状态、连接数等。
    option dontlognull关键字表示日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接,官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要设置该参数,因为设置后互联网上的恶意扫描或其他动作就不会被记录下来。
    option http-server-close关键字表示每次请求完毕后主动关闭HTTP通道。
    option forwardfor关键字表示应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段启用 X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
    option redispatch关键字表示当使用了cookie时,HAProxy将会将其请求的后端服务器信息插入到cookie中,以保证会话的持久性,如果后端的服务器服务不可用,但客户端的cookie是不会刷新的,设置此参数会将客户的请求强制定向到另外一个后端服务器上,以保证服务的正常。
    retries定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用。
    timeout为前缀的关键字指定了一些关于请求、连接、响应的最大超时时间,单位默认为毫秒,也可以加入后缀s(秒),m(分钟),h(小时),d(天)来指定。http-request设置HTTP请求超时时长,queue设置一个请求在队列里的超时时间,connect设置最大与服务端建立连接的时长,client设置客户端最大非活动时长,server设置服务端最大非活动时长,http-keep-alive设置最大等待新请求的空闲时长,check设置检测超时时长。
  2. 前端代理定义(frontend)
    前端代理配置定义一个服务监听,用于接收用户请求并将请求转发给后端代理,可以定义多个前端代理。
frontend  main
mode  http
bind  :80                      
    default_backend  nginx
  1. frontend前端代理配置段定义一组前端服务并启动服务监听,同时设置代理名称。mode设置工作模式,如果此参数未被设定则引用默认配置段配置的模式。bind设置监听地址及端口,地址为空或者表示绑定至所有服务器的网络接口。default_backend指定默认后端代理进行流量转发。
  2. 后端代理定义(backend)
    用于接收前端代理请求并根据设置的负载均衡策略将流量转发至指定后端并对后端执行健康检查,一个前端可以指向多个后端;同时一个后端可以被多个调用。
backend  nginx
mode    http
balance   roundrobin
server   web1 host1:80 check inter 3s rise 1 fall 2
server   web2 host2:80 check
  1. backend后端代理配置段定义一组后端服务器,同时设置代理名称。mode设置工作模式如果此参数未被设定则引用默认配置段的模式。balance设置后端负载均衡转发策略,策略取值请参考表1。

    server配置了相应的后端服务集群地址,是真实的服务器,一个backend对应一个或者多个实体服务器。配置依次为节点名称、节点IP和端口、启用四层健康检查,在上述示例中web1服务器还设定了检查的相关参数表示每3秒(inter)检查一次,执行两次(fall)失败认为故障,执行一次(rise)成功即为服务可用。

3.3.3 启动

HAProxy配置完成后,使用以下命令开启HAProxy服务。

systemctl start haproxy

如果需要设置开机启动,则执行以下命令。

systemctl enable haproxy

修改配置文件后可以通过刷新配置的方式热加载配置。

systemctl reload haproxy

3.3.4 会话保持

HAProxy在会话保持功能上可以分为四层会话保持和七层会话保持。四层会话保持是基于源地址的会话保持,是指HAProxy在负载均衡时根据访问请求的源地址作为判断关联会话的依据,对于同一IP地址的所有访问请求在作负载均衡时均会被保持到后端的同一台服务器上。七层会话保持是基于cookie的会话保持,当客户端HTTP请求进入HAProxy时,根据负载均衡策略选择后端的一台服务器,后端服务器将HTTP响应返回HAProxy,此时HAproxy会插入该服务器的cookie并将插入cookie的HTTP响应返回至客户端,当该客户端再次发出请求时,带有上次插入cookie的HTTP请求进入HAProxy,HAProxy解析出cookie中服务器信息并将请求发送至相同的后端服务器。

四层会话保持的配置方式实际只需要将配置文件中后端代理段的负载均衡策略设置为基于源地址哈希并将工作模式设置为tcp即可,配置文件如下。

backend  nginx
mode    tcp
balance  source
    server   web1 10.230.150.68:80 check cookie web1
server   web3 10.230.150.70:80 check cookie web3 

七层会话保持配置方式则需要在配置文件后端代理段中设置cookie并确保工作模式为http,配置文件如下。

backend  nginx
    mode    http
    balance  roundrobin
    cookie  WEBSRV insert indirect nocache
    server   web1 10.230.150.68:80 check cookie web1
    server   web3 10.230.150.70:80 check cookie web3

以上配置文件中的cookie设置了以WEBSRV为名称的cookie,然后在server配置中分别定义了不同的cookie值,通过浏览器访问HAProxy前端代理地址可以看到该cookie,利用该cookie实现会话保持,如图2所示。

3.3.5 SSL卸载

利用HAProxy可以实现SSL卸载功能,从而使客户端到HAProxy的访问采用SSL封装后的HTTPS,而HAProxy至后端服务器之间的通信则采用HTTP(图3),从而消除服务器端的SSL加密运算开销。

实现SSL卸载需要在配置文件全局定义段加入SSL参数调整,以及在前端代理段加入SSL配置,涉及的配置如下。

global
    maxconn     20000
    log         127.0.0.1 local0 info
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    user        haproxy
    group       haproxy
    daemon
    tune.ssl.default-dh-param 2048
stats socket /var/lib/haproxy/stats
frontend main
    bind :80
    bind :443 ssl crt /etc/ssl/certs/web.pem
    redirect scheme https if !{ ssl_fc }
    default_backend nginx

全局段配置中增加了SSL参数tune.ssl.default-dh-param,设置值为2048,表示使用2048bit加密,和SSL秘钥加密位数保持一致。

前端代理配置bind加入443端口、SSL支持并绑定指定证书,证书文件内容为网站的证书和私钥通过命令(cat web.crt web.key | tee web.pem)拼接合成。配置段中还加入了HTTP到HTTPS的自动跳转功能(redirect scheme https if !{ ssl_fc }),在浏览器中输入域名或者IP地址,无需指定协议类型,如果导入根证书后的浏览器显示的状态是安全的则表示配置成功(图4)。

3.3.6 流量路由

HAProxy可以为数据库、邮件、页面等服务提供四层负载均衡机制,也可以从HTTP请求报文中提取指定数据并通过特定的访问控制列表(ACL)提供基于七层的流量转发机制。

  1. 基于URL路径转发。HAProxy可以根据请求的URL路径做路由,通过配置不同的路径将不同的URL路径分发至不同的后端服务器,在以下的例子中我们在两个页面服务器上分别配置了两个测试页面test1.html、test2.html,页面内容简单标识了所在服务器的信息,并利用转发机制实现基于URL的路径分发,涉及的相关配置如下。
frontend main
bind :80
bind :443 ssl crt /etc/ssl/certs/web.pem
redirect scheme https if !{ ssl_fc }
    acl is_test1  path_beg  /test1
    acl is_test2  path_beg  /test2
    use_backend test1  if  is_test1
    use_backend test2  if  is_test2
    default_backend nginx
backend nginx
    balance roundrobin
    server  web1 10.230.150.68:80 check
backend test1
    balance roundrobin
    server  web2 10.230.150.69:80 check
backend test2
    balance roundrobin
    server  web3 10.230.150.70:80 check

前端代理配置段中加入acl配置,设置的路由规则为匹配路径的前缀(path_beg)test1及test2,并配置use_backend参数将指定acl作用于指定后端服务器,is_test1规则匹配后路由至test1,is_test2规则匹配后路由至test2。

定义两组后端代理配置,分别配置test1及test2后端代理,指向相应的页面服务器。通过访问不同的路径HAProxy可以正确路由转发到指定后端页面服务器,没有命中acl的请求将转发至默认后端服务器,如图5所示。

2. 基于HTTP首部信息转发。HAProxy可以根据HTTP首部信息来执行路由分发操作,例如通过首部信息中的User-Agent来判断请求方的设备类型是iPhone还是Android,以此作为依据进行路由分发至不同的后端服务器上,或者通过首部信息中的Host字段实现以域名为依据进行路由分发。以Host为例,涉及的相关配置如下。

frontend main
    bind :80
    bind :443 ssl crt /etc/ssl/certs/web.pem
    redirect scheme https if !{ ssl_fc }
    acl  is_test1  hdr_beg(host)  www.test1.com
    acl  is_test2  hdr_beg(host)  www.test2.com
    use_backend test1  if  is_test1
    use_backend test2  if  is_test2
    default_backend nginx
backend nginx
    balance roundrobin
    cookie WEBSRV insert indirect nocache
    server   web1 10.230.150.68:80 check cookie web1
backend test1
    balance roundrobin
    server   web2 10.230.150.69:80 check
backend test2
    balance roundrobin
    server   web2 10.230.150.70:80 check

前端代理配置段中加入acl配置,通过hdr_beg(host)关键字设置的路由规则匹配HTTP首部信息中Host前缀www.test1.com及www.test2.com,并配置use_backend参数将指定acl作用于指定后端服务器,is_test1规则匹配后路由至test1,is_test2规则匹配后路由至test2。

定义两组后端代理配置,分别配置test1及test2后端代理,指向相应的页面服务器。通过不同的域名访问可以正确路由转发到指定后端页面服务器,没有命中acl的请求将转发至默认后端服务器,如图所示。

4. 总结

负载均衡可以由专业硬件设备提供,由服务器集群服务节点之上架设专业负载均衡器来完成集群节点的负载均衡工作。硬件负载均衡优势明显,设备独立于操作系统、强大的性能、丰富的功能、多样化的负载均衡策略、智能化流量管理,由专业维护团队提供维护,缺点是价格昂贵、配置复杂,部署难度大时间长,不适于中小规模的网络服务。

软负载则在一台或多台服务器操作系统之上安装附加软件来实现负载均衡。采用软负载方案后系统构架内无需额外部署专用于负载均衡的硬件设备以降低成本,同时能够更好地根据系统与应用的状态来分配负载,无缝的嵌入系统架构中,也可以根据实际需求灵活扩展,互联网公司大多都有自己的软负载方案。相比硬件负载来说软件负载具有配置简单、快速部署、使用灵活、成本低廉、高性价比等诸多优势。

在建设某银行应用基础云PaaS平台的实践中,采用Keepalived+HAproxy组合搭建了高可用软负载方案,为平台内多组控制节点、多组工作节点、以及双副本镜像仓库提供服务接口聚合负载和高可用性保障。首先,平台的业务流量入口指向Keepalived高可用VIP地址,经过Haproxy负载调度至后端工作节点中,这样一旦其中任意一个负载均衡节点或者后端工作节点宕机,高可用VIP地址和剩余存活的后端工作节点仍可对外提供服务。其次,随着后期业务流量的上升,后端工作节点出现负载压力时,可以根据实际需要灵活配置Haproxy,扩展后端工作节点数量,降低整体工作节点负载压力。从现有的实践经验来看,该软负载方案具备了良好的稳定性、灵活性和可扩展性。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
4天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
8 1
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
163 0
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
4月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
185 1
|
5月前
|
负载均衡 关系型数据库 PostgreSQL
Pgpool-II实现高可用+读写分离+负载均衡(八)---- 维护工具
Pgpool提供了一些维护工具,用于日常观察Pgpool运行状态、上线、下线节点等操作。主要有:pcp_stop_pgpool,pcp_node_count,pcp_node_info,pcp_health_check_stats,pcp_proc_count,pcp_proc_info,pcp_detach_node,pcp_attach_node,pcp_recovery_node,pcp_promote_node,pcp_pool_status,pcp_watchdog_info,pcp_reload_config
189 0
|
18天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
32 0
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
3月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
49 1
|
8天前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
21 2