一、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七层负载也可以平衡,但是很麻烦。实际工作中没有人使用。
负载平衡是通过的OSI协议对应的
- 7层负荷平衡:7层http协议,
- 四层负荷均衡: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 ///健康检查。如果连接三次失败,服务将不可用 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毫秒。如果连续两次健康检查成功,则视为有效。如果连续五次健康检查失败,则视为服务器停机
四、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"