Cassandra 集群密钥用法



我对此感到震惊,但是,坦率地说,我的大脑不会理解它 - 或者看起来是这样。

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

每个作业执行器Actor系统,即实际执行作业的系统,都与一个Cassandra节点一起安装,即在同一节点上。实际上,当然有大师级演员拉动工作并将它们分配给演员经纪人,但这与我的问题无关。

还有一些Actor系统

可以在中央作业表中创建作业,由其他Actor甚至Actor系统执行,但通常作业是批量加载或通过Web界面手动加载的。

要执行作业的参与者总是只查询它的本地 cassandra 节点。如果完成,它将更新作业表以指示它已完成。在正常情况下,此写入也应该只使用作业更新记录,他的本地 Cassandra 节点是权威的。

现在,有时可能会发生给定主机上的参与者系统无关的情况。在这种情况下,它确实也应该从其他节点获取作业,但当然它仍然只会与它的本地 Cassandra 节点通信。我知道这有效,它不会打扰我。

让我夜不能寐的是:

我将如何创建一个复合键来实现 Cassandra 节点的本地权威,用于其本地参与者系统的作业条目,从而成为作业执行参与者,而无需将作业表拆分为多个列系列等?

换句话说:如何创建一个复合键来确保 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: 

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

>Cassandra无法将密钥"固定"到节点上,如果这就是你所追求的。

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

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

另一个值得一提的是原子"比较和交换",也称为轻量级事务。假设您要确保给定作业仅执行一次。 您可以添加一个字段,指示作业是否已被"拾取",然后查询该字段(where picked_up = 0),同时(原子地)更新该字段以指示您正在"拾取"该工作。 这样就不会有其他演员再拿起它了。

有关轻量级交易的信息,请访问:http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html

相关内容

  • 没有找到相关文章

最新更新