HAProxy

庆云1年前技术文章466

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,又发现恢复正常


相关文章

MySQL 复制延迟是如何计算的?

MySQL 复制延迟是如何计算的?

前言日常运维中总会收到 MySQL 备库延迟告警,一般数据库监控只读实例延迟都是采集 Seconds_Behind_Master 值,我们都知道它在某些场景下不可靠,今天一起探索 MySQL 是如何计...

达梦数据库初始化

达梦数据库初始化

1、dm数据库初始化认证dm数据库默认开启了ssl,在第一次登录时,使用SYSDBA用户登录,需要通过命令指定对应的ssl文件。不然会出现ssl 初始化失败的报错./disql SYSDBA/SYSD...

Elasticsearch数据生命周期如何规划

Elasticsearch中的open状态的索引都会占用堆内存来存储倒排索引,过多的索引会导致集群整体内存使用率多大,甚至引起内存溢出。所以需要根据自身业务管理历史数据的生命周期,如近3个月的数据op...

ORC、Parquet 等列式存储的优点

ORC 和Parquet 都是高性能的存储方式,这两种存储格式总会带来存储和性能上的提升Parquet:1. Parquet 支持嵌套的数据模型,类似于Protocol Buffers,每一个数据模型...

RDS通过DMS管理登录处理

RDS通过DMS管理登录处理

问题描述无法通过DMS管理登录进入数据库,报错如下:问题处理方式一在RDS控制台新建账号 账号管理--创建账号将此数据库添加进DMS在DMS控制台--数据库实例--新增实例将新建的数据库账号信息进行录...

Ambari Hive 创建函数无权限

Ambari Hive 创建函数无权限

1、创建udf函数参考文档:https://blog.csdn.net/helloxiaozhe/article/details/102498567如果已经编写好,请使用自己的。如果没有请参考以上链接...

发表评论    

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