HAproxy概述
Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如LVS和Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂,Nginx 的 upstream模块支持群集功能,但是对群集节点的健康检查功能不强,性能没有 Haproxy 好。
Haproxy 官方网站是 http://haproxylwteu/。
负载均衡常用调度算法
LVS、Haproxy、Nginx 最常用的调度算法有三种
-
RR(Round Robin)。RR 算法是最简单最常用的一种算法,即轮询调度。
-
LC (Least Connections)。LC 算法即最小连接数算法,即根据后端的节点连接数大小动态分配前端请求。
-
SH (Source Hashing)。SH 即基于来源访问调度算法,此算法用于一些有Session 会话记录在服务器端的场景,可以基于来源的IP、Cookie 等做群集调度。
例如,使用基于源IP 的群集调度算法,有三个节点 A、B、C,第一个用户第一次访问被指派到了 A ,第二个用户第一次访问被指派到了 B,当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现群集的调度。此调度算法的好处是实现会话保持,但某些 IP 访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用。
案例环境
本案例使用三台服务器模拟搭建一套 Web 群集
案例实施
1 编译安装nginx服务器
①搭建nginx1服务器
# 编译安装
useradd -M -s /sbin/nologin nginx
yum -y install pcre-devel zlib-devel gcc
tar zxf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
# 编辑测试文件
cd /usr/local/nginx/html/
echo "hello python" > text.html
# 启动nginx
/usr/local/nginx/sbin/nginx
②搭建nginx2服务器
编译安装的步骤与Nginx1 相同,不同之处在于建立测试页面。
echo "hello linux" > text.html
③访问测试文件
服务器能正常访问
2 编译安装HAproxy
yum -y install pcre-devel bzip2-devel gcc openssl-devel
tar xf haproxy-1.7.2tar.gz
cd haproxy-1.7.2
make TARGET=inux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
一般在每个安装包中有一个README
文件,这里需要注意make
时的选择
3 HAproxy配置项
HAproxy
提供了几个模板配置文件option-http_proxy.cfg
、transparent_proxy.cfg
但是不是很全面,可以自己写一个
Haproxy 配置文件根据功能和用途通常分为五个部分,即 global、defaultslisten、firontend 和 backend。但有些部分不是必需的,可以根据需要进行选择配置。
①global配置
为设定的全局配置部分,属于进程级别的配置,通常和使用的操作系统配置相关
global
log 127.0.0.1 local0 notice
pidfile /var/run/haproxy.pid
maxconn 10240
user nobodyuser nobody
nbproc 1
daemon
————————————————————————————
log: 配置全局日志记录,local0 为日志设备,默认存放到系统日志,notice为输出的日志级别。表示使用本地(127.0.0.1) 机器上的 rsyslog 服务中的local0设备记录日志等级为 notice 的日志。
pidfle: 指定 haproxy 进程的 PID 文件,启动进程的用户需要有访问此文件的相关权限。
maxconn: 每个 haproxy 进程可以接收的最大并发连接数,等同于 Linux 下的 ulimit-n 命令。
user/group: 运行 haproxy 进程的用户和组,也可以使用 uid 和 gid 选项来指定用户ID和组ID号来代替。
nbproc: 设置 haproxy 的负载均衡的并发进程数。
daemon: 设置 haproxy 进程使用后台模式即守护进程方式运行,是推荐的运行模式。
②defaults配置
为缺省默认配置部分。这些设置参数属于公共配置,一般会被自动继承到 listen、frontend 和 backend 中,如果没有在这几部分特别声明,将按默认配置参数设置。
defaults
log global
mode http
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
option httplog
option forwardfor
option dontlognull
option httpclose
————————————————————————————
log: 缺省日志配置,定义日志为 global 配置中定义的日志记录方式
mode: 设置 Haproxy 默认运行模式,有 tcp、http 和 health 三种模式。tcp 模式下客户端和服务端之间会建立全双工的连接,常用于 SSLISSHSMTP 等应用,也是这里的默认模式;http 模式下客户端请求在转发到后端服务器之前会进行分析,会把不兼容 RFC 格式的请求拒绝; health 模式已经废弃不用
retries: 检查节点服务器失败次数,连续达到该失败次数则认为节点不可用。
timeout connect: 连接超时时间,连接到一台服务器的最长等待时间,单位为毫秒。
timeout client: 客户端超时时间,连接客户端发送数据时的最长等待时间,单位为毫秒。
timeout server: 服务器超时时间,服务端回应客户端数据发送的最长等待时间,单位为毫秒。
option httplog: 表示采用 http 日志格式进行日志的记录,默认不记录 http 请求日志。
option forwardfor: 表示后端服务器日志中可获得并记录客户端的源 IP 地址信息。
option dontlognull: 启用该项,日志中将不会记录空连接。
option httpclose: 表示客户端和服务端请求完毕后主动关闭 http 通道
③listen配置
为应用组件配置部分,属于 fontend 和 backend 的结合体,在之前老版本中所有的配置都在这一部分完成。为了保证配置的兼容性,这一部分被保留使用,也可以不添加此部分的设置,非必需。
listen stats
bind 0.0.0.0:8080
stats uri /stats
stats refresh 30s
stats realm Haproxy Manager
stats auth admin:admin
stats hide-version
stats admin ifTRUE
————————————————————————————
stats refresh: 统计页面自动刷新时间。
stats realm: 统计页面密码框上显示的文本。
stats auth: 设置统计页面登录用户名和密码,用户名和密码通过冒号进行分割。
stats hide-version: 隐藏统计页面上的 Haproxy 版本信息。
stats admin if TRUE: 添加此选项可在监控页面手动启用或禁用后端真实服务器,注意仅在 Haproxy 1.4.9 之后版本有效。
④frontend配置
为前端配置部分。用于设置用户接收请求的前端虚拟节点及端口,可根据 ACL 规则直接指定要使用的后端 backend 服务器。
frontend main
bind *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
————————————————————————————————
frontend main: 通过 frontend 关键字定义一个名为“main”的前端虚拟节点。
bind: 用于定义监听端口,语法格式为 bind [<address>:port_range>] interfac<interface>,这里“*”表示监听当前所有IPv4地址,与“0.0.0.0”格式含义相同。
acl: 用来设置定义ACL 规则策略,此处设置了 url_path 匹配 .jpg .gif .png .css .js 静态文件。
use_backend: 指定符合 ACL 策略的请求所访问的后端真实服务器池。
default_backend: 指定默认的后端真实服务器池,这些服务器将会在 backend 部分定义。
⑤backend配置
为后端服务器配置部分。此部分用于进行群集后端服务器群集的配置,即用来添加一组真实服务器处理前端用户请求。
backend static
balance roundrobin
server static 127.0.0.1:80 check //静态文件部署在本机
backend app
option redispatch
option abortonclose
option httpchk GET /index.html
option persist // 强制将请求发送到已经 down 掉的服务器
balance roundrobin //负载均衡调度算法使用轮询算法
server instl 192.168.114.56:80 check inter 2000 fall 3 //定义在线节点
server inst2 192.168.114.56:81 check inter 2000 fall 3 backup //定义备份节点
——————————————————————————
backend static:通过 backend 关键字定义一个名为“static”的后端真实服务器池,使用了静态、动态分离,如果 url path 匹配 .jpg、.gif、.png、.css、.js 静态文件,则访问此后端。定义了一个名为“app”的后端真实服务器池用来指定默认的后端真实服务器池。
option abortonclose: 此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接。
option redispatch: 表示当使用了 cookie 时,Haproxy 会将其请求的后端服务器的 serverID 插入到 cookie 中,以保证会话的 SESSION 持久性。一旦后端服务器出现故障,就会将客户请求强制定向到另外一个健康的后端服务器上,以保证服务的正常运行。
option httpchk: 启用 HTTP 服务状态监测,支持后端节点的健康检查,可以将故障节点上的服务迁移至其他健康节点,从而保证服务的可用性。
语法格式为:option httpchk <method> <url> <version> ,
method 表示 http 的请求方式,常用的有 OPTIONS、GET、HEAD 几种方式;
url 是要检测的 URL 地址,通过此地址获得后端服务器运行状态;
version 用来指定检测时的 HTTP 版本号;
这里的 option httpchk GET/index.html 表示检查服务器的 index.html 文件。
balance: 定义负载均衡算法,目前 Haproxy 常用算法包括:
roundrobin:简单轮询调度;
static-rr:基于权重的调度算法;
leastconn:最小连接数算法;
source:根据请求的源IP 地址;
url:根据请求的URL;
url_param:根据请求的URL参数进行调度;
hdr(name):根据 HTTP 请求头来锁定每一次HTTP请求;
rdp-cookie(name):根据 cookie(name) 来锁定并哈希每一次 TCP 请求
server:用来定义多个真实的后端服务器池
语法格式为: server <name> <address> [:port] [param]
name:为服务器池指定的内部名称;
address:是服务器的 IP 地址或主机名;
port:指定连接请求发往真实服务器时的目标端口,未指定为客户端请求端口;
param:为后端服务器设定的参数,常见的有
check(健康检查)
inter(健康检查间隔时间,单位为毫秒)
rise (从故障状态到正常状态需要成功检查的次数)
fall(从正常状态到不可用状态需要检查的次数)
weight (服务器权重)
backup (备份服务器)
4 使用 Haproxy 配置 Web 群集
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
daemon
nbproc 1
maxconn 4096
user haproxy
group haproxy
chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
defaults
mode http
log global
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
option dontlognull
option httpclose
option httplog
option redispatch
frontend main
bind *:80
default_backend webcluster
backend webcluster
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.153.132:80 check inter 2000 fall 3
server inst2 192.168.153.133:80 check inter 2000 fall 3
# 创建专用系统用户
useradd -M -s /sbin/nologin haproxy
5 创建HAproxy自启动脚本
HAproxy
提供了启动脚本模板examples/haproxy.init
cp examples/haproxy.init /etc/init,d/haproxy
# 添加权限
chmod +x /etc/init.d/haproxy
# 添加到系统服务
chkconfig --add haproxy
# 启动程序
service haproxy start
启动时报错
查看状态
报错1:/etc/init.d/haproxy: 第 26 行:[: =: 期待一元表达式
原因:语法
vim /etc/init.d/haproxy
# 修改一下
[ ${NETWORKING} = "no" ] && exit 0
# 修改为下面这个
[ "${NETWORKING}" = "no" ] && exit 0
报错2:/etc/init.d/haproxy:行98:/usr/sbin/haproxy:符号连接的层数过多
原因:/usr/sbin/
目录下没有haproxy
,创建软连接做路径优化
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
查看进程,注意haproxy
的默认端口是80
现在可以正常访问网址192.168.27.145
,不要访问VIP地址
6 挂载NFS服务器
为了方便区分,创建两个不同的目录
开启服务
systemctl start rpcbind
systemctl start nfs
在HTTP1和HTTP2两台服务器上分别挂载
# 在HTTP1服务器
mount.nfs 192.168.153.134:/share/http1 /usr/local/nginx/html/
# 在HTTP2服务器
mount.nfs 192.168.153.134:/share/http2 /usr/local/nginx/html/
访问网址192.168.27.145
7 使用Keepalived进行双机热备
在服务器BACKUP上源码安装HAporxy
软件
yum -y install pcre-devel bzip2-devel gcc openssl-devel
tar xf haproxy-1.7.2tar.gz
cd haproxy-1.7.2
make TARGET=inux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg # 内容与主调度器一致
useradd -M -s /sbin/nologin haproxy
cp examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start
编辑两台调度服务器的keepalived
配置文件
vim /etc/keepalived/keepalived.conf
# 主调度器
global_defs {
router_id LVS_DR_1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.27.149
}
}
————————————————————————————————————
# 从调度器
global_defs {
router_id LVS_DR_2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.27.149
}
}
# 重载服务
systemctl reload keepalived
现在可以通过访问定义的漂移地址192.168.27.149
查看网站内容
关于LVS、Nginx、HAproxy的优劣
目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LVS,Nginx及HAProxy,高可用软件有Heartbeat、Keepalived,成熟的架构有LVS+Keepalived、Nginx+Keepalived、HAProxy+keepalived及DRBD+Heartbeat.
三种负载均衡器的优缺点说明如下:
LVS
优点:
-
抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;
-
工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;
-
应用范围比较广,可以对所有应用做负载均衡;
-
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
缺点:
-
软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
-
如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Nginx
优点:
-
工作在OSI第7层,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比HAProxy更为强大和灵活;
-
Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
-
Nginx安装和配置比较简单,测试起来比较方便;
-
可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
-
Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;
-
Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;
-
Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;
缺点:
-
Nginx不支持url来检测。
-
Nginx仅能支持http和Email,这个它的弱势。
-
Nginx的Session的保持,Cookie的引导能力相对欠缺。
HAProxy
-
HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
-
能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
-
支持url检测后端的服务器;
-
它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
-
HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
P环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;
- Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;
缺点:
-
Nginx不支持url来检测。
-
Nginx仅能支持http和Email,这个它的弱势。
-
Nginx的Session的保持,Cookie的引导能力相对欠缺。
HAProxy
-
HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
-
能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
-
支持url检测后端的服务器;
-
它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
-
HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
-
HAProxy的算法较多,达到8种;