内容要点:
一、常见的 Web集群调度器:
二、Haproxy 应用分析:
三、Haproxy 调度算法原理:
四、实验示例:
第一步:搭建两台 Nginx 服务器
第二步:搭建 Haproxy
第三步:在 win7 上用浏览器访问调度服务器(192.168.100.100/test.html)
第四步:优化日志
一、常见的 Web集群调度器:
目前常见的 Web 集群调度器分为软件和硬件,软件通常使用开源的LVS、Haproxy、Nginx,硬件一般使用比较多的是 F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等。
二、Haproxy 应用分析:
(1)LVS 在企业应用中抗负载能力很强,但存在不足:
LVS 不支持正则处理,不能实现动静分离;
对于大型网站,LVS 的实现配置复杂,维护成本相对较高
(2)Haproxy 是一款可提供高可用性、负载均衡、及基于 TCP 和 HTTP 应用的代理的软件
特别适用于负载特别大的 Web站点;
运行在当前的硬件上可支持数以万计的并发连接请求
三、Haproxy 调度算法原理:
Haproxy 支持多种调度算法,最常用的有三种:
(1)RR:
RR 算法是最简单最常用的一种算法,即轮询调度;
理解举例
有三个节点A、B、C,第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到节点
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果
(2)LC:
LC 算法即最小连接数算法,根据后端的节点连接数大小动态分配前端请求;
理解举例
有三个节点A. B、C,各节点的连接数分别为A:4、B:5、 C:6, 此时如果有第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、 C:6
第二个用户请求会继续分配到A上,连接数变为A:6、B:5、 C:6; 再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端
由于实际情况下A. B、C的连接数会动态释放,很难会出现一样连接数的情况,因此此算法相比较r算法有很大改进,是目前用到比较多的-种算法
(3)SH:
SH 即基于来源访问调度算法,次算法用于一些有 Session 会话记录在服务器端的场景,可以基于来源的 IP、Cookie 等做集群调度。
理解举例
有三个节点A. B、C,第一个用户第一-次访问被指派到了A,第二个用户第一次访问被指派到了B
当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度
此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用
四、实验示例:
(1)环境准备:
两台 Nginx 服务器,一台 Haproxy调度服务器,一台window作为测试用;
在两台 Nginx服务器写两个测试网页;
所有主机网卡都设置成仅主机模式,修改好网卡信息;
客户端可以通过访问调度服务器,访问到两台节点服务器,不需要访问真实服务器地址。
角色 | IP地址 |
Haproxy | 192.168.100.100 |
Nginx 01 | 192.168.100.201 |
Nginx 02 | 192.168.100.202 |
window7(作为测试用) | 192.168.100.50 |
第一步:搭建两台 Nginx 服务器
关于nginx的搭建可以看我之前的博客,有详细的搭建过程和细节,这边具体细节不再写了。
搭建好 Nginx服务之后,在 Nginx主页 html 中添加一个测试主页,便于验证实验结果:
第一台:
echo "this is kgc web" > /usr/local/nginx/html/tset.html
第二台:
echo "this is accp web" > /usr/local/nginx/html/tset.html
第二步:搭建 Haproxy
(1)安装编译工具:
yum install bzip2-devel pcre-devel gcc gcc-c++ make -y
(2)可以通过远程挂载将 haproxy压缩包挂载到本地,再解压缩:
tar zxvf haproxy-1.5.19.tar.gz -C /opt/ //解压到/opt目录下
(3)编译:
make TARGET=linux3100 注:这个版本号,可以使用 uname -a 命令来查看版本号
make install
(4)创建文件,进行备份修改:
mkdir /etc/haproxy cp examples/haproxy.cfg /etc/haproxy/ vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 uid 99 gid 99 daemon #debug #quiet defaults log global mode http option httplog option dontlognull retries 3 maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webcluster 0.0.0.0:80 option httpchk GET /test.html balance roundrobin server inst1 192.168.100.201:80 check inter 2000 fall 3 server inst2 192.168.100.202:80 check inter 2000 fall 3
(5)启动脚本:
cp examples/haproxy.init /etc/init.d/haproxy //复制到init.d启动进程中 chmod +x /etc/init.d/haproxy //添加执行权限 chkconfig --add haproxy //添加到service,便于识别 ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy //创建软连接
(6)开启服务:
service haproxy start
关闭防火墙等环境
[root@Haproxy haproxy-1.5.19]# systemctl stop firewalld.service [root@Haproxy haproxy-1.5.19]# setenforce 0
第三步:在 win7 上用浏览器访问调度服务器(192.168.100.100/test.html)
http://192.168.100.100/test.html
第四步:优化日志
对调度器的配置文件进行优化和修改,可以将正常的访问信息和错误的信息分别存放在不同的日志文件中,方便管理;Haproxy的日志默认是输出到系统的 syslog 中,在生产环境中一般单独定义出来。
(1)修改主配置文件
vim/etc/haproxy/haproxy.cfg 修改global段: log /dev/log local0 info //正常访问的信息存放地 log /dev/log local0 notice //提示、警告等信息存放地
(2)重启服务
service haproxy restart
(3)创建文件,并添加规则
[root@Haproxy haproxy]# touch /etc/rsyslog.d/haproxy.conf [root@Haproxy haproxy]# cd /etc/rsyslog.d/ [root@Haproxy rsyslog.d]# vim 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 &~
(4)重启日志服务
systemctl restart rsyslog.service
(5)查看日志文件: /var/log/haproxy/haproxy-info.log
cat haproxy-info.log