? ? ? ? Haproxy是目前比较流行的一致群集调度功能,同类群集调度工具有很多,如LVS和Nginx。相对而言,LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有Haproxy好。Haproxy官方网站是http://www.haproxy.org/
? ? ? ? 本章案例介绍使用Haproxy及Nginx搭建一套Web群集
? ? ? ? 通过URL访问网站使用的协议是HTTP协议,此类请求一般称呼为HTTP请求。HTTP请求的方式分为GET方式和POST方式。当使用浏览器访问某一个URL,会根据请求URL返回状态码,通常正常的状态码为2XX、3XX(如200、301),如果出现异常会返回4XX、5XX(如400,500)
? ? ? ? 例如,访问http://www.test.com/a.php?ID=123。就是一个GET请求,如果访问正常,会从服务器的日志中获取200状态码。假如此请求使用POST方式,那么传递给 a.php 的 Id 参数依旧是 123,但是浏览器的 URL 将不会显示后面的 Id=123 字样,因此表单类或者有用 户名、密码等内容提交时建议使用 POST 方式。不管使用哪种方式,最终 a.php 获取的值是 一样的
LVS、Haproxy、Nginx的最常用的调度算法有三种,如下所述
????????(1)RR(Round Robin)。RR 算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点 A、B、C,第一个用户访问会被指派到节点 A,第二个用户访问会被指派到节点 B,第三个用户访问会被指派到节点 C,第四个用户访问继续指派到节点 A,轮询分配访问请求实现负载均衡效果。此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求
? ? ? ? (2)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 算法有很大改进,是目前用到比较多第 3 页 共 10 页 的一种算法
? ? ? ? (3)SH(Source Hashing)。SH 即基于来源访问调度算法,此算法用于一些有 Session 会话记录在服务器端的场景,可以基于来源的 IP、Cookie 等做群集调度。例如,使用基于源 IP 的群集调度算法,有三个节点 A、B、C,第一个用户第一次访问被指派到了 A,第二个用户第一次访问被指派到了 B,当第一个用户第二次访问时会被继续指派到 A,第二个用户第二次访问时依旧会被指派到 B,只要负载均衡调度器不重启,第一个用户访问都会被指派到 A,第二个用户访问都会被指派到 B,实现群集的调度。此调度算法好处是实现会话保持,但某些 IP 访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用
? ? ? ? 目前,常见的Web群集调度器分为软件和硬件。软件通常使用开源的LVS、Haproxy、Nginx,硬件一般使用比较多的是F5。也是很多人使用国内的一些产品,如梭子鱼、绿门等
本案例使用三天服务器模拟搭建一套Web群集,具体拓扑如下
Haproxy群集拓扑
案例环境
(1)测试安装nginx、haproxy
(2)Haproxy、nginx配置
(1)搭建第一台服务器Nginx,使用软件包进行编译安装
[root@node2 ~]# yum -y install pcre-devel zlib-devel gcc++ gcc
[root@node2 ~]# useradd -M -s /sbin/nologin nginx
[root@node2 ~]# tar zxvf nginx-1.12.0.tar.gz
[root@node2 ~]# cd nginx-1.12.0/
[root@node2 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@node2 nginx-1.12.0]# make && make install
安装完后的默认信息如下
[root@node2 ~]# cd /usr/local/nginx/html/
[root@node2 html]# echo "www.aaa.com" > index.html //建立测试页面
[root@node2 ~]# /usr/local/nginx/sbin/nginx //启动Nginx
[root@node2 ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13633/nginx: master
[root@node2 ~]#
为了方便实验 ,网站没有配置域名 ,直接使用IP地址 。在客户端访问 http://192.168.161.11/test.html 测试
(2)搭建第二服务器Nginx,步骤与之相同就不作介绍了,不同之处在于创建测试页面不同,安装完成后在客户端访问http://192.168.161.12测试
在 Haproxy 服务器使用 haproxy-1.5.19.tar.gz 安装包进行编译安装
[root@node1 ~]# yum -y install pcre-devel bzip2-devel
[root@node1 ~]# tar xf haproxy-1.5.19.tar.gz
[root@node1 ~]# cd haproxy-1.5.19/
[root@node1 haproxy-1.5.19]# make TARGET=linux26
[root@node1 haproxy-1.5.19]# make install
(1)建立Haproxy的配置文件
[root@node1 ~]# mkdir /etc/haproxy //创建配置文件目录
[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/ //将配置文件复制到/etc目录下
(2)Haproxy配置项介绍
????????Haproxy 配置文件通常分为三个部分,即 global、defaults 和 listen。global 为全局配置,defaults 为默认配置,listen 为应用组件配置
????????global 配置项通常有下面配置参数,以示例参数说明如下
global
log 127.0.0.1 local0 //配置日志记录,local0 为日志设备,默认存放到系统日志
log 127.0.0.1 local1 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 //强制将请求发送到已经 down 掉的服务器
balance roundrobin //负载均衡调度算法使用轮询算法
server inst1 192.168.114.56:80 check inter 2000 fall 3 //定义在线节点
server inst2 192.168.114.56:81 check inter 2000 fall 3 backup //定义备份节点
(2)修改haproxy配置文件
根据目前的群集设计,将 haproxy.cfg 配置文件的内容修改如下
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy
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 aaa 192.168.161.11:80 check inter 2000 fall 3 //Nginx服务器IP地址
server aaa 192.168.161.12:80 check inter 2000 fall 3
[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
[root@node1 ~]# cp haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@node1 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@node1 ~]# chmod +x /etc/init.d/haproxy
[root@node1 ~]# chkconfig --add /etc/init.d/haproxy
[root@node1 ~]# /etc/init.d/haproxy start
????????通过上面的步骤,已经搭建完成 Haproxy 的 Web 群集,接下来需要验证群集是否工作正 常。一个群集一般需要具备两个特性,第一个是高性能,第二个是高可用
(1)测试高性能
在客户端使用浏览器打开http://192.168.161.10,浏览器显示信息如图
再次打开一个新的浏览器页面访问http://192.168.161.10,浏览器显示信息如图(可能需要刷新一下)
可以看到群集的负载均衡调度已经生效,已经满足了群集的高性能需求
(2)测试高可用
? 现在将192.168.161.11的Nginx服务关闭,在客户端使用浏览器打开http://192.168.161.10,浏览器显示信息仍然是(www.bbb.com)
从中可以看出,当一台节点故障,不会影响群集的使用,这样就满足了群集的高可用性。 也可以将 192.168.161.11?的 Nginx 服务恢复,再将 192.168.161.12?的 Nginx 服务停用,测试高可用性
????????关于 Haproxy 的参数优化,以下列举了几个关键的参数,并对各参数的生产环境的优化建议做了说明,如表