开发大型高负载类网站的注意事项
发布于:2017/5/17 17:16:20 浏览:

  看了一些人的所谓大型项目的办法,我感受都是没有提到点子上,有点难过。

  我也说说自个的观点.我个人以为,很难衡量所谓项目是不是大型,即便很简略的运用在高负载和高增长情况下都是一个应战.因此,按照我的主意,权且说是高负载高并发或许高增长情况下,需求思考的疑问.这些疑问,许多是和程序开发无关,而是和全部体系的架构密切相关的.

  一、数据库

  没错,首先是数据库,这是大多数运用所面对的首个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是最佳的办法了。

  LVSlighttped====>squid(s) ====lighttpd

  上面是我常常用的。留意,我没有用apache,除非特定的需求,不然我不布置apache,由于我通常用php-fastcgi配合lighttpd,性能比apache+mod_php要强许多。

  squid的运用能够处理文件的同步等等疑问,可是需求留意,你要极好的监控缓存的命中率,尽也许的提高的90%以上。squid和lighttped也有许多的话题要评论,这儿不赘述。

  三、存储

  存储也是一个大疑问,一种是小文件的存储,比方图像这类。另一种是大文件的存储,比方搜索引擎的索引,通常单文件都超越2g以上。

  小文件的存储最简略的办法是联系lighttpd来进行散布。或许爽性运用Redhat的GFS,长处是运用通明,缺点是费用较高。我是指你购买盘阵 的疑问。我的项目中,存储量是2-10Tb,我采用了散布式存储。这儿要处理文件的仿制和冗余。这样每个文件有不一样的冗余,这方面能够参阅谷歌的 gfs的论文。大文件的存储,能够参阅nutch的计划,如今已经独立为hadoop子项目。(你能够谷歌 it)

  别的:

  此外,passport等也是思考的,不过都归于比较简略的了。抛砖引玉罢了。