如何检查docker Cassandra实例是否准备好进行连接

时间:2019-03-29 19:49:57

标签: bash spring-boot docker cassandra

我有两个通过docker-compose启动的docker实例。 一个拥有一个Cassandra实例 一个拥有一个Spring Boot应用程序,尝试连接到该应用程序。

但是,Spring Boot应用程序将始终失败,因为它试图连接到尚未准备好进行连接的Cassandra实例。

我尝试过:

  • 使用重新启动:总是在Docker-compose中
    • 这仍然并不总是可行的,因为Cassandra可能已经足够了以至于不再使Spring Boot应用程序崩溃,但是还没有足够的时间来成功创建了Table / Column系列。最重要的是,这是一个非常棘手的解决方案。
  • 使用健康检查
    • 撰写中的运行状况检查似乎没有重启功能
  • 使用bash脚本作为入口点
    • 希望我可以使用netstat,ping等...以确定Cassandra的就绪状态

现在唯一真正有效的方法是使用相同的bash脚本并将进程休眠x秒,然后启动jar。这甚至更hacky ...

有人对如何解决这个问题有想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在docker-compose.yml中定义的spring boot服务 depends_on cassandara服务吗?如果是,则仅在cassandra服务就绪时启动该服务。

https://docs.docker.com/compose/compose-file/#depends_on

看看这个github仓库,找到cassandra服务的运行状况检查。

https://github.com/docker-library/healthcheck

结论

经过一番讨论,我们发现docker-compose似乎不提供等待服务正常运行的功能,例如Kubernetes和Openshift提供(请参阅下面的评论)。他们建议使用包装器脚本(docker-entrypoint.sh),该脚本等待依赖服务出现,这使二进制文件成为必需,但不应使用实际服务,例如cassandra客户端二进制文件。另外,如果不使用cassandra,则取决于cassandra的服务永远都不会启动,这不应该发生。

微服务的主要优点是,它们必须具有一定的弹性以应对故障,并且如果依赖服务当前不可用或意外消失,则不应死亡或不恢复。因此,微服务的实现方式应使其在启动或意外消失后重试以建立连接。 意外是在这种情况下实际上错误使用的词,因为您应该始终在分布式环境中期待此类问题,即使使用docker-compose,您也将面临本主题中讨论的此类问题。

以下链接指向一个教程,该教程有助于将cassandra正确集成到spring boot应用程序中。它提供了一种实现具有重试行为的cassandra连接的检索的方法,因此该服务对不存在的cassandra数据库具有弹性,并且不会再启动失败。希望这对其他人也有帮助。

https://dzone.com/articles/containerising-a-spring-data-cassandra-application