web/服务器知识

一 PV 推到出 QPS

你想建设一个能承受500万PV/天天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?若是计算呢??前端

PV是什么:PV是page view的简写。PV是指页面的访问次数,每打开或刷新一次页面,就算作一个pv。 
计算模型: 
每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60秒*40%)) / 服务器数量 。
其中关键的参数是80%、40%。表示一天中有80%的请求发生在一天的40%的时间内。24小时的40%是9.6小时,有80%的请求发生一天的9.6个小时当中(很适合互联网的应用,白天请求多,晚上请求少)。 
简单计算的结果:
((80%*500万)/(24小时*60分*60秒*40%))/1 = 115.7个请求/秒 linux

((80%*100万)/(24小时*60分*60秒*40%))/1 = 23.1个请求/秒 程序员

(2)初步结论: web

如今咱们在作压力测试时,就有了标准,若是你的服务器一秒能处理115.7个请求,就能够承受500万PV/天天。若是你的服务器一秒能处理23.1个请求,就能够承受100万PV/天天。
留足余量:
以上请求数量是均匀的分布在白天的9.6个小时中,但实际状况并不会这么均匀的分布,会有高峰有低谷。为了应对高峰时段,应该留一些余地,最少也要x2倍,x3倍也不为过。
115.7个请求/秒?*2倍=231.4个请求/秒
115.7个请求/秒?*3倍=347.1个请求/秒
23.1个请求/秒?*2倍=46.2个请求/秒
23.1个请求/秒?*3倍=69.3个请求/秒
(3)最终结论:
若是你的服务器一秒能处理231.4--347.1个请求/秒,就能够应对平均500万PV/天天。
若是你的服务器一秒能处理46.2--69.3个请求,就能够应对平均100万PV/天天。算法

这里所谓的每秒N个请求,就是QPS数据库

(4)实际经验:编程

一、根据实际经验,采用两台常规配置的机架式服务器,配置是很常见的配置,例如一个4核CPU+4G内存+服务器SAS硬盘。
二、我的武断的认为在服务器CPU领域Intel的CPU要优于AMD的CPU,有反对的就反对吧,我都说我武断了(请看CPU性能比较),不要太相信AMD的广告,比较CPU性能简单办法就是比价格,不要比频率与核心数,价格相差很少的性能也相差很少。
三、硬盘的性能很重要,尤为是数据库服务器。通常的服务器都配1.5万转的SAS硬盘,高级一点的能够配SSD固态硬盘,性能会更好。最最最最重要的指标是“随机读写性能”而不是“顺序读写性能”。(本例仍是配置最多见的1.5万转的SAS硬盘吧)
四、一台服务器跑Tomcat运行j2ee程序,一台服务器跑MySql数据库,程序写的中等水平(这个真的很差量化),是论坛类型的应用(总有回帖,不太容易作缓存,也没法静态化)。
五、以上软硬件状况下,是能够承受100万PV/天天的。(已留有余量应对忽然的访问高峰)
注意机房的网络带宽:
有人说以上条件我都知足了,但实际性能仍是达不到目标。这时请注意你对外的网络的带宽,在国内服务器便宜但带宽很贵,极可能你在机房是与你们共享一条100M的光纤,实际每一个人可分到2M左右带宽。再好一点5M,再好一点双线机房10M独享,这已经很贵了(北京价格)。
一天总流量:每一个页面20k字节*100万个页面/1024=19531M字节=19G字节,
19531M/9.6小时=2034M/小时=578K字节/s。若是请求是均匀分布的,须要5M(640K字节)带宽(5Mb=640KB 注意大小写,b是位,B是字节,差了8倍),但全部请求不多是均匀分布的,当有高峰时5M带宽必定不够,X2倍就是10M带宽。10M带宽基本能够知足要求。以上是假设每一个页面20k字节,基本不包含图片,要是包含图片就更大了,10M带宽也不能知足要求了后端

 

