`

[转]开发大型高负载类网站应用的几个要点

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

开发大型高负载类网站应用的几个要点


作者:nightsailer
来源:http://www.phpchina.com/bbs/thread-15484-1-1.html


看了一些人的所谓大型项目的方法,我感觉都是没有说到点子上,有点难受。
我也说说自己的看法.我个人认为,很难衡量所谓项目是否大型,
即便很简单的应用在高负载和高增长情况下都是一个挑战.因此,按照我的想法,姑且说是高负载
高并发或者高增长情况下,需要考虑的问题.这些问题,很多是和程序开发无关,而是和整个系统的
架构密切相关的.

  • 数据库
    没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。
    一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,
    那么,MySQL的效能急剧下降。常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的
    服务器上进行操作。我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,
    但是同时只有1个是Active,我们可以在一定时候切换。之所以用2个M,是保证M不会又成为系统的SPOF。
    Slaves可以进一步负载均衡,可以结合LVS,从而将select操作适当的平衡到不同的slaves上。

    以上架构可以抗衡到一定量的负载,但是随着用户进一步增加,你的用户表数据超过1千万,这时那个M变成了
    SPOF。你不能任意扩充Slaves,否则复制同步的开销将直线上升,怎么办?我的方法是表分区,
    从业务层面上进行分区。最简单的,以用户数据为例。根据一定的切分方式,比如id,切分到不同的数据库集群去。
    全局数据库用于meta数据的查询。缺点是每次查询,会增加一次,比如你要查一个用户nightsailer,你首先要到
    全局数据库群找到nightsailer对应的cluster id,然后再到指定的cluster找到nightsailer的实际数据。
    每个cluster可以用m-m方式,或者m-m-slaves方式。
    这是一个可以扩展的结构,随着负载的增加,你可以简单的增加新的mysql cluster进去。

    需要注意的是:
    1、禁用全部auto_increment的字段
    2、id需要采用通用的算法集中分配
    3、要具有比较好的方法来监控mysql主机的负载和服务的运行状态。如果你有30台以上的mysql数据库在跑就明白我的意思了。
    4、不要使用持久性链接(不要用pconnect),相反,使用sqlrelay这种第三方的数据库链接池,或者干脆自己做,因为php4中mysql的
    链接池经常出问题。
    • 缓存
      缓存是另一个大问题,我一般用memcached来做缓存集群,一般来说部署10台左右就差不多(10g内存池)。需要注意一点,千万不能用使用
      swap,最好关闭linux的swap。
      • 负载均衡/加速
        可能上面说缓存的时候,有人第一想的是页面静态化,所谓的静态html,我认为这是常识,不属于要点了。页面的静态化随之带来的是静态服务的
        负载均衡和加速。我认为Lighttped+Squid是最好的方式了。
        LVS lighttped====>squid(s) ====lighttpd

        上面是我经常用的。注意,我没有用apache,除非特定的需求,否则我不部署apache,因为我一般用php-fastcgi配合lighttpd,
        性能比apache+mod_php要强很多。

        squid的使用可以解决文件的同步等等问题,但是需要注意,你要很好的监控缓存的命中率,尽可能的提高的90%以上。
        squid和lighttped也有很多的话题要讨论,这里不赘述。
        • 存储
          存储也是一个大问题,一种是小文件的存储,比如图片这类。另一种是大文件的存储,比如搜索引擎的索引,一般单文件都超过2g以上。
          小文件的存储最简单的方法是结合lighttpd来进行分布。或者干脆使用Redhat的GFS,优点是应用透明,缺点是费用较高。我是指
          你购买盘阵的问题。我的项目中,存储量是2-10Tb,我采用了分布式存储。这里要解决文件的复制和冗余。
          这样每个文件有不同的冗余,这方面可以参考google的gfs的论文。
          大文件的存储,可以参考nutch的方案,现在已经独立为hadoop子项目。(你可以google it)

          其他:
          此外,passport等也是考虑的,不过都属于比较简单的了。

          吃饭了,不写了,抛砖引玉而已。

          【回复】

          9tmd :
          说了关键的几个部分,还有一些比如squid群、LVS或者VIP(四层交换)之类的必须考虑,数据库逻辑分表不需要master里面查id,可以定期缓存或者程序逻辑上进行控制。
          跟大家分享一下我的经验: http://www.toplee.com/blog/archives/337.html (欢迎讨论)
          nightsailer
          楼上说的很好.
          我再说一下关于为何要在主表查询,最主要的因素是考虑到复制和维护的问题。假设按照程序逻辑,用户nightsailer应该在s1集群,但是由于种种原因,我须要将nightsailer的数据从s1集群转移到s5集群或者某些时候,我需要将某几个集群的数据合并,此时,我维护的时候只需要更新一下主数据库中nightsailer的cluster id从1变成5,,维护的工作可以独立进行,无需考虑更新应用程序的逻辑。也许程序的id分配逻辑可以考虑到这种情况,但是这样一来,你的这个逻辑会发散到各个应用中,产生的代码的耦合是很高的。相反,采用查表这种方式,只需要在最初的时候进行初始分配,那么其他的应用是无需考虑这些算法和逻辑的。
          当然,我最初提到的增加这次查询并不是说每次查询都需要找主数据库,缓存策略是必定要考虑的。

          至于说为什么要禁用auto_increment,我想也清楚了,数据的合并和分隔,肯定是不能用auto_increment的。
          在闲扯一下,PHP的优化可以有很多,主要的措施:
          1、使用FCGI方式,配合lighttpd,Zeus.
          我个人比较喜欢Zeus,简单可靠。不过,需要¥¥¥。
          lighty也不错,配置文件也很简单,比较清爽。最新的1.5,虽然不稳定,但是配合linux的aio,性能的提升
          非常明显。即便现在的稳定版,使用2.6的epoll可以得到的性能是非常高。当然,lighty比zeus缺点是对于smp
          的支持很有限,所以可以采用多服务器负载,或者干脆起不同的进程服务监听不同的端口。
          2、专门的PHP FCGI服务器。
          好处多多,在这个服务器上,就跑php的fcgi服务,你可以把一些缓存加上,比如xcache,我个人喜欢这个。
          还有别的,套用大腕的话,把能装的都装上,呵呵。
          另外,最主要的是,你可以只维护一个php的环境,这个环境能够被apache,zeus,lighttpd同时share,
          前提是这些都使用php的fcgi模式,而且,xcache可以充分发挥!
          3、apache+mod_fastcgi
          apache并非无用,有时候也需要。比如我用php做了一个web_dav的服务器,在其他有问题,只能跑apache.
          那么,apache安装一下mod_fastcgi,通过使用externl server,使用2配置的php fastcgi。
          4、优化编译
          ICC是我的首选,就是intel的编译器啦,用icc重新编译php,mysql,lighty,能编的都编,会有不小的收获的。尤其是你用
          intel的cpu的话。
          5、php4的64位需要patch
          好像没有人在linux x86_64上编译过php4吧,我曾经googleit
          ,别说国内了,连老外都很少用。
          这里就做个提醒把,如果用php官方下载的(包括最新的php-4.4.4),统统无法编译通过。问题是出在autoconf上,需要
          手工修改config.m4,一般是在mysql,gd,ldap等一些关键的extension上,还有phpize的脚本。把/usr/lib64加入到
          config.m4中相关搜索的path中。
          不过我估计很少人像我这样死用php4不防,呵呵。php5就没有问题。
          我也考虑正在迁移到php5.2,写代码太方便了,一直忍着呢。
          QUOTE:
          原帖由 wuexp 于 2007-1-3 17:01 发表
          分表会使操作数据(更改,删除,查询)边的很复杂,特别是遇到排序的时候就更麻烦了.
          曾经考虑根据用户id哈希一下,插入到相应的分表里

          明白你的意思。

          不过我们可能讨论的不完全一样,呵呵。
          我所说的分表要依据不同的业务情况来划分的,

          1、可以是垂直划分,
          比如依据业务实体切分,比如用户a的blog贴子,用户的tag,用户的评论都在a数据库u,甚者是完整的一套数据结构(这种情况下应该说是分数据库)

          2、也可以水平划分,
          一个表的数据分在不同的数据库上。
          比如message表,你可能分为daily_message,history_message,
          dialy_meesage可能是hot对象,week_message是warm,2个月以前的帖子
          可能属于cold对象了。这些对象依据访问频度不同会划分到不同的数据库群上。

          3、二者结合

          不过,不论如何,更改、删除并不复杂,和未分区的表没有区别。

          至于查询和排序,不可能仅仅是通过select,order吧?
          而是应该产生类似摘要表,索引表,参考表。。。
          另外,要根据业务具体分析减少垃圾数据,有些时候,只需要最初的1万条记录,那么所有表
          数据的排序就不需要了。很多传统的业务,比如零售,流水表很大,但是报表的数据
          并非实时生成的,扎报表应该不陌生。

          也可以参考很多网站的做法,比如technorati啊,flickr之类的。


          所谓的麻烦是你设计系统的结构的时候要考虑到,在设计数据库的时候更要注意,
          因此只要项目的framework最初设计比较完备,那么可以说大部分对开发人员是透明的。
          前提是,你一定要设计好,而不是让程序员边写代码边设计,那会是噩梦。


          我写这么多废话,并非仅仅是对程序员来说,也许对设计者更有用。

          9tmd
          程序逻辑上控制表拆分只需要维护一个数据库访问的配置文件即可,对于开发来说,完全透明,可以不用关心访问的是哪里,而只需要调用通用的接口即可,曾经做过的系统里面,这样的应用经常遇到,尤其在全网passport、社区帖子等方面的处理上应用最多。

          原来在yahoo工作和后来mop工作都使用了这样的架构,整体感觉来说还是值得信赖的,单表毕竟存在面对极限数据量的风险。

          9tmd
          前面老是有人问auto_increment的问题,其实这是MySQL官方专门针对M/S的Replication做过的说明,因为MySQL的同步是依靠同步MySQL的SQL日志来实现的,事实上单向的Master->Slave使用auto_increment是没有问题的,而双向的M/M模式就会存在问题了,稍微一思考就知道怎么回事了。官方文档:
          http://dev.mysql.com/tech-resour ... ql-replication.html
          http://dev.mysql.com/doc/refman/ ... auto-increment.html

          另外,在使用MySQL的同步时,需要注意在自己的代码里面,写SQL的时候不要使用MySQL自己提供的类似 NOW()之类的函数,而应该使用php程序里面计算的时间带入SQL语句里面,否则同步的时候也可能导致值不相等,这个道理可以牵涉出另外一些类似的问题,大家可以考虑一下。




          分享到:
          评论

          相关推荐

            开发大型高负载类网站应用的几个要点

            综上所述,开发大型高负载类网站应用时,需要综合考虑数据库设计、缓存策略、负载均衡与加速以及存储方案等多个方面。通过对这些关键要素的有效管理和优化,能够显著提升系统的稳定性和性能表现。

            新版开发大型商城购物网站JAVA开源源码内含小程序源码+安卓IOS双端原生源码.txt

            这类网站通常需要具备高性能、高可用性和良好的用户体验。 #### 技术要点: - **架构设计**:为了确保系统的稳定运行,可能采用了微服务架构来实现不同业务模块之间的解耦。 - **负载均衡**:通过负载均衡技术来...

            高性能高并发服务器架构大全

             开发大型高负载类网站应用的几个要点 105  Memcached和Lucene笔记 110  使用开源软件,设计高性能可扩展网站 110  面向高负载的架构Lighttpd+PHP(FastCGI)+Memcached+Squid 113  思考高并发高负载...

            构建高性能可扩展ASP.NET网站PDF与源码(修正PDF)

            在构建高性能的ASP.NET网站时,有几个关键知识点是必不可少的: 1. **页面生命周期管理**:了解ASP.NET页面生命周期是优化性能的基础,包括初始化、加载、验证、呈现和卸载等阶段。掌握每个阶段的功能可以帮助你...

            JSP打造大型分布式B2C商城项目视频教程

            根据提供的文件信息,我们可以将这个“JSP打造大型分布式B2C商城项目视频教程”的主要内容归纳为以下几个关键知识点: ### 一、项目简介与技术选型 本项目旨在通过Java Server Pages (JSP) 技术来构建一个大型的...

            jsp源码乐趣大型购物系统v1.1(jsp+servlet+mysql)130223

            根据提供的文件信息,我们可以深入探讨该系统的几个关键知识点:JSP技术、Servlets以及MySQL数据库在构建大型购物系统中的应用。 ### JSP (JavaServer Pages) JSP是一种基于Java技术的服务器端脚本语言,它允许...

            TM00082-大型在线学习平台.rar

            【标题】"TM00082-大型在线学习平台" 涵盖了构建一个高效、可扩展的在线教育系统的各种技术要点。这个平台可能包括了学生管理系统、课程管理系统、教师管理系统、支付系统以及用户交互界面等多个核心模块。源码的...

            Oracle性能优化10大要点[归类].pdf

            在优化Shared Pool时,应关注以下几个方面: 1. 通过监控`v$librarycache`视图中的`gethitratio`,确保SQL Area的命中率超过90%,如果不足,应优化应用代码以减少解析次数。 2. `reloads/pins`比率应小于1%,否则...

            基于SpringCloud的微服务实战案例-基于Dubbo的微服务开发基础框架

            基于SpringBoot/Dubbo的微服务开发基础框架,通常包含以下几个关键组件: - **服务提供者**:负责具体的业务逻辑处理,对外暴露服务接口。 - **服务消费者**:通过Dubbo提供的API调用服务提供者暴露的接口。 - **...

            大型企业云平台DevOps实践.pdf

            首先,我们看到目录中提到了云平台运维的几个关键方面,包括基础组件、持续发布、智能监控等。在传统运维中,基础场景涉及到代码管理、测试部署、日志和监控等,而关键问题则集中在可用性、效率、成本和用户体验上。...

            以.net为基础的三层架构分布式系统设计.pdf

            分布式系统的优点主要体现在以下几个方面: 经济性:微处理机提供的性能价格比比大型主机更好,使得分布式系统具有更高的经济效率。 速度:分布式系统的总计算能力比单个大型主机更强,尤其在处理需要高速计算能力...

            tuxedo 资料

            课程内容涵盖以下几个关键部分: - **TUXEDO 基本特性**:包括其服务定位器、事务管理、负载均衡等功能。 - **使用 TUXEDO 开发**:讲解如何创建、编译和运行 TUXEDO 应用程序,以及与其他系统的集成。 - **TUXEDO ...

            从百度文件系统看大型分布式系统设计.pdf

            主要包括以下几个方面: 1. 集群环境和核心服务:百度的集群环境通常包含几千台服务器,其中BFS、集群调度系统Galaxy以及分布式协调服务Nexus构成核心服务。这些服务共同为百度的各类应用提供底层支持。 2. 分布式...

            基于 Java 的私有PT(private tracker)站点系统,可以提供高质量的连接服务和简单易用的界面。ba.zip

            在Java私有PT站点系统中,主要涉及以下几个关键技术点: 1. **BitTorrent协议**:BitTorrent协议是P2P(对等网络)文件共享技术的一种,它允许用户同时从多个源下载和上传文件,从而提高下载速度。Java实现...

            考拉开源仿微信uniapp前端+JAVA后端IM即时通讯

            项目后端可能包含了以下几个核心模块: 1. 用户认证与授权:使用Spring Security或OAuth2等框架,实现用户的注册、登录、权限管理,保证系统安全。 2. 消息服务:基于RabbitMQ或Kafka等消息队列,实现异步处理用户...

            Implementing Cloud Design Patterns for AWS.pdf

            具体而言,它关注于以下几个方面: 1. **可扩展性**:构建能够随着负载增加而自动扩展的应用程序。 2. **冗余性**:确保系统的各个部分都具备备份方案,以防止单点故障。 3. **高可用性**:设计出即使在某些组件...

            cics教程

            CICS(Customer Information Control System,客户信息控制系统)是由IBM开发的一款事务处理系统软件,主要用于支持大型企业的关键业务应用。它能够在高并发环境下提供稳定可靠的服务,并且具备强大的事务管理能力。...

            Java架构技术揭秘:Redis+Nginx+Dubbo+面试题+视频.docx

            根据给定文件的信息,我们可以将相关知识点分为以下几个部分进行详细阐述: ### 一、Redis 技术要点 #### 1. Redis 哨兵、复制、集群的设计原理及其区别 - **哨兵**:Redis Sentinel(哨兵)是一种用于监控主...

          Global site tag (gtag.js) - Google Analytics