请教关于hbase的强一致模型的理解

查看数: 66563 | 评论数: 20 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-1-12 17:38

正文摘要:

找了很多资料都说,HBase用的是强一致模型,一个客户端对数据的变更, 其他客户端马上就可以看到。 我想问的是,HBase是怎么做到强一致性的?

回复

pengsuyun 发表于 2015-1-14 11:29:48
折腾很久HBase的强一致模型,今天终于可以对自己有个交待了。

说道HBase的强一致性模型,其实应该去理解事务。传统关系型数据库做到了跨行、跨表的事务,但是原生的HBase仅支持单行的事务,仅这一点,其实是可以得到HBase强一致性的结论。所以这篇帖中,有同学提到了这点,只是那时候我不太理解HBase怎么实现行的事务的,所以我直接飘过了。事务的ACID特征中的C其实讲的就是一致性,所以只要承认了HBase的行事务,也就说明了HBase的强一致性了。

下面我谈谈HBase中怎么实现行事务的。

要明白这点,建议大家看看http://www.rigongyizu.com/hbase-row-lock-and-multiversion-concurrency-control/ 这篇文章,HBase官网的翻译贴,其中讲了MVCC(多版本并发控制)机制,顺着他的思路,应该可以部分理解HBase中的事务。下面就结合MVCC谈谈我对HBase的行事务的理解:
(1)MVCC中用到了行锁,通过串行化的操作,保证了行操作的原子性;
(2)在读操作的时候,读取点使用完成的最大的写序号(没有完成的写序号不可用)保证了事务的隔离型;
(3)在Region刷写MemStore的时候,MemStore通过加写锁,阻塞了region的更新操作,直到HFile写完成,释放锁,使得更新的行数据,顺利的写到HDFS中,保证了持久性;
(4)再来看行数据的一致性,最新的数据不是在MemStore中就是在HFile中,这样,其他客户端在读取行数据的时候,结合MemStore和HFile,取到的数据就总是最新的数据。

HBase行事务的实现,也就保证了HBase的强一致性。

关于第三点,我想补充下我的认识,之前,我担心在memstore刷写的过程中出现datanode没有及时更新的情况,这点是我想多了,再查看了《Hadoop权威指南》中“文件写入剖析”和“一致模型”后,我发现我的担心显得多余,因为,hadoop会等到最小份数datanode的写确认,只有这样,才说明文件写入成功,而且,在hdfs的文件cllose的时候,写入的数据在各个datanode都是可见的,再结合MemStore的写入锁,整个MemSotre的刷写过程是可以当作一个原子操作的。

到此,就是我对HBase的强一致性的理解了,有问题,也请各位同学指正。
stark_summer 发表于 2015-1-28 23:35:55
stark_summer 发表于 2015-1-28 23:35:23
stark_summer 发表于 2015-1-28 23:34:39
好文章呀
stark_summer 发表于 2015-1-28 23:33:58
文章写的很好  大赞
hua0704 发表于 2015-1-26 10:52:34
关注,正在学习中
starrycheng 发表于 2015-1-14 11:50:45
pengsuyun 发表于 2015-1-14 11:29
折腾很久HBase的强一致模型,今天终于可以对自己有个交待了。

说道HBase的强一致性模型,其实应该去理解 ...

楼主写的不错,给个赞,持续关注楼主
pengsuyun 发表于 2015-1-13 17:15:47
desehawk 发表于 2015-1-13 17:07
这种可能是会发生的,因为写数据是一个过程,在没有写入成功前,读取的肯定是以前的数据。但是一旦写入成 ...

这样说的话,Hbase读数据的时候,可能从旧的datanode中取数据。
但是这又跟HBase宣称的强一致性冲突了。
按照强一致性的说法,任何操作更新成功后,客户端取到的都应该是最新的数据。


源于以下两点,我有了一个新的问题,HBase还是强一致性的吗?
1、hbase的写操作包括两个部分,写wal和写memstore,这两个操作完成说明更新成功。
2、更新后,Hbase读数据的时候,可能从旧的datanode中取数据。


desehawk 发表于 2015-1-13 17:07:22
pengsuyun 发表于 2015-1-13 15:07
能说下HMemCache这个东西是出自哪里吗? 《Hbase权威指南》上有hbase的存储结构图,我没有看到过这个东 ...

这种可能是会发生的,因为写数据是一个过程,在没有写入成功前,读取的肯定是以前的数据。但是一旦写入成功,那就可以读取成功

关闭

推荐上一条 /2 下一条