我正在为此绞尽脑汁,但是,坦率地说,我的大脑无法理解它 - 或者看起来是这样。
我有一个专栏家族,为相当多的 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/