我在kubernetes中部署了一个应用程序,它由cassandra、一个go客户端和一个java客户端组成(还有其他东西,但它们与本讨论无关(。我们用舵手进行部署。我们正在为cassandra使用有状态集合和无头服务。我们已经将客户端配置为使用headless服务dns作为创建集群的联系点。
一切都很好。在所有节点都关闭之前,或者其他一些邪恶的节点组合关闭之前,我通过在所有cassandra节点上连续使用kubectl delete删除所有pod来模拟它。
当我这样做时,客户端抛出NoHostAvailableException在java中它的
"java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.200.23.151:9042 (com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency LOCAL_QUORUM (1 required but only 0 alive)), /10.200.152.130:9042 (com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency ONE (1 required but only 0 alive)))"
which eventually becomes
"java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)"
in go its
"gocql: no hosts available in the pool"
我可以使用cqlsh查询cassandra,使用nodetool状态节点似乎很好,所有新的ip都在那里我正在使用的映像没有netstat,所以我还没有确认它在预期端口上侦听。
通过在两个客户端pod上执行bash,我可以看到使用nslookup的dns是有意义的,但是。。。netstat没有显示到cassandra的任何已建立的连接(在我关闭节点之前,它们已经存在(
如果我重新启动我的客户,一切都很好。
我在谷歌上搜索了很多(我的意思是很多(,我发现的大部分都与从未有过工作联系有关,最相关的事情似乎很古老(比如2014年、2016年(。
因此,节点宕机是非常基本的,我希望一切都能正常工作,cassandra集群自我管理,在新节点上线时发现新节点,平衡负载等。
如果我慢慢放下我的所有cassandra节点,一次一个,一切都很好(我还没有确认负载是否适当分配到正确的节点,但至少它能工作(
那么,这种行为在某种程度上是意料之中的吗?ie我已经把所有东西都取下来了,在第一个集群的最后一个被取下来之前,什么都没有启动和运行。。这种行为是意料之中的事吗?
对我来说,这似乎是一个很容易解决的问题,不确定遗漏/不正确的地方,我很惊讶两个客户都表现出了相同的症状,这让我认为我们的状态设置和服务没有发生什么
我认为问题可能在于无头DNS服务。如果所有节点都完全关闭,并且在更换pod之前,服务根本没有可用的节点,这可能会导致驱动程序挂起。
我注意到您已经在部署中使用了Helm,但您可能对cass操作符的作者提供的连接Kubernetes中Cassandra集群的文档感兴趣。
我会联系一些作者,让他们在这里回复。干杯