Haproxy负载均衡

软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡

apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。

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

7层负载均衡:用的7层http协议,

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

ha-proxy概述

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

ha-proxy的特点

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

•支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。

•支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。

•性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。

•拥有一个功能出色的监控页面,实时了解系统的当前状况。

•功能强大的ACL支持,给用户极大的方便。

haproxy算法:

1.roundrobin

基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
2.static-rr

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

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

Haproxy 实现七层负载

Keepalived + Haproxy

/etc/haproxy/haproxy.cfg
global //关于进程的全局参数
log 127.0.0.1 local2 info #日志服务器
pidfile /var/run/haproxy.pid #pid文件
maxconn 4000 #最大连接数
user haproxy #用户
group haproxy #组
daemon #守护进程方式后台运行
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults 用于为其它配置段提供默认参数
listen 是frontend和backend的结合体
frontend 虚拟服务VIrtual Server
backend 真实服务器Real Server

实验准备俩台提供后端服务页面的nginx服务器,一台安装haproxy的服务器。这台服务器就是负载均衡,客户端通过访问这台负载均衡服务器来访问后端页面

安装haproxy服务器:192.168.231.190

后端服务器:192.168.231.185

192.168.231.183

后端服务器:

复制代码
服务器1:
yum -y install nginx 

echo "server--1" > /usr/share/nginx/html/index.html

systemctl start nginx 



服务器2:
yum -y install nginx 

echo "server--2" > /usr/share/nginx/html/index.html

systemctl start nginx 

安装haproxy的服务器:

复制代码
安装haproxy
yum -y install haproxy

修改haproxy的配置文件
vim /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000   #优先级低
    user        haproxy
    group       haproxy
    daemon               #以后台形式运行ha-proxy
    nbproc 1		    #工作进程数量  cpu内核是几就写几
defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层	
    log                     global
    retries                 3     #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中
    contimeout	            5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    clitimeout	            50000 #客户端超时
    srvtimeout	            50000 #后端服务器超时
listen stats
    bind			        *:81     
    stats                   enable
    stats uri              	/haproxy 
    stats auth           	qianfeng:123 
frontend  web
    mode                   	http  
    bind                    *:80   #监听哪个ip和什么端口
    option                  httplog		#日志类别 http 日志格式
    acl html url_reg  -i  \.html$  #1.访问控制列表名称html。规则要求访问以html结尾的url
    use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
    default_backend    httpservers   #默认使用的服务器组
backend httpservers    #名字要与上面的名字必须一样
    balance     roundrobin  #负载均衡的方式
    server  http1 192.168.231.185:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 192.168.231.183:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

haproxy的监控端口是80,与后端nginx的端口重复,更改配置文件,

listen stats

bind *.90
#check inter 2000 检测心跳频率

#rise 2 2 次正确认为服务器可用

#fall 2 2 次失败认为服务器不可用

启动haproxy

复制代码
systemctl start haproxy

浏览器访问:192.168.231.190

由于设置的权重是相同的 因此会各自访问一次

查看监控

Haproxy与keepalived高可用

实验机器

后端提供服务的服务器:

192.168.231.185

192.168.231.183

负载均衡服务器:

192.168.231.190

192.168.231.191

复制代码
实验步骤:
在俩台后端服务器上  都进行相同操作
yum -y install nginx 

echo "server--1" > /usr/share/nginx/html/index.html

systemctl start nginx 

俩台负载均衡服务器都进行操作:
yum -y install haproxy

vim /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000   #优先级低
    user        haproxy
    group       haproxy
    daemon               #以后台形式运行ha-proxy
    nbproc 1		    #工作进程数量  cpu内核是几就写几
defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层	
    log                     global
    retries                 3     #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中
    contimeout	            5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    clitimeout	            50000 #客户端超时
    srvtimeout	            50000 #后端服务器超时
listen stats
    bind			        *:81     
    stats                   enable
    stats uri              	/haproxy 
    stats auth           	qianfeng:123 