Throughput(吞吐量):按照常规理解网络吞吐量表示在单位时间内经过网卡数据量之和,其中即包括本机网卡发送出去的数据量也包括本机网卡接收到的数据量。 一个100Mb(位)的双工网卡,最大发送数据的速度是12.5M字节/s, 最大接收数据的速度是12.5M字节/s, 能够同时收发数据。 
并发用户数                             是同时执行操做的用户(线程数) 
响应时间                                从请求发出到收到响应花费的时间
QPS(Queries Per Second)        每秒处理的查询数(若是是数据库,就至关于读取)
TPS(Transactions Per Second) 每秒处理的事务数(若是是数据库,就至关于写入、修改)
IOPS                                     每秒磁盘进行的I/O操做次数

浏览器

 

二  ip地址分类和网络区分

IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段缓存

简单来讲在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段。

每一个IP地址都包含两部分,即网络号和主机号。 
InterNIC将IP地址分为五类:
A类保留给ZF或大型企业,
B类分配给中等规模的公司,
C类分配给小公司或我的,
D类用于组播,
E类用于实验,
注:各种可容纳的地址数目不一样。 

A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,
A类地址的第一位老是O,如,10.0.0.1==00001010-00000000-00000000-00000001
==》1.0.0.0-127.255.255.255,默认子网掩码为255.0.0.0,最多可容纳16777215台计算机
B类地址的前两位老是10,如,172.16.0.1==10101100-00010000-00000000-00000001
==》128.0.0.0-191.255.255.255,默认子网掩码为255.255.0.0,最多可容纳65535台计算机
C类地址的前三位老是110。如,192.168.0.1==11000000-10101000-00000000-00000001
==》192.0.0.0-223.255.255.255,默认子网掩码是255.255.255.0,最多可容纳254台计算机

IP地址中保留地址:主机部分全为0的IP地址保留用于网络地址,主机部分全为1的IP地址保留为广播地址,224--255部分保留做为组播和实 验目的。 同时注意IP地址分配时不能使用最末位为0和255的地址,由于这是广播地址,普通计算机上不能使用,但可用于网关和路由器上。

专用IP地址: 就是咱们在3类地址中常见到内网的IP段。

10.0.0.0--10.255.255.255
172.16.0.0--172.31.255.255 
192.168.0.0--192.168.255.255 
 

内网的计算机以NAT(网络地址转换)协议,经过一个公共的网关访问Internet。内网的计算机可向Internet上的其余计算机发送链接请求,但Internet上其余的计算机没法向内网的计算机发送链接请求。

主机地址种类

概述

  经过IP地址的引导位(最高位)来区分不一样类别的IP地址: 

  注:n为网络编号位,h为主机编号位 

A类地址

  A类地址:0nnnnnnn.hhhhhhhh.hhhhhhhh.hhhhhhhh 

  A类地址具备7位网络编号,所以可定义126个A类网络{2^7-2(网络编号不能是全0或全1 注1)-1(127为环回地址 注2)}每一个网络能够拥有的主机数为16777214{2^24-2(主机位不能是全0或全1)}

  十进制表示范围:1.0.0.1-126.255.255.254,任何一个0到127间的网络地址均是一个A类地址。 

B类地址

  B类地址:10nnnnnn.nnnnnnnn.hhhhhhhh.hhhhhhhh 

  B类地址具备14位网络编号,所以可定义16382个B类网络{2^14-2} 

  每一个网络能够拥有的主机数为65534{2^16-2} 

  十进制表示范围:129.0.0.1-191.255.255.254,任何一个128到191间的网络地址是一个B类地址。 

C类地址

  C类地址:110nnnnn.nnnnnnnn.nnnnnnnn.hhhhhhhh 

  C类地址具备21位网络编号,所以可定义2097152个C类地址{2^21-2} 

  每一个网络能够拥有的主机数为254{2^8-2} 

  十进制表示范围:192.0.0.1-223.255.255.254,任何一个192到223间的网络地址是一个C类地址。 

D类地址

  D类地址:1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 

  D类地址用于组播,前面4位1110引导,后面28位为组播地址ID。 

  十进制表示范围:224.0.0.0-239.255.255.255 

