特别篇第3课 缓存系统——squid、varnish
当Web 应用程序负载的逐渐增大,系统容量不足时,增加应用程序服务器和数据库服务器当然可以应对,但使用HTTP加速器在HTTP 层增加缓存处理,就能以低成本实现不错的效果。
代理服务器可以缓存请求的响应内容,下次对于同样的请求就可以直接返回缓存的内容。这样无需消耗带宽或服务器资源,就能快速处理请求。
Web 应用程序达到一定规模后,有效利用反向代理作为缓存服务器,就能控制资源消耗,处理大量请求。特别是对于更新频率较低的动态页面非常有效。
squid
反向代理转发给应用程序服务器的部分请求可以被缓存服务器处理,提高系统整体性能。
加入缓存服务器,无论在平时请求量比较稳定时,还是访问集中于部分内容时都有较好的效果。
平时, 一定比例的请求可以由缓存返回,这样就能减少发送到应用程序服务器的请求数量,抑制应用程序服务器数量的增加,甚至可以减少应用程序服务器数量。假设每分钟产生100 个请求,其中50% 的请求由缓存服务器返回,那么发给应用程序服务器的请求就能减半。通常,缓存服务器处理一个请求所需的服务器资源要比应用程序服务器少,因此可以节约系统整体的资源消耗量。
另一方面,访问量集中时,缓存服务器可以防止请求量超过系统整体容量。缓存服务器可以将访问集中的内容进行缓存。访问集中时,大多数会集中到特定的内容上,因此可以有效地缓存。
两层结构的缓存服务器一一用CARP 扩展
上层Squid 代理接收请求,但自己并不保持缓存,而是将请求转发给下层Squid 服务器。此时用CARP ( Cache Array Routing Protocol,缓存阵列路由协议)协议,以URL 为key ,转发至适当的Squid 缓存服务器。
用URL 为key 选择下层代理服务器,特定URL 就只能使用特定缓存服务器。这样,即使缓存服务器增加,也能有效地进行缓存。此外,即使缓存对象的URL 数量增加,只需增加下层代理服务器的数量,即可毫无障碍地扩展。
进一步,用Squid 实现CARP ,还能监视下层缓存服务器的活动,即使有的服务器失去响应,也可以让其他缓存服务器进行处理, 尽管缓存命中率稍稍下降, 但可以维持整体的正常运转。
Varnish
与Squid 那种大众化工具不同,它有几个不足。特别是要注意以下三点:
·对象(默认)通过mmap保存在磁盘上的文件中。而且,进程重启后缓存全部丢失:
· 基本配置(监昕端口号等)通过命令行参数指定,代理规则通过配置文件(VCL) 指定:
·自身不能将日志写入文件,而是放在共享内存中。
最值得注意的就是第一点: 也重启之后缓存全部丢失。Squid将对象保存到文件中,这样就不会丢失缓存,但Squid 服务器的I/O 负载就会很高,而缓存命中率不会有明显的下降。
但是,Vamish 缓存的内容会全部丢失,重启之后缓存命中率变成0,因此所有请求都会转发到Varnish 背后的应用程序服务器上。因
此,它可能会对系统的其他部分造成不可预知的影响,重启和上线应当比Squid 更谨慎。为避免这种不良影响, Vamish 最少应当部署3 台,使得一台重启不会对整体缓存命中率造成太大影响。
特别篇第4课 计算集群——hadoop
运营大规模Web 服务,会产生大量日志数据。大量日志数据哪怕是全部读取一遍都很困难,要想进一步进行统计处理和分析,就需要海量计算资源。例如, Hatena Diary 的访问日志每天有4GB ,要想处理一个月的日志,就要处理120GB 。假设要计算当月的独立用户数,就要全部读取这些日志,设硬盘读取性能平均为50Mbps ,那么单单读取这些日志就要花费5 个多小时。我们需要使用计算集群进行快速并行处理。
MapReduce 计算模型(注意这是一个数学模型)
Hatena 的计算集群采用了名为Hadoop 的MapReduce 开源实现。MapReduce 的目的为快速并行处理大量数据,其计算系统包括由多个计算节点组成的集群,以及分散存储大量数据的分布式存储系统。
MapReduce 计算模型的输入数据为key 和value 对,输出为值的列表。计算基本上可分为Map 步骤和Reduce 步骤。
在Map 步骤中,首先master node 对输入数据进行分割,并分发到各个节点。各个节点对分割后的输入数据进行计算,并输出计算结果,为key 和value 对构成的中间数据。Map 步骤如下所示:
(k1, v1) →list(k2 , v2)
Reduce 步骤首先按照key (k2 )对Map 步骤的输出数据进行汇总,生成key (k2 )与key 对应的value 列表(list(v2) ) 。然后将各个key 分发至各个节点。这个过程称为shuffle 阶段。然后,各个节点以key (k2)和key 对应的value 列表 (list(v2))为输入数据进行处理,得到最终的输出数据——value 列表(list(v3))。Reduce 步骤可以表述如下:
(k2,list (v2) ) → (k2 , list (v3) )
最后汇总各个节点的value 列表(list(v3)) ,计算结束。
Hadoop
Hatena 使用的Hadoop 是Apache 的一个项目, 是MapReduce的一个开源实现。