|
那些序列号小于等于已经序列化到磁盘存储中的修改操作将会被忽略,因为该修改操作已经被apply了。其他的修改操作将会被apply到该region对应的memstore中以恢复之前的状态。最后,会将memstore的内容强制flush到磁盘。
一旦recovered.edits中的文件被读取并持久化到磁盘后,它们就会被删除。如果某个文件无法读取,那么会根据hbase.skip.errors来确定如何处理:默认值是false,会导致整个region恢复过程失败。如果设为true,那么该文件会被重命名为原始名称+” .<currentTimeMillis>”。不管是哪种情况,你都需要仔细检查你的log文件确认问题产生的原因及如何fix。
1.8 持久性
无论底层采用了什么稀奇古怪的算法,用户都希望可以依赖系统来存储他们所有的数据。目前HBase允许用户根据需要调低log flush的时间或者是每次修改操作都进行sync。但是当存储数据的stream被flush后,数据是否真的写入到磁盘了呢?我们会讨论下一些类似于fsync类型的问题。当前的HBase主要依赖于底层的HDFS进行持久化。
比较明确的一点是系统通过log来保证数据安全。一个log文件最好能在长时间内(比如1小时)一直处于打开状态。当数据到达时,一个新的key/value对会被写入到SequenceFile,同时间或地被flush到磁盘。但是Hadoop并不是这样工作的,它之前提供的API,通常都是打开一个文件,写入大量数据,立即关闭,然后产生出一个可供其它所有人读取的不可变文件。只有当文件关闭之后,对其他人来说它才是可见的可读的。如果在写入数据到文件的过程中进程死掉通常都会有数据丢失。为了能够让日志的读取可以读到服务器crash时刻最后写入的那个位置,或者是尽可能接近该位置,这就需要一个feature:append支持。
插曲:HDFS append,hflush,hsync,sync…
|
|