一、案例分析
1.案例概述
Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如LVS 和Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy好。
2.案例前置知识
(1)HTTP请求
通过 URL访问网站使用的协议是HTTP 协议,此类请求一般称为HTTP 请求。HTTP 请求的方式分为 GET 方式和 POST 方式。当使用浏览器访问某一个 URL,会根据请求 URL 返回状态码,通常正常的状态码为 2xx、3xx(如 200、301),如果出现异常会返回 4xx、5xx(如 400、500)。
(2)负载均衡常用调度算法
LVS、Haproxy、Nginx最常用的调度算法有三种,如下所述:
RR(Round Robin)。RR算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点 A、B、C,第一个用户访问会被指派到节点 A,第二个用户访问会被指派到节点 B,第三个用户访问会被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果。此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求。
LC(Least Connections)。LC算法即最小连接数算法,根据后端的节点连接数大小动态分配前端请求。例如,有三个节点 A、B、C,各节点的连接数分别为 A:4、B:5、C:6,此时如果有第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6:第个用户请求会继续分配到A上,连接数变为A:6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端。由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况,因此此算法相比较rr 算法有很大改进,是目前用到比较多的一种算法。
SH(Source Hashing)。SH 即基于来源访问调度算法,此算法用于一些有 Session会话记录在服务器端的场景,可以基于来源的 IP、Cookie 等做群集调度。例如,使用基于源 IP 的群集调度算法,有三个节点 A、B、C,第一个用户第一次访问被指派到了 A,第二个用户第一次访问被指派到了 B,当第一个用户第二次访问时会被继续指派到 A,第二个用户第二次访问时依旧会被指派到 B,只要负载均衡调度器不重启,第一个用户访问都会被指派到 A,第二个用户访问都会被指派到 B,实现群集的调度。此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用。
(3)常见的Web群集调度器
目前,常见的 Web 群集调度器分为软件和硬件。软件通常使用开源的LVS、Haproxy、Nginx,硬件一般使用比较多的是 F5。也有很多人使用国内的一些产品,如梭子鱼、绿盟等。
3.案例环境
本案例使用三台服务器模拟搭建一套 Web 群集,具体的拓扑如图所示。
二、案例实施
1.编译安装Nginx服务器
[root@node1 ~]# yum -y install pcre-devel zlib-devel gcc*
[root@node1 ~]# useradd -M-s /sbin/nologin nginx
[root@node1 ~]# tar zxvf nginx-l.12.0.tar.gz
[root@node1 ~]# cd nginx-l.12.0
[root@node1 nginx-1.12.0]#./configure--prefix=/usr/local/nginx --user-nginx --gro
up=nginx
[root@node1 nginx-1.12.0]# make && make install
[root@node1 nginx-1.12.0]# cd /usr/local/nginx/html
[root@node1 html]# echo "test web01">index.html
[root@node1 html]# /usr/local/nginx/sbin/nginx
node2编译安装步骤与node1相同,但测试页面要和node1有所不同。
2.编译安装Haproxy
[root@hap-node]# yum -y install pcre-devel bzip2-devel gcc*
[root@hap-node ~]# tar xf haproxy-1.5.19.tar.gz
[root@hap-node ~]# cd haproxy-1.5.19
[root@hap-node haproxy-1.5.19]# make TARGET=linux26
[root@hap-node haproxy-1.5.19]# make install
3.Haproxy服务器配置
(1)建立Haproxy的配置文件
[root@hap-node haproxy-1.5.19]# mkdir /etc/haproxy
[root@hap-node haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
Haproxy 配置项介绍:
Haproxy配置文件通常分为三个部分,即 global、defaults 和 listen。global 为全局配置,defaults 为默认配置,1isten为应用组件配置。
global配置项通常有下面配置参数,以示例参数说明如下。
global
1og 127.0.0.1 loca10 //配置日志记录,loca10 为日志设备,默认存放到系统日志
1og 127.0.0.1 locall notice//notice为日志级别,通常有24个级别
maxconn 4096 //最大连接数
uid 99 //用户 uid
gid 99 //用户 gid
defaults 配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将按照默认配置参数设置。
defaults
log global //定义日志为 global 配置中的日志定义
mode http //模式为 http
option httplog //采用 http 日志格式记录日志
retries 3 //检查节点服务器失败次数,连续达到三次失败,则认为节点不可
用
redispatch //当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 //最大连接数
contimeout 5000 //连接超时时间
clitimeout 50000 //客户端超时时间
srvtimeout 50000 //服务器超时时间
listen 配置项一般配置应用模块参数。
listen appli4-backup 0.0.0.0:10004 //定义一个 appli4-backup 的应用
option httpchk /index.html //检查服务器的 index.html 文件
option persist //制将请求发送到已经 dow 掉的服务器
balance roundrobin //负载均衡调度算法使用轮询算法
server instl 192.168.114.56:80 check inter 2000 fa11 3 //定义在线节点
server inst2 192.168.114.56:81 check inter 2000 fall 3 backup //定义备份节点
(2)修改haproxy.cfg配置文件
根据目前的群集设计,将 haproxy.cfg 配置文件的内容修改如下。
[root@localhost haproxy-1.5.19]# vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
# redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webcluster 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.10.102:80 check inter 2000 fall 3 weight 1
server inst2 192.168.10.103:80 check inter 2000 fall 3 weight 2
4.创建自启动脚本
[root@hap-node haproxy]# cp /haproxy-1.5.19/examples/haproxy.init /etc/init. d/haproxy
[root@hap-node haproxy]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@hap-node haproxy]# chmod +x /etc/init.d/haproxy
[root@hap-node haproxy]# chkconfig --add /etc/init.d/haproxy
[root@hap-node haproxy]# /etc/init.d/haproxy start
Starting haproxy (via systemctl): [确定]
root@hap-node haproxy]# systemctl stop firewalld
5.测试Web群集
(1)测试高性能
在客户端连续访问Haproxy服务器的IP地址,查看浏览器显示信息,若能按照设置分别显示node1和node2的测试页面,群集的负载均衡调度已经生效,已经满足了群集的高性能需求。
(2)测试高可用
将一台node节点的Nginx服务停用,在客户端访问测试页面,浏览器仍显示信息。当一台节点故障,不会影响群集的使用,这样就满足了群集的高可用性。
6.Haproxy的日志
Haproxy 的日志默认输出到系统的 syslog 中,查看起来不是非常方便,为了更好地管理 Haproxy 的日志,在生产环境中一般单独定义出来,定义的方法如下所述。
(1)修改syslog
配置文件,将原有的配置更改为以下配置:
[root@hap-node ~]# vim /etc/rsyslog. conf
......
$ModLoad imudp #去掉注释,开启 UDP 日志协议转发
$UDPServerRun 514
......
local3.* /var/log/haproxy.log #最下方添加
local0.* /var/log/haproxy.log #最下方添加
重启 rsyslog,完成rsyslog 配置。
(2)测试日志信息
在客户端访间 http://192.168.10.101后,可以使用tail -f /var/log/haproxy.log 即时査看Haproxy的访问请求日志信息。