HAproxy在四层的工作负载
第一阶段:
client发送http请求报文到haproxy,haproxy由于工作在第四层,因此通过拆包可以查看到TCP/IP包头信息,haproxy根据定义的规则将client请求的目标地址修改为后端的web服务器的IP地址,与此同时还将源地址修改为haproxy的IP地址并转发给后端的web服务器。
第二阶段:
后端的web服务器将响应的结果封装成响应报文发送给haproxy服务器后,haproxy再将报文的源地址修改为haproxy的IP地址,目标地址修改为client的IP地址并转发给client。
HAproxy在七层的工作负载
第一阶段:
client发送http请求报文到haproxy,haproxy接收到client的http请求报文后,会查看client的请求报文,根据http请求报文的信息在结合haproxy自身定义的规则判断出client要访问后端的web服务器;
第二阶段:
haproxy根据client的请求报文判断要访问的后端的web服务器后,会代替客户端的重新发起http请求报文到后端的web服务器;
第三阶段:
后端的web服务器接收到haproxy的http请求报文后,如果访问的资源存在且权限允许的话会将haproxy请求的资源封装成响应报文并发送给haproxy服务器;
第四阶段:
haproxy接收到web服务器的响应报文后,haproxy将后端web服务器返回的结果封装成响应报文并发送给client。
四层与七层的区别
HAProxy的四层与七层的主要区别就在于是否重新发起了http请求,如果重新发来http请求则说明工作在第七层,若没有重新发起http请求则说明haproxy工作在第四次。
这也就是为什么HAProxy在反向代理MySQL,Redis,RDP等服务时需要特别指定mode为TCP模式的主要原因,因为工作在七层会重新发起http请求,而重新发起的http请求MySQL,Redis,RDP等服务压根就不认识,因为这些服务都有着自己默认的协议。
mode参数可设置HAProxy工作在四层还是七层,在HAProxy中mode有三种工作模式:
1.tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;
2.http:仅当代理的协议为http时使用;
3.health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;
HAproxy提供高可用,负载均衡以及基于TCP和THHP应用的代理,支持虚拟机,免费、快速并且可靠的一套方案。
HAproxy适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层代理。HAproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您的架构中,同事可以保护你的web服务器不被暴露到网路上。
**************************************************************************************************************
一。负载平衡类型
(1)无负载均衡:没有负载均衡的简单Web应用程序环境可能如下所示
用户直接连接到你的web服务器,在youdomain.com上,并且没有负载均衡。如果你的单个web服务器出现故障时,用户将无法再访问您的web服务器。此外,如果许多用户试图同时访问您的服务器并且无法处理负载,他们可能会遇到缓慢的体验,或者可能根本无法连接。
(2)4层负载均衡
将网络流量负载平衡到多个服务器的最简单方式是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入http://yourdomain.com/anything,则流量将转发到处理yourdomain.com的所有请求的后端。端口80)
(3)7层负载平衡
7层负载平衡是更复杂的负载均衡网络流量的方式是使用第7层(应用层)负载均衡。使用第7层允许负载器根据用户请求的内容将请求转发到不同的后端服务器。这种负载均衡模式允许您在同一域和端口下运行多个web应用程序服务器
示例中,如果用户请求yourdomain.com/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。
二、HAproxy基础配置文件详解:
HAproxy配置中分成五部分内容,分别如下:
1.global:设置全局配置参数,属于进程的配置,通常是和操作系统相关。
2.defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件
3.frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
4.backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器
5.Listen: frontend和backend的组合体。
部署
1.部署lua环境
192.168.200.12 HAproxy
192.168.200.13 Nginx
192.168.200.14 Nginx
#lua的当前版本
[root@node4 app]# lua -v
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
#源码部署5.3.5lua
mkdir /app
cd /app
yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++
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
#拷贝新版本的lua命令
mv /usr/bin/lua /usr/bin/lua.bak
ln -s /app/lua-5.3.5/src/lua /usr/bin/lua
[root@node4 lua-5.3.5]# ll /usr/bin/lua
lrwxrwxrwx 1 root root 22 Jan 6 18:58 /usr/bin/lua -> /app/lua-5.3.5/src/lua
[root@node4 ~]# lua -v
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
2.部署haproxy
#下载haproxy2.0.4,下载地址:http://www.haproxy.org/download
mkdir /app
cd /app
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.4.tar.gz
tar xvf haproxy-2.0.4.tar.gz
#安装依赖包
yum install -y 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
#安装编译环境
#HAProxy 1.8及1.9版本编译参数:
cd haproxy-1.8.4
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
#HAProxy 2.0编译参数:
cd haproxy-2.0.4
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=/app/lua-5.3.5/src/ \
LUA_LIB=/app/lua-5.3.5/src/ PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
echo 'export PATH=/usr/local/haproxy/sbin:$PATH' > /etc/profile.d/haproxy.sh
source /etc/profile
3.查看haproxy安装版本
[root@node4 haproxy-2.0.4]# haproxy -v HA-Proxy version 2.0.4 2019/08/06 - https://haproxy.org/
4.创建用户haproxy及配置文件
#启动用户 useradd -M -s /sbin/nologin haproxy [root@node4 ~]# id haproxy uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)
/etc/haproxy/haproxy.cfg
defaults
log global
mode http
maxconn 20480
option httplog
option httpclose
option dontlognull
#option forwardfor
option redispatch
option abortonclose
#stats refresh 30
retries 3
balance roundrobin
#balance source
#balance leastconn
timeout check 2000
frontend http
bind 192.168.200.12:9999
# acl url_doc path_beg doc.test.com
# use_backend docserver if url_doc
default_backend servers
backend servers
# balance roundrobin
server node1 192.168.200.13:80 check inter 3000 fall 2 rise 5
server node2 192.168.200.14:80 check inter 3000 fall 2 rise 5
5HAproxy的启动脚本
cat >> /usr/lib/systemd/system/haproxy.service <<EOF
[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
6启动HAproxy
mkdir /var/lib/haproxy chown haproy.haproxy /var/lib/haproxy/ -R systemctl start haproxy systemctl enable haproxy systemctl status haproxy
7.两台web yum安装nginx
yum -y install nginx
并 echo 'node1 192.168.200.13' > /usr/share/nginx/html/index.html
8.发现会出现轮询
curl 192.168.200.12:9999