E类地址

  E类地址:老是以1111四位引导 

  E类地址用于研究用 

  十进制表示范围:240- 

  IP地址由InterNIC(因特网信息中心)统一分配,以保证IP地址的惟一性,但有一类IP地址是不用申请可直接用于企业内部网的,这就是 Private Address,Private Address不会被INTERNET上的任何路由器转发,欲接入INTERNET必需要经过NAT/PAT转换,以公有IP的形式接入。

  这些私为地址为: 

  10.0.0.0-10.255.255.255(一个A类地址) 

  172.16.0.0-172.31.255.255(16个B类地址) 

  192.168.0.0-192.168.255.255(256个C类地址) 

  任何一个第一个八位组在224到239间的网络地址是一个组播地址 

  任何一个专用I P网络都可以使用包括: 

  1个A类地址( 10.0.0.0 )、 

  16个B类地址(从172.16.0.0到172.31.0.0 ) 

  256个C类地址(从192.168.0.0到192.168.255.0 ) 

 

 
 

三 观察者模式对于消息的推和拉的处理

观察者模式,指的是定义一种对象间的一对多的关系,当一个对象的状态发生变化的时候,全部依赖于它的对象都将获得通知并更新本身。

“推”的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新消息主动推送到各个Observer去。

“拉”的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间去Subject获取相应的更新数据。

 

“推”的好处包括:

一、高效。若是没有更新发生,不会有任何更新消息推送的动做,即每次消息推送都发生在确确实实的更新事件以后,都是有意义的。

二、实时。事件发生后的第一时间便可触发通知操做。

三、能够由Subject确立通知的时间,能够避开一些繁忙时间。

四、能够表达出不一样事件发生的前后顺序。

 

“拉”的好处包括:

一、若是观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到Observer去完成。

二、Observer能够不理会它不关心的变动事件,只须要去获取本身感兴趣的事件便可。

三、Observer能够自行决定获取更新事件的时间。

四、拉的形式可让Subject更好地控制各个Observer每次查询更新的访问权限。

 

----------------------------------------------------------------------------------------------------------------------------------

补充:

事实上“推”和“拉”能够比较的内容太多了,好比:

客户端一般是不稳定的,服务端是稳定的,若是消息由客户端主动发起去获取,它很容易找到服务端的地址,能够比较容易地作到权限控制(集中在服务端一处),服务端也能够比较容易地跟踪客户端的位置和状态,反之则不行;

互联网页面的访问就是一个最好的“拉”的模式的例子;

一般咱们但愿把压力分散到各个客户端上去,服务端只作最核心的事情,只提供内容,无论理分发列表;

……

还有一个idea是关于“推”和“拉”结合的形式,例如,服务端只负责通知某一些数据已经准备好,至因而否须要获取和何时客户端来获取这些数据,彻底由客户端自行肯定。

 

 

 

四 虚拟内存(linux的swap)

 1 技术介绍

虚拟 内存计算机系统 内存管理的一种技术。它使得 应用程序认为它拥有连续的可用的 内存(一个连续完整的 地址空间),而实际上,它一般是被分隔成多个 物理内存碎片,还有部分暂时存储在外部 磁盘存储器上,在须要时进行 数据交换。目前,大多数操做系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。
Windows 8/8.1 操做系统如出现开机时卡在Windows徽标页面,没法进入系统,必须强制关机再重启才能打开时,可适当调整虚拟内存设置解决。
 
虚拟内存别称 虚拟存储器(Virtual Memory)。 电脑中所运行的
程序均需经由 内存执行,若执行的程序占用内存很大或不少,则会致使内存消耗殆尽。为解决该问题, Windows中运用了虚拟 内存[2]   技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操做所需的 随机存储器( RAM)不足时,则 Windows 会用 虚拟存储器进行补偿。它将计算机的 RAM硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“ 分页文件”的空间中。将数据移入 分页文件可释放RAM,以便完成工做。 通常而言,计算机的RAM 容量越大,程序运行得越快。若计算机的速率因为RAM可用空间匮乏而减缓,则可尝试经过增长虚拟内存来进行补偿。可是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,于是扩增RAM 容量(可加 内存条)是最佳选择。
虚拟内存是Windows 为做为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是 PageFile.Sys,一般状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。
[2]   内存在计算机中的做用很大,电脑中全部运行的程序都须要通过内存来执行,若是执行的程序很大或不少,就会致使内存消耗殆尽。为了解决这个问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为 虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。
 

