HAProxy

庆云11个月前技术文章209

1、HAProxy简介

  HAProxy 是一款基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,它也可作为负载均衡器,而且完全免费。 借助 HAProxy,可以快速并且可靠地提供基于 TCP 和 HTTP 应用的代理解决方案。 HAProxy 最主要的优点是性能突出,它特别适合那些负载特大的 Web 站点,这些站点通常需要具备会话保持或七层处理功能。 HAProxy 完全可以支持数以万计的并发连接,而且它的运行模式可以让你简单而安全地将它整合到当前的架构中,同时可以保护你的 Web 服务器不暴露到网络上(通过防火墙 80 端口映射的方法)。 作为一款优秀的负载均衡软件,HAProxy 优点如下所示:

  1>免费且开源,稳定性也非常好,其稳定性可以与硬件级的 F5 Big-IP 相媲美。
  2>根据官方文档可知,HAProxy 可以跑满 10Gbps,对于软件级负载均衡器而言,这个数字是相当惊人的。
  3>支持连接拒绝,因为维护一个连接保持打开状态的开销是很低的,有时我们需要防止蠕虫攻击,也就是通过限制它们的连接打开来防止它们的危害。 这个功能已经拯救了很多被 DDoS 攻击的小型站点,这也是其他负载均衡器所不具备的。
  4>支持全透明代理(已具备硬件防火墙的典型特点),可以用客户端 IP 地址或任何其他地址来连接后端服务器,这个特性仅在 Linux 2.4/2.6 内核打了 cttproxy 补丁后才可以使用。 这个特性使得为某特殊服务器处理部分流量的同时又不修改服务器的地址成为可能。
  5>HAProxy 现在多用于线上的 MySQL 集群环境,常用它作为 MySQL(读)负载均衡。
  6>自带强大的监控服务器状态的页面,在实际环境中我们可以结合 Nagios 来实现邮件或短信报警,这也是很多人非常喜欢它的原因之一。
  7>支持虚拟主机。

2、四种常用算法

1>roundrobin:轮询,轮流分配到后端服务器;
2>static-rr:根据后端服务器性能分配;
3>leastconn:最小连接者优先处理;
4>source:根据请求源 IP,与 Nginx 的 IP_Hash 类似。

3、HAProxy L4 负载均衡应用架构拓扑

  HAProxy 软件的四层 tcp 代理应用非常优秀,配置非常简单方便,比 LVS 和 Nginx 要方便很多,因为不需要在 RS 端执行脚本即可实现应用代理。和商业版的 NS(Netscaler)、F5 等负载均衡硬件的使用方法和在架构中的位置几乎一样。

1.png

 

说明:由于 haproxy 采用的 NAT 模式,数据包来去都会经过 haproxy,因此,在流量特别大的情况下,其性能不如 LVS。

4、HAProxy L7 负载均衡应用架构拓扑

  Haproxy 的最大优点在于其 7 层的根据 URL 请求头应用过滤的功能,在门户网站的高并发生产架构中,haproxy 软件一般用在 LVS 软件的下一层,或者像官方推荐的可以挂在硬件负载均衡 althon、NS、F5 下使用,其表现非常好。2009 年起 taobao 网的 cdn 业务就大面积使用了 haproxy作为 7 层 CACHE 应用代理。

2.png

 

   通过修改 HAProxy 的配置文件,指定哪一台 Heartbeat 服务器作为主服务器,则另一台将自动成为备份服务器。然后在备份服务器上配置 Heartbeat 守护程序来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的。

5、HAProxy负载均衡搭建

  1>环境规划:centos7
    client:192.168.100.111/24
    haproxy:192.168.100.101/24
    web1:192.168.100.10/24
    web2:192.168.100.20/24

  2>前期配置:部署各节点ip,各个节点关闭防火墙,禁用selinux,时间同步,保证机器干净

  3>web-server节点配置:

web-server1节点:
[root@web-server1 ~]# yum install httpd -y
[root@web-server1 ~]# echo web-server1 > /var/www/html/index.html
[root@web-server1 ~]# systemctl start httpd

web-server2节点:
[root@web-server2 ~]# yum install httpd -y
[root@web-server2 ~]# echo web-server2 > /var/www/html/index.html
[root@web-server2 ~]# systemctl start httpd

  4>haproxy节点配置:

[root@haproxy ~]#   haproxy -~]#  /etc/haproxy/haproxy.cfg /etc/haproxy/~]# vim /etc/haproxy/. local2 /var/run//-.:-i  \.html$    # 访问控制列表:html 靠正则表达式的地址区分 --server --/-A 192.168.100.10: weight  cookie  check inter  rise  fall -B 192.168.100.20: weight  cookie  check inter  rise  fall
[root@haproxy ~]# systemctl start haproxy    //启动haproxy

  5>client访问测试

[root@client ~]# elinks -dump http://192.168.100.101
   web-server1
[root@client ~]# elinks -dump http://192.168.100.101
   web-server2
[root@client ~]# elinks -dump http://192.168.100.101
   web-server1
