目前常见的 Web 集群调度器分为软件和硬件,软件通常使用开源的 LVS、Haproxy、Nginx, 硬件一般使用比较多的是 F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等。
二、Haproxy 与 LVS 应用对比分析
LVS 在企业应用中抗负载能力很强,但不支持正则处理,不能实现动静分离,对于大型 网站,LVS 的实施配置复杂,维护成本相对较高。
Haproxy 是一款可以提供高可用性、负载均衡、及基于 TCP 和 HTTP 应用的代理软件。 特别适用于负载特别大的 Web 站点,运行在当前的硬件上可支持数以万计的并发连接请求。
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用 的软负载实现。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,表示根据请求的 URI
- (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 # 最大连接数
#---------------------------------------------------------------------
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
#---------------------------------------------------------------------
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
客户机访问测试:
将nginx_1和nginx_2停止掉
[root@nginx1 ~]# nginx -s stop
[root@nginx2 ~]# nginx -s stop
五、为Haproxy配置Keepalived
1.更改haproxy的当前ip,更改群集为192.168.100.100
[root@haproxy ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.100.10/24 brd 192.168.100.255 scope global noprefixroute ens33
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
34 listen nginx_server
35 bind 192.168.100.100:80
2.安装keepalived并配置
[root@haproxy ~]# yum -y install keepalived
[root@haproxy ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R1 ##本服务器的名称
}
vrrp_instance VI_1 { ##定义VRRP热备实例
state MASTER ##MASTER表示主服务器
interface ens33 ##承载VIP地址的物理接口
virtual_router_id 1 ##虚拟路由器的ID号
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
virtual_ipaddress {
192.168.100.100 ##指定漂移地址(VIP)
}
}
[root@haproxy ~]# systemctl start keepalived.service
[root@haproxy ~]# systemctl enable keepalived.service
[root@haproxy ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.100.10/24 brd 192.168.100.255 scope global noprefixroute ens33
inet 192.168.100.100/32 scope global ens33
3.编写haproxy启动脚本
考虑到调度器必须先获取漂移地址才能启动监听,故此需写脚本实现
[root@haproxy ~]# vim /opt/haproxy.sh
#!/bin/bash
/sbin/ip a | /bin/grep 192.168.100.100 &>/dev/null
if [ $? -eq 0 ]
then
systemctl restart haproxy
echo "Haproxy启动中"
fi
[root@haproxy ~]# chmod +x /opt/haproxy.sh
[root@haproxy ~]# crontab -e
* * * * * sleep 2 && /opt/haproxy.sh
[root@haproxy ~]# systemctl start crond
[root@haproxy ~]# systemctl enable crond
4.配置从haproxy
[root@haproxy_bak ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.100.20/24 brd 192.168.100.255 scope global noprefixroute ens33
[root@haproxy_bak ~]# yum -y install haproxy keepalived
[root@haproxy_bak ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
[root@haproxy_bak ~]# vim !$
global_defs {
router_id HA_TEST_R2
}
vrrp_instance VI_1 {
state BACKUP
priority 90
[root@haproxy_bak ~]# systemctl start keepalived.service
[root@haproxy_bak ~]# systemctl enable keepalived.service
[root@haproxy_bak ~]# scp [email protected]:/etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
[root@haproxy_bak ~]# scp [email protected]:/opt/haproxy.sh /opt/
[root@haproxy_bak ~]# chmod +x /opt/haproxy.sh
[root@haproxy_bak ~]# crontab -e
* * * * * sleep 2 && /opt/haproxy.sh
[root@haproxy_bak ~]# systemctl start crond
[root@haproxy_bak ~]# systemctl enable crond
5.测试效果
停止主haproxy服务,然后刷新网页看效果
[root@haproxy ~]# systemctl stop keepalived.service
文章评论