Cassandra集群密钥用法

时间:2015-03-13 22:14:28

标签: cassandra akka-cluster compound-key cassandra-2.1 clustering-key

我对此表示不满,但是,坦率地说,我的大脑不会得到它 - 或者看起来如此。

我有一个专栏,为一大群演员提供工作。它是一个中央作业管理和调度表,必须在整个集群中分发和使用,甚至可能在不久的将来某天跨越数据中心障碍。

每个作业执行者actor系统,即实际执行作业的系统,都与一个Cassandra节点一起安装 - 即在同一节点上。实际上当然有一个主要的演员拉动工作并将它们分发给演员代理,但这与我的问题无关。

还有一些actor系统可以在中央作业表中创建作业,由其他演员甚至演员系统执行,但通常可以批量加载作业或通过Web界面手动加载作业。

执行作业的actor总是只查询它的本地cassandra节点。如果完成,它将更新作业表以指示它已完成。在正常情况下,此写入也应仅更新包含其本地Cassandra节点权威的作业的记录。

现在,有时可能会发生给定主机上的actor系统无关。在这种情况下,它确实应该从其他节点获得作业,但当然它仍然只能与它的本地Cassandra节点对话。我知道这很有效,但它并没有让我感到烦恼。

让我夜不能寐的是:

如何创建复合键以实现Cassandra节点的本地权威,以获取其本地actor系统的作业条目,从而实现其作业执行actor,而无需在多列中拆分作业表家庭之类的?

换句话说:我如何创建一个复合键,以确保a)作业通过我的集群均匀分布 b)作业表上的本地查询仅返回此Cassandra节点具有权威性的作业 c)我的分布式代理系统仍有可能从其他节点获取作业,以防它没有自己的作业来执行???

上面c)的最后一句话。如果没有本地工作,我不想做2个查询,但仍然只有!

有关此的任何提示吗?

这是目前作业表的一般结构:

ClusterKey    UUID: Primary Key
JobScope    String: HOST / GLOBAL / SERVICE / CHANNEL
JobIdentifier    String: Web-Crawler, Twitter
Description    String: 
URL    String:
JobType    String: FETCH / CLEAN / PARSE /
Job    String: Definition of the job
AdditionalData    Collection: 
JobStatus      String: NEW / WORKING / FINISHED 
User    String: 
ValidFrom    Timestamp: 
ValidUntill    Collection: 

仍在设置所有内容的过程中,因此到目前为止还没有定义查询。但是一个演员会从中取出工作并设置状态,所以

1 个答案:

答案 0 :(得分:2)

Cassandra无法固定"节点的关键,如果那是你所追求的。

如果我是你,我不再担心我的本地节点是否对某些数据集具有权威性,并开始利用Cassandra中的内置一致性控件来管理您从中读取的节点集或者写信给。

有关读取一致性和写入一致性的大量信息 - 使用正确的一致性将确保您的应用程序在保持逻辑正确的同时进行良好的扩展:http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html

值得一提的另一个项目是atomic"比较和交换",也称为轻量级交易。我们假设你想确保给定的工作只执行一次。您可以添加一个字段,指示作业是否已被拾取",然后查询该字段(where picked_up = 0)并同时(并原子地)更新字段以指示您是" ;拾起"那工作。这样,没有其他演员会再次接受它。

此处有关轻量级交易的信息:http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html