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


     看了一些人的所谓大型项目的方法,我感觉都是没有说到点子上,有点难受。
    E q!B6V k u R0我也说说自己的看法.我个人认为,很难衡量所谓项目是否大型,设计动量博客家园-A t2i z A p {
    即便很简单的应用在高负载和高增长情况下都是一个挑战.因此,按照我的想法,姑且说是高负载
    s+T G"r&F7D0高并发或者高增长情况下,需要考虑的问题.这些问题,很多是和程序开发无关,而是和整个系统的设计动量博客家园8N U O m&y"U
    架构密切相关的.
    8U-v Q W3X,V6e0
    #o#i$V Z h5l*n g$r0

    • 数据库

    没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。
    G&G2v k9R0一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,设计动量博客家园;Y Y*[ r J6G p m
    那么,MySQL的效能急剧下降。常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的
    _ h / F3k.o V z0服务器上进行操作。我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,设计动量博客家园 x C U f8C ^ {
    但是同时只有1个是Active,我们可以在一定时候切换。之所以用2个M,是保证M不会又成为系统的SPOF。设计动量博客家园 p }.B b w Y
    Slaves可以进一步负载均衡,可以结合LVS,从而将select操作适当的平衡到不同的slaves上。
    I!VU V0C#m/I0设计动量博客家园'] d7b I n4? D ^-@
    以上架构可以抗衡到一定量的负载,但是随着用户进一步增加,你的用户表数据超过1千万,这时那个M变成了
    k D8J j!g d} F0SPOF。你不能任意扩充Slaves,否则复制同步的开销将直线上升,怎么办?我的方法是表分区,
    7F A&F i | i0从业务层面上进行分区。最简单的,以用户数据为例。根据一定的切分方式,比如id,切分到不同的数据库集群去。设计动量博客家园 f5p B8p+Z j [ e c
    全局数据库用于meta数据的查询。缺点是每次查询,会增加一次,比如你要查一个用户nightsailer,你首先要到设计动量博客家园/x1E /8Z Y!z,^ t B
    全局数据库群找到nightsailer对应的cluster id,然后再到指定的cluster找到nightsailer的实际数据。设计动量博客家园 i n i6N n d
    每个cluster可以用m-m方式,或者m-m-slaves方式。
    ;f8/ X"T k)x S `0这是一个可以扩展的结构,随着负载的增加,你可以简单的增加新的mysql cluster进去。
    2` I5t m8y%o&r j d O0
    B A ~ R.x7_7f B l0需要注意的是:设计动量博客家园 h;a(g y*H:h Y
    1、禁用全部auto_increment的字段
    'z(B*Z o#_&M U o02、id需要采用通用的算法集中分配
    H x0@5[ F;P,V03、要具有比较好的方法来监控mysql主机的负载和服务的运行状态。如果你有30台以上的mysql数据库在跑就明白我的意思了。
    ,Z r S h6` f o P04、不要使用持久性链接(不要用pconnect),相反,使用sqlrelay这种第三方的数据库链接池,或者干脆自己做,因为php4中mysql的设计动量博客家园 B2n:L,I q [2x
    链接池经常出问题。
    y7P ])M N H D:k U W0

    • 缓存

    缓存是另一个大问题,我一般用memcached来做缓存集群,一般来说部署10台左右就差不多(10g内存池)。需要注意一点,千万不能用使用设计动量博客家园/N i4I8F6H [&u9S t
    swap,最好关闭linux的swap。设计动量博客家园 R/V2x$L J(a"Z5g C @

    • 负载均衡/加速

    可能上面说缓存的时候,有人第一想的是页面静态化,所谓的静态html,我认为这是常识,不属于要点了。页面的静态化随之带来的是静态服务的设计动量博客家园5f }5o ? ?5a0/"F.X!h
    负载均衡和加速。我认为Lighttped+Squid是最好的方式了。
    V z ~2F ~8`+} J s2/0LVS <------->lighttped====>squid(s) ====lighttpd设计动量博客家园 f%} @(L)f E,[
    设计动量博客家园5}'N!]$@ C s1h r
    上面是我经常用的。注意,我没有用apache,除非特定的需求,否则我不部署apache,因为我一般用php-fastcgi配合lighttpd,
    /e n f ~ k b#^ L0性能比apache+mod_php要强很多。
    } J [(W P9Q |0
    i n0o m)Q P)f0squid的使用可以解决文件的同步等等问题,但是需要注意,你要很好的监控缓存的命中率,尽可能的提高的90%以上。设计动量博客家园/t I4H3W x h
    squid和lighttped也有很多的话题要讨论,这里不赘述。
    "t q&G O F0

    • 存储

    存储也是一个大问题,一种是小文件的存储,比如图片这类。另一种是大文件的存储,比如搜索引擎的索引,一般单文件都超过2g以上。
    P v U t8U o N:F0小文件的存储最简单的方法是结合lighttpd来进行分布。或者干脆使用Redhat的GFS,优点是应用透明,缺点是费用较高。我是指设计动量博客家园 ^"?2n7S H"M6@1C6^
    你购买盘阵的问题。我的项目中,存储量是2-10Tb,我采用了分布式存储。这里要解决文件的复制和冗余。
    x$K A S /%F T0这样每个文件有不同的冗余,这方面可以参考google的gfs的论文。设计动量博客家园 h(F e g u9[$y;F h |
    大文件的存储,可以参考nutch的方案,现在已经独立为hadoop子项目。(你可以google it)
    A u;s ~ C m;c6M0设计动量博客家园 Q W o6`;/
    其他:
    g+L0g1T1a c J0此外,passport等也是考虑的,不过都属于比较简单的了。设计动量博客家园:M+{ / _!H;S#q H

  • 相关阅读:
    690. 员工的重要性
    91. 解码方法
    153. 寻找旋转排序数组中的最小值
    81. 搜索旋转排序数组 II
    33. 搜索旋转排序数组
    80. 删除有序数组中的重复项 II
    5708. 统计一个数组中好对子的数目
    高精度除法
    易闻app
    2021.4.13
  • 原文地址:https://www.cnblogs.com/yefengmeander/p/2887882.html
Copyright © 2020-2023  润新知