一、常见的 Web 集群调度器
目前常见的 Web 集群调度器分为软件和硬件,软件通常使用开源的 LVS、Haproxy、Nginx, 硬件一般使用比较多的是 F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等。
二、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
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/
客户端访问:http://192.168.100.10:8080/haproxy?stats
将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