DCAwareRoundRobinPolicy行为

时间:2018-09-14 14:28:34

标签: java cassandra-3.0

https://docs.datastax.com/en/developer/java-driver/3.2/manual/load_balancing/说: “该策略以循环方式查询本地数据中心的节点;(可选)如果所有本地主机都发生故障,它还可以尝试在远程数据中心中配置数量的主机。”

为了在生产环境中使用该产品之前进行测试,我创建了4个小型虚拟机(CentOS 7,内存2GB),并在每个DC中安装了2个数据中心群集和2个节点。 然后,在创建了一个连接到该集群的小型Web服务之后,我最终得到了这个结果。

集群具有2个DC:myLocalDC和myLocalDC2 我还启用了驱动程序的调试日志记录。

Cluster cluster = Cluster.builder()
        .addContactPoint("192.168.0.10") // seed node in myLocalDC
        .addContactPoint("192.168.0.12") // seed node in myLocalDC2
        .withLoadBalancingPolicy(
            new TokenAwarePolicy(
                DCAwareRoundRobinPolicy.builder()
                        .withLocalDc("myLocalDC")
                        .withUsedHostsPerRemoteDc(2)
                        .allowRemoteDCsForLocalConsistencyLevel()
                        .build()
            )
        ).build();

这是我针对的标准设置:2个DC,每个DC 2个节点,一个键空间为replication_factor = { 'class' : 'NetworkTopologyStrategy', 'myLocalDC' : 2, 'myLocalDC2' : 2} 使用此设置,每个节点应具有数据的完整复制。 现在,如果我放下1个节点,我认为Web服务将继续工作(并且由于4个完全复制,因此只有1个节点就不会出现问题)。 为此,我在测试查询(选择和插入)上添加了.setConsistencyLevel(ConsistencyLevel.ONE)设置。 然后我尝试关闭myLocalDC2上的1个(然后2个)节点(远程节点),然后所有节点继续工作。

问题:我打开远程节点上的2个节点,然后关闭本地节点上的一个节点 Web应用程序为断开连接的节点接收事件DOWN,并继续正常工作,以便在ConsistencyLevel.ONE进行简单的选择和插入查询。 尝试执行批处理分组2插入(在ConsistencyLevel.ONE上成功执行了相同的查询)给我错误: 关闭本地DC上的Booth节点会产生错误,即使远程DC已启动并正在运行,也无济于事。

问题:如果我没有听错,DCAwareRoundRobinPolicy应该在没有本地可用的情况下使用远程DC,但似乎无法正常工作。 当本地DC变得不可用时,即使在启动时正确列出了所有4个节点,应用程序也不会切换到远程DC。 日志显示,仅针对本地DC尝试了连接,而对远程DC则没有尝试。 .withUsedHostsPerRemoteDc(2)应该如何运作?我尝试使用1或2作为参数,但没有发现任何差异。 我尝试创建的是2 DS设置,每个设置都由多个节点组成。

每个DS用于管理不同的地理区域,但是我希望在本地DC发生故障的情况下,不中断Web服务在远程1个或多个节点上切换服务所提供的服务直流,当本地停机时。

0 个答案:

没有答案