海量存储系列之五

标签: 未分类 | 发表时间:2011-12-15 19:34 | 作者:shenxun0whisper
出处:http://rdc.taobao.com/team/jm

 

http://rdc.taobao.com/team/jm/archives/1365 上一章

在上一章节,我们一起浏览了如何进行单机事务操作。下面我们来看一下分布式场景中我们碰到的问题吧。

 

需要说明的一点是,这里涉及到的权衡点非常的多。就我短短的工作经验里面,也只是能够简单的涉猎一部分,因为在事务这个领域,目前大家都在尝试提出各种各样的不同的方法,而在taobao,我们目前也没有完美的解决这个问题,更多的是在权衡,在金钱和开发成本之间,做出选择。

 

那么,我们就先从问题开始,来看一下原来的事务出了什么问题。

在事务中,有ACID四种属性。(见上篇文章)

 

在分布式场景中,我们看引入了什么因素,导致了什么样的新问题:

1.      延迟因素:光是我们所知最快的信息载体了,各位可能都会从潜意识里面认为光传输信息不就是一眨眼的事情而已。那我们做个简单的计算吧(感谢@淘宝叔度,第一次在分享中让我对这个问题有了个数值化的印象。):

北京到杭州,往返距离2600km ,光在真空中的传输速度是30wkm/s。在玻璃中的速度是真空的2/3。算下来,最小的请求和响应,之间的延迟就有13ms。并且,因为光在管子里走的不是直线,又有信号干扰等问题,一般来说要乘以2~3倍的因子值。

所以一次最小的请求和响应,时间就差不多有30ms左右了。

再想想TCP的时间窗口的移动策略,相信大家都能意识到,实际上延迟是不可忽略的,尤其在传输较多数据的时候,延迟是个重要的因素,不能不加以考虑。

并且,延迟 不是 带宽,带宽可以随便增加,千兆网卡换成万兆,但延迟却很难降低。而我们最需要的,是带宽,更是延迟的降低。因为他直接决定了我们的可用性。

2.      灾备因素:单机的情况下,人们一般不会去追求说一个机器物理上被水冲走了的时候,我的数据要保证不丢(因为没办法的嘛。。)。但在分布式场景下,这种追求就成为了可能,而互联网行业,对这类需求更是非常看重,恨不能所有的机器都必须是冗余的,可随意替换的。这样才能保证7*24小时的正常服务。这无疑增加了复杂度的因素。

3.      Scale out的问题: 单机总是有瓶颈的,于是,人们的追求就一定是:不管任何一种角色的机器,都应该可以通过简单的增加新机器的方式来提升整个集群中任何一个角色的性能,容量等指标。这也是互联网行业的不懈追求。

4.      性能:更快的响应速度,更低的延迟,就是更好的用户体验。(所以google用了个“可怜”到家的简单input框来提升用户体验,笑)。

 

说道这里,大概大家都应该对在分布式场景下的广大人民群众的目标有了一个粗略的认识了。

那么我们来看一下原有ACID的问题吧。

 

在上次的章节中,我们也提到了ACID中,A和D相对的,比较容易达到。但C和I都涉及到锁实现,也就和性能紧密的相关了。

然后,人们就开始了纠结,发掘这个C和I,似乎不是那么容易了。

上次,我们谈到,目前主流的实现一次更新大量数据的时候,不同人(或机器)修改数据相互之间不会打架的方法有以下几种:

1.      排他锁

2.      读写锁

3.      Copy-on-write

4.      队列

5.      内存事务

 

 

排他锁和读写锁,本身都是锁的实现,单机的锁实现,相对而言是非常简单的事情,但如果涉及到分布式锁,那么消耗就很高了,原因是,锁要在两边都达到一致,需要多次机器之间的交互过程,这个交互的过程,再考虑到延迟的因素,基本上一次加锁请求就要100~200+毫秒的时间了,那么去锁又要这样的时间。而要知道,我们在单机做内存锁操作,最慢也不过10毫秒。。

于是,有一批人就说了,既然这么难,我们不做了!~来个理论证明他很难就行了~。于是就有了CAP和BASE.

