网站、数据库的衍变之路(一)
最简单的一个网站,可能说是demo更加合适一些,部署上一台计算机上也可以正常运转。通常情况,这种部署方式是效率最高的。但是为什么说需要把web服务器与数据库分开放置呢?这就牵扯到通信效率的问题。
你写一个程序,无论是winform还是webform或者是windows service的,总会有两个对象需要交换数据吧?而数据交换大体上有这么几种方式:
1、通过内存;
2、通过硬盘;
3、通过网卡。
一、通过内存交换数据
图1.1
图1.1是两个类之间的数据交换,取款记录是“引用类型”,那么在“个人”使用的时候就是使用的原对象;而“余额”是值类型,会被拷贝过来使用。但是无论是值类型还是引用类型,这种在一个进程里的通信,都是通过内存进行数据交换的,这种也是速度最快的方式。像我家里的机器,内存的读写速度是6G/s左右。
上面说了进程内部的通信是通过内存来进行的(这里忽略非主流的开发出来的程序),而进程间通信也存在用内存交换数据的情况。比如,内存文件映射。再比如,匿名管道。(这里不详述这些技术。)
二、通过硬盘交换数据
图2.1
进程内也有这种数据交换方式,更多见的是在进程间交换数据时使用。在实现进程间通信时,内存文件映射、管道技术相对来说比读写硬盘上的文件稍微难理解一点,所以对速率要求不高的系统也有采用这种方式的。图2.1表现这种情况。现在的硬盘一般分为三种,IDE、SCSI和SATA(串口)。IDE硬盘的读写速度一般在10~100M/s之间,SCSI的最高速度320M/s左右,SATA有几个版本,1.0规范是150M/s,3.0规范是600M/s。可见硬盘的读写速度要比内存低好多,而且频繁读写硬盘另外一个坏处是硬盘相对内存来说容易坏。
三、通过网卡交换数据
图3.1
图3.1反映了通过网卡交换数据的情况。现在的网卡一般都是百兆千兆的,百兆网卡的实际传输速度大约是12m/s,千兆网卡的传输速度大约是100m/s。
言归正传,为什么要把web服务器与数据库分开放置呢?在单机上放置不是能达到最高效率么?一旦分开放置,即使使用千兆网卡,那么数据传输速度也是大打折扣啊!这就要讲一个规模问题,网站规模小,这样存放当然没有任何问题(这里单从性能上分析,不考虑其它因素)。但是一旦规模比较大的时候就容易出现问题,这是系统瓶颈上的一个考虑。访问量大的时候很可能发生数据库跟web服务器抢cpu,而更糟糕的是,当尝试使用缓存来解决数据库占用大量CPU时,发现内存也被数据库占完了。当web与数据库分离的时候,网站就成长的更像一个网站了。这个时期的网站需要花很多心思考虑性能问题,工作也更加有挑战性了。
可以当我们沾沾自喜的时候,麻烦的问题又来了,现在两台服务器,一台web一台数据库,性能又出现问题了。这个时期出现的问题相对来说还是比较简单的,因为就两个部分,不是数据库瓶颈就是web服务器瓶颈。当然,是数据库瓶颈的可能性更高一些。为什么这么说呢?一般来说,一个公司开发的网站是这种规模的时候,聘用的程序员都是刚入门不久的。而这个时期的程序员更加关心功能如何实现,对性能优化还没有很多经验。要是再去仔细研究数据库如何优化,如何让查询更有效率,学习改造成本还是相当高的。这个时候一般会采用避重就轻的办法——静态化。