我想在ZooKeeper的帮助下为Cassandra实现一个事务系统。由于我不认为自己在数据库实施方面有足够的经验,所以我想知道我的想法是否在原则上有效,或者是否存在重大缺陷。ZooKeeper的卡桑德拉交易 - 这是否工作?
下面是这些步骤的高级描述:
- 识别所有行(键)和列进行编辑。让密钥为[K0..Kn]
- 对涉及的所有行应用写入锁定(锁是内存中的Zookeeper实现)
- 将旧值复制到卡桑德拉分隔的位置,这些位置由键唯一标识: K'0..K'n]
- 存储[K'0..K'n]及其在ZooKeeper中使用持久模式映射到[K0..Kn]
- 继续前进将更新应用到数据
- 删除的条目中的ZooKeeper
- 解锁行
- 删除的条目Ò F [K'0..K'n]懒惰地在维护线程(卡桑德拉缺失使用时间戳,所以可以K'0..K'n用于与较新的时间戳记另一个事务被重新使用)
正当性:
- 如果事务在步骤1-4失败,没有更改应用,我可以中止事务并删除存储在zookeeper中的任何内容,并在cassandra中备份,如果有的话。
- 如果在步骤5中事务失败,则使用步骤3中保存的信息来回滚所有更改。
- 如果服务器发生故障/坠毁/被人偷走,在重新启动服务器请求之前,我检查是否有任何密钥在步骤4中保存在zookeeper中,如果是这样,我将使用这些密钥来获取备份第3步存储的数据,并将这些数据放到原来的位置,从而回滚任何失败的事务。
我的一个担心是如果某些服务器从群集中分割出来会发生什么。我没有这方面的经验,我的计划是否可以工作?如果分区发生,它会工作吗?
猜测我将不得不寻找它自己,让你们知道... – Viele 2010-06-30 18:32:27