所谓CAP,我个人的理解是描述了一种: 在数据存了多份的前提下,一致性和响应时间,读写可用性不可兼得的“现象”而已。

在我这里来看CAP的证明过程就是个扯淡的玩意儿,他只是描述了一种现象而已。原因还是网络延迟,因为延迟,所以如果要做到数据同时出现或消失,那么按照锁的方式原来可能只需要10ms以内完成的操作,现在要200~400ms才能完成,那自然不能接受了。所谓CAP就是这个现象的英文简称,笑。

 

BASE呢,这个理论似乎更老,其实也是个现象,就是基本可用,软状态,最终一致的简称,也没个证明,其实就是告诉咱:要权衡一下,原来的ACID不太容易实现啦,我们得适当放弃一些啦。但请各位注意,ACID实际上是能够指导我们在什么情况下做什么样的事情能够获取什么样的结果的。而BASE则不行,这也说明BASE不是个经典的理论。

 

好啦。废话了这么多,其实就是想说,分布式场景没有银弹啦,你们自己权衡去吧。我们大牛们救不了你们啦的意思。。

 

既然大牛救不了咱,咱就只能自救了。。。

 

好,好的文章就要在关键的地方恰然而止,留下悬念,我们也就在这里留下点悬念吧。

在这篇中,主要是想给大家介绍一下,目前在分布式场景中,事务碰到了什么问题,出现这些问题的原因是什么。

 

在下一篇中,我将尝试从原理的角度,去分析目前的几类常见的在分布式场景中完成原有事务需求的方法。敬请期待 : )

相关 [系列] 推荐:

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

[原]Lucene系列-FieldCache

- - 文武天下
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.

google全系列hosts列表

- 佳 - cooerson的各种聚合
整理了一下Google(含google大部分服务,google+,gmail,地图,gtalk等~)的hosts. 可以通过添加hosts方式,享受谷歌产品,这样读图会快很多,gmail也能随时打开了,不会出现链接不上情况了,更不用番强了. windows下修改hosts文件,添加固定的DNS解析.

可爱的Pusheen猫系列

- apple - 鸸鹋动物园
全部都会动,全部都会哦~~ (via). 还有Pusheen猫的QQ表情. © Salala for 鸸鹋动物园, 2011. 转发本文地址 可爱的Pusheen猫系列 http://www.ermiao.com/gallery/20110901/21594.html. 本文标签:Pusheen, 猫, 表情.

This man is your FRIEND系列海报

- Edward - hUrR DuRr
Fallout: New Vegas乱入:. Team Fortress 2乱入:. reddit上真是什么奇葩的subreddit都有:r/PropagandaPosters.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

位置预测系列(一)

- - CSDN博客互联网推荐文章
关于位置预测,在每年的顶级会议上都有很多文章出炉. 下面就简单说说ubicomp'13年录用的一篇论文:. 基于用户移动行为的规律性,现有的位置预测方法都能够获得一个很高的预测精度. 然而,目前的方法未能够有效地检测出用户在两个不同位置间的转移. 精确地预测出用户在不同位置间的转移行为是非常重要的,比如在智能家居服务中,需要有效地检测出用户是离开家还是回到家,以便智能地关闭或开启某些服务.

访谈系列:Hadley Wickham

- - 统计之都
Hadley Wickham 是 RStudio 的首席科学家以及 Rice University 统计系的助理教授. ggplot2 的开发者,以及其他许多被广泛使用的软件包的作者,代表作品如. plyr、 reshape2 等. 2013年9月13日小编(Yixuan)对他(Hadley)进行了一次简短的采访,谈及了他在图形可视化、数据整理和R编程等诸多方面的工作.

PostgreSQL Cluster系列教程

- - 数据库 - ITeye博客
PostgreSQL9.1 PITR示例. 本教程是PostgreSQL Cluster系列教程的一部分,该系列包括:. PostgreSQL9.1 PITR示例  (该教程主要阐述DBA如何基于WAL日志做备份恢复). PostgreSQL9.1 Warm-Standby ---之基于拷贝WAL文件的方法 (file-based log shipping).

Java NIO 系列教程

- - 编程语言 - ITeye博客
Java NIO提供了与标准IO不同的IO工作方式:. Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情.