如何检查docker cassandra示例是否准备好进行连接

cidc1ykv  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(313)

我用docker compose启动了两个docker示例。一个持有一个cassandra示例,一个持有一个spring引导应用程序,该应用程序试图连接到该应用程序。
但是,spring启动应用程序总是会失败,因为它试图连接到一个cassandra示例,而这个示例还没有准备好进行连接。
我试过:
使用restart:always in Docker
这仍然不总是有效的,因为cassandra可能已经“足够”了,不再使spring启动应用程序崩溃,但还没有“足够”成功创建表/列族。除此之外,这是一个非常棘手的解决方案。
使用healthcheck
似乎healthcheck-in-compose没有重启功能
使用bash脚本作为入口点
希望我能使用netstat,ping,。。。无论什么决定了Cassandra的准备状态
现在唯一真正有效的方法就是使用相同的bash脚本,将进程休眠x秒,然后启动jar。这是更黑客。。。
有人知道怎么解决这个问题吗?
谢谢!

jobtbby3

jobtbby31#

docker-compose.yml中定义的spring引导服务是否依赖于cassandara服务?如果是,则只有在cassandra服务就绪时才启动服务。
https://docs.docker.com/compose/compose-file/#depends_on
看看这个github存储库,找到cassandra服务的健康检查。
https://github.com/docker-library/healthcheck

结论

经过一番讨论,我们发现docker compose似乎没有提供等待服务正常运行的功能,比如kubernetes和openshift provide(参见下面的注解)。他们建议使用 Package 器脚本(docker entrypoint.sh),它等待依赖的服务出现,这使得需要二进制文件,而实际的服务不应该使用诸如cassandra客户端二进制文件。另外,如果cassandra不提供服务,依赖于cassandra的服务就永远无法提供,这是不应该发生的。
微服务的一个主要特点是,它们必须具有故障恢复能力,并且在依赖服务当前不可用或意外消失时,它们不应该死亡或不出现。因此,微服务的实现方式应该使它在启动或意外消失后重试获取连接。unexpected是一个在这个上下文中被错误使用的词,因为在分布式环境中,您应该总是预料到这样的问题,即使使用docker compose,您也会遇到本主题中讨论的那样的问题。
下面的链接指向一个教程,该教程有助于将cassandra正确地集成到spring引导应用程序中。它提供了一种实现具有重试行为的cassandra连接检索的方法,因此该服务对不存在的cassandra数据库具有弹性,并且不会再启动失败。希望这对其他人也有帮助。
https://dzone.com/articles/containerising-a-spring-data-cassandra-application

相关问题