免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7479 | 回复: 10
打印 上一主题 下一主题

大型高并发高负载网站的系统架构浅淡 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-19 12:17 |只看该作者 |倒序浏览
本帖最后由 hoojar 于 2010-03-20 10:43 编辑

大型高并发高负载网站的系统架构浅淡

怎么样才能高效的开发程序?有一部份人会说,程序就是堆积木,到网上找些模块来用就行了;有另一部份人会说,可以找一些现成的框架与开源软件下载来修改就行了。大家都说的没错,现在国内的开发人员普遍不会考虑程序的性能与代码的大小,只图快速完成任务就OK了。

那么怎样才能高效的开发出功能强大、稳定性高、安全性强、负载量重的程序呢?很多程序开发相关人员可能从未想过这方面的问题。当今的程序是越来越大,很多网站代码都差不多,使用的框架太尽相同,代码中包含了太多无用的代码模块,我相信也有一部分程序开发人员对自己所使用的框架是怎么运行的都不太清楚。清楚是框架是怎么运行的太麻烦了,会用就行了,这话说的没错,但也别忘了程序代码可以随便COPY,但程序真正的精髓是思想,思路是无法COPY的。

本文我将以Nginx + Php + MySql + Memcached来讨论一下如何设计高负载的网站系统架构。

以前我一直以为大型高并发高负载的网站瓶颈是MYSQL,后来我从一高人那了解到一种全新的设计思想才知道原来大型网站的瓶颈是WEB服务器连接数。

高人的设计思想是,动态网站的内容第一次生成后就存储到Memcached当中,当第二次有连接请求时,PHP程序先判断此页面的内容是否在Memcached当中有存在,若存在则直接输出Memcached当中所对应的页面内容。那么又会有人问:要是我的页面需要即时更新怎么办了?对于这个问题,我想更新不会整个页面当中的内容全更新吧,就拿论坛来说,我们需要即时更新访问人数,而页面的内容并没有做修改,这时怎么办才好了?这时我们可以在显示访问人数处作一个标记,并且记录访问数量时并不时时同步更新到数据库当中,而先更新来到Memcached当中,再将需要更新的SQL语句也存储到Memcached异步SQL更新的队列当中,当有人访问页面时,再从Memcached当中获取访问人数,再替换标记就OK了。

我可能没有说清楚,但这种东西讲不清楚,我最后将总结的几句写下。

一、        数据库设置1台MASTER数据库只写,N台SLAVE数据库只读。
二、        记住MASTER数据库不创建索引,而SLAVE数据库定要创建大量索引。
三、        页面的生成可采用静态,若非要采用动态请加上Memcached。
四、        非即时需更新与新增的SQL采用异步更新到MASTER库,异步的SQL存储到Memcached当中,定时或条件触发更新到主库当中。
五、        存储到Memcached当中的数据尽可能的小,不要存储大数组,若非来存储大数组,请拆分成多个KEY分别进行存储。
六、        MYSQL 与Memcached不对外网,只对WEB服务提供内网服务。
七、        不采用SESSION,采用COOKIE加密码校验算法,非要采用SEESION请将SESSION存储到数据表内存表或Memcached当中。
八、        多服务器WEB程序与WEB服务器做境像,采用DNS轮循定位。
九、        尽可能的少写代码,能重复使用的代码尽可能的重用,代码尽可能的精短高效,以追求精益求精为宗旨。
十、        动态页面(PHP JSP ASP)与静态页面(HTML JPG GIF PNG)最好分服务器专门提供服务。
十一、        有条件的话静态文件或大图片文件有条件可采用CDN服务。
十二、        有C语言技术做后盾的话可用C语言开发PHP扩展。

当然以上的办法较适合服务器资源有限,若是财大气粗的您还将会有很多的解决方案,在此就不描述了。
顺便借此来推销一下本人使用多年的PHP框架,您也还可以下载wcore框架试试http://www.hoojar.com/tmp/wcore.zip希望能对您在程序设计思想上有所帮助。谢谢!
言谈不足,望众互教,众献良思,技艺超群,广泛学习,授教如众。

转载:http://www.hoojar.com/view-lore.php?lid=66963  大型高并发高负载网站的系统架构浅淡

论坛徽章:
0
2 [报告]
发表于 2010-03-19 13:20 |只看该作者
1."动态网站的内容第一次生成后就存储到Memcached当中" 这步感觉是多余的,前端反向代理要做得更出色一些.
2.如果你最近有关注业内一些新技术,且你的业务逻辑如你所说的简单,可以尝试用NoSQL型数据库
3.在你所说的"高负载高并发"应用下,你的数据库MASTER仍旧是瓶颈
4.你的Memcached将会是瓶颈,你也没有说如何防止Memcached挂了的情况下如何处理?数据丢失?如何保障可靠性?
5.静态文件或大图片文件服务器内部怎么消化?怎么组织存储?

这个看来顶多算中型应用吧.

论坛徽章:
0
3 [报告]
发表于 2010-03-19 14:00 |只看该作者
本帖最后由 hoojar 于 2010-03-19 14:04 编辑

