大网站都在用的HAproxy+Web群集还不快来学

1 HAproxy+Web群集

1.1 常见的web集群调度器

目前常见的web集群调度器分为软件和硬件
软件通常使用开源的LVS、Nginx、HAproxy

就性能来说LVS性能最好(基于性能实现的负载均衡,但是搭建相对复杂),Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,并发性能没有HAproxy好。

硬件一般使用比较多的是F5、Array、也有很多人使用国内的一些产品,例如梭子鱼、绿盟等。

1.2 HAproxy应用分析和比较

lvs:
LVS在企业应用中抗负载能力能抢,但存在不足
LVS不支持正则处理,不能实现动静分离
对于大型网站,LVS的实施配置复杂,维护成本相对较高
HAproxy
HAproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用代理的软件
适用于负载大(并发1W以上的)的web站点,这些站点通常有需要会话保持或七层代理
HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。运行在硬件上可支持数以万计的并发连接的请求连接

1.3 Haproxy调度算法原理

roundrobin
简单的轮询调度
leastconn
最小连接数算法,根据后端的节点链接数大小动态分配前端请求
uri
根据请求的URI地址哈希
基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度。
source
根据源地址hash调度
url_param
根据请求的URL参数进行调度
hdr(name)
根据HTTP请求头来做调度
rdp-cookie(name)
根据cookie的key哈希
表示根据cookie(name)来锁定哈希每一次TCP请求
static-rr
加权轮询

1.4 HAProxy的主要特性有

●可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美; ●最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s; ●支持多达8种负载均衡算法 ●支持Session会话保持,Cookie的引导; ●支持通过获取指定的url来检测后端服务器的状态; ●支持虚机主机功能,从而实现web负载均衡更加灵活; ●支持连接拒绝、全透明代理等独特的功能; ●拥有强大的ACL支持,用于访问控制; ●支持TCP和HTTP协议的负载均衡转发; ●支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成

1.5 LVS、Nginx、HAproxy的区别

●LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡; ●LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案; ●LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式; ●HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡; ●Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。

负载均衡性能:硬件负载均衡是性能更好打的(F5、绿盟)LVS是最好的,其次是Haproxy其次,Nginx要弱于其他两种
他们支持的代理类型:LVS是基于Linux系统内核实现的软负载均衡,只支持四层代理的IP转发,并且不支持正则匹配。而Nginx和Haproxy都是基于应用程序实现的软负载均衡,都支持四层和七层反向代理转发且支持正则匹配
健康检查方式 :LVS可以配合Keepalive实现支持对TCP端口或者URL路径方式的健康检查。Nginx默认只支持被动健康检查方式,主动健康检查需要安装第三方模块支持。Hparoxy支持TCP端口、URL路径、脚本等方式的健康检查。

1.6 Haproxy的配置文件组成

  • global:用于配置全局参数
  • default:用于配置所有的frontend和的组backend的默认属性
  • frontend:用于配置前度服务(即HAproxy自身提供的服务)实例
  • backend:用于配置后端服务器()即HAproxy后面接的服务十实例组
  • listen:frontend +backend的组合配置,可以理解成更间接的配置方法,frontend域和backend域中所有的配置都可以配置在listen域中。

2 Haproxy的部署

HAproxy的安装
#haproxy支持基于lua实现功能扩展(需要安装比较新的lua语言,方便进行haproxy编译)
yum install -y gcc gcc-c++ make
​
curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz
tar zxf lua-5.4.4.tar.gz -C /usr/local/
cd /usr/local/lua-5.4.4
make linux test
​
​
#安装haproxy
yum install -y zlib-devel openssl-devel pcre-devel systemd-devel
useradd -M -s /sbin/nologin haproxy
​
cd /opt
tar xf haproxy-2.8.3.tar.gz
cd /opt/haproxy-2.8.3/
​
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.4.4/src/ LUA_LIB=/usr/local/src/lua-5.4.4/src/
make install PREFIX=/usr/local/haproxy
​
mkdir /etc/haproxy
cp /opt/haproxy-2.8.3/examples/quick-test.cfg /etc/haproxy/haproxy.cfg
vim /etc/haproxy/haproxy.cfg
​
cp /opt/haproxy-2.8.3/examples/haproxy.init /etc/init.d/haproxy
vim /etc/init.d/haproxy
 26 [ "${NETWORKING}" = "no" ] && exit 0
​
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
haproxy -v
​
chmod +x /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
chkconfig --level 35 haproxy on
chkconfig --list haproxy
​
service haproxy start
netstat -lntp | grep haproxy

2.1 HAproxy搭建 Web 群集部署

HAproxy服务器:192.168.111.5
Nginx服务器1:192.168.111.7
Nginx服务器2:192.168.111.8
Tomcat服务器:192.168.111.10:8080 192.168.111.10:8081

2.2 实验步骤

配置节点服务器Nginx1和Nginx2
安装依赖包新建nginx用户解压包配置编译环境

大网站都在用的HAproxy+Web群集还不快来学_第1张图片

