Hbase利用单行ACID,实现跨表跨库最终一致性,替代分布式事务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16414307/article/details/55506418

hbase只提供了单行ACID的事务,很多人梦想能实现跨行,跨表,甚至与其他数据源实现分布式事务。

其实,大规模分布式,强一致性事务,理论上就不能完美实现,CAP原理已经指出了。

但是利用hbase提供的单行事务,同样可以实现传统两个数据库之间的最终一致性分布式事务。

原理就是利用,hbase多列簇,多列的灵活。

目标,在hbase中t1插入一条记录时,同时要保证在t2插入一条相关数据。

伪码:
var t1=”表1”
var t2=”表2”
var logid=”生成的唯一id”
var row=”行键”
var f=”数据列族”
var log=”日志列族”
var c=”数据字段”
var v1=”数据1”
var v2=”数据2”

multiple {//单行原子批处理
put(t1,row,f,c,v1) //插入数据
put(t1,row,log,logid,v2) //插入日志
}

//单独插入另外一张表
put(t2,row,f,c,v2)

//删除日志
del(t1,row,log,logid)

//上述后两步可能被打断,另外一个定时恢复进程

//搜索t1中log列族,超时的字段
for (row,logid,v2 in scan(“t1中log列族”) ){
//再次写t2
put(t2,row,f,c,v2)

//删除日志
del(t1,row,log,logid)
}

这种方式实际与
多数据源之间不使用分布式事务实现异步最终一致性

完全一致!所以不光可以实现hbase跨行,跨表,还可实现hbase与数据库,redis等等之间实现最终一致性,用来作为分布式事务的一种替代。

当然hbase单行事务,用起来还是有些麻烦,比如目前提供了一堆checkAndXXX来完成原子操作,如果能像redis这样提供一个内置脚本,就比较理想了 。

总结,只要提供了即便受限制的ACID操作,也都有可能方便扩展。

猜你喜欢

转载自blog.csdn.net/qq_16414307/article/details/55506418