1)设计一个 DNS 的 Cache 结构,要求能够满足每秒 5000 次以上的查询,满足 IP 数据 的快速插入,查询的速度要快(题目还给出了一系列的数据,比如站点数总共为 5000 万、 IP 地址有 1000 万等)。
2)有 N 台机器,M 个文件,文件可以以任意方式存放到任意机器上,文件可任意分割 成若干块。假设这 N 台机器的宕机率小于 1/3,想在宕机时可以从其他未宕机的机器中完整 导出这 M 个文件,求最好的存放与分割策略。
3)假设有三十台服务器,每台服务器上面都存有上百亿条数据(有可能重复),如何找出这 三十台机器中,根据某关键字,重复出现次数最多的前100条?要求使用Hadoop来实现。
4)设计一个系统,要求写速度尽可能快,并说明设计原理。
5)设计一个高并发系统,说明架构和关键技术要点。
6)有 25T 的 log(query->queryinfo),log 在不断地增长,设计一个方案,给出一个 query 能快速返回 queryinfo。 以上所有问题中凡是不涉及高并发的,基本可以采用 Google 的三个技术解决,即 GFS、 MapReduce 和 Bigtable,这三个技术被称为“Google 三驾马车”,Google 只公开了论文而未 开源代码,开源界对此非常有兴趣,仿照这三篇论文实现了一系列软件,如 Hadoop、HBase、 HDFS 及 Cassandra 等。 在 Google 这些技术还未出现之前,企业界在设计大规模分布式系统时,采用的架构往 往是 database+sharding+cache,现在很多公司(比如 taobao、weibo.com)仍采用这种架构。 在这种架构中,仍有很多问题值得去探讨。如采用什么数据库,是 SQL 界的 MySQL 还是 NoSQL 界的 Redis/TFS,两者有何优劣?采用什么方式 sharding(数据分片),是水平 分片还是垂直分片?据网上资料显示,weibo.com 和 taobao 图片存储中曾采用的架构是 Redis/MySQL/TFS+sharding+cache,该架构解释如下:前端 cache 是为了提高响应速度,后 端数据库则用于数据永久存储,防止数据丢失,而 sharding 是为了在多台机器间分摊负载。 最前端由大块大块的 cache 组成,要保证至少 99%(该数据在 weibo.com 架构中的是自己猜 的,而 taobao 图片存储模块是真实的)的访问数据落在 cache 中,这样可以保证用户访问速 度,减少后端数据库的压力。此外,为了保证前端 cache 中的数据与后端数据库中的数据一 致,需要有一个中间件异步更新(为什么使用异步?理由简单:同步代价太高。异步有缺点, 如何弥补?)数据,这个有些人可能比较清楚,新浪有个开源软件叫 Memcachedb(整合 了 Berkeley DB 和 Memcached),正是完成此功能。另外,为了分摊负载压力和海量数据, 会将用户微博信息经过分片后存放到不同节点上(称为“Sharding”)。
这种架构优点非常明显:简单,在数据量和用户量较小的时候完全可以胜任。但缺点是 扩展性和容错性太差,维护成本非常高,尤其是数据量和用户量暴增之后,系统不能通过简 单地增加机器解决该问题。 鉴于此,新的架构应运而生。新的架构仍然采用 Google 公司的架构模式与设计思想, 以下将分别就此内容进行分析。
GFS 是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的 应用。它运行于廉价的普通硬件上,提供容错功能。现在开源界有 HDFS(Hadoop Distributed File System),该文件系统虽然弥补了数据库+sharding 的很多缺点,但自身仍存在一些问题,
比如:由于采用 master/slave 架构,因此存在单点故障问题;元数据信息全部存放在 master 端的内存中,因而不适合存储小文件,或者说如果存储大量小文件,那么存储的总数据量不 会太大。 MapReduce 是针对分布式并行计算的一套编程模型。其最大的优点是:编程接口简单, 自动备份(数据默认情况下会自动备三份),自动容错和隐藏跨机器间的通信。在Hadoop中, MapReduce 作为分布计算框架,而 HDFS 作为底层的分布式存储系统,但 MapReduce 不是 与HDFS耦合在一起的,完全可以使用自己的分布式文件系统替换掉HDFS。当前MapReduce 有很多开源实现,如 Java 实现 Hadoop MapReduce,C++实现 Sector/sphere 等,甚至有些数 据库厂商将 MapReduce 集成到数据库中了。
BigTable 俗称“大表”,是用来存储结构化数据的,编者觉得,BigTable 在开源界最火 爆,其开源实现最多,包括 HBase、Cassandra 和 levelDB 等,使用也非常广泛。 除了 Google 的这“三驾马车”以外,还有其他一些技术可供学习与使用: Dynamo:亚马逊的 key-value 模式的存储平台,可用性和扩展性都很好,采用 DHT (Distributed Hash Table)对数据分片,解决单点故障问题,在 Cassandra 中,也借鉴了该技 术,在 BT 和电驴这两种下载引擎中,也采用了类似算法。 虚拟节点技术:该技术常用于分布式数据分片中。具体应用场景是:有一大块数据(可 能 TB 级或者 PB 级),需按照某个字段(key)分片存储到几十(或者更多)台机器上,同时 想尽量负载均衡且容易扩展。传统的做法是:Hash(key) mod N,这种方法最大的缺点是不容易 扩展,即增加或者减少机器均会导致数据全部重分布,代价太大。于是新技术诞生了,其中一 种是上面提到的 DHT,现在已经被很多大型系统采用,还有一种是对“Hash(key) mod N”的 改进:假设要将数据分布到 20 台机器上,传统做法是Hash(key) mod 20,而改进后,N 取值要 远大于 20,比如是20000000,然后采用额外一张表记录每个节点存储的 key的模值,比如: node1:0~1000000 node2:1000001~2000000 …