目录

一、haproxy概述

二、ha-proxy的特点

三、haproxy配置文件

四、haproxy算法

1、roundrobin

2、static-rr

3、leastconn

4、source

五、Haproxy+keepalived 实现七层负载

 配置haproxy日志


一、haproxy概述

ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一件事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

软件:haproxy—主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。

负载均衡是通过OSI协议对应的

  • 7层负载均衡:用的7层http协议,
  • 4层负载均衡:用的是tcp协议加端口号做的负载均衡

二、ha-proxy的特点

ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。

支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。

三、haproxy配置文件

global   //全局配置
	log 127.0.0.1 local3 info  //日志配置
	maxconn 4096    //最大连接限制(优先级低)
        user nobody
        group nobody

	daemon   //守护进程运行
	nbproc 1  //haproxy进程数
defaults   //针对(listen和backend块进行设置没如果块中没设置,则使用默认设置)默认配置
	log		   global  //日志使用全局配置
	mode	   http  //模式7层LB
	maxconn 2048   //最大连接数(优先级中)
	retries 	3   //健康检查。3次连接失败就认为服务不可用
	option	redispatch   //服务不可用后的操作,重定向到其他健康服务器
	stats	uri  /haproxy    //web页面状态模块功能开启
	stats auth          qianfeng:123  //状态模块认证(用户名qianfeng密码123)
	contimeout	5000   //定义haproxy将客户端!!!请求!!!转发至后端服务器,所等待的超时时长
    clitimeout	 50000  //haproxy作为客户,和后端服务器之间!!!空闲连接!!!的超时时间,到时候发送fin指令
	srvtimeout	    50000  //haproxy作为服务器,和用户之间空闲连接的超时时间,到时候发送fin指令
   #timeout connect 5000
#timeout client 50000
#timeout server 50000
frontend http-in   //前端配置块。面对用户侧
	bind 0.0.0.0:80  //面对用户监听地址和端口
	mode http  //http模式的LB
	log global  //日志使用全局配置
	option httplog  //默认日志格式非常简陋,仅包括源地址、目标地址和实例名称,而“option httplog参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
	
	 option httpclose  // 每次请求完毕后,关闭http通道
     acl html url_reg  -i  \.html$  //1. 访问控制列表名称html。规则要求访问以html结尾的url时
     use_backend html-server if  html  //2.如果满足acl html规则,则推送给后端服务器 html-server
     default_backend html-server  // 3:默认的后端服务器是 html-server

backend html-server  //后端服务器名称为  html-server
	mode http  //模式为7层代理
	balance roundrobin  //轮循(rr)
	option httpchk GET /index.html  //允许用http协议检查server 的健康
	cookie SERVERID insert indirect nocache  //轮询的同时,根据插入的cookie SERVERID  的值来做会话保持,将相同的用户请求,转发给相同的真实服务器。
	server html-A web1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
	server html-B web2:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
cookie 3 服务器ID,避免rr算法将客户机请求转发给其他服务器 ,对后端服务器的健康状况检查间隔为2000毫秒,连续2次健康检查成功,则认为是有效的,连续5次健康检查失败,则认为服务器宕机

四、haproxy算法

1、roundrobin

轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.

2、static-rr

基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制

3、leastconn

新的连接请求被派发至具有最少连接数目的后端服务器.

4、source

将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器

五、Haproxy+keepalived 实现七层负载

客户端:192.168.242.144

Haproxy+keepalived-master:192.168.242.145

Haproxy+keepalived-backup:192.168.242.146

web-1:192.168.242.147

web-2:192.168.242.148

实验思路:

先部署web-1和web-2,利用nginx分别创建测试界面,然后Haproxy+keepalived-master和Haproxy+keepalived-backup都部署haproxy,然后在部署keepalived。

实验过程:

1、创建测试界面

web-1:
[root@localhost ~]# yum -y install nginx &&systemctl start nginx &&echo "web-1" > /usr/share/nginx/html/index.html
web-2:
[root@localhost ~]# yum -y install nginx &&systemctl start nginx &&echo "web-1" > /usr/share/nginx/html/index.html

2、部署haproxy

