我在kubernetes中部署了一个应用程序,它由cassandra、一个go客户机和一个java客户机(以及其他一些东西,但它们与本文无关)组成。我们已经用赫尔姆号进行了部署。我们正在为cassandra使用有状态集和无头服务。我们已经将客户机配置为使用无头服务dns作为集群创建的联系点。
一切都很好。在所有的节点都崩溃之前,或者其他一些节点的邪恶组合崩溃之前,我将通过使用kubectl delete在所有cassandra节点上连续删除所有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,所有新的ip都在那里我使用的映像没有netstat,所以我还没有确认它在预期的端口上侦听。
通过在两个客户端pod上执行bash,我可以看到使用nslookup的dns是有意义的,但是。。。netstat没有显示到cassandra的任何已建立的连接(它们在我取下节点之前就存在了)
如果我重启我的客户一切正常。
我在google上搜索了很多(我的意思是很多),我发现的大部分东西都与从未有过工作联系有关,最相关的东西似乎非常古老(比如2014年、2016年)。
所以一个节点崩溃是非常基本的,我希望一切都能正常工作,cassandra集群管理自己,它在新节点上线时发现新节点,平衡负载,等等。
如果我把所有的cassandra节点慢慢地放下,一次一个,一切都正常(我还没有确认负载是否被适当地分配到了正确的节点,但至少它工作了)
那么,这种行为在什么时候是可以预期的呢?(我已经把所有的东西都取下来了,在第一个集群的最后一个被取下来之前,没有任何东西启动和运行。)。。这种行为是预期的吗?
对我来说,这似乎应该是一个很容易解决的问题,不知道什么遗漏/不正确,我很惊讶,两个客户端显示相同的症状,使我认为我们的statefulset和服务没有发生什么事情
1条答案
按热度按时间oipij1gg1#
我想问题可能出在无头dns服务上。如果所有节点都完全关闭,并且在更换pod之前根本没有节点可通过服务使用,则可能会导致驱动程序挂起。
我注意到您已经在部署中使用了helm,但是您可能对这个文档感兴趣,因为它是从cass操作符的作者那里连接到kubernetes中的cassandra集群的。
我要联系一些作者,让他们在这里回复。干杯!