编译并安装,创建软链接,创建脚本将nginx加入到系统服务中
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/      #让系统识别nginx的操作命令
vim /lib/systemd/system/nginx.service

大网站都在用的HAproxy+Web群集还不快来学_第2张图片

添加权限并启动

修改网页内容
vim /usr/local/nginx/html/index.html

同样操作修改Nginx2服务器并测试页面是否成功

大网站都在用的HAproxy+Web群集还不快来学_第3张图片

大网站都在用的HAproxy+Web群集还不快来学_第4张图片

配置Tomcat服务器
rpm方式安装JDK,并设置JDK环境变量

大网站都在用的HAproxy+Web群集还不快来学_第5张图片

执行脚本并查看版本

大网站都在用的HAproxy+Web群集还不快来学_第6张图片

解压tomcat压缩包改名为tomcat1并复制相同文件tomcat2
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat1
cp -a /usr/local/tomcat1 /usr/local/tomcat2

大网站都在用的HAproxy+Web群集还不快来学_第7张图片

编译脚本将tomcat添加到系统服务中

大网站都在用的HAproxy+Web群集还不快来学_第8张图片

修改tomcat1的启动和关闭脚本

大网站都在用的HAproxy+Web群集还不快来学_第9张图片

大网站都在用的HAproxy+Web群集还不快来学_第10张图片

tomcat2同样配置,并配置动态页面 this is web 4

同样配置配置tomcat1

修改tomcat2的端口号,tomcat1和tomcat2不能占用相同的端口号

大网站都在用的HAproxy+Web群集还不快来学_第11张图片

启动服务并查看服务状态

大网站都在用的HAproxy+Web群集还不快来学_第12张图片

网页测试否配置成功

大网站都在用的HAproxy+Web群集还不快来学_第13张图片

大网站都在用的HAproxy+Web群集还不快来学_第14张图片

配置HAproxy服务器
安装依赖包建立程序用户并解压压缩包

配置编译环境并安装
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.4.4/src/ LUA_LIB=/usr/local/src/lua-5.4.4/src/
make install PREFIX=/usr/local/haproxy

大网站都在用的HAproxy+Web群集还不快来学_第15张图片

为HAproxy建立程序目录,并将配置文件格式复制到程序目录里

复制脚本文件格式到系统目录中,并修改第26行加上双引号

大网站都在用的HAproxy+Web群集还不快来学_第16张图片

添加软链接,添加权限并启动

大网站都在用的HAproxy+Web群集还不快来学_第17张图片

修改配置文件
vim /etc/haproxy/haproxy.cfg

大网站都在用的HAproxy+Web群集还不快来学_第18张图片

大网站都在用的HAproxy+Web群集还不快来学_第19张图片

大网站都在用的HAproxy+Web群集还不快来学_第20张图片

大网站都在用的HAproxy+Web群集还不快来学_第21张图片

测试静态页面

大网站都在用的HAproxy+Web群集还不快来学_第22张图片

大网站都在用的HAproxy+Web群集还不快来学_第23张图片

测试动态页面

大网站都在用的HAproxy+Web群集还不快来学_第24张图片

大网站都在用的HAproxy+Web群集还不快来学_第25张图片

取消注释为使动态页面保持长连接

大网站都在用的HAproxy+Web群集还不快来学_第26张图片

测试状态监控页面

大网站都在用的HAproxy+Web群集还不快来学_第27张图片

2.3 日志单独保存

方法一:修改rsyslog配置通过if语句判断将日志记录转移到指定目录中
vim /etc/haproxy/haproxy.cfg
global
    log /dev/log local0 info
    log /dev/log local0 notice
    ......
 
defaults
    ......
    log global
    ......
#需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
 
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
 
#这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
启动配置并重启haproxy查看请求日志消息

大网站都在用的HAproxy+Web群集还不快来学_第28张图片

方法二:通过修改日志等级的方式,来将请求日志放到指定文件里
#修改haproxy.cfg,将info及以上级别的日志发送到rsyslog的local0接口,将warning及以上级别的日志发送到rsyslog的local1接口
vim /etc/haproxy/haproxy.cfg
global
    ......
    log 127.0.0.1 local0 info
    log 127.0.0.1 local1 warning
    ......
​
defaults
    ......
    log global
    ......
​
#注:信息级日志会打印HAProxy 的每一条请求处理,会占用大量的磁盘空间,在生产环境中,将日志级别调整为notice
​
​
#为 rsyslog 添加 haproxy 日志的配置
mkdir /var/log/haproxy
​
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644                               #日志文件的权限
$FileOwner haproxy                                 #日志文件的owner
local0.*     /var/log/haproxy/haproxy.log          #local0接口对应的日志输出文件
local1.*     /var/log/haproxy/haproxy_warn.log     #local1接口对应的日志输出文件
​
#修改 rsyslog 的启动参数
vim /etc/sysconfig/rsyslog
......
SYSLOGD_OPTIONS="-c 2 -r -m 0"
启动服务并查看

大网站都在用的HAproxy+Web群集还不快来学_第29张图片

你可能感兴趣的:(前端)