![云上负载均衡实践体会](https://wp.cdn.emptinessboy.com/2017/09/lb.png!xiaofansub)
云上负载均衡实践体会
云上负载均衡实践体会
还记得帆哥上次在博客分享过我使用Nginx自己搭建负载均衡的一次实践。然而由于最近网站不断被人攻击以及上次部署的模式存在很多问题,又恰逢阿里云旧系列服务器免费升级。于是抽空干脆把服务在云上重新部署了一遍,也顺便体验下云计算的优势。
先说说上次部署的老旧负载均衡吧。emm,,前置Nginx加后端Apache,文件采用Rsync保持一致。看似非常美好。但恰恰是这一模式把各个软件的缺陷暴露的淋漓尽致,233
- 首先是Nginx做前置的七层负载均衡,相比其他4层转发,Nginx基于七层,支持缓存和Cookies粘滞等优点无需多说,但其只支持基于4层的健康检查也成了最大的毛病。(举个简单的栗子:当后端web应用挂掉的时候,服务器返回异常状态码如500时,其tcp端口还是正常监听的,而这种情况下Nginx仅通过Tcp是无法获知后端的真实运行情况的。不健康的服务器就不能及时从负载均衡池剔除从而导致web不可用)
- 其次Apache的phpFastcgi模式下存在内存管理的先天不足,此外Apache对大并发的承载力非常不好,流大时通过Top命令监控下黑压压的满眼都是httpd进程,场面十分壮观(很可惜当时忘记截图了)。相比下php-fpm会好很多。
- 最后,是某云 众所周知的诟病,现在想想都觉得可笑,帆哥当时一定是智商被套路才会选择在阿里云挂载普通云盘的服务器上使用Rsync来保持文件和目录的一致性。后期通过云监控可以看到我的Rsync成功把阿里云的石头IO跑满。2333
那么如何改进呢?还是从一个个问题着手去解决喽。
对于第一个Nginx负载均衡模块的缺陷问题,查阅资料得知由阿里经过Nginx二次开发的Tengine可以满足七层负载均衡下的健康检查,并且能够提供更多的自定义功能。对于Apache占资源的问题自然是采用更换为Nginx+Phpfpm的模式运行。至于文件同步的问题,其实作为Wordpress站点大可以忽略,因为Wordpress本身是无状态的服务,内容通过数据库输出。不过考虑到静态文件缓存充分利用的问题,以及帆哥还得在同一个服务器集群部署其他站点需要上传图片等文件,对文件一致有一定的要求(其实博主是处女座,,假的),因此经过考虑,决定采用建立公用Nas储存并挂载的方式来解决。
然而有一点在无意中被我忽视了,那就是我是在云计算平台部署网站,那么为什么不利用云计算的天然优势来使问题更简单呢?简单分析以上场景,其实有多个需求可以利用云平台的一站式服务解决。包括腾勋阿里在内的云厂商,都提供了基于自身平台的数据库,负载均衡和共享文件储存产品。
既然有现成方案,查了下价格,不论是0.02元每小时的负载均衡服务还是(阿里0.2元/GB/月,腾讯内测免费)的SSD共享文件储存都在可接受的价格范围内。不过考虑到之前在阿里云年付的旧服务器可以免费升级到新的系列,就动手在阿里云开始部署。(不过帆哥现在有点后悔上了套路云贼船,同样价格的虚拟机,腾勋不论是IO还是CPU性能都远远甩了阿里几条街)。
就这样,根据预算开通了三台阿里云服务器(1数据库,2web应用服务器)。为了减少成本,均采用弹性IP,不分配公网IP。然后如下图创建了192.168.0.0/16的内网网段(深受家里路由器Dhcp网段划分影响?)。然后把云服务器划分到虚拟交换机192.168.1.1/24网段下,Nas和负载均衡划分到192.168.2.1/24下。大概也许好像这样是因为这样看着比较顺眼吧。
作为个懒人,帆哥直接采用现成的军哥lnmp一键包来配置环境。云服务器A和B仅安装Nginx1.12和php-fpm7,另外一台服务器C则利用之前的镜像安装了Mysql57。
接下来配置web服务器通过内网安全组访问数据库节点。然后到控制台开通负载均衡服务。这里发现套路云的负载均衡现在要根据实例规格额外收费了,不过最低规格仍然免实例费,因此这里直接开通了最低配。然后创建http监听。这里建议开启获取真实ip,会话保持和健康检查功能。这里帆哥为健康检查单独分配了一个test.txt来减轻健康检查对服务器性能影响。当然如果你能够通过redis或者memcached来存储共享SessionCookie,那么这会是一个比会话保持更完美的解决方案。
做完这一切,就是为服务器挂载Nas共享储存了。根据官方文档,新建储存并创建挂载点。
然后安装nfs-utils
或nfs-common
使用Nas4命令挂载,并把命令写入启动脚本里。
sudo mount -t nfs4 011*********.cn-hangzhou.nas.aliyuncs.com:/itpaidui-web /web
如果启动失败可以尝试在脚本前加入sleep30延时挂载
挂载成功后会多出一个1PB的目录。然后在另一台服务器执行同样的操作。经试验,服务器A上传到web目录的文件在服务器B可以正常显示。至此,所有环境基本配置完毕,可以上传源码使用了。
其他细节:
SSL:使用负载均衡服务开启https的流程会遇到坑,因为阿里云负载均衡支持https监听但不支持https协议回源,因此需要开启传递前端访问协议的功能才能让后端输出正常页面。如果是wordpress,需要安装第三方插件或者在主题嵌入相关代码才能正常输出。具体代码太长这里就不粘贴了,大家可以Google或者有需要的可以mail帆哥索要:i@my.huxiaofan.com 也可以在文章评论里留言。
Gzip问题:理论上如果你创建了7层监听,就没必要在后端开启nginx gzip了,压缩可以由负载均衡监听集群代为完成以节省cpu开支。
会话保持:如果你的网站涉及到用户登陆注册,请务必开启。
IP识别:务必将负载均衡回源ip段加入白名单和realipp名单(如果需要获取访客真实ip,预计下一篇文章和大家讨论这个问题),在负载均衡前套cdn也是同理。
其他安全优化:这里帆哥采用了Nginx luawaf模块协助防御CC攻击。同时也编译安装了云锁的防御模块,目前效果良好。在开了真实访客ip筛选后同360CDN完美兼容
以上文章为 Live帆-梦想的帆 huxiaofan.com IT派对 itpaidui.com 原创,转载请注明出处,谢谢
留下你的评论