软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用;
负载均衡是通过OSI协议对应的;
7层负载均衡:用的7层http协议;
4层负载均衡:用的是tcp协议加端口号做的负载均衡;
ha-proxy概述
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做的更好,更专业。
ha-proxy的特点
ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy负载均衡软件的优点。
•支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
•支持多种负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
•性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
•拥有一个功能出色的监控页面,实时了解系统的当前状况。
•功能强大的ACL支持,给用户极大的方便。
haproxy算法:
1.roundrobin
基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.
2.static-rr
基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
3.leastconn
新的连接请求被派发至具有最少连接数目的后端服务器.
实践准备
没有太多资源,用容器模拟实现
web 容器创建 docker-compose 水平扩展 scale
master 主节点服务器一台,正式使用建议多准备一台备用,node 代理服务器10台(用来进行web测试),可以根据虚拟机配置自行调节;
配置如下:
# 创建文件
docker-compose.yml
haproxy.cfg
# docker-compose.yml
version: "3.6"
services:
ha_proxy:
container_name: ha_proxy
image: haproxy:latest
restart: always
expose:
- 80
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.haproxy.entrypoints=http"
- "traefik.http.routers.haproxy.rule=Host(`haproxy.halobug.cn`)"
- "traefik.http.services.haproxy-backend.loadbalancer.server.scheme=http"
- "traefik.http.services.haproxy-backend.loadbalancer.server.port=80"
logging:
driver: "json-file"
options:
max-size: "10m"
networks:
traefik:
external: true
# haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backends
backend web_backends
balance roundrobin
# 启动了 10个容器 进行web测试,
server server1 local_2_web_nginx_1:80 check
server server2 local_2_web_nginx_2:80 check
server server3 local_2_web_nginx_3:80 check
server server4 local_2_web_nginx_4:80 check
server server5 local_2_web_nginx_5:80 check
server server6 local_2_web_nginx_6:80 check
server server7 local_2_web_nginx_7:80 check
server server8 local_2_web_nginx_8:80 check
server server9 local_2_web_nginx_9:80 check
server server10 local_2_web_nginx_10:80 check
#启动
docker-compose down && docker-compose up -d
# 绑定hosts
127.0.0.1 haproxy.halobug.cn
haproxy容器
web容器
浏览器访问 haproxy.halobug.cn,如下图。
根据haproxy.cfg 配置 查看 haproxy 监控,haproxy.halobug.cn/status ,如下图。
使用ab测试 查看分发效果
# 执行后查看 status 监控
ab -n 20000 -c 200 http://haproxy.halobug.cn/
监控很清晰的能看见每台机器当前分发的请求量。
试着停掉某一台机器
docker stop local_2_web_nginx_8
可以看到server 8的机器状态down掉了,继续使用ab测试,如下图 server8 是down掉的,此时请求不会分发到这台机器,重新启动后恢复正常。
如高可用,可搭配 Keepalived VRRP 结合使用。
到这里就算完成了,快动手吧。