Haproxy是目前比较流行的一种集群调度工具,同类的集群工具有很多,前面已经介绍了LVS、Nginx。相比较而言,LVS性能最好,但是搭建相对复杂,Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,性能没有Haproxy好。本篇博客将介绍haproxy搭建Web群集的安装配置和日志配置


常见的Web集群调度器

Nginx:nginx是一款轻量级,能实现缓存、webserver、邮件、负载均衡等功能,但nginx的许多功能都需要第三方的模块,但对集群节点健康检查功能不强

Haproxy:转发能力比nginx有更强更灵活的定制性,可以运用splice实现0复制的转发,并且有更直观的图形化管理界面,不过通用性不如nginx,并无缓存功能

lvs:lvs是工作在内核空间上直接转发的,无缓存功能,性能好,配置较复杂


负载均衡常用调度算法

RR(Round Robin):轮询调度,轮询分配访问请求实现负载均衡效果

LC(Least Connections):最小连接数,根据后端的节点连接数大小动态分配前端请求

SH(Source Hashing):基于来源的IP、COOKIE等做集群调度,好处是实现会话保持,但某些IP访问量很大时可能影响负载不均衡


案例环境

    本案例使用三台服务器模拟搭建一套Web集群,如下所示:

杨书凡09.png

主机
角色
IP
web1
real server-1
192.168.1.1/24
web2
real server-2
192.168.1.2/24
haproxy
代理服务器
192.168.1.10/24
win7
客户端
192.168.1.100/24



实验步骤如下:

1. 编辑安装nginx服务器

(1)搭建nginx1

[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost ~]# tar zxf nginx-1.6.2.tar.gz
[root@localhost nginx-1.6.2]# ./configure  --prefix=/usr/local/nginx  
[root@localhost nginx-1.6.2]# make && make install
[root@localhost nginx-1.6.2]# cd /usr/local/nginx/html
[root@localhost html]# echo "this is 192.168.1.1" > index.html         //建立测试页面
[root@localhost html]# /usr/local/nginx/sbin/nginx                     //启动nginx
[root@localhost html]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT      //建立防火墙规则


(2)搭建nginx2,步骤与nginx1相同,建立不同的测试页面

   安装完成后,在客户端访问nginx进行测试,如下图所示:

杨书凡10.png

杨书凡11.png




2. 安装配置haproxy

[root@localhost ~]# yum -y install pcre-devel bzip2-devel
[root@localhost ~]# tar zxf haproxy-1.4.24.tar.gz
[root@localhost ~]# cd haproxy-1.4.24
[root@localhost haproxy-1.4.24]# make TARGET=linux26
[root@localhost haproxy-1.4.24]# make install[root@localhost haproxy-1.4.24]# mkdir /etc/haproxy      //创建配置文件目录
[root@localhost haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/  //将样本复制到配置文件目录


3. 根据目前集群设计,将haproxy.cfg配置文件修改如下:


[root@localhost haproxy-1.4.24]# vim /etc/haproxy/haproxy.cfg 
global                    //全局配置log 127.0.0.1   local0          //配置日志记录,默认存放到系统日志log 127.0.0.1   local1 notice   //notice为日志级别,通常有24个级别maxconn 4096          //最大连接数uid 99                //用户uidgid 99                //用户giddaemon                //后台运行#debug#quiet
defaults                   //默认配置log     global              //定义全局配置日志格式mode    http                //模式为httpoption  httplog             //采用http日志格式记录日志option  dontlognull         //不记录健康检查的日志信息retries 3           //检查节点的失败次数,连续失败三次则认为节点不可用maxconn 2000                 //最大连接数contimeout      5000         //连接超时时间clitimeout      50000        //客户端超时时间srvtimeout      50000        //服务器超时时间
listen  webcluster 0.0.0.0:80        //定义一个webcluster应用模块option httpchk GET /index.html      //检查服务器的index.html文件balance     roundrobin              //负载均衡的调度算法采用轮询算法server inst1 192.168.1.1:80 check inter 2000 fall 3    //定义在线节点,每间隔2秒检查3次server inst2 192.168.1.2:80 check inter 2000 fall 3    //定义备份节点


4. 创建自启动脚本


[root@localhost haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[root@localhost haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost haproxy-1.4.24]# chmod +x /etc/init.d/haproxy 
[root@localhost haproxy-1.4.24]# /etc/init.d/haproxy start
Starting haproxy:                                          [确定]
[root@localhost haproxy-1.4.24]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT


5. 测试Web集群

    通过上面的步骤,已经搭建完成Haproxy的Web集群,下面验证一下集群是否正常工作,一个集群一般具备两个特性:高性能与高可用

(1)测试高性能

    在客户端使用浏览器打开http://192.168.1.10,如下图所示:

杨书凡12.png


(2)测试高可用
    现在将nginx1服务停用,在客户端访问代理服务器,浏览器会显示nginx2网页内容,不会影响集群的使用,满足了集群的高可用性


6. 配置haproxy日志
    Haproxy的日志默认是保存到系统的syslog中,查看起来不方便,所以我们在生产环境中可以将日志单独存储到不同的文件中,配置如下:
(1)修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
log /dev/log    local0 info       //将info、notice日志记录分别记录到不同的日志文件中
log /dev/log    local0 notice
[root@localhost ~]# service haproxy restart
Shutting down haproxy:                                     [确定]
Starting haproxy:                                          [确定]


(2)修改rsyslog配置

    将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d下,rsyslog启动时会自动加载此目录下所有的配置文件

[root@localhost ~]# touch /etc/rsyslog.d/haproxy.conf
[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
& ~
[root@localhost ~]# service rsyslog restart
关闭系统日志记录器:                                       [确定]
启动系统日志记录器:                                       [确定]



7. 测试日志信息

[root@localhost ~]# tail -f /var/log/haproxy/haproxy-info.log   //查看haproxy的访问请求日志信息
Feb 28 19:37:38 localhost haproxy[8432]: 192.168.1.111:61757 [28/Feb/2018:19:37:38.000] 
webcluster webcluster/inst1 0/0/0/1/3 304 150 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"


    如果haproxy服务器出现故障,依然会影响集群的使用,可以增加一台haproxy安装keepalived保证haproxy服务器本身的高可用,注意防火墙开启224.0.0.18端口,这是keepalived的组播地址。

iptables -I INPUT -p ip -d 224.0.0.18 -j ACCEPT

参考文档:https://blog.51cto.com/yangshufan/2067083