52.haproxy负载均衡
haproxy负载均衡
HAProxy 简介
HAProxy 是一个使用 C 语言编写的开源软件,提供高可用性、负载均衡以及基于 TCP 和 HTTP 的应用程序代理功能。
核心特点:
- 高性能:适用于负载巨大的 Web 站点,支持会话保持和七层处理。
- 高并发:采用事件驱动、单一进程模型,能高效支持数万并发连接。
- 安全集成:可简单安全地整合进现有架构,保护后端 Web 服务器不直接暴露于网络。
知名用户:GitHub, Bitbucket, Stack Overflow, Reddit, Tumblr, Twitter, 亚马逊 AWS 等。
负载均衡类型
根据 OSI 模型,负载均衡可分为不同层次:
层次 | 名称 | 工作原理 | 代表产品 |
---|---|---|---|
二层 | 数据链路层负载均衡 | 基于虚拟 MAC 地址,分配至实际 MAC 地址响应。 | - |
三层 | 网络层负载均衡 | 基于虚拟 IP 地址,分配至实际 IP 地址响应。 | - |
四层 | 传输层负载均衡 | 基于 IP + Port 进行请求转发。 | F5, LVS, HAProxy, Nginx |
七层 | 应用层负载均衡 | 基于 URL、HTTP 头、主机名等应用层信息进行转发。 | HAProxy, Nginx, Apache |
说明:HAProxy 同时支持高效的四层(TCP) 和七层(HTTP) 负载均衡。
HAProxy 安装
可以使用yum直接进行安装
yum -y install haproxy
但是我们通常会使用源码安装,这样更灵活
首先安装依赖环境
[root@ha ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua
跟mysql一样,我们要创建一个haproxy的用户
[root@ha ~]# useradd -r -M -s /sbin/nologin haproxy
使用源码安装需要源码包,解压源码包
[root@ha ~]# tar -xzf haproxy-2.1.3.tar.gz
安装
[root@ha ~]# cd haproxy-2.1.3/
[root@ha haproxy-2.1.3]# make clean
[root@ha haproxy-2.1.3]# make -j $(grep 'processor' /proc/cpuinfo |wc -l) \
> TARGET=linux-glibc \
> USE_OPENSSL=1 \
> USE_ZLIB=1 \
> USE_PCRE=1 \
> USE_SYSTEMD=1
[root@ha haproxy-2.1.3]# make install PREFIX=/usr/local/haproxy
[root@ha haproxy-2.1.3]# cp haproxy /usr/sbin/
设置内核参数
[root@ha haproxy-2.1.3]# vim /etc/sysctl.conf
[root@ha haproxy-2.1.3]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
配置haproxy服务
[root@ha ~]# mkdir /etc/haproxy
[root@ha ~]# vim /etc/haproxy/haproxy.cfg
global #全局配置log 127.0.0.1 local0 info#log loghost local0 infomaxconn 20480
#chroot /usr/local/haproxypidfile /var/run/haproxy.pid#maxconn 4000user haproxygroup haproxydaemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults #默认参数,可以被用到frontend,backend,Listen组件,本次使用listen组件mode httplog globaloption dontlognulloption httpcloseoption httplog#option forwardforoption redispatchbalance roundrobintimeout connect 10stimeout client 10stimeout server 10stimeout check 10smaxconn 60000retries 3
#--------------统计页面配置------------------
listen admin_stats fronted和backend的组合体bind 0.0.0.0:8189stats enablemode httplog globalstats uri /haproxy_statsstats realm Haproxy\ Statisticsstats auth admin:admin#stats hide-versionstats admin if TRUEstats refresh 30s
#---------------web设置-----------------------
listen webclusterbind 0.0.0.0:80mode http#option httpchk GET /index.htmllog globalmaxconn 3000balance roundrobincookie SESSION_COOKIE insert indirect nocache
server rs1 192.168.100.10:80 check
server rs2 192.168.100.20:80 check
配置文件由五部分组成,逻辑关系如下:
- global:全局配置,与操作系统和进程相关的参数。
- defaults:为后续组件(
frontend
,backend
,listen
)提供默认参数。 - frontend:定义前端虚拟服务,用于接收客户端请求。
- backend:定义后端真实服务器集群。
- listen:
frontend
和backend
的组合体,常用于监控
全局配置详细解析
globallog 127.0.0.1 local0 info # 定义日志输出和级别maxconn 20480 # 全局最大连接数user haproxy # 运行用户group haproxy # 运行用户组daemon # 以后台守护进程方式运行pidfile /var/run/haproxy.pid # PID 文件位置
defaultsmode http # 默认模式(http/tcp)log global # 继承全局日志设置option dontlognull # 不记录健康检查空日志option httpclose # 关闭 HTTP 连接(不支持 keep-alive)option httplog # 启用 HTTP 请求日志option redispatch # 连接失败时重定向到其他服务器balance roundrobin # 默认负载均衡算法:轮询timeout connect 10s # 连接后端服务器超时时间timeout client 10s # 客户端响应超时时间timeout server 10s # 服务器端响应超时时间maxconn 60000 # 默认最大连接数retries 3 # 3次失败判定服务器不可用
frontend http_80_in #前端配置bind 0.0.0.0:80 # 监听所有 IP 的 80 端口mode httpoption forwardfor # 向后端传递客户端真实 IP(X-Forwarded-For)default_backend wwwpool # 指定默认后端服务器组
backend wwwpool 后端配置mode httpbalance source # 负载均衡算法:源 IP 哈希option httpchk GET /index.html # 定义健康检查方法server web1 192.168.100.10:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3server web2 192.168.100.20:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
listen admin_stats 监听配置bind 0.0.0.0:8189 # 监控页面访问端口stats enable # 启用统计报告stats uri /haproxy_stats # 统计页面的 URL 路径stats realm "Haproxy Statistics" # 认证提示信息stats auth admin:admin # 登录用户名和密码stats refresh 30s # 页面自动刷新间隔
配置haproxy的服务单元,然后启动
[root@ha ~]# vim /usr/lib/systemd/system/haproxy.service[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID[Install]
WantedBy=multi-user.target[root@ha ~]# systemctl daemon-reload
[root@ha ~]# systemctl restart haproxy
查看