- 负载均衡
- 负载均衡功能
- 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-commonadd-apt-repository ppa:vbernat/haproxy-2.0 #通过PPA源来安装软件apt updateapt-cache madison haproxyapt 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#环境:centosyum install libtermcap-devel ncurses-devel libevent- devel readline-develyum 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/srcwget http://www.lua.org/ftp/lua-5.3.5.tar.gztar xvf lua-5.3.5.tar.gzcd lua-5.3.5make linux test#检查是否安装成功/usr/local/src/lua-5.3.5/src/lua -v#编译安装haproxycd /usr/local/srctar 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/haproxyln -s /apps/haproxy/sbin/haproxy /usr/sbin#验证版本haproxy -v#启动脚本[Unit]Description=HAProxy Load BalancerAfter=syslog.target network.target[Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -qExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pidExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target
- **启动haproxy**
mkdir /var/lib/haproxychown 99.99 /var/lib/haproxy/ -R #99.99用户是nologinsystemctl 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
- **调度算法**- **服务器权重调整**```shellyum install socatecho "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-basebalance source#一致性hashbalance sourcehash-type consistent#uri#map-basebalance uri#hashbalance urihash-type consistent#url-parambalance url_param name,age #支持单个及多个#hashbalance url-param name,agehash-type consistent#hdrbalance hdr (User-Agent)#hashbalance hdr (User-Agent)hash-type consistent#rdp-cookiebalance rdp-cookiemode tcpserver rdp0 172.18.132.20:3389 check fall 3 rise 5 inter 2000 weight 1#hashbalance rdp-cookiepersist rdp-cookie #启⽤基于RDP cookie的持久连接,同⼀个 cookie就转发给对应的服务器。tcp-request inspect-delay 5s #设置内容检查期间等待数据的最⼤允 许时间tcp-request content accept if RDP_COOKIE #匹配RDP_COOKIE 存在就接受请求#hash-type consistentserver 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的会话保持**- **配置选项**- ** **```shellname : cookie 的key名称,用于实现持久连接insert : 如果客户端请求报文没有cookie就插入新的cookie到响应报文,第一次访问haproxyindirect:不会向客户端发送服务器已经处理过请求的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 pagestats hide-version #隐藏版本stats refresh #设置自动刷新时间间隔stats uri #自定义stats page url 默认值 /haproxy?statsstats 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)
