热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Haproxy+Nginx搭建负载均衡集群

文章目录引言一、Haproxy简介1、Haproxy应用分析2、Haproxy的特性3、常见负载均衡策略3.1 RR(Round Robin)3.2 LC(Least Connections)3.3


文章目录



  • 引言

  • 一、Haproxy简介



    • 1、Haproxy应用分析

    • 2、Haproxy的特性

    • 3、常见负载均衡策略



      • 3.1 RR(Round Robin)

      • 3.2 LC(Least Connections)

      • 3.3 SH(Source Hashing)

      • 3.4 uri

      • 3.5 url_param

      • 3.6 rdp—COOKIE(name)

      • 3.7 source

      • 3.8 static-rr



    • 4、常见的Web集群调度服务器

    • 5、LVS、Haproxy、Nginx区别



  • 总结

  • 二、Haproxy搭建Web群集



    • 1.实验准备

    • 2.Haproxy服务器部署(192.168.28.10)



      • 2.1关闭防火墙、关闭核心防护,将Haproxy所需软件包拖到/opt目录下

      • 2.2安装所需依赖包

      • 2.3解压软件包,并编译安装Haproxy

      • 2.4Haproxy服务配置文件修改

      • 2.5添加haproxy系统服务



    • 3.Nginx服务配置(192.168.28.100,192.168.28.200)



      • 3.1关闭防火墙及核心防护

      • 3.2修改index.html文件

      • 3.3重启服务,测试网页



    • 4.Haproxy验证







引言

Haproxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。


一、Haproxy简介

1、Haproxy应用分析

LVS在企业中康复在能力很强,但存在不足:



  • LVS不支持正则处理,不能实现动静分离

  • 对于大型网站LVS的事实配置较为复杂,维护成本相对较高

Haproxy是一款可以供高可用性、负载均衡和基于TCP和HTTP应用的代理软件



  • 适用于负载较大的站点

  • 运行在硬件上可支持数以万计的并发连接请求


2、Haproxy的特性



  • 1.可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美

  • 2.最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s

  • 3.支持多达8 种负载均衡算法,同时也支持会话保持

  • 4.支持虚拟主机功能,从而实现web负载均衡更加灵活

  • 5.支持连接拒绝、全透明代理等独特功能

  • 6.拥有强大的ACL支持,用于访问控制

  • 7.其独特的弹性二叉树数据结构,使数据结构的复杂性上升到了0(1),即数据的查询速度不会随着数据条目的增加而速度有所下降

  • 8.支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成

  • 9.支持TCP加速,零复制功能,类似于mmap机制

  • 10.支持响应池(response buffering)

  • 11.支持RDP协议

  • 12.基于源的粘性,类似于nginx的ip_hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器

  • 13.更好统计数据接口,其web接口显示后端冀全中各个服务器的接受、发送、拒绝、错误等数据的统计信息

  • 14.详细的健康状态检测,web接口中有关对上流服务器的健康检测状态,并提供了一定的管理功能

  • 15.基于流量的健康评估机制

  • 16.基于http认证

  • 17.基于命令行的管理接口

  • 18.日志分析器,可对日志进行分析


3、常见负载均衡策略

Haproxy支持多种调度算法,最常用的有8种


3.1 RR(Round Robin)



  • RR算法是最简单最常用的一种算法,即轮询调度

理解举例:有三个节点A、B、C



  • 1.第一个用户访问会被指派到节点A

  • 2.第二个用户访问会被指派到节点B

  • 3.第三个用户访问会被指派到节点C

  • 4.第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果


3.2 LC(Least Connections)

最小连接数算法,根据后端的节点连接数大小动态分配前端请求

理解举例: 有三个节点A、B、C,各节点的连接数分别为A:4 B:5 C:6



  • 1.第一个用户连接请求,会被指派到A上,连接数变为A:5 B:5 C:6

  • 2.第二个用户请求会继续分配到A上,连接数变为A:6 B:5 C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端

由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况

此算法相比较rr算法有很大改进,是用到比较多的一种算法


3.3 SH(Source Hashing)

基于来源访问调度算法,用于一些有Session会话记录在服务端的场景,可以基于来源的IP、COOKIE等做集群调度

理解举例 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B



  • 当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡器不重启,第一个用户都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用


3.4 uri

表示根据请求的URI,做cdn需使用


3.5 url_param

表示根据HTTP请求头来锁定每 一 次HTTP请求。


3.6 rdp—COOKIE(name)

表示根据据COOKIE (name)来锁定并哈希每一次TCP请求。


3.7 source

表示根据请求的源IP,类似Nginx的IP hash机制。


3.8 static-rr

表示根据权重,轮询


4、常见的Web集群调度服务器



  • 目前常见的Web集群调度器分为软件和硬件

  • 软件通常使用开源的LVS、Haproxy、Nginx


