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