我试图在ZooKeeper的帮助下为Cassandra实现一个事务系统.由于我认为我没有足够的数据库实施经验,我想知道我的想法是否原则上有效,或者是否有任何重大缺陷.
以下是步骤的高级描述:
识别要编辑的所有行(键)和列.让键为[K0..Kn]
对所涉及的所有行应用写锁定(锁是内存中的Zookeeper实现)
将旧值复制到Cassandra中由键唯一标识的不同位置:[K'0..K'n]
使用持久模式存储[K'0..K'n]并将它们映射到ZooKeeper中的[K0..Kn]
继续将更新应用于数据
删除ZooKeeper中的条目
解锁行
在维护线程上懒惰地删除[K'0..K'n]的条目(cassandra删除使用时间戳,因此K'0..K'n可以重新用于具有较新时间戳的另一个事务)
理由:
如果在步骤1-4中事务失败,则不应用任何更改,我可以中止事务并删除存储在zookeeper中的任何内容并在cassandra中备份,如果有的话.
如果在步骤5中事务失败,则使用步骤3中保存的信息来回滚任何更改.
如果服务器碰巧被清理人员发生故障/崩溃/被盗,在重新启动服务任何请求之前,我会检查来自步骤4的zookeeper中是否有任何密钥,如果是,我会使用这些密钥来获取备份数据由步骤3存储,并将这些数据放到它们所在的位置,从而回滚任何失败的事务.
我担心的一个问题是,如果某些服务器是从群集中分区的,会发生什么.我没有这方面的经验,我的计划是否有效?如果分区发生,它会起作用吗?
您应该查看Cages:http://ria101.wordpress.com/2010/05/12/locking-and-transactions-over-cassandra-using-cages/
http://code.google.com/p/cages/