目录
七层和四层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量
四层的负载均衡,就是通过发布三层的IP地址 (VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下 2.性能 :四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应 用层报文消息内容,识别URL、Cookie、HTTP header等信息。 3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等. 4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。 5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击
haproxy实验环境部署
haproxy主机
[root@haproxy ~]# dnf install haproxy -y
#查找配置文件
[root@haproxy ~]# rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend webcluster
bind *:80
mode http
use_backend webcluster-host
backend webcluster-host
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
#另外一种写法
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
[root@haproxy ~]# systemctl restart haproxy.service
webserver1 2 的配置
[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo web1-10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
全局配置参数及日志分离
进程
#设定多进程
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
nbproc 2
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(33253)-+-haproxy(33255)
| `-haproxy(33256)
[root@haproxy ~]# systemctl restart haproxy.service
#cpu核心绑定,防止cpu抖动从而减少系统资源消耗
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
nbproc 2 #开启的进程数
cpu-map 1 0
cpu-map 2 1
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(33276)-+-haproxy(33278)
| `-haproxy(33279)
#查看子进程的线程
[root@haproxy ~]# cat /proc/33279/status | grep -i thread
Threads: 1
Speculation_Store_Bypass: thread vulnerable
线程
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
nbthread 2
自定义日志
[root@haproxy ~]# vim /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local2.* /var/log/haproxy.log
socat工具
下载socat
[root@haproxy ~]# dnf install socat -y
修改权限
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats1 mode 600 level admin
查看状态
[root@haproxy ~]# echo 'show servers state' | socat stdio /var/lib/haproxy/stats1
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
算法
静态算法
static-rr
基于权重 的轮询调度
不支持运行时利用socat进行权重的动态调整
不支持端服务器 慢启动( 其中一台服务器挂了,流量应该一点一点发送)
其后端主机数量没有限制 ,相当于LVS中的 wrr
first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
动态算法
基于后端服务器状态进行调度适当调整
新请求将优先调度至当前负载较低的服务器
可以用socat进行热设定权重
roundrobin
基于权重的轮询动态调度算法,
支持权重的运行时调整,不同于lvs中的rr轮训模式
HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
其每个后端backend中最多支持4095个real server,
支持对real server权重动态调整,
roundrobin为默认调度算法,此算法使用广泛
lestconn
leastconn 加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
比较适合长连接的场景使用,比如:MySQL等场景
其他算法
既可以作为静态,也可以成为动态
source
静态
源地址hash,源不变,就会一直转发到同一个后端服务器上。
但是当后端服务器发生改变(比如断了),会话就丢失了
默认情况下都是静态算法
但是实际情况ip可能是很贵的,一家公司都使用同一个IP去访问服务器的话,会造成失衡的情况
map-base取模法
静态
对源地址进行hash,在基于服务器总权重取模。最终结果决定将此请求转发到对应的后端服务器。
缺点:如果更改了权重,或者服务器上下线,会出现一部分会话丢失
hash一致性
动态,支持socat,慢启动
特点:当服务器权重发生变化时,对调度结果的影响是局部的,不会引起大的变动
算法
uri
默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> 左半部分:/<path>;<params> 整个uri:/<path>;<params>?<query>#<frag>
<scheme> 协议
<user>:<password>用户密码
<host>www.jd.com
<port>端口 443 80
<path>路径 /index.html
<params>向服务器传递的指令 search
<query>搜索的字段
<frag>片段 快速定位
uri:资源在互联网里的唯一标识符
url:资源在服务器的真实位置
url_param取模
listen webcluster
bind *:80
mode http
#指定关键字
balance url_param name,userid
server web1 172.25.254.10:80 weight 2 check inter 3s fall 3 rise 5
server web2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
server web_sorry 172.25.254.100:8080 backup
hdr
报文:详见web的ppt
对包头当中的某些信息取模
浏览器访问主机
Use-Agent
高级功能及配置
1.基于cookie的会话保持
配置选项
name: #cookie 的 key名称,用于实现持久连接
insert: #插入新的cookie,默认不插入cookie
indirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie, #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
2.ip透传
web服务器中需要记录ip
与defaults区域里面的
option forwardfor 有关
但是apache做不到
动静分离实验
frontend webcluster
bind *:80
mode http
acl ststic path_end -i .html .jpg .png .css .js
acl php path_end -i .php
use_backend webcluster-host if php
default_backend default-host
webserver1 2
[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# vim /var/www/html/index.php
<?php
phpinfo();
?>
[root@webserver1 ~]# systemctl restart httpd
基于路径访问
frontend webcluster
bind *:80
mode http
acl ststic path_sub -m sub static
acl php path_sub -m sub php
use_backend webcluster-host if php
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
webserver 12
[root@webserver1 ~]# mkdir -p /var/www/html/php
[root@webserver1 ~]# mv /var/www/html/index.php /var/www/html/php/
[root@webserver2 ~]# mkdir /usr/share/nginx/html/static -p
[root@webserver2 ~]# echo static - 172.25.254.20 > /usr/share/nginx/html/static/index.html
3.ACL
基于域名访问
基于源访问
基于浏览器
4.自定义错误页面
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
errorloc 503 https://www.baidu.com
5.https的实现
增加证书
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/test.org.key -x509 -days 365 -out /etc/haproxy/certs/test.org.crt