1."动态网站的内容第一次生成后就存储到Memcached当中" 这步感觉是多余的,前端反向代理要做得更出色一些.
2.如果你最近有关注业内一些新技术,且你的业务逻辑如你所说的简单,可以尝试用NoSQL型数据库
3.在你所说的"高负载高并发"应用下,你的数据库MASTER仍旧是瓶颈
4.你的Memcached将会是瓶颈,你也没有说如何防止Memcached挂了的情况下如何处理?数据丢失?如何保障可靠性?
5.静态文件或大图片文件服务器内部怎么消化?怎么组织存储?


1.老大,用反相代理第二次访问的就不是动态的页面了。我所说的是动太,因为我除了输入内容外还要统计很多数据信息的。您说静态的能统计吗?

2.nosql现在只是说说而以,那么您现在在使用NOSQL吗?

3.不是说了异步在MASTER数据库执行SQL存储嘛。

4.Memcached挂的情况太少,就算挂了也没关系,不是异步执行保存了数据嘛,重启Memcached再加载数据不就来了嘛

5.静态文件或大图片文件并没有说内部处理,而是采用CDN加速。

论坛徽章:
0
4 [报告]
发表于 2010-03-19 14:59 |只看该作者
显然LZ并没有完全清楚2楼的意思,这也说明楼主的应用更多的是适用于中型应用,对于大型应用,这种架构还是显得单薄了些

论坛徽章:
0
5 [报告]
发表于 2010-03-19 17:12 |只看该作者
显然LZ并没有完全清楚2楼的意思,这也说明楼主的应用更多的是适用于中型应用,对于大型应用,这种架构还是显 ...
david2008 发表于 2010-03-19 14:59



    那么请问,怎么样的框架最适合于大型网站了。希望指教,让我们都学习一下。

论坛徽章:
0
6 [报告]
发表于 2010-03-19 17:24 |只看该作者
谁说动态页面不能缓存了,谁说静态不能统计....
Memcached 挂了也没关系?
你的静态存储环境寄望于CDN?  你要是说整体迁移到商业云平台,那岂不是连架构都省了.


大型的意思笼统地说是哪怕你某个重要环节出现0.0n秒的问题就会全盘崩溃.

论坛徽章:
0
7 [报告]
发表于 2010-03-19 17:25 |只看该作者
呵呵,lz勇气过人

论坛徽章:
0
8 [报告]
发表于 2010-03-19 18:07 |只看该作者
那么请问,怎么样的框架最适合于大型网站了。希望指教,让我们都学习一下。
hoojar 发表于 2010-03-19 17:12


首先要明确一个问题前提,就是你说的大型网站的量化定义,是访问量大,还是数据量大?大到什么程度或标准才称为大型?高并发又是指多少数据量的并发标准以上是高并发?
不要简单的去定义一个网站是小型、中型、大型,甚至巨型,这么笼统的定义无益于问题的合理解答。

当然你提出的这些都是一些有效的措施,但是任何大的应用都是根据其自身特点去设计架构的,应用根据业务的不同而对技术架构的要求是不一样的。

复杂的应用首要的需求一般都是“稳定”,而非高效。所以备份和冗余是不得不考虑的东西,如果一个memcached服务器挂了,如果仅仅是不重要的数据那么产生的后果可能还可以承受,但是如果缓存的丢失导致上百个用户的付款出现问题,你就只能卷铺盖滚蛋了。

论坛徽章:
0
9 [报告]
发表于 2010-03-20 10:19 |只看该作者
首先要明确一个问题前提,就是你说的大型网站的量化定义,是访问量大,还是数据量大?大到什么程度或标 ...
david2008 发表于 2010-03-19 18:07



    您说的很对,“任何大的应用都是根据其自身特点去设计架构的,应用根据业务的不同而对技术架构的要求是不一样的。”

不同的数据也会进行不同的优化处理。


[复杂的应用首要的需求一般都是“稳定”,而非高效。所以备份和冗余是不得不考虑的东西,如果一个memcached服务器挂了,如果仅仅是不重要的数据那么产生的后果可能还可以承受,但是如果缓存的丢失导致上百个用户的付款出现问题,你就只能卷铺盖滚蛋了。]

如果是重要的数据,当然会做两手或N手处理,如果一个memcached服务器挂了也没什么关系,memcached是分布式的,重要的数据也会直接更新到数据库当中,若还会写文件日志,但通常的数据还是以读为主,写的频率稍少些。

不知楼上高手,有没有发现,有时memcached与nginx接合的好,访问效率会比静态的表面还要高点?

论坛徽章:
0
10 [报告]
发表于 2010-03-20 14:26 |只看该作者
呵呵,搭建大型高并发负载网站是个比较复杂的东西,既要考虑宏观,比如用什么硬件,软件,数据库,开发语言,数据安全,数据存储。。。,
又要考虑细节,比如内存消耗,并发处理,cache搭配。。。

对大致可能出现的瓶颈有一定认知和解决方法

有了初步架构方案,还要大量测试( 有些软件选型时就要测试 ), 这样才能保证方案可实施,稳定

当然还有突发状况,那就需要靠自身经验和能力去应对。

这是我个人理解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP