开发者社区> 技术小胖子> 正文

一次设计高可用网站的实战经验

简介:
+关注继续查看

我公司前段时间做了一个活动,花了5000块购买了5台虚拟机(每台cpu 为单核2GHZ,内存为1.5GB)做了一个两个月大活动,我设计支持高并发的系统如下:
活动的特点是高并发,逻辑不是很复杂,因此我采用DNS做负载均衡器+nginx做前端+php开发+redis数据库的分布式结构。
使用DNS负载均衡的原因是,我没有更多的钱买负载均衡,其次负载均衡至少得双机主备,再次DNS负载均衡不用部署配置,比lvs简单多了。
为了解决跨域的session问题,我使用了一个redis数据库来存储session的id,这样我的php程序得改成不读取本地session,而去读取redis中的session数据。可以实现跨域的session,不用担心分布式带来的session问题。
同时redis可以用作存储用户数据,例如微博id,生成图片路径等等信息,并发性要比mysql高得多。
为了解决redis单点故障,我添加了一个从redis数据库实时和主redis数据库进行同步,若是主数据库挂了,可以用从数据库来顶替

 

 

 

但是这个网站每台机器上都会生成各自的图片,而这些图片需要在网站上显示,这样的话存在一个问题:
某个用户是通过DNS只能请求到一台机器上(VM3)上,那么在网站上出现的VM2,VM4,VM5的图片就无法显示了。
我冥思苦想,想到了一个好办法:就是利用nginx的proxy模块来实现:
1)VM2上由程序生成的每一张的图片都存在目录(10.200.225.158--VM2的内网ip)下,VM3上由程序生成的每一张的图片都存在目录(10.200.226.56)下...
2) 这样VM2下的图片路径就是http://www.a.com/10.200.225.158/xxx.jpg,VM3下的图片就是http://www.a.com/10.200.226.56/xxx.jpg
3)我VM2上的nginx上配置使得:
    3.1)当用户被DNS解析到VM2上时,若URL是http://www.a.com/10.200.225.158/xxx.jpg时就直接读取本地图片
    3.2)当用户被DNS解析到VM2上时,若URL是http://www.a.com/10.200.226.56/xxx.jpg时就通过VM2代理读取远程的VM3上的图片
    3.3)当用户被DNS解析到VM2上时,若URL是http://www.a.com/10.200.55.39/xxx.jpg时就通过VM2代理读取远程的VM4上的图片
    3.4)当用户被DNS解析到VM2上时,若URL是http://www.a.com/110.200.51.143/xxx.jpg时就通过VM2代理读取远程的VM5上的图

 

 

 

 

也就是说当www.a.com解析到vm2,若是要显示vm3上生成的图片的话,得通过vm2的代理去获取,由于我设置的代理的ip都是内网的,因此不占用外网ip的网络资源,不影响用户的访问速度。  


