Haproxy搭建Web群集(含Haproxy+Keepalived高可用群集)

目录

  • 一、常见的Web集群调度器
  • 二、Haproxy应用分析
  • 三、Haproxy调度算法原理
    • 1.RR(Round Robin)
    • 2.LC(Least Connections)
    • 3.SH(Source Hashing)
  • 四、Haproxy配置文件详解
    • defaults配置项配置
    • 2.Listen配置项目一般为配置应用模块参数
  • 五、 Haproxy参数优化
  • 六、Haproxy日志管理
  • 七、案例:使用Haproxy搭建Web群集
    • 环境要求
    • 步骤分析
      • 1.在两台网站服务器上安装Nginx,并启动服务
      • 2.在负载均衡器上安装Haproxy
    • Haproxy搭建Web群集
      • 1.NFS共享存储服务器配置
      • 2.nginx服务器
      • 3.Haproxy服务器
      • 4.访问测试
  • 八、日志定义
  • 九、统计页面设置
  • 十、案例:Haroxy+Keepalived高可用群集
      • 主调度服务器
      • 配置keepalived服务健康检查脚本
      • 备用调度服务器

一、常见的Web集群调度器

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

二、Haproxy应用分析

  • LVS在企业应用中抗负载能力很强,但存在不足——(工作在四层)
    LVS不支持正则处理,不能实现动静分离
    对于大型网站,LVS的实施配置复杂,维护成本相对较高
  • Haproxy是一款可提供高可用、负载均衡、及基于TCP和HTTP应用的代理的软件——(工作在四层和七层)
    使用于负载大的Web站点
    运行在硬件上可支持数以万计的并发连接的连接请求

三、Haproxy调度算法原理

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

1.RR(Round Robin)

RR算法是最简单最常用的一种算法,即轮询调度
理解举例
有三个节点A、B、C
第一个用户访问会被指派到节点A
第二个用户访问会被指派到节点B
第三个用户访问会被指派到节点C
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

2.LC(Least Connections)

最小连接数算法,根据后端的节点连接数大小动态分配前端请求
理解举例
有三个节点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.SH(Source Hashing)

基于来源访问调度算法,用于一些Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度
理解举例
有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B
当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现群集的调度
此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

四、Haproxy配置文件详解

defaults配置项配置

1.defaults配置项配置默认参数,一般会被应用组件继承
2.如果应用组件中没有特别声明,将按默认配置参数设置

  • log global:定义日志为global配置中的日志定义
  • mode http:模式为http
  • option httplog:采用http日志格式记录日志
  • retries 3:检查节点服务器失败连续达到三次则认为节点不可用
  • maxconn 2000:最大连接数
  • contimeout 5000:连接超时时间(5秒)
  • slitimeout 50000:客户端超时时间(50秒)
  • srvtimeout 50000:服务器超时时间

2.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.57:80 check inter 2000 fall 3 backup: 定义备份节点

五、 Haproxy参数优化

随着企业网站负载增加,haproxy参数优化相当重要

  • maxconn:最大连接数,根据应用实际情况进行调整,推荐使用10240
  • daemon:守护进程模式,Haproxy可以使用非守护进程模式启动,建议使用守护进程模式启动
  • nbproc:负载均衡的并发进程数,建议与当前服务器CPU核数相等或为其2倍
  • retries:重试次数,主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次
  • option http-server-close:主动关闭http请求选项,建议在生产环境中使用此选项
  • timeout http-keep-alive:长连接超时时间,设置长连接超时时间,可以设置为10s
  • timeout http-request:http请求超时时间,建议将此时间设置为5-10s,增加http连接释放速度
  • timeout client:客户端超时时间,如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右就可以了

六、Haproxy日志管理

默认是输出到系统的syslog中,生产环境中一般单独定义
定义的方法步骤
修改Haproxy配置文件中关于日志配置的选项,加入配置