[root@client ~]# elinks -dump http://192.168.100.101
   web-server2

  6>浏览器访问haproxy web状态页面


 

 6、实现HAProxy动静分离

  1>环境规划:centos7
    192.168.100.111    client
    192.168.100.101    haproxy
    192.168.100.10      web-server1
    192.168.100.20      web-server2
    192.168.100.30      php-server1
    192.168.100.40      php-server2

  2>前期配置:部署各节点ip,各个节点关闭防火墙,禁用selinux,时间同步,保证机器干净

  3>web-server节点配置:

web-server1节点:
[root@web-server1 ~]# yum install httpd -y
[root@web-server1 ~]# echo web-server1 > /var/www/html/index.html
[root@web-server1 ~]# systemctl start httpd

web-server2节点:
[root@web-server2 ~]# yum install httpd -y
[root@web-server2 ~]# echo web-server2 > /var/www/html/index.html
[root@web-server2 ~]# systemctl start httpd

  4>php-server节点配置:

php-server1节点:
[root@php-server1 ~]# yum install httpd php -y
[root@php-server1 ~]# vim /var/www/html/test.php<?phpecho "Here is php-server1";?>[root@php-server1 ~]# systemctl start httpd

php-server2节点:
[root@php-server2 ~]# yum install httpd php -y
[root@php-server2 ~]# vim /var/www/html/test.php<?phpecho "Here is php-server2";?>[root@php-server1 ~]# systemctl start httpd

  5>haproxy节点配置:

~]#   -y pcre-devel -devel  -c++     groupadd -r -g -r -s /sbin/nologin - xf haproxy-...gz -C /usr/local/src//usr/local/src/haproxy-./ TARGET=linux-glibc PREFIX=/usr/local/  PREFIX=/usr/local/ /usr/local/src/haproxy-./examples/haproxy.init /etc/init.d/ +x /etc/init.d/ -s /usr/local/haproxy/sbin/haproxy /usr/sbin/ /etc//etc/haproxy/. local2 /var/run//-.:-i  \.html$    # 访问控制列表:html 靠正则表达式的地址区分 ---server  html # 如果访问html,就使用后端服务器html--server --/-A .: weight  cookie  check inter  rise  fall -B .: weight  cookie  check inter  rise  fall ..XX:(也可以配置域名解析)  weight权重  cookie -/-C .: weight  cookie  check inter  rise  fall -D .: weight  cookie  check inter  rise  fall -f /etc/haproxy/haproxy.cfg    //启动haproxy服务,-f指定配置文件路径

  6>client访问测试

[root@client ~]# elinks --dump http://192.168.100.101
   web-server1
[root@client ~]# elinks --dump http://192.168.100.101
   web-server2
[root@client ~]# elinks --dump http://192.168.100.101/test.php
   Here is php-server1
[root@client ~]# elinks --dump http://192.168.100.101/test.php
   Here is php-server2

  7>浏览器访问haproxy web状态页面

5.png 


   8>模仿后端服务器挂掉,再进行访问测试

使php-server1挂掉:
[root@php-server1 ~]# systemctl stop httpd

client访问测试:
[root@client ~]# elinks --dump http://192.168.100.101/test.php
   Here is php-server2
[root@client ~]# elinks --dump http://192.168.100.101/test.php
   Here is php-server2

  浏览器刷新haproxy web状态页面:

6.png

  haproxy状态页明显发现php-server1挂掉,重新启动php-server1,又发现恢复正常


相关文章

Dockerfile编写指南

Dockerfile编写指南

一、背景  在k8s提出抛弃docker,拥抱其他的cri插件的情况下,为什么还有这篇指南呢?首先Dockerfile作为容器打包的标准,已经存在了很多年了。其中的编写技巧到现在也是一直延续的,所以并...

Kafka 单条日志传输大小

kafka 对于消息体的大小默认为单条最大值是1M 但是在我们应用场景中, 常常会出现一条消息大于1M,如果不对kafka 进行配置。则会出现生产者无法将消息推送到kafka 或消费者无法去消费kaf...

Hbase 存储相关知识

1.Hbase的写流程Client 写入-> 存入MemStore,一直到MemStore 满-> Flush 成一个StoreFile,直至增长到一定阈值-> 触发Compact...

Kubernetes 认证授权

Kubernetes 认证授权

1、认证所有 Kubernetes 集群都有两类用户:由 Kubernetes 管理的服务账号和普通用户。任何客户端访问之前,经由 kubernetes 时,需经过:认证(token, ssl)、授权...

使用clickhouse-copier迁移数据

说明clickhouse-copier是clickhouse官方提供的一个数据迁移工具。支持将clickhouse表从一个集群迁移到另外一个集群。使用clickhouse-copier有一些限制条件:...

oracle adg切换

1 主库转备库注意:原则上至多只能有一个主库,但是备库可以多个,所以需要先进行主库转备库操作。1.1 查看主库角色切换状态SYS@proe>select name,database_role,s...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。