- 负载均衡
- 负载均衡功能
- web服务器的动态水平扩展—》对用户无感知
- 增加业务并发访问及处理能力—》解决单服务器瓶颈问题
- 节约公网IP地址—》降低IT支出成本
- 隐藏内部服务器IP—》提高内部服务器安全性
- 配置简单—》固定格式的配置文件
- 功能丰富—》支持四层和七层,支持动态下线生机
- 性能较强—》并发数万甚至数十万
- 负载均衡类型
- 四层
- LVS
- HAProxy
- Nginx
- 七层
- HAProxy
- Nginx
- 硬件
- F5
- 深信服等
- 四层
- 应用场景
- 四层:Redis Mysql RabbitMQ Memcache
- 七层: Nginx Tomcat Apache PHP
- HAProxy功能
- TCP和HTTP反向代理
- SSL/TSL服务器
- 可以针对HTTP请求添加cookie,进行路由后端服务器
- 可平衡负载至后端服务器,并支持持久连接
- 支持所有主服务器故障切换至备用服务器
- 支持专用端口实现监控服务
- 支持不影响现有连接的情况下停止接受新的连接请求
- 可以在双向添加,修改或删除HTTP报文首部
- 响应报文压缩
- 支持访问控制
- 通过特定的URL为授权用户提供详细状态信息
- 负载均衡功能
HAProxy安装及基础配置
ubuntu
apt -get install software-properties-common
add-apt-repository ppa:vbernat/haproxy-2.0 #通过PPA源来安装软件
apt update
apt-cache madison haproxy
apt isntall haproxy
centos
- yum ```shell yum install -y haproxy #centos yum 安装版本过旧
第三方包安装 wget http://www.nosuchhost.net/~cheese/fedora/packages/epel- 7/x86_64/cheese-release-7-1.noarch.rpm rmp -ivh cheese-release-7-1.noarch.rpm yum install haproxy-1.8.14-1.e17.x86_64.rpm -y
- **编译安装**
```shell
#解决lua环境问题
#环境:ubuntu
#安装基础命令及软件包
apt install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip libreadline-dev libsystemd-dev
#环境:centos
yum install libtermcap-devel ncurses-devel libevent- devel readline-devel
yum install gcc gcc-c++ glibc glibc-devel pcre pcre- devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
#开始安装
cd /usr/local/src
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar xvf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test
#检查是否安装成功
/usr/local/src/lua-5.3.5/src/lua -v
#编译安装haproxy
cd /usr/local/src
tar xvf haproxy-2.0.4.tar.gz
#2.0之前参数
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
#2.0参数
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua- 5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/apps/haproxy
#开始安装
make install PREFIX=/apps/haproxy
ln -s /apps/haproxy/sbin/haproxy /usr/sbin
#验证版本
haproxy -v
#启动脚本
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
- **启动haproxy**
mkdir /var/lib/haproxy
chown 99.99 /var/lib/haproxy/ -R #99.99用户是nologin
systemctl start haproxy
- 配置文件详解
- global 全局配置段
- proxies 代理配置段
```shell
global参数
chroot #锁定运行目录 deamon #以守护进程运行 user , group , uid , gid 运行haproxy的用户身份 nbproc #开启的进程数,尽量与CPU保持一致 nbthread#指定每个进程开启的线程数,默认为一进程一线程 maxconn #每个haproxy进程的最大并发数 maxsslconn #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景 spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5之间 pidfile #指定pid文件路径 log 127.0.01 local3 info #定义全局的syslog全局服务器,最多两个
Proxies参数
defaults #默认配置项,针对frontend backend listen生效,可多个name 可无name frontend name #前端servername 类似于nginx的虚拟主机 backend name #后端服务器组,等于nginx的upstream
listen name #将frontend backend 合并配置
proxies 配置defaults
option redispatch #当server id对应的服务器挂掉以后,强制定向到其他健康的服务器 option abortonclose #当server负载很高的时候,自动结束掉当前队列处理较久的连接 option http-keep-alive #开启与客户端的会话保持 option forwardfor #透传客户端真实IP至后端web服务器 mode http #设置默认工作类型 timeout http-keep-alive 120s #会话保持超时时间 timeout connect 120s #客户端请求从haproxy到后端Server最长连接等待时间 TCP之前 timeout sercer 600s #客户端请求从haproxy到后端server的请求处理超时时长 TCP之后 timeout client 600s #设置haproxy与客户端的最长非活动时间 timeout check 5s #对后端服务器的默认检测超时时间
proxies 配置frontend
bind #监听地址,也可单独用于listen中
proxies 配置backend
mode #指定负载协议类型 option #配置选项 server #定义后端real server check #对指定real进行检查,默认不开启 addr IP #IP PORT #端口 inter #间隔时间,默认2000MS fall #失效检查次数 ,默认为23 rise #下线至恢复检查次数,默认为2 weight #默认为1,最大为256 0不参与负载均衡 backup #将后端服务器标记备份状态 disabled#将后端服务器标记为不可用状态 redirect prefix http://www.baidu.com/ #将请求临时重定向,适用于http模式 maxconn #最大并发连接数 backlog #当server的连接数达到上限后的后援队列长度
范例
frontend web-port bind:10.0.10.1:80 mode http.tcp use_backend web_port_http
backend web_port_http mode http option forwardfor server 10.0.10.2 10.0.10.2:8081 check inter 3000 fall 3 rise 5 server 10.0.10.3 10.0.10.3:8080 check inter 3000 fall 3 rise 5
listen范例
listen web_port bind 10.0.10.1:80 mode http option forwardfor server web1 10.0.10.2:80 check inter 3000 fall 3 rise 5 server web2 10.0.10.3:80 check inter 3000 fall 3 rise 5
- **调度算法**
- **服务器权重调整**
```shell
yum install socat
echo "show info " | socat stdio #查看信息
echo "get weight web_host/web1" | socat stdio #查看web1的权重信息
echo "set weight web_host/web1 2 " | socat stido #调整web1的权重信息
- 静态算法
- static-rr
- 基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量无限制
- first
- 根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数到达上限,新请求才会分配下一台服务器,因此会忽略服务器的权重设置
- static-rr
- 动态算法
- roundrobin
- 基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs的rr轮询,haproxy的支持慢启动,也就是新加的服务器会逐渐增加转发数,为默认调度算法,且支持对realserver权重动态调整
- leastconn
- roundrobin
first
listen web_port bind 10.0.10.2:80 mode http log global balance first server web1 10.0.10.3:80 weight 1 check inter 3000 fall 3 rise 5 #实验可用maxconn控制最大并发数 server web2 10.0.10.4:80 weight 1 check inter 3000 fall 3 rise 6
roundrobin
listen web_port bind 10.0.10.1:80 mode http balance roundrobin server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5
leastconn
listen web_port bind 10.0.10.1:80 mode http balance leastconn server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5
random
listen web_port bind 10.0.10.1:80 mode http balance random server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5
- **其他算法**
- **soure**
- **源地址哈希,基于用户源地址hash并将请求转发至后端服务器,默认为静态取模,通过hash-type选项更改,后续同一个IP将被转发至同一个后端web服务器,适用于session保持及缓存等业务**
- **取模方法**
- **基于服务器总权重的hash数组取模,该hash是静态的,不支持在线调整,不支持慢启动,缺点是服务器上线或下线都会引起变化导致调度结果发生改变**
- **取模就是计算两个数相除的余数**
- **一致性hash**
- **动态,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对影响是局部的,不会引起太大变动**
- **相当于吧客户端信息分组,每个后端一组,然后即使权重发生改变,**
- ** uri**
- **基于用户请求的uri做hash并将请求转发至后端指定服务器,可通过map-based consisten定义使用取模法还是一致性hash**
- **url-param:**
- **针对用户url的参数做hash计算,并由服务器总权重相除以后派发至跳出的服务器,通常用于追踪用户,以确保来自同一用户的请求始终发往同一个real server**
- **hdr**
- **针对用户每个http头部请求中的指定信息做hash,由name指定的http首部将会被取出做hash计算,然后服务器总权重除以后派发至跳出的服务器,若无有效值,则使用默认的轮询调度**
- **rdp-cookie**
- **实现对win桌面的负载,可实现同一个win的请求始终被转发至同一个后台服务器,若从未访问过,则使用连接roundrobin算法计算一个后端服务器进行转发**
- **random**
- **基于随机数作为一致性hash的key 随即负载均衡对于大型服务器或经常添加删除服务器非常有用**
- ** **
```shell
#soure
#map-base
balance source
#一致性hash
balance source
hash-type consistent
#uri
#map-base
balance uri
#hash
balance uri
hash-type consistent
#url-param
balance url_param name,age #支持单个及多个
#hash
balance url-param name,age
hash-type consistent
#hdr
balance hdr (User-Agent)
#hash
balance hdr (User-Agent)
hash-type consistent
#rdp-cookie
balance rdp-cookie
mode tcp
server rdp0 172.18.132.20:3389 check fall 3 rise 5 inter 2000 weight 1
#hash
balance rdp-cookie
persist rdp-cookie #启⽤基于RDP cookie的持久连接,同⼀个 cookie就转发给对应的服务器。
tcp-request inspect-delay 5s #设置内容检查期间等待数据的最⼤允 许时间
tcp-request content accept if RDP_COOKIE #匹配RDP_COOKIE 存在就接受请求
#hash-type consistent
server win-server1 172.31.4.0:3389 check fall 3 rise 5 inter 2000 weight 1
#基于iptables实现转发
# iptables -t nat -A PREROUTING -d 172.31.7.201 -p tcp -- dport 3389 -j DNAT --to-destination 172.31.4.0:3389
# iptables -t nat -A POSTROUTING -s 172.31.0.0/21 -j SNAT --to-source 172.31.7.201
- 总结
```shell static-rr 静态—》做session共享的web集群 first 静态—》使用少
roundrobin 动态—》默认 leastconn 动态—》数据库 random 动态—》大型服务器或经常添加删除服务器场合
取决于hash type类型
source —》基于客户端公网IP的会话保持 uri —》缓存服务器 CDN url_param —》http hdr —》基于客户端请求报文头部做下一步处理 rpd_cookie —》很少使用
- **layer4 layer7**
- **四层**
- **在四层负载均衡设备中,将客户端发送的报文目标地址,根据均衡设备的设置选择web服务器的IP地址,这样客户端可以直接与服务器建立TCP连接**
- **七层**
- **负载均衡器主要起反向代理服务器的作用,服务器建立一次TCP连接要三次握手,客户端先与负载均衡进行握手然后建立TCP连接,把访问的报文信息发送至负载均衡,然后负载均衡在与后端服务器建立三次握手,把数据发送webserver,然后webser将数据发送给负载均衡,负载均衡在将数据发送客户端。**
- **IP透传**
- **四层**
- **七层**
- **高级功能及配置**
- **基于cookie的会话保持**
- **配置选项**
- ** **
```shell
name : cookie 的key名称,用于实现持久连接
insert : 如果客户端请求报文没有cookie就插入新的cookie到响应报文,第一次访问haproxy
indirect:不会向客户端发送服务器已经处理过请求的cookie信息,比如后端服务器宕机后haproxy将客户端请求强制转发至real server则会涉及修改cookie ,不建议配置
nocache:当客户端与haproxy之间有缓存时,haproxy不缓存客户端cookie,因为客户端浏览器会缓存cookie并携带cookie访问haproxy
#配置 cookie SERVER-COOKIE insert nocache
#验证 curl --cookie "SERVER-COOKIE=we111" URL
HAProxy状态页
配置项
stats enable #基于默认的参数启用stats page
stats hide-version #隐藏版本
stats refresh #设置自动刷新时间间隔
stats uri #自定义stats page url 默认值 /haproxy?stats
stats realm #账户认证提示信息
stats auth aaa:111 #认证的账户密码
stats amdin if true #启用管理功能
登录状态页
Running tasks: 1/9; idle = 100 % #运⾏的任务/当前空闲率
active UP:#在线服务器
backup UP:#标记为backup的服务器
active UP, going down:#监测未通过正在进⼊down过程
backup UP, going down:#备份服务器正在进⼊down过程
active DOWN, going up:#down的服务器正在进⼊up过程
backup DOWN, going up:#备份服务器正在进⼊up过程
active or backup DOWN:#在线的服务器或者是backup的服务器已经转换 成了down状态
not checked:#标记为不监测的服务器
active or backup DOWN for maintenance (MAINT) #active或者 backup服务器⼈为下线的
active or backup SOFT STOPPED for maintenance #active或者 backup被⼈为软下线(⼈为将weight改成0)