<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>petermao的技术blog &#187; leveldb log</title>
	<atom:link href="http://www.petermao.com/tag/leveldb-log/feed" rel="self" type="application/rss+xml" />
	<link>http://www.petermao.com</link>
	<description>欢迎探讨，共同进步</description>
	<lastBuildDate>Fri, 17 Feb 2017 07:03:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>leveldb注释6–log文件</title>
		<link>http://www.petermao.com/leveldb/leveldb-6-log.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=leveldb-6-log</link>
		<comments>http://www.petermao.com/leveldb/leveldb-6-log.html#comments</comments>
		<pubDate>Fri, 12 Jul 2013 08:45:35 +0000</pubDate>
		<dc:creator>petermao</dc:creator>
				<category><![CDATA[leveldb]]></category>
		<category><![CDATA[leveldb log]]></category>
		<category><![CDATA[存储]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.petermao.com/?p=542</guid>
		<description><![CDATA[在leveldb中，除了sstable文件格式，还有log文件格式。该文件格式用于存储写操作的日志与manifest文件（不同的文件名）。前者用于异常回滚。后者用于记录sstable文件的元数据。整体架构中提到过，leveldb在将记录写入内存中的memtable之前，会先写入log文件，memtable会延后持久化。在这个过程中进程可能down掉。有了log写操作文件后，即使系统发生故障，levelDB也可以根据log写操作日志文件恢复内存的memtable内容，不会造成丢失数据。而manifest文件用于记录所有的sstable文件的元数据，比如sstable文件的编号，key范围。 log文件格式也是分块存储的。跟sstable文件不同的是，一方面sstable是有序存储的，因此为了加速读取，有相关索引，而log文件始终是顺序读写的，不需要定位某个key，因而不需要索引信息。另一方面sstable的data block虽大致按4KB分块，但实际上存储的块大小通常会比4KB大，这主要是因为单条record不会跨block。而log文件中的block则严格保证为一样，默认值为32KB。因此，log文件中的record可能会跨块，为了区分record是否结束，不同的block有不同的类型（kFullType/kFirstType/kMiddleType/kLastType）。如果block剩余的空间足以存储新的record，则type取值为kFullType，否则则有可能出现1个FirstType的block（剩余部分block存储record的部分内容）+ 0或者多个kMiddleType的block + 1个kLastType的block。除了type字段之外，record还包括check sum与数据的长度，最后才是具体的数据。校验和针对type+length+data。详细的格式如下图所示。如果剩余block的空间]]></description>
			<content:encoded><![CDATA[<p>在leveldb中，除了sstable文件格式，还有log文件格式。该文件格式用于存储写操作的日志与manifest文件（不同的文件名）。前者用于异常回滚。后者用于记录sstable文件的元数据。整体架构中提到过，leveldb在将记录写入内存中的memtable之前，会先写入log文件，memtable会延后持久化。在这个过程中进程可能down掉。有了log写操作文件后，即使系统发生故障，levelDB也可以根据log写操作日志文件恢复内存的memtable内容，不会造成丢失数据。而manifest文件用于记录所有的sstable文件的元数据，比如sstable文件的编号，key范围。<span id="more-542"></span></p>
<p>log文件格式也是分块存储的。跟sstable文件不同的是，一方面sstable是有序存储的，因此为了加速读取，有相关索引，而log文件始终是顺序读写的，不需要定位某个key，因而不需要索引信息。另一方面sstable的data block虽大致按4KB分块，但实际上存储的块大小通常会比4KB大，这主要是因为单条record不会跨block。而log文件中的block则严格保证为一样，默认值为32KB。因此，log文件中的record可能会跨块，为了区分record是否结束，不同的block有不同的类型（kFullType/kFirstType/kMiddleType/kLastType）。如果block剩余的空间足以存储新的record，则type取值为kFullType，否则则有可能出现1个FirstType的block（剩余部分block存储record的部分内容）+ 0或者多个kMiddleType的block + 1个kLastType的block。除了type字段之外，record还包括check sum与数据的长度，最后才是具体的数据。校验和针对type+length+data。详细的格式如下图所示。如果剩余block的空间<7（checksum+length+type），则剩余的直接填充0，另起一块存储数据。leveldb严格按照32k为一个单位读写一个block。<br />
<div id="attachment_757" class="wp-caption alignnone" style="width: 440px"><a href="http://www.petermao.com/wp-content/uploads/2013/10/leveldb-log1.png"><img src="http://www.petermao.com/wp-content/uploads/2013/10/leveldb-log1.png" alt="leveldb log" title="leveldb log" width="430" height="110" class="size-full wp-image-757" /></a><p class="wp-caption-text">leveldb log</p></div><br />
doc/log_format.txt中讲述了这种文件格式的benefit与downside。<br />
好处如下：<br />
（1）容错性好。不需要额外的信息来同步。发现出错了，直接跳至下一个block（32K为一个block）。<br />
（2）容易切分，适合mapreduce等大数据处理方式。切分时，需按逻辑上的一个Record。<br />
（3）对于大记录，也不需要额外的字段来表示其长度。自然的按32k切分了嘛。<br />
一些限制如下：<br />
（1）对于小记录，没有pack机制。<br />
（2）没有压缩。<br />
对于这些限制，作者认为可以通过添加新的type来实现。</p>
<p>代码主要在log_format.h，log_reader.cc/.h，log_writer.cc/.h。前者定义了一些，log::Writer类用于写，比较简单，log::Reader考虑到容错，稍微复杂些。但整体上还是很简单的，给点耐心看吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.petermao.com/leveldb/leveldb-6-log.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