frontend  web
    mode                   	http  
    bind                    *:80   #监听哪个ip和什么端口
    option                  httplog		#日志类别 http 日志格式
    acl html url_reg  -i  \.html$  #1.访问控制列表名称html。规则要求访问以html结尾的url
    use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
    default_backend    httpservers   #默认使用的服务器组
backend httpservers    #名字要与上面的名字必须一样
    balance     roundrobin  #负载均衡的方式
    server  http1 192.168.231.185:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 192.168.231.183:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

在负载均衡服务器下载keepalived:

复制代码
负载均衡服务器进行相同操作:
yum -y install keepalived

修改配置文件,在第一台负载均衡服务器上
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id director1
}
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.231.66/24
    }
}


修改第二台负载均衡服务器的配置文件
vim /etc/keepalived/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.231.66/24
    }
}

这里定义的master的负载均衡服务器是192.168.231.190

定义的backup的负载均衡服务器是192.168.231.191

定义的虚拟ip是192.168.231.66

因此用户访问时访问的就是192.168.231.66

然后负载均衡服务器均启动keepalived,此时的虚拟ip 在master服务器上

复制代码
systemctl start keepalived

浏览器访问:

扩展对调度器Haproxy健康检查

两台机器都做

让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived

写一个脚本,然后在keepalived的配置文件内引用

在master服务器

复制代码
a. script   这是脚本内容
[root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh

#!/bin/bash                                                                                      /usr/bin/curl -I http://localhost &>/dev/null   
if [ $? -ne 0 ];then                                                                            
#       /etc/init.d/keepalived stop
        systemctl stop keepalived
fi		


													        	
[root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh

b. keepalived使用script
[root@ha-proxy-master keepalived]# vim keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id director1
}
vrrp_script check_haproxy {
   script "/etc/keepalived/check_haproxy_status.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.231.66/24
    }
    track_script {
        check_haproxy
    }
}

在backup服务器

将脚本复制到backup服务器,然后修改backup的keepalived的配置文件

复制代码
[root@ha-proxy-slave keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id directory2
}
vrrp_script check_haproxy {
   script "/etc/keepalived/check_haproxy_status.sh"
   interval 5
}

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.231.66/24
    }
    track_script {
        check_haproxy
    }
}

重启keepalived

复制代码
[root@ha-proxy-master keepalived]# systemctl restart keepalived
[root@ha-proxy-slave keepalived]# systemctl restart keepalived
注:必须先启动haproxy,再启动keepalived

两台机器都配置haproxy的日志:需要打开注释并添加

复制代码
[root@ha-proxy-master ~]# vim /etc/rsyslog.conf 
# Provides UDP syslog reception  #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
找到  #### RULES ####   下面添加
local2.*                       /var/log/haproxy.log
[root@ha-proxy-master ~]# systemctl restart rsyslog
[root@ha-proxy-master ~]# systemctl restart haproxy

[root@ha-proxy-master ~]# tail -f /var/log/haproxy.log 
相关推荐
肠胃炎5 小时前
挂载方式部署项目
服务器·前端·nginx
曲幽8 小时前
FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了!
python·websocket·nginx·socket·fastapi·web·async·socketio
袁庭新11 小时前
M系列芯片Mac上通过Homebrew一键安装/卸载Nginx并上线项目全指南
运维·nginx·macos·袁庭新·袁庭新ai
Densen201412 小时前
发布blazor应用到Linux, 使用nginx作为WebSocket代理
linux·websocket·nginx
不是书本的小明12 小时前
Apache vs Nginx vs Tomcat 核心区别与优化
nginx·tomcat·apache
困惑阿三1 天前
客户消息及时反馈
nginx·node.js·飞书·企业微信
liurunlin8881 天前
httpslocalhostindex 配置的nginx,一刷新就报404了
运维·nginx
BullSmall1 天前
Nginx负载均衡会话保持配置指南
运维·nginx·负载均衡
你才是臭弟弟2 天前
Nginx部署前后端
运维·nginx