2 工做原理

虚拟存储器是由硬件和操做系统自动实现存储信息调度和管理的。它的工做过程包括6个步骤:
中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a做为索引,查地址变换表,以肯定该组信息是否存放在主存内。
②如该组号已在 主存内,则转而执行④;若是该组号不在主存内,则检查主存中是否有空闲区,若是没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
③从辅存读出所要的组,并送到主存空闲区,而后将那个空闲的物理组号a和逻辑组号a登陆在地址变换表中。
④从地址变换表读出与逻辑组号a对应的物理组号a。
⑤从物理组号a和组内字节地址b获得物理地址。
⑥根据物理地址从主存中存取必要的信息。
调度方式有分页式、段式、段页式3种。页式调度是将逻辑和物理地址空间都分红固定大小的页。主存按页顺序编号,而每一个独立编址的程序空间有本身的页号顺序,经过调度辅存中程序的各页能够离散装入主存中不一样的页面位置,并可据表一一对应检索。页式调度的优势是页内零头小,页表对程序员来讲是透明的,地址变换快,调入操做简单;缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,而且容许伸长,它的优势是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操做复杂。将这两种方法结合起来便构成段页式调度。在段页式调度中把物理空间分红页,程序按模块分段,每一个段再分红与物理空间页一样小的页面。段页式调度综合了段式和页式的优势。其缺点是增长了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度。
 

3 虚实地址

实地址与虚地址
[3]   用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。程序进行虚地址到实地址转换的过程称为程序的再定位。
虚存的访问过程
虚存空间的用户程序按照虚地址编程并存放在辅存中。程序运行时,由地址变换机构依据当时分配给该程序的实地址空间把程序的一部分调入实存。每次访存时,首先判断该虚地址所对应的部分是否在实存中:若是是,则进行地址转换并用实地址访问主存;不然,按照某种算法将辅存中的部分程序调度进内存,再按一样的方法访问主存。因而可知,每一个程序的虚地址空间能够远大于实地址空间,也能够远小于实地址空间。前一种状况以提升存储容量为目的,后一种状况则以地址变换为目的。后者一般出如今多用户或多任务系统中:实存空间较大,而单个任务并不须要很大的 地址空间,较小的虚存空间则能够缩短 指令地址字段的长度。
 
 

五 http和https

1 引言

http: 超文本传输协议http协议被用于在web浏览器和网站服务器之间传递信息,http协议以明文方式发送内容,不提供任何方式的数据加密,若是攻击者截取了web浏览器和网站服务器之间的 传输报文,就能够读懂其中的信息。所以http协议不适合传输一些银行卡号,密码等敏感信息

https: https是以安全为目标的http通道,简单来讲就是http的安全版,即http下加入ssl(secure sockets layer)层,https的安全基础是ssl。https协议的主要做用能够分为两种: 一种是创建一个信息安全通道,来保证数据传输的安全; 另外一种就是确认网站的真实性.

 

2 http和https的区别

1 https协议须要到ca申请证书,通常免费证书较少,所以须要必定费用

2 http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议

3 http和https使用的是彻底不一样的链接方式,用的端口不同,前者是80,后者是443

4 http的链接很简单,是无状态的; https协议是由ssl + http协议构建的可进行加密传输,身份认证的网络协议,比http协议安全

 

3 通讯过程

