首页 > 其他分享 >使用 Haproxy 搭建 Web 群集

使用 Haproxy 搭建 Web 群集

时间:2023-05-13 14:03:22浏览次数:34  
标签:Haproxy Web 负载 stats HAProxy 群集 nginx root haproxy

一、常见的 Web 集群调度器

目前常见的 Web 集群调度器分为软件和硬件,软件通常使用开源的 LVS、Haproxy、Nginx, 硬件一般使用比较多的是 F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等。

使用 Haproxy 搭建 Web 群集_haproxy

二、Haproxy 与 LVS 应用对比分析

LVS 在企业应用中抗负载能力很强,但不支持正则处理,不能实现动静分离,对于大型 网站,LVS 的实施配置复杂,维护成本相对较高。

Haproxy 是一款可以提供高可用性、负载均衡、及基于 TCP 和 HTTP 应用的代理软件。 特别适用于负载特别大的 Web 站点,运行在当前的硬件上可支持数以万计的并发连接请求。

官方网站:http://www.haproxy.com/

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用 的软负载实现。LVS 就是基于 Linux 操作系统实现的一种软负载,HAProxy 就是开源的并且基 于第三应用实现的软负载。

HAProxy 相比 LVS 的使用要简单很多,功能方面也很丰富。当前,HAProxy 支持两种主 要的代理模式:”tcp”也即 4 层(大多用于邮件服务器、内部协议通信服务器等),和 7 层(HTTP)。 在 4 层模式下,HAProxy 仅在客户端和服务器之间转发双向流量。7 层模式下,HAProxy 会 分析协议,并且能通过允许、拒绝、交换、增加、修改或者***请求(request)或者回应(response) 里指定内容来控制协议,这种操作要基于特定规则。(新的 1.3 之后的版本引入了 frontend,backend 指令;frontend 根据任意 HTTP 请求头内容做规则匹配,然后把请求定向到相关的backend.)

HAProxy 主要优点:

·        1、HAProxy 是支持虚拟主机的,通过 frontend 指令来实现

·        2、能够补充 Nginx 的一些缺点比如 Session 的保持,Cookie 的引导等工作

·        3、支持 url 检测后端的服务器出问题的检测会有很好的帮助。

·        4、它跟 LVS 一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 更会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。

·        5、HAProxy 可以对 Mysql 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,不 过在后端的 MySQL slaves 数量超过 10 台时性能不如 LVS,所以更推荐 LVS+Keepalived。

·        6、能对请求的 url 和 header 中的信息做匹配,有比 lvs 有更好的 7 层实现

若企业中,硬件负载均衡器发生故障时,应急处理所采用的方案顺序:

·        1、Haproxy+Keepalived

·        2、Nginx+Keepalived

·        3、LVS+Keepalived

三、Haproxy 调度算法及其原理

1、RR(Round Robin)轮询算法。

ABC,1–>A ,2–>B,3–>C,4–>A,…,

此外,加权轮询调度算法 WRR。根据每个节点的权重轮询分配访问请求。

2、LC(Least Connections)最少连接数算法。

A B C. A:4、B:5 C:6, 1 –> A, A:5 B:5 C:6,2 –> A:6 B:5 C:6 , 3 –> B , A:6 B:6 C:6 , 4 –> A:7 B:6 C:6 ,5 –> B , A:7 B:7 C:6 , 6 –>C A:7 B:7 C:7 (目前用的比较多的一种)

3、 SH(source hashing)来源访问调度算法。

A B C , 1 –> A, 2 –> B 1 –> A , 2 –> B, 只要保证负载调度器不重启,第一个用户 –> A , 2 –> B 这种调度算法的好处是会实现会话保持。

HAProxy 的负载均衡算法现在也越来越多了,具体有如下 8 种:

·        (1)roundrobin,表示简单的轮询,这个是负载均衡基本都具备的

·        (2)static-rr,表示根据权重,建议关注

·        (3)leastconn,表示最少连接者先处理,建议关注

