你的位置:首页 > ASP.net教程

[ASP.net教程]《大型网站技术架构》笔记


最近又把《大型网站技术架构》看了一遍.而中间读了一本《计算机操作系统》的教材后,感觉对大型网站的技术架构有更深的了解。在此结合对这两本书的理解做一些笔记

传统的OS(Operator System)有四个基本的功能:

  1. 处理机管理:以进程为基本单位,对其创建和撤销

a)         进程控制

b)         进程同步

c)         进程通信

d)         调度

  1. 存储器管理

a)         内存分配

b)         内存保护

c)         地址映射

d)         内存扩充

  1. 设备管理:完成I/O请求.提高CPU和I/O设备的利用率,提高I/O速度.方便用户使用I/O设备

a)         缓冲管理

  1.                          i.              如果在I/O和CPU之间引入缓冲区,则可有效的缓和它俩速度不匹配的矛盾,提高CPU的吞吐量,进而提高系统的吞吐量

b)         设备分配

c)         设备处理:设备处理器又被成为设备驱动程序

  1. 文件管理

a)         文件存储空间的管理

b)         目录管理

c)         文件的读/写管理和保护

 

架构的演变过程

一、起初的网站直接用LAMP(Linux+Apache+MySQL+PHP)部署在一台服务器上

这样会造成:

  1. 用户所有的请求都由这台服务器的多线程处理
  2. 所有的内存都在此服务器上(内存的获取速度比磁盘读取快N倍.最好把经常需要读取的数据放在内存中)
  3. 请求的处理(数据的处理:mysql中的数据都是通过磁盘存取的,这时候务必会涉及I/O处理)
  4. 用户上传的所有文件都在此服务器上

综上所述:

  1. 这台服务器必须要有足够多的CPU处理器来同事处理用户的请求
  2. 必须有足够大的内存存储空间
  3. 磁盘存取的速度必须够快(例如固态硬盘)
  4. 硬盘必须足够大来存储文件

 除此之外,还有一些其他的问题.例如网络宽带等

如我的博客服务器上行100k/s ,10个人就没人10K,2M的图片就得20秒,如果100人的话..

综上所述,需对单一服务器进行分开部署:

  1. 请求服务器(多处理器.专门处理用户的请求)
  2. 缓存服务器(内存足够大.用于存储经常访问的数据.如用redis)
  3. 数据库服务器(采用固态硬盘)
  4. 文件服务器(足够大的硬盘空间)

通过分开部署.每台服务器都发挥自己的特长,大大提高了效率

 

 而衡量一个网站的优越性,经常会考虑到一下五点

  1. 高性能

a)         加载页面时,将静态文件部署到CDN第三方供应商服务器.以减少向服务器请求资源.

b)         使用缓存.命中资源便立即返回,减少数据库读取操作(磁盘读取数据的速度比缓存慢N倍)

c)         采用分布式.不同业务采用单独的服务器分开(避免请求集中化)

d)         进行分布式集群.通过负载均衡算法把请求分发到集群服务器中的某台(一般用nginx反向代理服务器进行集群)

e)         分布式缓存.让所有的缓存集中在这些专门做缓存的服务器(如redis)

f)          将数据库的读写分离.(后期业务做大还有分库的可能)

g)         采用消息队列(也就是异步)把次要的事件加到消息队列不用等待返回结果立即响应用户.最典型的例子就是12306的订单邮件提醒,一般买到票后好一段时间后才收到.这就是把邮箱提醒功能加到消息队列中

  1. 可用性

a)         对于用户而言,网站7*24小时可用不间断.这个是理想状态,一般来说4个9(99.99%)就差不多了

b)         任意一台服务器的宕机都不会造成网站不可用.并且集群服务器之间有互相备份的功能,任何一台服务器宕机后不会影响应用的整体可用或者导致数据丢失

  1. 可拓展性

a)         当增加功能时只是增加开放接口,而不会对原有的功能产生影响,达到松耦合的效果

b)         增值性业务的拓展.也是不会影响到其他业务

c)         网站可收缩性的主要手段是事件驱动架构和分布式服务

  1. 可伸缩性

a)         向集群中增加或减少服务器的时候可以平滑过渡.用户的请求依然可以高命中.

所以缓存路由算法非常重要(一般来说会用nginx负载均衡.的用轮询算法.像哈希求余等效果不好)

  1. 安全性

a)         能够防御XSS攻击

b)         脚本注入的方式

c)         发无效的源地址tcp包