问题描述
我在kubernetes中部署了一个应用程序,它由cassandra,一个go客户端和一个Java客户端组成(以及其他内容,但它们与本讨论无关)。 我们使用头盔来进行部署。 我们正在为Cassandra使用状态集和无头服务。 我们已将客户端配置为使用无头服务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,因此我尚未确认其在预期端口上的监听状态。
通过在两个客户端容器上执行bash,我可以看到使用nslookup的dns是有意义的,但是... netstat没有显示与cassandra的任何已建立的连接(在我断开节点之前它们已经存在)
如果我重新启动客户端,一切正常。
我在Google上搜索了很多(我的意思是很多),我发现的大多数与从未建立联系有关,最相关的东西似乎很陈旧(例如2014年,2016年)。
因此,出现故障的节点是非常基本的,我希望一切正常,cassandra群集进行自我管理,在新节点联机时发现新节点,平衡负载等。
如果我将所有cassandra节点一次缓慢地放下,一切正常(我尚未确认负载是否已正确分配到正确的节点上,但至少可以正常工作)
那么,在某种程度上可以预期这种行为吗?也就是说,我已经关闭了所有设备,在关闭第一个集群中的最后一个之前,什么也没有启动并运行..这是预期的行为吗?
在我看来,这似乎应该是一个容易解决的问题,不确定什么丢失/不正确,我很惊讶两个客户都表现出相同的症状,这让我认为我们的状态和服务没有发生任何事情
解决方法
我认为问题可能出在无头的DNS服务上。如果所有节点完全崩溃,并且在更换吊舱之前根本没有任何节点可通过该服务使用,则可能导致驱动程序挂起。
我注意到您已经在部署中使用了Helm,但是您可能对this document感兴趣,因为 cass-operator 的作者连接到Kubernetes中的Cassandra集群。
我将联系一些作者,并让他们在这里回复。干杯!