摘要: 1 设计分布式系统需要考虑的异常1.1 节点宕机1.2 网络异常消息丢失、消息乱序(可以通过增加序列号解决)以及数据错误1.3 分布式系统三态在单机,只要不宕机,一个函数执行要么成功、要么失败,但是分布式系统共下存在成功、失败和超时。下面解释一下超时的不确定性:某个节点 A 向另一个节点 B 发送一个消息,如果请求 RPC 的节点 A 在给定的时间内没有收到执行 RPC 的节点 B 返回的消息,则认为该操作“超时”。对于超时的请求,我们无法获知该请求是否被节点 B 成功执行了。这是因为,如果超时是由于节点 A 发向节点 B 的请求消息丢失造成的,则该操作肯定没有被节点 B 成功执行;但如果节点 阅读全文
posted @ 2013-11-03 23:31 TheBug 阅读(4493) 评论(5) 推荐(6) 编辑
摘要: 小文件指的是那些size比HDFS的block size(默认64M)小的多的文件。如果在HDFS中存储小文件,那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop了)。而HDFS的问题在于无法很有效的处理大量小文件。 任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,没一个object占用150 bytes的内存空间。所以,如果有10million个文件,没一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息。如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限。 . 阅读全文
posted @ 2013-11-02 14:38 TheBug 阅读(1446) 评论(1) 推荐(2) 编辑
摘要: Facebook运行着全球最大的MySQL数据库集群,该集群分布在两个大洲上的多个数据中心中数以千计的服务器上。让人不解的是,Facebook只动用了一个很小的团队来管理这个庞大的MySQL数据库集群。 近日Facebook的Shlomo Priymak在Facebook博客上发文揭开了这个秘密。Facebook的秘诀就是Facebook自己开发的MySQL Pool Scanner(MPS),MPS能完成一个MySQL数据库管理员(BDA)的几乎所有运营维护工作,使得Facebook的数据库集群运营能够实现高度的自动化。 据Priymak介绍,MPS非常复杂,代码大部分由Pyth... 阅读全文
posted @ 2013-11-02 13:18 TheBug 阅读(715) 评论(0) 推荐(0) 编辑
摘要: 随着科技进步,人类活动使数据以惊人的速度产生。毋庸置疑,我们已经进入大数据时代,这些庞杂的数据是垃圾也孕育商机。随着数据分析能力的提高,营销人将能更快速高效成本低廉的使用大数据。未来三年,71%的营销将开始使用大数据营销。 阅读全文
posted @ 2013-11-02 11:46 TheBug 阅读(563) 评论(0) 推荐(0) 编辑
摘要: SSTable是Bigtable中至关重要的一块,对于LevelDb来说也是如此,对LevelDb的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。本节内容主要讲述SSTable的静态布局结构,我们曾在“整体架构”中说过,SSTable文件形成了不同Level的层级结构,至于这个层级结构是如何形成的我们放在后面Compaction一节细说。本节主要介绍SSTable某个文件的物理布局和逻辑布局结构,这对了解LevelDb的运行过程很有帮助。LevelDb不同层级有很多SSTable文件(以后缀.sst为特征),所有.sst文件内部布局都是一样的。上节介绍Log文件是物理 阅读全文
posted @ 2013-10-31 23:10 TheBug 阅读(1922) 评论(0) 推荐(0) 编辑
摘要: 上节内容讲到log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据。因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据log文件恢复内存的Memtable数据结构内容,不会造成系统丢失数据,在这点上LevelDb和Bigtable是一致的。下面我们带大家看看log文件的具体物理和逻辑布局是怎样的,LevelDb对于一个log文件,会把它切割成以32K为单位的物理Block,每次读取的单位以一个Block作为基本读取单位,下图展示的log文件由3 阅读全文
posted @ 2013-10-30 22:57 TheBug 阅读(1881) 评论(0) 推荐(0) 编辑
摘要: LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面。本节所讲的整体架构主要从静态角度来描述,之后接下来的几节内容会详述静态结构涉 阅读全文
posted @ 2013-10-29 22:49 TheBug 阅读(3256) 评论(0) 推荐(0) 编辑
摘要: 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:JeffDean和SanjayGhemawat。这两位是Google公司重量级的工程师,为数甚少的GoogleFellow之二。 JeffDean其人:http://research.google.com/people/jeff/index.html,Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。 SanjayGhemawat其人:http://research.google.com/people/sanjay/index.html... 阅读全文
posted @ 2013-10-28 22:13 TheBug 阅读(1501) 评论(0) 推荐(0) 编辑
摘要: 作者:JeffDean,SanjayGhemawat原文:http://leveldb.googlecode.com/svn/trunk/doc/index.html译者:phylips@bmy2011-8-16译文:http://duanple.blog.163.com/blog/static/70971767201171705113636/LevelDB库提供了一种永久性的keyvalue存储。Key和value都是任意的字节序列。在这个keyvalue存储系统中,key按照用户声明的比较函数有序排列。打开一个数据库一个LevelDB数据库有一个文件系统目录名称与之关联。该数据库的所有内. 阅读全文
posted @ 2013-10-27 19:47 TheBug 阅读(2577) 评论(1) 推荐(0) 编辑
摘要: LevelDB内部通过采用变长编码,对数据进行压缩来减少存储空间,采用CRC进行数据正确性校验。下面就对varint编码进行学习。传统的integer是以32位来表示的,存储需要4个字节,当如果整数大小在256以内,那么只需要用一个字节就可以存储这个整数,这样就可以节省3个字节的存储空间,Google varint就是根据这种思想来序列化整数的无符号Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数 阅读全文
posted @ 2013-10-26 22:32 TheBug 阅读(9147) 评论(0) 推荐(1) 编辑