当联系节点死亡时,Cassandra的行为如何?我的意思是说,Cassandra具有“n”个节点的环形结构,如果客户端要访问第一个节点但它已经死了。第一个节点在java客户端中指定。 我无法理解故障处理。有谁可以帮助我?
答案 0 :(得分:2)
如果您只有一个节点,或者只指定一个节点,并且该节点已关闭,那么客户端将无法连接(显然);但通常客户端库(如Hector)将允许您指定一组节点并维护一个连接池,连接到哪个节点可用。
Hector documentation更详细一些,但指定多个节点的最简单方法是在创建集群时在CassandraHostConfigurator
中传递以逗号分隔的主机列表:
String hosts = "node1.example.com:9160, node2.example.com:9160, node3.example.com:9160";
Cluster cluster = HFactory.getOrCreateCluster(CLUSTER_NAME, new CassandraHostConfigurator(hosts));
答案 1 :(得分:1)
这取决于客户端,不同的客户端做不同的事情来处理这个问题,但是对于大多数驱动程序,您可以提供多个联系点。
Astyanax 使用令牌发现来跟踪群集中的各种节点。 Full docs here
主机供应商将连接池与动态主机注册表相关联。连接池将经常轮询此供应商以获取当前主机列表,并更新其内部主机连接池以考虑新主机或已删除主机。
这是在您设置上下文时配置的:
AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
...
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)
)
...
context.start();
只要您提供了多个联系点,DataStax java驱动程序就可以很好地处理故障。如果3个节点的SimpleStrategy用于复制,复制因子为3(所有3个节点上都存在所有数据),只要3个节点中有一个存活,就可以查询。
Cluster cluster = Cluster.builder()
.addContactPoint("127.0.0.1")
.addContactPoint("127.0.0.2")
.addContactPoint("127.0.0.3")
.build();
Session session = cluster.connect();