poetry

岁暮阴阳催短景,天涯霜雪霁寒宵。
五更鼓角声悲壮,三峡星河影动摇。

Haproxy简介说明

  • 一款高性能+代理负载均衡软件,目前使用广泛,支持实现TCP/HTTP的负载均衡
  • 免费开源
  • 最大并发量能达到5w
  • 支持多种负载均衡算法,同时支持session
  • 支持虚拟主机
  • 拥有服务监控页面,可以了解 系统实时运行状态
  • 通常不做正向代理,有更好的选择(Squid)
  • 通常不做缓存代理,有更好的选择(Varnish)
  • 不会改变请求和响应报文
  • 不用于Web服务器
  • 不是基于数据报的负载均衡器,看不到IP数据报

haproxy文档:https://cbonte.github.io/haproxy-dconv/

Haproxy配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
rpm -ql haproxy
/etc/haproxy/haproxy.cfg #主配置文件
/usr/lib/systemd/system/haproxy.service #守护进程


[root@16a3b18f2dda /]# cat /etc/haproxy/haproxy.cfg | grep -Ev '#|^$'
global #全局配置项
log 127.0.0.1 local2 #syslog服务器位置及类型
chroot /var/lib/haproxy #chroot路径:工作目录
pidfile /var/run/haproxy.pid #进程文件
maxconn 4000 #最大连接数
user haproxy #用户
group haproxy #组
daemon #以守护进程运行
stats socket /var/lib/haproxy/stats #socket通信状态
defaults #默认配置项
mode http #运行模式或协议
log global #定义每个实例启动事件和流量日志
option httplog #http日志
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s #http-request超时时间
timeout queue 1m #队列超时时间
timeout connect 10s #连接超时时间
timeout client 1m #客户端超时时间
timeout server 1m #服务端超时时间
timeout http-keep-alive 10s #保持长连接超时时间
timeout check 10s #check超时时间
maxconn 3000 #定义最大并发数
frontend main *:5000 #前端配置,定义了一系列监听套接字,这些套接字可接受客户端请求并建立连接,监听5000端口,(bind *:80)
#ACL规则:(location url)
#测试请求的URL是以指定模式开头
acl url_static path_beg -i /static /images /javascript /stylesheets
#测试请求<String>是否以指定模式结尾
acl url_static path_end -i .webp .gif .webp .css .js
use_backend static if url_static
#如果user_backend没能匹配,指定后端的名称为app
default_backend app

#定义后端配置:定义一系列“后端”服务器,代理会将请求转发给这些服务器
#static组后端
backend static
balance roundrobin #负载均衡算法为轮询
server static 127.0.0.1:4331 check

#app组后端
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check

配置文件结构

  • 全局配置项
  • 默认配置项
  • 前端配置项
  • 后端配置项

监听配置:通过关联前端配置想和后端配置项(frontend & backend)定义一个完整代理。通常只对TCP流量有用。

Docker & Harpoxy

三台机器:

角色 IP地址 功能
WEB1 172.18.12.10 httpd – THIS IS WEB1…
WEB2 172.18.12.20 httpd – THIS IS WEB2…
Proxy 172.18.12.30 CentOS7 / Haproxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/bash
#安装docker环境
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
systemctl start docker
systemctl enable docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ukdws02a.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

#创建docker桥接网络,用于给容器分配IP地址
docker network create --driver bridge --subnet=172.18.12.0/16 --gateway 172.18.1.1 mynet

#创建后端站点,分别为web1和web2
docker run -e TZ="Asia/Shanghai" -itd -h web1.com --name web1 --network=mynet --ip 172.18.12.10 httpd
docker run -e TZ="Asia/Shanghai" -itd -h web2.com --name web2 --network=mynet --ip 172.18.12.20 httpd
echo "THIS IS WEB1..." > /root/index.html
docker cp /root/index.html web1:/usr/local/apache2/htdocs/

sleep 1

echo "THIS IS WEB2..." > /root/index.html
docker cp /root/index.html web2:/usr/local/apache2/htdocs/

#创建代理服务器haproxy,镜像为centos7
#参数说明:--privilege + /usr/bin/init 是为了能够让程序以root运行,Container默认的Root只是相当于普通用户
#TZ : 指定时区
#-h : 指定域名
#--network: 指定网络类型为我创建的网络
docker run -e TZ='Asia/Shanghai' --privileged -itd -h haproxy.com --name myhaproxy --network=mynet --ip 172.18.12.30 centos:7 /usr/sbin/init

#查看是否连同
#docker exec -it myhaproxy bash -c 'curl 172.18.12.10'
#docker exec -it myhaproxy bash -c 'curl 172.18.12.20'

#安装haproxy,并配置后端节点
docker exec -it myhaproxy bash -c 'yum -y install haproxy -q'
docker exec -it myhaproxy bash -c 'systemctl restart haproxy'
docker exec -it myhaproxy bash -c "echo 'server web1 172.18.12.10:80 check' >> /etc/haproxy/haproxy.cfg"
docker exec -it myhaproxy bash -c "echo 'server web1 172.18.12.20:80 check' >> /etc/haproxy/haproxy.cfg"
docker exec -it myhaproxy bash -c 'systemctl restart haproxy'

#测试
echo "等待服务加载...."
sleep 3
docker exec -it myhaproxy bash -c "echo '-------------负载均衡演示---------------' && for i in {1..10}; do curl 172.18.12.30:5000; done"


#净化检测命令
echo "------------开始删除配置------------"
docker rm myhaproxy --force
docker rm web1 web2 --force
docker network rm mynet
echo "------------检查是否有残留------------"
docker network ls
echo -e " "
docker ps -a
rm /root/index.html* -rf

负载均衡结果演示

docker_haproxy_1.webp