大规模网站架构

以下并非所有都经过本人实践,部分为根据资料的假想所得,切勿贯彻本本主义。

网站架构目标

  • 高可用性(High Availability)
  • 可伸缩性(Scalability)
  • 高性能(High Performance)

原则

  • 尽量避免分布式,此为分布式第一原则
  • 避免分布式事务

系统异构

  • 架构与语言无关
  • 系统可以多个平台并存(分层,模块化)

数据库

数据库读写分离

  • 直接在程序中实现,或封装为ORM
  • MySQL Proxy

数据库纵横切分

水平切分

  • 根据自定义策略,如hash(N)%n(按hash分),查找表
  • 在水平分库时,应优先考虑从属关系,以降低查询的复杂度。如用户A和用户A所发表的文章应分在同一数据库中。
  • 如有用到user_id,则应该在公共库中创建一个路由表,表字段主要有:user_id,user_name,DB_Name。如没有用到user_id,而是根据user_name判断及查询用户的关系,则可省略路由表,根据某种算法进行DB定位,此时应考虑以后增加节点时,DB定位是否会发生变化的情况。
  • 为避免分表时自增id发生重复的情况,可选择以下的几个方法:

    1.在公共库创建一个空表,专门用于id分发。

    2.利用递增值,如DB1的递增值为2,DB2的递增值为3,DB3的递增值为5…

    3.利用初始值,id长度一般为11位,每个DB取9位(最多100个DB),如DB1的起始值为100000000,DB2的起始值为200000000,DB3的起始值为300000000…

– 在系统设计时就考虑数据库切分的话,应先在一台服务器创建多个数据库节点,当负载达到一定程度时,再将节点迁移至其他服务器上,这样可以减少数据迁移的工作量。每次增加数据库节点,原则上应为已有节点的倍数,而不是一台台的增加。

垂直切分

  • 按功能分(论坛,博客)

表分区

非关系数据库(NoSQL)

高性能

  • Redis
  • Memcached
  • 海量存储

  • MongoDB

负载均衡

DNS负载均衡

反向代理负载均衡

负载均衡软件

  • nginx
  • HAProxy
  • apache httpd
  • LVS(网络第四层工作)
  • F5(硬件,四层/七层)

高可用性

  • 使用双机热备
  • 故障时切换至备份机
  • 工具(Linux-HA)
  • heartbeat

缓存

按功能分

  • 数据缓存
  • 页面缓存
  • 页面片段缓存
  • 静态化
  • 浏览器缓存

按存储介质分

  • 本地缓存
  • 分布式缓存

    memcached

反向代理缓存

  • squid 巨无霸
  • Varnish

静态资源分离

img,js,css使用单独的服务器处理请求

  • 图片服务器的域名不同
  • 多台机器保存相同的图片(img3,img2子域名)
  • 同一页面不同图片随机生成不同的子域名进行负载均衡

FAQ

A.一些大网站,图片服务器为什么都用另外一个域名? 比如yahoo.com 图片服务器用了yimg.com 的域名?

1.因为IE等浏览器对单一域名有并发限制

2.避免COOKIE 的影响,如taobao.com 域下的Cookie 信息不会被带到 taobaoimg.com 域下,提高了图片服务器解析 header 头的速度。

CDN

浏览器优化

  • 节省带宽:js,css的静态gzip压缩

    http header: Content-Encoding: gzip

  • 浏览器缓存

    http header: Etag,Last-Modified

  • 小图片,css,js压缩,合并(JSA)

分布式Session

  • 单点认证(SSO)
  • session memcached
  • db

分布式文件系统

  • MogileFS
  • FastDFS