客户端在使用HTTPS方式与Web服务器通讯时有如下几个步骤,如图所示。

  (1)客户使用https的URL访问Web服务器,要求与Web服务器创建SSL链接。

  (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  (3)客户端的浏览器与Web服务器开始协商SSL链接的安全等级,也就是信息加密的等级。

  (4)客户端的浏览器根据双方赞成的安全等级,创建会话密钥,而后利用网站的公钥将会话密钥加密,并传送给网站。

  (5)Web服务器利用本身的私钥解密出会话密钥。

  (6)Web服务器利用会话密钥加密与客户端之间的通讯。

 

4 https的优缺点

优势:

(1) 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器

(2) HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程当中不被窃取、改变,确保数据的完整性。它是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增长了中间人攻击的成本。

缺点:

(1) https协议握手阶段比较费时,会使页面的加载时间延长近50%。

(2) https链接缓存不如http高效,会增长数据开销和功耗,甚至已有的安全措施也会所以受到影响

(3) ssl证书须要钱,功能越强大费用越高,我的网站小型网站不必用

(4) 加密范围比较有限,在黑客攻击,拒绝服务攻击,服务器劫持等方面起不到什么做用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家能够控制CA根证书的状况下,中间人攻击同样可行。

 

 

 

 

六 网络链接的创建过程

当咱们在浏览器输入网址并回车后,一切从这里开始

1 DNS域名解析

将域名解析成对应的服务器ip地址这项工做,是由DNS服务器完成的

客户端收到你输入的域名地址后,它首先去找本地的hosts文件,检查在该文件中是否有相应的域名,ip对应关系。若是有,则向其IP地址发送请求,若没有,再去找DNS服务器。通常用户不多去编辑修改hosts文件

DNS服务器层次结构

浏览器客户端向本地DNS服务器发送一个含有域名www.cnblogs.com的DNS查询报文。本地DNS服务器把查询报文转发到根DNS服务器,根DNS服务器注意到其com后缀,因而向本地DNS服务器返回comDNS服务器的IP地址。本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其www.cnblogs.com后缀并用负责该域名的权威DNS服务器的IP地址做为回应。最后,本地DNS服务器将含有www.cnblogs.com的IP地址的响应报文发送给客户端。

从客户端到本地服务器属于递归查询,而DNS服务器之间的交互属于迭代查询。

正常状况下,本地DNS服务器的缓存中已有comDNS服务器的地址,所以请求根域名服务器这一步不是必需的。

 

 

2 创建TCP链接

费了一顿周折终于拿到服务器IP了,下一步天然就是连接到该服务器。对于客户端与服务器的TCP连接,必然要说的就是『三次握手』。

三次握手

客户端发送一个带有SYN标志的数据包给服务端,服务端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息,最后客户端再回传一个带ACK标志的数据包,表明握手结束,链接成功。

上图也能够这么理解:

客户端:“你好,在家不,有你快递。”

服务端:“在的,送来就行。”

客户端:“好嘞。”

 

 

 

3 发送http请求

与服务器创建了链接后,就能够向服务器发起请求了。这里咱们先看下请求报文的结构(以下图):

请求报文

在浏览器中查看报文首部(以google浏览器为例):

请求行包括请求方法、URI、HTTP版本。首部字段传递重要信息,包括请求首部字段、通用首部字段和实体首部字段。咱们能够从报文中看到发出的请求的具体信息。具体每一个首部字段的做用,这里不作过多阐述。

 

4 服务器处理请求

服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了须要调度哪些资源文件,再经过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果经过web服务器返回给浏览器客户端。

服务器处理请求

 

 

5 返回响应结果

在HTTP里,有请求就会有响应,哪怕是错误信息。这里咱们一样看下响应报文的组成结构:

响应报文

在响应结果中都会有个一个HTTP状态码,好比咱们熟知的200、30一、40四、500等。经过这个状态码咱们能够知道服务器端的处理是否正常,并能了解具体的错误。

状态码由3位数字和缘由短语组成。根据首位数字,状态码能够分为五类:

 

6 关闭TCP链接

为了不服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方均可以发起关闭请求。与建立TCP链接的3次握手相似,关闭TCP链接,须要4次握手。

4次握手

上图能够这么理解:

客户端:“兄弟,我这边没数据要传了,咱关闭链接吧。”

服务端:“收到,我看看我这边有木有数据了。”

服务端:“兄弟,我这边也没数据要传你了,咱能够关闭链接了。”

客户端:“好嘞。”

 

 

7 浏览器解析HTML

准确地说,浏览器须要加载解析的不只仅是HTML,还包括CSS、JS。以及还要加载图片、视频等其余媒体资源。

 

浏览器经过解析HTML,生成DOM树,解析CSS,生成CSS规则树,而后经过DOM树和CSS规则树生成渲染树。渲染树与DOM树不一样,渲染树中并无head、display为none等没必要显示的节点。

要注意的是,浏览器的解析过程并不是是串连进行的,好比在解析CSS的同时,能够继续加载解析HTML,但在解析执行JS脚本时,会中止解析后续HTML,这就会出现阻塞问题,关于JS阻塞相关问题,这里不过多阐述。

 

8 浏览器布局渲染

根据渲染树布局,计算CSS样式,即每一个节点在页面中的大小和位置等几何信息。HTML默认是流式布局的,CSS和js会打破这种布局,改变DOM的外观样式以及大小和位置。这时就要提到两个重要概念:replaint和reflow。

replaint:屏幕的一部分重画,不影响总体布局,好比某个CSS的背景色变了,但元素的几何尺寸和位置不变。

reflow: 意味着元件的几何尺寸变了,咱们须要从新验证并计算渲染树。是渲染树的一部分或所有发生了变化。这就是Reflow,或是Layout

因此咱们应该尽可能减小reflow和replaint,我想这也是为何如今不多有用table布局的缘由之一。

最后浏览器绘制各个节点,将页面展现给用户。

 

 

 

七 网盘给每一个人免费2TB存储空间背后的原理

前段时间在使用百度网盘时,忽然发现百度网盘能够免费领取 2TB 空间啦!

网络硬盘你们可能都或多或少的接触过,不得不说在万物皆云的时代里,这是一种很是好的网络工具,而对咱们这种穷到掉渣的免费用户来讲,硬盘空间简直就是硬伤,刚开始使用的时候真是为了空间,各类折腾(作他那里所谓的任务),到头来也才扩充了5G左右。如今好了,随随便便、轻轻松松就有了2T的空间。

而这突如其来的2T空间是如何实现的呢?

事实是这样滴!

假如我想要为每一个用户提供 1G 的网络存储空间。

若是服务器上有一颗 1000G 的硬盘能够所有为用户提供数据储存,若是每一个用户分配 1G 的最大储存空间,那么能分配给多少个用户使用呢?

你必定说是 1000/1=1000 个用户。

可是事实上你这么分配了,你会发现每一个用户平时根本不会上传 1G 的东西将容量占的满满的,有多有少,但平均用户平时只上传 50M 的文件,也就是说,若是你将 1000G 的硬盘分给 1000我的使用,但只有效利用了其中的 50M*1000=50G 的空间,剩余 950G 的空间基本都彻底浪费了。

那么怎么解决呢?

你能够变通一下,将这 1000G 的空间分配给 20000个用户使用,每一个人的上传上限容量仍是1G,但每人平时仍是平均上传 50M 的数据,那么 20000*50M=1000G,这下子就把宝贵的服务器上的存储空间充分利用了。但你又怕这样分配给 20000我的后,万一某一刻人们忽然多上传点数据,那么用户不是就觉察出来你分给人家的 1G 空间是假的了吗?因此能够不分配那么多人,只分配给 19000 人,剩下一些空间作应急之用。

忽然发现一会儿将可分配的用户数量翻了 19倍啊,了不得。那还有没有办法更加有效的利用一下呢?

若是我有 1000个 以上的服务器,一个服务器上有 1000G 空间,那么咱们每一个服务器上都要留下 50G 的空白空间以备用户忽然上传大数据时致使数据塞满的状况,那么我这 1000个服务器上就空出了 1000台*50G=50000G 的空间被浪费了,多么惋惜。因此攻城狮们发明了存储集群,使得一个用户的数据能够被分配在多个服务器上存储,但在用户那看起来只是一个 1G 的连续空间,那么就不必在每一个服务器上预留出应急的空间了,甚至能够充分的将前一个服务器塞满后,在将数据往下一个服务器中塞。这样保证了服务器空间的 最大利用,若是某一刻管理员发现用户都在疯狂上传数据(在一个大规模用户群下,这样的几率少之又少)致使我现有提供的空间不够了,不要紧,只须要随手加几块硬盘或者服务器就解决了。

好吧,这下子咱们的服务器空间利用高多了,能够将必定量的空间分配给最多的用户使用了。但有没有更好的改进方案呢?

管理员有一天发现,即便每一个用户平均下来只存储 50M 的东西,但这 50M 也不是一蹴而就的,是随着1-2年的使用慢慢的达到这个数量的,也就是说,一个新的用户刚刚注册个人网络空间时,不会上传东西,或者只上传一点很是小的东西。那么我为每个用户都初始分配了 50M 的空间,即便未来2年后他们会填满这 50M ,但这期间的这空间就有不少是浪费的啊。因此聪明的攻城狮说:既然咱们能够分布式、集群式存储,一个用户的数据能够分布在多个服务器上,那么咱们就假设一开始就给一个新注册的用户提供 0M 的空间,未来他用多少,我就给他提供多少存储空间,这样就完全的保证硬盘的利用了。但用户的前端仍是要显示 1G 的。

工程师的这个点子,使得我在创建网盘初期能用 1台 1000G 的服务器提供了大约 1000000 人来注册和使用,随着注册的人多了,我也有钱了,也能够不断增长服务器以提供他们后期的存储了。同时由于一部分服务器完成了一年多购买,个人购买成本也下来了。

那么…这就结束了吗?

如果邮箱提供商的话,这样的利用率够高了。但网盘就不同了。

聪明的工程师发现:不一样于邮箱,你们的内容和附件绝大多数都是自创的和不一样的。但网盘上你们上传的东西不少都是重复的。

好比:张三今天下载了一部《TOKYO HOT》上传到了本身的网盘上,李四在三天后也下载了如出一辙的《TOKYO HOT》上传到了网络硬盘上,随着用户的增多,你会发现总共有 1000我的上传了1000份如出一辙的文件到你宝贵的服务器空间上,因此工程师想出一个办法,既然是同样的文件,我就只存一份不久好啦,而后在用户的前端显示是没人都有一份不久行啦。当某些用户要删除这个文件的时候,我并不真的删除,只须要在前端显示彷佛删除了,但后端一直保留着以供其余拥有此文件的用户下载。直到全部使用此文件的用户都删除了这个文件我再真的将其删除吧。

这样子随着存储的数据愈来愈多,注册的用户愈来愈多,其上传的重复数据愈来愈多。你发现这样的检测重复文件存储的效率愈来愈大。这样算下来彷佛每一个人上传的不重复的文件只能平均 1M/用户。这下子你能够提供超过50倍的用户使用您这有限的空间了。

但伴随着使用,你又发现一个规律:

张三上传的《TOKYO HOT N0124》和李四上传的《TH n124》是同一个文件,只不过文件名不同,难道我就不能识别出他们是一个文件,而后只将其分别给不一样的用户保存成不一样的文件名不就行啦?确实可行,但这要利用一些识别文件相同性的算法,例如MD5值等。只要两个文件的 MD5 值同样,文件大小同样,我就认为它们是相同的文件,只须要保存一份文件并给不一样的用户记做不一样的文件名就行了。

有一天你发现,由于每个文件都须要计算 MD5 值,致使 CPU 负荷很大,并且原本同样的文件非要浪费带宽上传回来才能够检测一致性,能改进一下吗?

聪明的工程师写了个小软件或小插件,美其名曰“上传控件”,将计算 MD5 的工做利用这个软件交给了上传用户的电脑来完成,一旦计算出用户要上传的数据和服务器上已经存储的某个数据是同样的,就干脆不用上传了,直接在用户那里标记上这个文件已经按照 XX 文件名上传成功了。这个过程几乎是瞬间搞定了,并给其起了个高富帅的名字“秒传”!

经过以上这么多步骤,你发现原本你只能给 1000用户 提供网络空间的,这么多改进办法后,在用户端显示 1G 空间不变的状况下,近乎能够为 1000000个用户 提供网络空间了。

这样如果您哪天心情好,对外宣传说:我要将每一个用户的存储空间上限提高到 1TB。那么每一个用户平均仍是只上传 50M 数据,只有极个别的用户上传了突破 1G 原始空间的数据,你会发现所付出的成本近乎是微乎其微的。

辛勤的攻城狮还在为如何更有效率的利用服务器提供的磁盘空间在不屑努力和挖掘着……

相关文章
相关标签/搜索