【发布时间】:2011-03-10 04:34:42
【问题描述】:
我正在尝试在 ZooKeeper 的帮助下为 Cassandra 实现一个事务系统。由于我认为我在数据库实现方面没有足够的经验,所以我想知道我的想法在原则上是否可行,或者是否有任何重大缺陷。
以下是步骤的高级描述:
- 确定所有要编辑的行(键)和列。让键为 [K0..Kn]
- 对所有涉及的行应用写锁(锁是内存中的 Zookeeper 实现)
- 将旧值复制到 Cassandra 中由键唯一标识的不同位置:[K'0..K'n]
- 使用持久模式在 ZooKeeper 中存储 [K'0..K'n] 及其到 [K0..Kn] 的映射
- 继续将更新应用到数据
- 删除 ZooKeeper 中的条目
- 解锁行
- 在维护线程上懒惰地删除 [K'0..K'n] 的条目(cassandra 删除使用时间戳,因此 K'0..K'n 可以重用于具有较新时间戳的另一个事务)
理由:
- 如果事务在步骤 1-4 中失败,则未应用任何更改,我可以中止事务并删除存储在 zookeeper 中并在 cassandra 中备份的所有内容(如果有)。
- 如果事务在第 5 步失败,则使用第 3 步保存的信息来回滚任何更改。
- 如果服务器发生故障/崩溃/被清理人员窃取,在服务任何请求之前重新启动时,我会检查第 4 步中 Zookeeper 中是否有任何密钥,如果有,我将使用这些密钥来获取备份第 3 步存储的数据,并将这些数据放到它们所在的位置,从而回滚任何失败的事务。
我担心的一个问题是,如果某些服务器从集群中分区会发生什么。我在这方面没有经验,我的计划是否有效?如果发生分区,它会起作用吗?
【问题讨论】:
-
我想我得自己找出来告诉你们……
标签: database database-design transactions nosql cassandra