使用HAproxy搭建WEB群集

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.cfgtransparent_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种;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值