2

我正在努力解决这个问题,但坦率地说,我的大脑无法理解——至少看起来是这样。

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

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

还有一些参与者系统可以在中央作业表中创建作业以供其他参与者甚至参与者系统执行,但通常这些作业是批量加载或通过 Web 界面手动加载的。

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

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

让我彻夜难眠的是:

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

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

关于上面 c) 的最后一句话。在没有本地工作的情况下,我不想做 2 次查询,但仍然只有 on!

对此有任何提示吗?

到目前为止,这是作业表的一般结构:

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: 

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

4

1 回答 1

2

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

于 2015-03-14T13:41:15.407 回答