[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg
log /dev/log local0 info
log /dev/log local0 notice
[root@haproxy ~]# systemctl restart haproxy 重启服务

修改rsyslog配置,将Haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下
保存配置文件并重启rsyslog服务,完成rsyslog配置
访问Haproxy集群测试网页并查看日志信息

七、案例:使用Haproxy搭建Web群集

环境要求

用1台客户端,三台虚拟服务器模拟搭建一套Web群集

虚拟安装CentOS 7.4的64位系统

主机 IP地址 主要软件
Haproxy服务器 192.168.10.10 haproxy
Nginx服务器1 192.168.10.20 nginx
Nginx服务器2 192.168.10.30 nginx
nfs服务器 192.168.10.40 nfs服务
客户端 192.168.10.80 浏览器

步骤分析

1.在两台网站服务器上安装Nginx,并启动服务

使用源码编译的方式进行安装
关闭Firewalld防火墙
安装基础软件包
增加系统用户账号nginx
编译安装Nginx并启动

在两台Nginx上配置测试网站,注意测试网页的内容应该不同,以便进行测试

2.在负载均衡器上安装Haproxy

安装步骤
安装基础软件包
编译安装haproxy
要注意操作系统版本,是32位系统还是64位
建立Haproxy的配置文件
创建配置文件目录/etc/haproxy
将源码包提供的配置文件样例haproxy.cfg复制到配置文件目录中

Haproxy搭建Web群集

1.NFS共享存储服务器配置

[root@server1 ~]# yum -y install nfs-utils rpcbind
[root@server1 ~]# mkdir /opt/web1
[root@server1 ~]# mkdir /opt/web2
[root@server1 ~]# echo "this is Web1." > /opt/web1/index.html
[root@server1 ~]# echo "this is Web2." > /opt/web2/index.html
[root@server1 ~]# vi /etc/exports
/opt/web1 192.168.10.20/32(ro)
/opt/web2 192.168.10.30/32(ro)
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# showmount -e	#查看本机共享存储发布情况

2.nginx服务器

nginx服务器1

[root@server1 ~]# yum -y install gcc gcc-c++ pcre-devel zlib-devel
[root@server1 ~]# useradd -M -s /sbin/nologin nginx
[root@server1 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server1 ~]# cd nginx-1.12.2/
[root@server1 ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@server1 ~]# make && make install
[root@server1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@server1 ~]# nginx
[root@server1 ~]# nginx -t
[root@server1 ~]# mount 192.168.10.40:/opt/web1 /usr/local/nginx/html/index.html

nginx服务器

[root@server1 ~]# yum -y install gcc gcc-c++ pcre-devel zlib-devel
[root@server1 ~]# useradd -M -s /sbin/nologin nginx
[root@server1 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server1 ~]# cd nginx-1.12.2/
[root@server1 ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@server1 ~]# make && make install
[root@server1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@server1 ~]# nginx
[root@server1 ~]# nginx -t
[root@server1 ~]# mount 192.168.10.40:/opt/web2 /usr/local/nginx/html/index.html

3.Haproxy服务器

[root@server1 ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@server1 ~]# cd /opt/
[root@server1 opt]# tar zxf haproxy-1.4.24.tar.gz
[root@server1 ~]# cd haproxy-1.4.24/
[root@server1 haproxy-1.4.24]# make TARGET=linux26
[root@server1 haproxy-1.4.24]# make install
[root@server1 haproxy-1.4.24]# mkdir /etc/haproxy
[root@server1 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/
[root@server1 ~]# vi /etc/haproxy/haproxy.cfg
注释下面
#chroot /usr/share/haproxy
#redispatch

global
        log /dev/log    local0 info              ##日志文件
        log /dev/log    local0 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy		##注释此项
        uid 99
        gid 99
        daemon		        ##守护进程模式
        #debug
        #quiet
        #nbproc 2		    ##负载均衡并发连接数

defaults
        log     global		    ##定义日志为global配置中的日志定义
        mode    http		       ##模式为http
        option  httplog		         ##采用http日志格式记录日志
        option  dontlognull		
        #option http-server-close	    ##主动关闭http请求选项,建议在生产环境中使用
        retries 3	     ##重试次数,用于对群集节点的检查
        #redispatch			##注释此项
        maxconn 2000		##最大连接数,根据应用实际情况进行调整
        contimeout      5000	    ##连接超时时间(ms)
        clitimeout      50000	    ##客户端超时时间(ms)
        srvtimeout      50000	    ##服务器超时时间(ms)

listen webcluster 0.0.0.0:80	    ##定义一个应用为webcluster
        option httpchk GET /index.html	    ##检查服务器的index.html文件
        balance roundrobin		   ##负载均衡调度算法为轮询rr
        server web1 192.168.10.20:80 check inter 2000 fall 3	   ##服务节点1
        server web2 192.168.10.30:80 check inter 2000 fall 3	   ##服务节点2
        
[root@server1 ~]# cp examples/haproxy.init /etc/init.d/haproxy
[root@server1 ~]# vi /etc/init.d/haproxy
# chkconfig:35 80 83(将-换成35)

[root@server1 ~]# chmod 755 /etc/init.d/haproxy
[root@server1 ~]# chkconfig --add /etc/init.d/haproxy
[root@server1 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@server1 ~]# systemctl start haproxy

4.访问测试

win7访问http://192.168.1.10,多开几个任务(能轮询看到Web1和Web2的主页)
Haproxy搭建Web群集(含Haproxy+Keepalived高可用群集)_第1张图片
Haproxy搭建Web群集(含Haproxy+Keepalived高可用群集)_第2张图片

八、日志定义

[root@server1 ~]# vi /etc/haproxy/haproxy.cfg
需要注释global里的log 127.0.0.1 local0 和 log 127.0.0.1 local0 notice
log /dev/log local0 info
log /dev/log local0 notice
如果程序是haproxy,日志类型是info,就创建日志
[root@server1 ~]# vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($program
name == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~

[root@server1 ~]# systemctl restart rsyslog
[root@server1 ~]# systemctl restart haproxy
可以在/var/log/haproxy/下看到收集的日志信息

九、统计页面设置

设置配置文件

[root@server1 ~]# vi /etc/haproxy/haproxy.cfg 
[root@server1 ~]# systemctl restart haproxy
listen admin_stats         #添加
        bind 0.0.0.0:1080 
###设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
        mode http                ##http的7层模式
        option httplog            ##采用http日志格式
        #log 127.0.0.1 local0 err   错误日志记录
        maxconn 10                      ##默认的最大连接数
        stats refresh 30s               ##统计页面自动刷新时间
        stats uri /stats               ##统计页面url
        stats realm XingCloud\ Haproxy         ##统计页面密码框上提示文本
        stats auth apple:apple           ##设置监控页面的用户和密码:apple,可以设置多个用户名
        stats auth admin:admin            ##置监控页面的用户和密码: admin
        stats hide-version                   ##隐藏统计页面上HAProxy的版本信息
        stats admin if TRUE                ##设置手工启动/禁用,后端服务器(haproxy-1. 4.9以后版本)

十、案例:Haroxy+Keepalived高可用群集

在上述的部署基础上加一台Haproxy服务器
并在两台服务器上部署Keepalived服务

主机 IP地址 主要软件
Haproxy服务器(Keepalived主) 192.168.10.10(漂移路由192.168.10.100) haproxy 、Keepalived
Haproxy服务器(Keepalived备) 192.168.10.50(漂移路由192.168.10.100) haproxy 、Keepalived
Nginx服务器1 192.168.10.20 nginx
Nginx服务器2 192.168.10.30 nginx
nfs服务器 192.168.10.40 nfs服务
客户端 192.168.10.80 浏览器

主调度服务器

[root@server1 ~]# modprobe ip_vs
[root@server1 ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
[root@server1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@server1 ~]# tar zxf keepalived-2.0.13.tar.gz
[root@server1 ~]# cd keepalived-2.0.13/
[root@server1 ~]# ./configure --prefix=/
[root@server1 ~]# make && make install
[root@server1 ~]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@server1 ~]# systemctl enable keepalived.service
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_http_port {
     		#定义调度服务检查脚本
script "/etc/keepalived/check_haproxy.sh"	#定义检测haproxy调度服务脚本路径
interval 2
weight -10	#当脚本生效时将优先级降10
}
global_defs {
     
        router_id lvs_01
}
vrrp_instance VI_1 {
     
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 110
        advert_int 1
        authentication {
     
            auth_type PASS
            auth_pass 6666
}
track_script {
     		#健康检查使用的脚本
        chk_http_port		
    }
        virtual_ipaddress {
     
            192.168.10.100
}
}

[root@server1 ~]# systemctl start keepalived
[root@server1 ~]# ip addr show dev ens33
[root@server1 ~]# ipvsadm -Ln
[root@server1 ~]# tail -f /var/log/messages

Haproxy搭建Web群集(含Haproxy+Keepalived高可用群集)_第3张图片

配置keepalived服务健康检查脚本

#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ]		#如果haproxy进程数小于等于0
then	
haproxy -f /etc/haproxy/haproxy.cfg		
sleep 3			#则执行重启haproxy
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ]	#再次检查haproxy进程数如果小于等于0
then
/etc/init.d/keepalived stop		#则关闭keepalived服务
fi
fi

备用调度服务器

[root@server1 ~]# modprobe ip_vs
[root@server1 ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
[root@server1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@server1 ~]# tar zxf keepalived-2.0.13.tar.gz
[root@server1 ~]# cd keepalived-2.0.13/
[root@server1 ~]# ./configure --prefix=/
[root@server1 ~]# make && make install
[root@server1 ~]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@server1 ~]# systemctl enable keepalived.service
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_script chk_http_port {
     		#定义调度服务检查脚本
script "/etc/keepalived/check_haproxy.sh"	#定义检测haproxy调度服务脚本路径
interval 2
weight -10	#当脚本生效时将优先级降10
}

global_defs {
     
        router_id lvs_02
}
vrrp_instance VI_1 {
     
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 105
        advert_int 1
        authentication {
     
            auth_type PASS
            auth_pass 6666
}
track_script {
     		#健康检查使用的脚本
        chk_http_port		
    }
        virtual_ipaddress {
     
            192.168.10.100
}
}

[root@server1 ~]# systemctl start keepalived
[root@server1 ~]# ip addr show dev ens33
[root@server1 ~]# ipvsadm -Ln
[root@server1 ~]# tail -f /var/log/messages

把主Keepalived服务器的Keepalived服务关闭,浮动路由会转移到备份服务器上
Haproxy搭建Web群集(含Haproxy+Keepalived高可用群集)_第4张图片

你可能感兴趣的:(Web服务器集群,linux)