【读书笔记】大规模Web开发技术(ch16 作业队列系统,存储选择,分布式)

时间:2021-02-17 21:50:54

第16章 特别篇 当前构建web服务需要的实践技术——应对大规模web服务须知
【读书笔记】大规模Web开发技术(ch16 作业队列系统,存储选择,分布式)
特别篇第1课 作业队列系统theschwartz、gearman
利用作业队列系统异步执行那些允许延迟的处理,可以改善用户体验。
【读书笔记】大规模Web开发技术(ch16 作业队列系统,存储选择,分布式)
TheSchwartz
TheSchwartz 的作业队列采用了MySQL 这种RDBMS 。用MySQL 管理作业队列,能保证非常高的可靠性和稳定性。多数异步处理都是必须确实执行的重要处理,因此高可靠性是很大的优势。当然,速度会有一定损失,因此TheSchwartz 中的作业的粒度稍大一些比较好。
Gearman
Geallnan 这个作业队列系统比TheScheartz 轻量一些。作业队列不用RDBMS ,而是采用自带的守护程序Cdaemon) 作业信息保存在内存中,以保证性能。其代价就是可靠性的损失,因此不适合需要保证完成的任务。
另外,客户端向Gearnlan 中放入作业时,可以有以下三种
模式:
·同步的顺序处理
.同步的并行处理
·异步的后台处理
TheSchwartz 仅支持异步的后台处理,相比之下,采用Gearman 能够更灵活地进行处理。特别是同步并行处理,可以将互不依赖的作业并行处理,可以大幅度压缩整体处理时间。

特别篇第2课 存储方式的选择rdbms还是key-value存储

访问模式中,以下六个参数是选择存储系统的重要判断依据:
·平均数据大小
·最大大小
·新数据增加频率
.更新频率
·删除频率
.访问频率

存储系统的种类:
·RDBMS: MySQL 、PostgreSQL 等
·分布式key-value 存储: memcached 、TokyoTyrant 等
·分布式文件系统: MogileFS 、GlusterFS 、Lustre
·其他存储系统: NFS 分布式文件系统、DRBD 、HDFSo

RDBMS
RDBMS (Relational Database Management System,关系型
数据库管理系统) 就是用表形式保存数据,并多数采用SQL 语言操作数据的系统。它能保存各种各样的数据,而且查询功能强大,是通用性最强的存储系统。

MySQL
MySQL 的架构,如图A.2 所示,其特点是解析并执行SQL的功能模块和实际保存数据的功能模块相互分离。后者称为存储引擎,已有各种各样的实现。因此,除了默认的存储引擎之外,选择第三方实现的存储引擎也比较简单。
主要的存储引擎有MyISAM 和InnoDB ,还有仍在开发的Maria 。

MylSAM
MyISAM 这个存储引擎的结构十分简单, 一个表在实际的文件系统中呈现为三个文件(定义、索引、数据)。对于未经update 、delete 的表也能快速进行insert 操作(插入操作)。而且,启动、停止也十分迅速,表移动、改变名称也可以从文件系统中直接进行,因此数据库的运维比较容易。
相反, MyISAM 也有很多缺点。一旦数据库进程异常停止,
就很可能损坏表。而且它不支持事务, update 、delete 、insert (追加数据之外〉会执行表锁定,在更新较多的应用中性能并不好等等。

InnoDB
InnoDB 是个与MyISAM 相对的存储引擎,它将数据保存在事先定义好的少数几个文件中,而且支持事务,拥有异常停止时的恢复功能,数据更新时执行行锁定等,有许多MyISAM 没有的优势。
但是它也有缺点。比如数据量较大时启动、停止需要几分钟,表操作也必须完全通过数据库执行等。
【读书笔记】大规模Web开发技术(ch16 作业队列系统,存储选择,分布式)

分布式key-value存储

key-value 存储是个成对保存key 和value 的简单存储系统,分布式key-value 存储就是在网络上应用key-value 存储,使之能够扩展到多台服务器上。与RDBMS 相比, key-value 存储的功能很弱,但性能会提升1 ~2 个数量级。

key-value 存储中最有名的实现就是memcached。memcached不使用文件系统,完全在内存中执行, 因此速度非常快, 在全世界得到了广泛应用,应用事例十分丰富。由于完全在内存中执行,一旦重启,数据就会全部丢失。

memcached

memcached 是个分布式key-value 存储,实现简单,其特点是分布式算法由客户端函数库实现(如图A.3 所示)。
分布式算法有很多,有将key 的散列值用服务器数量取余这种十分简单的算法,也有Consistent Hashing (一致性hash)等比较复杂的算法。应用程序最好是使用那种不容易受到服务器数量变化的影响,多台服务器中停掉一台也无所谓的实现。
Hatena 现在采用的Perl 客户端函数库基本上Cache::Memcached: :Fast 。如前所述, memcached 完全在内存上执行,速度十分快,但进程重启会导致数据全部丢失。因此它显然不适合保存原始数据,也不适合保存需要花费很长时间重新生成的加工数据。

memcached 的特点最适合保存缓存数据。举个典型的例子,从RDBMS 中读出数据并临时保存到memcached 中,再次需要该数据时首先访问memcached ,不命中时才去访问RDBMS 。除了RDBMS 之外, memcached 还能缓存外部资源的访问结果等,可作为各种缓存存储系统使用。
如果仅限于保存缓存,那么服务器只需大量内存即可,对于CPU 性能和I/O 性能并没有太大要求。因此,可以用廉价硬件构建大规模缓存池,以减少需要昂贵硬件的RDBMS 服务器的数量。

分布式文件系统
分布式文件系统也是强大的候选存储系统。分布式文件系统从文件系统的特点上来看, 一般只适合保存大小超过某种程度的数据。除了NFS 这种考虑到这点的实现之外,多数实现都适合保存大量细小的数据。

Mogi1eFS 是一个用Perl 实现的分布式文件系统,适合处理大量较小的文件。

它适合绝大多数数据添加之后只有读取而不再更新的应用。也就是说,它适合接受图像上传的Web应用程序。

存储服务器上的每个文件在实际的文件系统中也保存成一个文件。通常, 一个文件会冗余化成3个副本,这种设计保证了即使部分存储服务器发生故障导致数据丢失,系统整体也能继续正常运行。
文件的存储位置和标识文件的key 之间的对应关系作为元数据保存在RDBMS 中。获取文件时,不像普通文件系统那样进行挂载,而是用WebDAV 协议获取。因此,使用MogileFS 需要应用程序做出相应的开发。

【读书笔记】大规模Web开发技术(ch16 作业队列系统,存储选择,分布式)