5、LVS、Haproxy、Nginx区别



  • 1.LVS基于linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡

  • 2.LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而实现Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案

  • 3.LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式

  • 4.Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡

  • 5.Nginx主要用于web服务器或缓存服务器

  • 6.Haproxy也是支持虚拟主机的

  • 7.Haproxy支持8种负载均衡器策略

  • 8.Haproxy的优点能补充nginx的一些缺点,比如支持Session的保持,COOKIE的引导,同时支持通过获取指定url来检测后端服务器的状态

  • 9.Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的

  • 10Haproxy支持TCP协议的负载均衡转发


总结

从三个方面来概述,①基于系统内核还是第三方应用,②工作在4层还是7层,③监测状态



  • LVS基于操作系统内核实现软负载均衡、nginx和haproxy都是基于第三方应用实现

  • LVS可实现4层ip负载均衡技术,4层中LVS负载均衡最轻,nginx和haproxy都可以实现4层和7层

  • LVS状态监测功能单一,Haproxy状态监测方面功能强大,可支持,端口、URL、脚本状态监测,nginx主要是web服务器或缓存服务器,虽然也有uostream模块支持群集功能,但是对节点的健康检查不强


二、Haproxy搭建Web群集

1.实验准备

Haproxy服务器:192.168.28.10
Nginx1服务器:192.168.28.100
Nginx2服务器:192.168.28.200


2.Haproxy服务器部署(192.168.28.10)


2.1关闭防火墙、关闭核心防护,将Haproxy所需软件包拖到/opt目录下

[root@haproxy nginx-1.15.9]# systemctl stop firewalld
[root@haproxy nginx-1.15.9]# systemctl disable firewalld
[root@haproxy nginx-1.15.9]# setenforce 0

在这里插入图片描述


2.2安装所需依赖包

[root@haproxy opt]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make

在这里插入图片描述


2.3解压软件包,并编译安装Haproxy

[root@haproxy opt]# tar zxf haproxy-1.5.19.tar.gz
[root@haproxy opt]# ls
haproxy-1.5.19 mysql-boost-5.7.20.tar.gz pass.txt shell_bianliang
haproxy-1.5.19.tar.gz nginx-1.15.9 passwd.txt txt
mysql-5.7.20 nginx-1.15.9.tar.gz rh
[root@haproxy opt]# cd haproxy-1.5.19/
[root@haproxy haproxy-1.5.19]# uname -r #查看内核版本
3.10.0-957.el7.x86_64
[root@haproxy haproxy-1.5.19]# make TARGET=linux2628 ARCH=x86_64 #进行编译
TARGET=linux2628 表示内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628)
(ARCH=x86_64 系统位数,现在基本都是64位)
[root@haproxy haproxy-1.5.19]# make install #安装
install -d "/usr/local/sbin"
install haproxy "/usr/local/sbin"
install -d "/usr/local/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1
install -d "/usr/local/doc/haproxy"
for x in configuration architecture haproxy-en haproxy-fr; do \
install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \
done

2.4Haproxy服务配置文件修改

[root@haproxy haproxy-1.5.19]# mkdir /etc/haproxy
[root@haproxy haproxy-1.5.19]# cp /opt/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
[root@haproxy haproxy-1.5.19]# cd /etc/haproxy/
[root@haproxy haproxy]# vim haproxy.cfg

在这里插入图片描述

vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
log /dev/log local0 info #修改
log /dev/log local0 notice #修改
#log loghost local0 info
maxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 1 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #引入global定义的日志格式
mode http #模式为http(7层代理http,4层代理tcp)
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
--删除下面所有listen项--,添加
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /index.html #检查服务器的index.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.28.100:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.28.200:80 check inter 2000 fall 3
---------------------参数说明-----------------------------------------------------------------
balance roundrobin #负载均衡调度算法
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hash
check inter 2000 #表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒
fall 3 #表示连续三次检测不到心跳频率则认为该节点失效
若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。

2.5添加haproxy系统服务

[root@haproxy haproxy]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy]# chmod +x /etc/init.d/haproxy
[root@haproxy haproxy]# chkconfig --add /etc/init.d/haproxy
[root@haproxy haproxy]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #做软连接
[root@haproxy haproxy]# service haproxy start #或 /etc/init.d/haproxy start #开启服务

在这里插入图片描述


3.Nginx服务配置(192.168.28.100,192.168.28.200)


3.1关闭防火墙及核心防护

[root@nginx1 nginx-1.15.9]# systemctl stop firewalld
[root@nginx1 nginx-1.15.9]# systemctl disable firewalld
[root@nginx1 nginx-1.15.9]# setenforce 0

3.2修改index.html文件

因为我们在haproxy配置中指向的是index.html文件,修改此文件,添加内容便于测试
nginx1

[root@nginx1 nginx-1.15.9]# vim /usr/local/nginx/html/index.html

在这里插入图片描述
nginx2

[root@nginx2 nginx-1.15.9]# vim /usr/local/nginx/html/index.html

在这里插入图片描述


3.3重启服务,测试网页

在这里插入图片描述


4.Haproxy验证

在这里插入图片描述



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
广东快乐笨人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有