我在 kubernetes 中部署了一个应用程序,它由 cassandra、一个 go 客户端和一个 java 客户端(以及其他东西,但它们与本次讨论无关)组成。我们使用 helm 进行部署。我们正在为 cassandra 使用有状态集和无头服务。我们已将客户端配置为使用无头服务 dns 作为集群创建的联系点。
一切都很好。直到所有节点都关闭,或者其他一些邪恶的节点组合关闭,我通过在所有 cassandra 节点上连续使用 kubectl delete 删除所有 pod 来模拟它。
当我这样做时,客户端在 java 中抛出 NoHostAvailableException
"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 status 节点似乎很好,所有新的 ips 都在那里我使用的图像没有 netstat 所以我还没有确认它在预期的端口上侦听。
通过在两个客户端 pod 上执行 bash,我可以看到使用 nslookup 的 dns 是有意义的,但是... netstat 没有显示任何与 cassandra 建立的连接(它们在我关闭节点之前就存在)
如果我重新启动客户端,一切正常。
我用谷歌搜索了很多(我的意思是很多),我发现的大部分内容都与从未有过工作连接有关,最相关的事情似乎很老(比如 2014 年、2016 年)。
所以一个节点宕机是非常基本的,我希望一切都能正常工作,cassandra集群自行管理,它在新节点上线时发现它们,平衡负载等等。
如果我将我所有的 cassandra 节点慢慢放下,一次一个,一切正常(我还没有确认负载是否正确分配到正确的节点,但至少可以正常工作)
那么,是否存在预期这种行为的点?即我已将所有内容都删除,在第一个集群的最后一个被删除之前没有任何东西启动和运行.. 这种行为是预期的吗?
对我来说,这似乎是一个容易解决的问题,不确定有什么遗漏/不正确,我很惊讶两个客户都表现出相同的症状,这让我觉得我们的 statefulset 和服务没有发生什么