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个或多个节点上切换服务所提供的服务直流,当本地停机时。