vm2的nginx配置文件如下

 


  1. location /10.200.226.56 {  
  2.              root    /opt/tmp/;  
  3.              proxy_redirect off ;  
  4.              proxy_set_header Host $host;  
  5.              proxy_set_header X-Real-IP $remote_addr;  
  6.              proxy_set_header REMOTE-HOST $remote_addr;  
  7.              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  8.              client_max_body_size 50m;  
  9.              client_body_buffer_size 256k;  
  10.              proxy_connect_timeout 30;  
  11.              proxy_send_timeout 30;  
  12.              proxy_read_timeout 60;  
  13.              proxy_buffer_size 256k;  
  14.              proxy_buffers 4 256k;  
  15.              proxy_busy_buffers_size 256k;  
  16.              proxy_temp_file_write_size 256k;  
  17.              proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;  
  18.              proxy_max_temp_file_size 128m;  
  19.              proxy_pass    http://10.200.226.56:80;  
  20.                
  21. }  
  22.  
  23. location /10.200.55.39 {  
  24.              root    /opt/tmp/;  
  25.              proxy_redirect off ;  
  26.              proxy_set_header Host $host;  
  27.              proxy_set_header X-Real-IP $remote_addr;  
  28.              proxy_set_header REMOTE-HOST $remote_addr;  
  29.              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  30.              client_max_body_size 50m;  
  31.              client_body_buffer_size 256k;  
  32.              proxy_connect_timeout 30;  
  33.              proxy_send_timeout 30;  
  34.              proxy_read_timeout 60;  
  35.              proxy_buffer_size 256k;  
  36.              proxy_buffers 4 256k;  
  37.              proxy_busy_buffers_size 256k;  
  38.              proxy_temp_file_write_size 256k;  
  39.              proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;  
  40.              proxy_max_temp_file_size 128m;  
  41.              proxy_pass    http://10.200.55.39:80;  
  42.                
  43. }  
  44. location /10.200.51.143 {  
  45.              root    /opt/tmp/;  
  46.              proxy_redirect off ;  
  47.              proxy_set_header Host $host;  
  48.              proxy_set_header X-Real-IP $remote_addr;  
  49.              proxy_set_header REMOTE-HOST $remote_addr;  
  50.              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  51.              client_max_body_size 50m;  
  52.              client_body_buffer_size 256k;  
  53.              proxy_connect_timeout 30;  
  54.              proxy_send_timeout 30;  
  55.              proxy_read_timeout 60;  
  56.              proxy_buffer_size 256k;  
  57.              proxy_buffers 4 256k;  
  58.              proxy_busy_buffers_size 256k;  
  59.              proxy_temp_file_write_size 256k;  
  60.              proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;  
  61.              proxy_max_temp_file_size 128m;  
  62.              proxy_pass    http://10.200.51.143:80;  
  63.                
  64. }  
  65.  
  66. location ~ \.php$ {  
  67.            fastcgi_pass   127.0.0.1:9000;  
  68.            fastcgi_index  index.php;  
  69.            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;  
  70.            include        fastcgi_params;  

 





     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/1047427,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【架构设计】互联网架构项目架构演进以及三高设计概述
【架构设计】互联网架构项目架构演进以及三高设计概述
19 0
【分布式技术专题】「架构实践于案例分析」盘点高并发场景的技术设计方案和规划
【分布式技术专题】「架构实践于案例分析」盘点高并发场景的技术设计方案和规划
67 0
【分布式技术专题】「架构设计方案」盘点和总结秒杀服务的功能设计及注意事项技术体系
【分布式技术专题】「架构设计方案」盘点和总结秒杀服务的功能设计及注意事项技术体系
86 0
阿里P9架构师终于把毕生心血而成的分布式高可用算法笔记开源了
分布式系统无处不在。 一台计算机内部多个互联的处理器组成了一个分布式系统,它们通过“一致性缓存”算法使每个处理器核心看到相同的数据。近三十年来,随着互联网的发展,越来越多的互联网后台系统采用计算机集群的方式来应对海量请求和数据的需求,这个计算机集群也是分布式系统。 为了简化分布式系统的开发,出现了很多为开发者提供分布式框架的开源项目,例如Apache基金会旗下的ZooKeeper项目就是一个应用广泛的分布式框架。 同时,国内也有很多关于如何使用这些分布式框架来搭建应用的书籍,它们极大地推动了分布式系统在国内的应用。我们不仅要知道如何使用这些现成的分布式框架来搭建应用,而且应该知道这些分布
88 0
阿里 P9 架构师讲解从单机至亿级流量大型网站系统架构的演进过程
阿里 P9 架构师讲解从单机至亿级流量大型网站系统架构的演进过程
178 0
京东首席系统架构师教你如何搭建高可用高并发系统架构
我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。 下面我会通过一本PDF实战跟大家一起深入了解亿级流量网站架构核心技术。 这本PDF实战总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战,从负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案、缓存、池化、异步化、扩容、队列等多方面详细地介绍了亿级流量网站的架构核心技术,可以让大家看完后能
81 0
4种典型限流实践保障应用高可用|云效工程师指北
4种典型限流实践保障应用高可用,本文总结了一份AHAS限流实践指南,如果你的系统有被恶意用户攻击的风险,或者系统中某个应用出现异常可能会造成雪崩效应,那么这篇文章会对你有所帮助。
482 0
质量公开课第3期:云原生时代微服务的高可用架构设计
阿里QA导读:近年来互联网行业迎来了云原生时代,在全面上云的同时,应用架构也纷纷向微服务架构迁移,这也对系统稳定性提出了新的挑战,如何能够在新的架构下保证应用稳定高可用,提升业务连续性,是必须要解决的问题。本次分享将为大家介绍蚂蚁在这方面的经验和思考。
152 0
阿里技术实战:一些云上资源调度的经验谈
对于初上云的企业来说,经常会有这些困惑:云上资源调度是否有必要自己做?云上资源调度应该怎么做? 基于企业目前的应用场景,最适合的云上资源调度管理方案是什么?阿里云弹性计算技术专家李雨前老师,以自身多年实战经验分享了一些可参考学习的方法论。
1885 0
云上高并发Web架构最佳实践
本文介绍云上高并发Web架构模型,以Wordpress应用为例,阐述云产品选择及架构部署、基础资源监控、应用实时监控、性能测试、应用防护的最佳实践。
177 0
+关注
技术小胖子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
58同城Android客户端框架演进与实践
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多