我安装了Cassandra集群和Zookeeper服务器。现在我想使用zookeeper支持cassandra中的事务。我怎么做。
Zookeeper创建znode以执行读取和写入操作,数据来回通过Zookeeper中的znodes。我想知道如何使用Zookeeper支持cassandra中的回滚和提交功能。有没有什么办法可以在cassandra中的zookeeper或zookeeper配置中指定cassandra配置。
我单独了解cassandra和zookeeper如何读取和写入数据,但我不知道如何使用Java集成它们。
我们如何使用Zookeeper在Cassandra进行交易。
感谢。
答案 0 :(得分:20)
我安装了Cassandra集群和Zookeeper服务器。现在我想使用zookeeper支持cassandra中的事务。我该怎么做。
很难。 Cassandra作为交易系统不能很好地运作。写入多行不是原子行,如果某些写入失败,则无法回滚写入,并且无法确保读者在读取时读取一致的视图。
我想知道如何使用Zookeeper支持cassandra中的回滚和提交功能。
Zookeeper不会帮助您,特别是提交功能。您可以向zookeeper写入足够的信息以便在发生故障时回滚,但如果您这样做,您也可以将回滚信息存储在cassandra中。
当您使用Zookeeper作为锁定服务时,Zookeeper和Cassandra可以很好地协同工作。查看Cages库。使用zookeeper协调对cassandra的读/写。
尝试使用cassandra作为事务系统,对多行和回滚进行原子提交将会非常令人沮丧。
答案 1 :(得分:1)
有些方法可以用来在没有ZooKeeper的情况下在Cassandra中实现事务。
Cassandra本身有一个名为Lightweight transactions的功能,它提供每个键的线性化和比较和设置。使用这些原语,您可以自己在应用程序级别实现可序列化的事务。
有关详细信息和逐步可视化,请参阅Visualization of serializable cross shard client-side transactions帖子。
此方法的变体用于Google的Percolator系统和CockroachDB。
顺便说一句,如果你对Read Committed隔离级别没问题,那么看看Peter Bailis撰写的RAMP transactions论文是否合理。
答案 2 :(得分:0)
Cassandra的CQL3有一个BATCH功能(Cassandra 1.2是发布CQL3的正式版本),据称可以原子地将BATCH中的所有更新作为一个单元全部或全部应用。
这并不意味着您可以像RDBMS那样回滚成功执行的BATCH,而这必须是手动完成的。
根据您提供给BATCH语句的一致性和首选项,可以使用UNLOGGED选项在一定程度上增加或减少更新的原子性保证。
答案 3 :(得分:0)
好吧,我不是这个(实际上远远不是)的代理人,但是我看到它的方式,你要么部署一些自己制作的中间件,以保证你正在寻找的特定属性,或者你可以让Cassandra将数据写入辅助文件,然后通过文件系统复制它们,因为Java中的复制函数可以作为原子操作。
我对你正在考虑的数据文件的大小一无所知,所以我真的不知道它是否可行,但是可能有办法通过较小的信息使用这个属性,然后将它们组合起来作为一个整体。
只是我的2美分......