Haproxy+keepalived-master:
[root@localhost ~]# yum -y install haproxy
[root@localhost ~]# cd /etc/haproxy
[root@localhost haproxy]# cp haproxy.cfg haproxy.cfg.bak
[root@localhost ~]# vim haproxy.cfg
global
        log 127.0.0.1 local3
        maxconn 4096
        user nobody
#       uid 99
        group nobody
#       gid 99
        daemon
        nbproc 1
defaults
        log                global
        mode       http
        maxconn 2048
        retries         3
        option  redispatch
        stats   uri  /haproxy
        stats auth          qianfeng:123
        contimeout          5000
        clitimeout          50000
        srvtimeout          50000
#timeout connect 5000
#timeout client 50000
#timeout server 50000
        
frontend makabaka
        bind 0.0.0.0:80
        mode http
        log global
        option httplog
        option httpclose
     acl panda url_reg  -i  \.html$
     use_backend wuxidixi if  panda
     default_backend wuxidixi

backend wuxidixi
        mode http
        balance roundrobin
        option httpchk GET /index.html
#       cookie SERVERID insert indirect nocache
        server html-A 192.168.242.147:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
        server html-B 192.168.242.148:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

Haproxy+keepalived-backup:
[root@localhost ~]# yum -y install haproxy
[root@localhost ~]# cd /etc/haproxy
[root@localhost haproxy]# cp haproxy.cfg haproxy.cfg.bak
然后在Haproxy+keepalived-master服务器上将haproxy的配置文件拷贝到Haproxy+keepalived-backup
[root@localhost ~]# scp  /etc/haproxy/haproxy.cfg 192.168.242.146:/etc/haproxy/

两台服务器都启动haproxy,浏览器分别访问测试

 3、然后部署keepalived

Haproxy+keepalived-master:
[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# cd /etc/keepalived
[root@localhost keepalived]# rm -rf keepalived.conf
[root@localhost ~]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id directory1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.242.111/24
    }

}

Haproxy+keepalived-backup:
[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# cd /etc/keepalived
[root@localhost keepalived]# rm -rf keepalived.conf
[root@localhost ~]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id directory2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    nopreempt
    virtual_router_id 80
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.242.111/24
    }
}

两台机器都启动keepalived

在Haproxy+keepalived-master上查看ip

 客户端访问keepalived的VIP测试

 我们同样可以利用keepalived的script模块,创建一个脚本,使keepalived每隔一段时间执行这个脚本,对haproxy进行健康检测。

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# vim a.sh
#!/bin/bash
counter=$(ps -C haproxy --no-heading|wc -l)
if [ "${counter}" = "0" ];then
        systemctl stop keepalived
fi
[root@localhost keepalived]# chmod a+x a.sh
[root@localhost keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id directory1
}
vrrp_script a {
    script "/etc/keepalived/a.sh"
    interval 5
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.242.111/24
    }
    track_script {
        a
    }
}

注:必须先启动haproxy,再启动keepalived

 配置haproxy日志

[root@localhost ~]# vim /etc/rsyslog.conf
.......                               #启用rsyslog的udp监听和tcp监听 
# Provides UDP syslog reception
$ModLoad imudp 
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
....
找到  #### RULES ####   下面添加
local3.*          /var/log/haproxy.log           #local3要与haproxy配置文件中的一致

[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy
[root@localhost ~]# tail -f /var/log/haproxy.log     #然后用浏览器访问测试
Apr 28 01:19:33 localhost haproxy[17063]: 192.168.242.1:62271 [28/Apr/2022:01:19:19.584] makabaka makabaka/<STATS> 13890/0/0/0/13890 200 14294 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy HTTP/1.1"
Apr 28 01:19:33 localhost haproxy[17063]: 192.168.242.1:62271 [28/Apr/2022:01:19:19.584] makabaka makabaka/<STATS> 13890/0/0/0/13890 200 14294 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy HTTP/1.1"
Apr 28 01:19:34 localhost haproxy[17063]: 192.168.242.1:62275 [28/Apr/2022:01:19:33.472] makabaka makabaka/<STATS> 1297/0/0/0/1297 200 14294 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy HTTP/1.1"
Apr 28 01:19:34 localhost haproxy[17063]: 192.168.242.1:62275 [28/Apr/2022:01:19:33.472] makabaka makabaka/<STATS> 1297/0/0/0/1297 200 14294 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy HTTP/1.1"


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