0

是否有可能使用 datastax 驱动程序写入特定节点?

例如,我在数据中心 1 中有三个节点,在数据中心 2 中有三个节点。

现存的

如果我使用其中任何一个作为种子来构建集群,则 datastax java 驱动程序将检测到所有节点。因此,在这种情况下,如果我使用驱动程序插入数据,它将自动选择其中一个节点并作为协调器继续处理(最好是本地数据中心)

要求

我想要一种方法来联系数据中心 2 中的任何节点并将协调员作业移交给数据中心 2 中的一个节点。

为什么我需要这个

我正在尝试单独使用数据中心 2 的触发功能。由于触发器由 co-ordinator 负责,我希望从数据中心 2 中选择一个 co-ordinator,以便数据中心 1 不必执行此操作。

4

2 回答 2

1

您可以使用DCAwareRoundRobinPolicy负载平衡策略来实现此目的,方法是创建将 DC2 视为“本地”DC 的策略。

Cluster.Builder builder = Cluster.builder().withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("dc2"));

在上面的示例中,远程(非 DC2)节点将被忽略。

驱动程序版本 2.0.2 中还有一个新的 WhiteListPolicy,它包装了另一个负载平衡策略并将节点限制为您提供的特定列表。

Cluster.Builder builder = Cluster.builder().withLoadBalancingPolicy(new WhiteListPolicy(new DCAwareRoundRobinPolicy("dc2"), whiteList));
于 2014-04-03T06:16:06.957 回答
0

对于多 DC 场景,Cassandra 提供 EACH 和 LOCAL 一致性级别,其中 EACH 将确认每个 DC 中的成功操作,而 LOCAL 仅在本地一个中确认。

如果我理解正确,您想要实现的是应用程序中的 DC 故障转移。这不是一个好习惯。假设您的应用程序与 Cassandra 一起托管在 DC1 中。如果 DC1 出现故障,您的整个应用程序将不可用。如果 DC2 出现故障,您的应用程序仍然可以使用 LOCAL CL 进行写入,并且 C* 将在 DC2 恢复时复制更改。

如果要实现高可用性,则需要在每个 DC 中部署应用程序,使用 CL=LOCAL_X,最后在 DNS 级别进行故障转移(例如使用 AWS Route53)。

有关多个 DC 的一致性级别的更多信息,请参阅数据一致性文档此博客文章。

于 2014-04-02T17:14:24.923 回答