使用Haproxy搭建web群集

内容要点:html

1、常见的 Web集群调度器:前端

2、Haproxy 应用分析:linux

3、Haproxy 调度算法原理:nginx

4、实验示例:c++

第一步:搭建两台 Nginx 服务器web

第二步:搭建 Haproxy算法

第三步:在 win7 上用浏览器访问调度服务器(192.168.100.100/test.html)vim

第四步:优化日志后端

1、常见的 Web集群调度器:浏览器

目前常见的 Web 集群调度器分为软件和硬件,软件一般使用开源的LVS、Haproxy、Nginx,硬件通常使用比较多的是 F5,也有不少人使用国内的一些产品,如梭子鱼、绿盟等。


2、Haproxy 应用分析:

(1)LVS 在企业应用中抗负载能力很强,但存在不足:


  • LVS 不支持正则处理,不能实现动静分离;

  • 对于大型网站,LVS 的实现配置复杂,维护成本相对较高

(2)Haproxy 是一款可提供高可用性、负载均衡、及基于 TCP 和 HTTP 应用的代理的软件


  • 特别适用于负载特别大的 Web站点;

  • 运行在当前的硬件上可支持数以万计的并发链接请求

3、Haproxy 调度算法原理:

Haproxy 支持多种调度算法,最经常使用的有三种:


(1)RR:


RR 算法是最简单最经常使用的一种算法,即轮询调度;

理解举例

  • 有三个节点A、B、C,第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到节点

  • 第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果


(2)LC:


LC 算法即最小链接数算法,根据后端的节点链接数大小动态分配前端请求;

理解举例

  • 有三个节点A. B、C,各节点的链接数分别为A:四、B:五、 C:6, 此时若是有第一个用户链接请求,会被指派到A上,链接数变为A:五、B:五、 C:6

  • 第二个用户请求会继续分配到A上,链接数变为A:六、B:五、 C:6; 再有新的请求会分配给B,每次将新的请求指派给链接数最小的客户端

  • 因为实际状况下A. B、C的链接数会动态释放,很难会出现同样链接数的状况,所以此算法相比较r算法有很大改进,是目前用到比较多的-种算法

(3)SH:


SH 即基于来源访问调度算法,次算法用于一些有 Session 会话记录在服务器端的场景,能够基于来源的 IP、Cookie 等作集群调度。

理解举例

  • 有三个节点A. B、C,第一个用户第一-次访问被指派到了A,第二个用户第一次访问被指派到了B

  • 当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

  • 此调度算法好处是实现会话保持,但某些IP访问量很是大时会引发负载不均衡,部分节点访问量超大,影响业务使用

4、实验示例:

(1)环境准备:


  • 两台 Nginx 服务器,一台 Haproxy调度服务器,一台window做为测试用;

  • 在两台 Nginx服务器写两个测试网页;

  • 全部主机网卡都设置成仅主机模式,修改好网卡信息;

  • 客户端能够经过访问调度服务器,访问到两台节点服务器,不须要访问真实服务器地址。

角色 IP地址
Haproxy 192.168.100.100
Nginx 01 192.168.100.201
Nginx 02 192.168.100.202
window7(做为测试用) 192.168.100.50


第一步:搭建两台 Nginx 服务器

关于nginx的搭建能够看我以前的博客,有详细的搭建过程和细节,这边具体细节再也不写了。

搭建好 Nginx服务以后,在 Nginx主页 html 中添加一个测试主页,便于验证明验结果:

第一台:

echo "this is kgc web" > /usr/local/nginx/html/tset.html

第二台:

echo "this is accp web" > /usr/local/nginx/html/tset.html


第二步:搭建 Haproxy

(1)安装编译工具:

yum install bzip2-devel pcre-devel gcc gcc-c++ make -y


(2)能够经过远程挂载将 haproxy压缩包挂载到本地,再解压缩:

 tar zxvf haproxy-1.5.19.tar.gz -C /opt/
 //解压到/opt目录下


(3)编译:

make TARGET=linux3100
注:这个版本号,可使用 uname -a 命令来查看版本号
make install


(4)建立文件,进行备份修改:


mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/

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
        uid 99
        gid 99
        daemon
        #debug
        #quiet
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
        
listen webcluster 0.0.0.0:80
       option httpchk GET /test.html
       balance roundrobin
       server inst1 192.168.100.201:80 check inter 2000 fall 3
       server inst2 192.168.100.202:80 check inter 2000 fall 3


(5)启动脚本:


cp examples/haproxy.init /etc/init.d/haproxy
 //复制到init.d启动进程中
 
chmod +x /etc/init.d/haproxy
 //添加执行权限
 
chkconfig --add haproxy 
 //添加到service,便于识别
 
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
 //建立软链接


(6)开启服务:

service haproxy start


关闭防火墙等环境


[root@Haproxy haproxy-1.5.19]# systemctl stop firewalld.service 
[root@Haproxy haproxy-1.5.19]# setenforce 0


第三步:在 win7 上用浏览器访问调度服务器(192.168.100.100/test.html)

http://192.168.100.100/test.html

image.png

image.png

第四步:优化日志

对调度器的配置文件进行优化和修改,能够将正常的访问信息和错误的信息分别存放在不一样的日志文件中,方便管理;Haproxy的日志默认是输出到系统的 syslog 中,在生产环境中通常单独定义出来。


(1)修改主配置文件


vim/etc/haproxy/haproxy.cfg

修改global段:
log /dev/log    local0 info      //正常访问的信息存放地
log /dev/log    local0 notice    //提示、警告等信息存放地


在这里插入图片描述

(2)重启服务

service haproxy restart


(3)建立文件,并添加规则


[root@Haproxy haproxy]# touch /etc/rsyslog.d/haproxy.conf
[root@Haproxy haproxy]# cd /etc/rsyslog.d/

[root@Haproxy rsyslog.d]# vim 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
&~


(4)重启日志服务

systemctl restart rsyslog.service


(5)查看日志文件: /var/log/haproxy/haproxy-info.log

cat haproxy-info.log

image.png