·        (4)source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似,我们用其作为解 决 session 问题的一种方法

·        (5)ri,表示根据请求的

·        (6)rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URL parameter name

·        (7)hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求

·        (8)rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求

四、使用 Haproxy 搭建 Web 集群案例

实验环境:

·        Haproxy 服务器:192.168.100.100/24

·        Nginx1 服务器:192.168.100.11/24

·        Nginx2 服务器:192.168.100.22/24

·        Nginxbak 服务器:192.168.100.33/24

使用 Haproxy 搭建 Web 群集_haproxy_02

1、Nginx 的安装与启动

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

[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx

[root@nginx1 ~]# tar -xvf nginx-1.12.0.tar.gz -C /usr/src/

[root@nginx1 ~]# cd /usr/src/nginx-1.12.0/

[root@nginx1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &&make &&make install

[root@nginx1 nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

[root@nginx1 nginx-1.12.0]# nginx

[root@nginx1 nginx-1.12.0]# ss -utpln |grep nginx
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=4359,fd=6),("nginx",pid=4358,fd=6))

[root@nginx1 nginx-1.12.0]# echo "<h1>1111</h1>" >/usr/local/nginx/html/index.html
#(nginx2 与 nginxbak 的配置与上述相同,唯一不同是最后测试页内容分别为 2222 和 bak)

[root@nginx2 nginx-1.12.0]# echo "<h1>2222</h1>" >/usr/local/nginx/html/index.html

[root@nginx-bak nginx-1.12.0]# echo "<h1>bak</h1>" >/usr/local/nginx/html/index.html

 

2、安装Haproxy

[root@haproxy ~] yum -y install haproxy

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
	log 127.0.0.1 local0                 #可不做修改
	chroot /var/lib/haproxy              # 改变当前工作目录
	pidfile /var/run/haproxy.pid         # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
	maxconn 4000                         # 最大连接数,默认4000
	user haproxy                         # 默认用户
	group haproxy                        # 默认组
	daemon                               # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为daemon
	stats socket /var/lib/haproxy/stats  # 创建监控所用的套接字目录
#---------------------------------------------------------------------
# defaults settings
#---------------------------------------------------------------------
# 注意:因为要使用tcp的负载,屏蔽掉与http相关的默认配置
defaults
	mode http                            # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
	log global
	option dontlognull                   # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
	option redispatch                    # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
	retries 3                            # 3次连接失败就认为服务不可用,也可以通过后面设置        
	timeout queue 1m
	timeout connect 10s                  # 连接超时时间
timeout client 1m                    # 客户端连接超时时间
	timeout server 1m                    # 服务器端连接超时时间
	timeout check 10s                    
	maxconn 3000                         # 最大连接数
#---------------------------------------------------------------------

#注释掉 frontend mian *:5000 内容段的注释
#---------------------------------------------------------------------

手动添加以下内容:
listen admin_stats                           #开启haproxy监控界面
	bind *:8080                            #绑定8080端口
	mode http
	option httplog
	stats enable                         #开启统计
	stats refresh 30s
	stats uri /haproxy?stats     #监控界面url:http://ip:80/haproxy/stats
	stats auth admin:123456
	stats realm welcome\ Haproxy
	stats admin if TRUE
#---------------------------------------------------------------------
注释掉 backend app 内容段

手动添加以下内容:
listen nginx_server                      #代理nginx集群
	bind *:80                         	#绑定80端口
	mode http
	option httpchk GET /index.html
	server nginx_1 192.168.100.11:80 check inter 2000 rise 3 fall 3 weight 1
	server nginx_2 192.168.100.22:80 check inter 2000 rise 3 fall 3 weight 1
	server nginx_bak 192.168.100.33:80 check inter 2000 rise 3 fall 3 backup

[root@haproxy ~]# systemctl start haproxy.service

客户机访问测试: http://192.168.100.10/

使用 Haproxy 搭建 Web 群集_haproxy_03

使用 Haproxy 搭建 Web 群集_haproxy_04

客户端访问:http://192.168.100.10:8080/haproxy?stats

使用 Haproxy 搭建 Web 群集_haproxy_05

将nginx_1和nginx_2停止掉

[root@nginx1 ~]# nginx -s stop
[root@nginx2 ~]# nginx -s stop

标签:Haproxy,Web,负载,stats,HAProxy,群集,nginx,root,haproxy
From: https://blog.51cto.com/u_15947621/6273685

相关文章

  • EntityFramework Core 6.0 MySql WebApi
    Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.Tools-----------------------------------------------------------------------------------------------------------------------......
  • 使用 jQuery Mobile 与 HTML5 开发 Web App (十八) —— HTML5 Web Workers
    本文要介绍的是HTML5的WebWorkers特性,它解决了JavaScript开发中一个重大的问题——在后台运行JavaScript。与本系列前两篇文章介绍的特性相似,WebWordkers似乎也是为了WebApps而设计的,可以想象,WebApps乃至原生Apps受移动设备性能的限制比在桌面环境中要大很多,尽......
  • 使用 jQuery Mobile 与 HTML5 开发 Web App (十七) —— HTML5 离线缓存
    本文要介绍的,是HTML5离线网络应用程序的特性,离线网络应用程序在W3C中的实际名称是"OfflineWebapplications",也称离线缓存。当用户打开浏览器时,浏览器会将一个列表中指定的资源都下载并储存在本地。下次当用户再访问这个网络程序时,浏览器会自动引用本地缓存中相应的文件,而......
  • WEB—源码拓展
    前言:WEB源码在安全测试中是非常重要的信息来源,可以用来代码审计漏洞也可用来做信息突破口,其中WEB源码有很多技术需要简明分析。比如:获取某ASP源码后可以采用默认数据库下载为突破,获取某其他脚本源,码漏洞可以进行代码审计挖掘或分析其业务逻辑等,总之源码的获取将为后期的安全测......
  • 前端 Website 的 sitemap.xml 文件和搜索引擎优化
    前端Website的sitemap.xml文件是一个XML格式的文件,其中包含了网站中所有页面的链接,这些页面可以是HTML页面、博客文章、产品页面、分类页面等等。Sitemap文件的作用是向搜索引擎提供关于网站的信息,帮助搜索引擎更好地索引网站内容,提高网站在搜索结果中的排名。Sitemap.xml......
  • JavaWeb过滤器读取并修改POST请求的参数-YhtHttpServletRequestWrapper
    核心原理就是一个类:javax.servlet.http.HttpServletRequestWrapper一个简单的例子,当任何请求的参数里有aaa的时候,把它的值改成bbb新增一个类自定义的类CustomHttpServletRequestWrapper importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSer......
  • 爆粗!类com.itheima.web.servlet.AjaxServlet不是servlet
    描述:Classcom.itheima.web.servlet.AjaxServletisnotaServlet  二、解决问题1、问题分析  根据报错的提示内容,貌似是Servlet的问题。 2、检查代码  无论是写的servlet测试java代码,还是pom.xml似乎都没有问题。  细心观察,发现了问题,自己忘记配置<scop>节......
  • WebUploader 超大文件上传和断点续传的实现
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的PHP或者Java程序来实现基......
  • web自动化12-捕获异常NoSuchElementException
    在定位元素的时候,经常会遇到各种异常,遇到异常又该如何处理呢?selenium的exceptions模块,了解异常发生的原因。捕获异常1.出现异常代码会被结束中断,为了可以继续运行,可以用try...except...来捕获异常。捕获后可以输出异常原因,以便于分析异常原因2.从上面的截图看报错提示元素不......
  • golang web页面动态加载实现
            Go的web页面动态加载实现。  1.在MySQL中添加表项users,构造多条数据。CREATETABLEIFNOTEXISTSusers(idINTUNSIGNEDAUTO_INCREMENT,usernameVARCHAR(255)NOTNULL,passwordVA......