Cassandra集群 key 使用

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

我正在为此绞尽脑汁,但是,坦率地说,我的大脑无法理解它 - 或者看起来是这样。

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

每个作业执行者参与者系统(实际执行作业的系统)都与一个 Cassandra 节点一起安装 - 即在同一节点上。实际上,当然有一个主 Actor 将工作分配给 Actor 代理,但这与我的问题无关。

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

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

现在,有时可能会发生给定主机上的 Actor 系统无事可做的情况。在这种情况下,它确实也应该从其他节点获取作业,但当然它仍然只会与本地 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: 

仍在设置所有内容,因此到目前为止尚未定义查询。但是 Actor 会从中提取工作并设置状态等等

最佳答案

Cassandra 无法将 key “固定”到节点,如果这就是您想要的。

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

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

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

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

关于Cassandra集群 key 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042860/

相关文章:

go - 使用 Cassandra GOCQL 驱动程序 (Golang) 确定页面状态

java - 从外部调用 akka actor 非常慢

java - JPA 中的复合键

cassandra - 删除 Cassandra 连接作为硬 Spring 启动依赖项

group-by - Cassandra 分组依据和过滤结果

java - 如何用 Direct Spark Cassandra 表数据操作替换 JAVA 循环

scala - 如何在 Akka Cluster 中测试订阅者的接收方法?

Kubernetes - Akka 集群部署

grails - 复合键逆向工程 grails pulgin 问题

SQL复合键