HAProxy实战(一)

实验目的

  • 测试基于haproxy的反代和负载均衡配置

  • 测试keepalived高可用haproxy的效果

实验要点

(1) 动静分离discuzx,动静都要基于负载均衡实现;
(2) 进一步测试在haproxy和后端主机之间添加varnish缓存;
(3) 给出拓扑设计;
(4) haproxy的设定要求:

(a) 启动stats;
(b) 自定义403、502和503的错误页;
(c) 各组后端主机选择合适的调度方法;
(d) 记录好日志;
(e) 使用keepalived高可用haproxy;

拓扑结构

拓扑图的简要说明

  • node2和node5上同时运行keepalived和haproxy,做高可用,VIP为172.16.47.100

  • 在node3和node4上,模拟了2台基于IP的虚拟主机,以减少实验中机器的数量

  • 在node3上,运行nginx的同时,还运行了nfs服务,共享目录;在node4上把该共享目录挂载到本地,用于httpd服务存放静态内容;node3上的nginx将该目录作为其网页文件根路径,从而实现了静态内容的共享

  • haproxy主机负责接受用户请求,当用户请求的是图片资源时,调度至nginx服务器,否则调度请求至httpd服务器

实验配置

根据实验拓扑,在node3上部署nginx服务,nfs服务

ssl -tnl可以看到111端口(rpc)和2049(nfs)都已经起来

修改nginx的配置文件,添加两个基于IP的虚拟主机,以模拟一组静态服务器组,将其网页根文件路径设置为nfs服务器的导出目录。

提供测试主页,启动nginx服务,测试nginx服务是否正常

在node4上部署配置amp环境

yum install httpd php php-mysql mariadb-server -y,启动mariadb,创建bbs库,授权用户访问,部署用于安装Discuz论坛所需的数据库环境

解压Discuzx至httpd工作目录/var/www/html/下,改名upload为bbs,解压目录下的data/attachment/目录为用户上传附件的目录,将node3上的共享目录/testdir/nfs挂载到该目录下。这样的话,就需要先将该目录下的文件先备份处理,待挂载后,再移进来。

注意:得先在node3上创建一个于node4上的apache用户相同ID号的用户,并且让该用户对nfs导出的目录有写权限。

再来配置httpd服务器,创建两个基于IP的虚拟主机,模拟动态服务器组

两个IP访问都没问题,开始安装

在node2上安装部署haproxy和keepalived

node5上的配置也是类似,只不过配置keepalived时要配置成主节点。

重启rsyslog,启动keepalived,haproxy,测试访问。

停掉主节点node5上的haproxy,可以看到VIP,已经到备节点node2上,页面也仍可以正常访问

至此,keepalived高可用haproxy成功。不过在这里的时候遇到一个坑,记录一下。

在配置好keepalived高可用haproxy后,把node5(主)和node3(备)上的haproxy和keepalived都起起来,这时VIP在node5上面,能正常访问页面,这没问题;把node5上的Haproxy停掉之后,它的优先级减了10,成了90,,这也没问题,但是,node3的优先级按正常来说应该是95,这时node3优先级比node5高,应该成为主,VIP应该在node3上,但是实际上却没有。

在node2上抓包tcpdump -i eno16777736 -nn host 224.0.100.33

可以看到,仍是node5(172.16.47.105)发的vrrp报文,并且优先级变成了90。

到这里我们来分析一下:node5的优先级降低,都变成了90,而node2却还没有变成主,难道是node2的优先级更低?停掉node5上的keepalived让其优先级变为0,来看看node2的优先级。

node2的优先级不是应该是95吗,怎么变成90了?于是想到检查haproxy健康状态的配置段:

killall -0 haproxy是检查haproxy进程是否存在,存在返回0。所以检测的逻辑是:每秒钟执行一次script “killall -0 haproxy”,如果返回码为0,则不执行下面的weight -5,否则执行。自己手动执行一下killall -0 haproxy,发现killall命令竟然不存在。

killall命令不存在,那么killall命令肯定执行不成功,返回非0值了。于是就明白为什么node2权重会异常的减5了。安装上killall所需的包,问题就解决了。

统计页面如下:

现在来验证动静分离是否成功:查看已经上传的图片是由谁处理的。

可以看到,是由nignx处理的,再来看看其他资源

可以看到,是由apache处理的。这说明,我们在haproxy上定义的acl生效了,当匹配到/attachment时,请求就被调度至nginx,其他的请求全都送往httpd服务器组,查看我们定义的haproxy的日志,可以看到nginxgroup和httpdgroup都处理过请求。

node4上停掉httpd服务器,systemctl stop httpd.service,我们自定义的错误页面也出来了

至此,discuz论坛的动静分离也已经实现。

原创文章,作者:Lurker,如若转载,请注明出处:/68260

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达注册  万达招商QQ  万达主管  万达娱乐主管  万达登录  guoqibee.com  万达娱乐主管  guoqibee.com  万达注册