Docker中来自应用程序容器的Cassandra客户端连接问题
我正在运行我的应用程序和一个Cassandra容器,试图建立从应用程序容器到Cassandra容器的连接Docker中来自应用程序容器的Cassandra客户端连接问题,docker,cassandra,docker-compose,Docker,Cassandra,Docker Compose,我正在运行我的应用程序和一个Cassandra容器,试图建立从应用程序容器到Cassandra容器的连接 我试过用docker compose。它抛出同样的错误。它能够解析正确的容器IP(如您所见),但无法连接 我试图通过单独启动cassandra容器并在我的应用程序容器中硬编码IP来运行,但仍然失败 Cassandra容器工作正常,如果我在外部运行相同的应用程序,它会连接 问题是,它无法从应用程序容器解析Cassandra容器IP。不知道为什么 我还启用了start\u rpc,并公开了所有与
我还启用了
start\u rpc
,并公开了所有与cassandra相关的端口。还是没运气 您可以创建Docker网络,并将Cassandra和您的应用程序连接到同一网络
您还需要检查Cassandra正在侦听哪些接口-是单个接口还是所有接口 您可以创建Docker网络,并将Cassandra和您的应用程序连接到同一网络 您还需要检查Cassandra正在侦听哪些接口-是单个接口还是所有接口 发行 [Control connection]在/IP:9042连接上出错,没有更多主机可供尝试 解决方案 愚蠢但重要的检查“应用程序尝试在cassandra启动之前连接” RPC_添加默认IP问题 因为容器有自己的网络。因此,每个容器都有自己的IP。当您的RPC_ADDESS设置为容器IP时,它将通过此错误 在Cassandra配置中,更改 rpc_address(默认值:localhost)客户端的侦听地址 连接(Thrift RPC服务和本机传输)。 有效值:
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.035 [cluster1-nio-worker-0] Connection - Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] Error connecting to /172.17.0.3:9042 (connection timed out: /172.17.0.3:9042)
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.037 [cluster1-nio-worker-0] STATES - Defuncting Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] because: [/172.17.0.3:9042] Cannot connect
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.038 [cluster1-nio-worker-0] STATES - [/172.17.0.3:9042] preventing new connections for the next 1000 ms
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.038 [cluster1-nio-worker-0] STATES - [/172.17.0.3:9042] Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] failed, remaining = 0
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.039 [cluster1-nio-worker-0] Connection - Connection[/172.17.0.3:9042-1, inFlight=0, closed=true] closing connection
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.042 [main] ControlConnection - [Control connection] error on /172.17.0.3:9042 connection, no more host to try
batchWorker_1 | com.datastax.driver.core.exceptions.TransportException: [/172.17.0.3:9042] Cannot connect
batchWorker_1 | at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:165) ~[batch_worker_server.jar:0.01]
batchWorker_1 | at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:148) ~[batch_worker_server.jar:0.01]
...
问题
[Control connection]在/IP:9042连接上出错,没有更多主机可供尝试
解决方案
愚蠢但重要的检查“应用程序尝试在cassandra启动之前连接”
RPC_添加默认IP问题
因为容器有自己的网络。因此,每个容器都有自己的IP。当您的RPC_ADDESS设置为容器IP时,它将通过此错误
在Cassandra配置中,更改
rpc_address(默认值:localhost)客户端的侦听地址
连接(Thrift RPC服务和本机传输)。
有效值:
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.035 [cluster1-nio-worker-0] Connection - Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] Error connecting to /172.17.0.3:9042 (connection timed out: /172.17.0.3:9042)
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.037 [cluster1-nio-worker-0] STATES - Defuncting Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] because: [/172.17.0.3:9042] Cannot connect
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.038 [cluster1-nio-worker-0] STATES - [/172.17.0.3:9042] preventing new connections for the next 1000 ms
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.038 [cluster1-nio-worker-0] STATES - [/172.17.0.3:9042] Connection[/172.17.0.3:9042-1, inFlight=0, closed=false] failed, remaining = 0
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.039 [cluster1-nio-worker-0] Connection - Connection[/172.17.0.3:9042-1, inFlight=0, closed=true] closing connection
batchWorker_1 | [DEBUG] 2017-10-30 12:42:10.042 [main] ControlConnection - [Control connection] error on /172.17.0.3:9042 connection, no more host to try
batchWorker_1 | com.datastax.driver.core.exceptions.TransportException: [/172.17.0.3:9042] Cannot connect
batchWorker_1 | at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:165) ~[batch_worker_server.jar:0.01]
batchWorker_1 | at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:148) ~[batch_worker_server.jar:0.01]
...
rpc_地址:0.0.0.0#rpc#u接口:eth1#rpc#u接口#u首选_ipv6:false rpc#u端口:9160广播#rpc#u地址:172.22.0.2这是我在容器内的cassandra.yaml中的内容。即使我创建网络并在docker compose文件中添加默认外部网络,它仍然无法连接。我的卡桑德拉·亚马尔有什么需要改变的吗@alex-ottrpc_地址:0.0.0.0#rpc#u接口:eth1#rpc#u接口#u首选#u ipv6:false rpc#u端口:9160广播#rpc#u地址:172.22.0.2这是我在容器内的cassandra.yaml中拥有的内容。即使我在docker compose文件中创建网络并添加默认外部网络,它仍然无法连接。我的卡桑德拉·亚马尔有什么需要改变的吗@亚历克斯:我正在尝试。不过,我已经解决了这个问题。如果我使用
--network preexistingnetwork
的预先存在的网络运行我的容器,然后在docker compose中将其作为默认的预先存在的网络与已检查的IP一起提供,那么它可以工作,否则就不能工作。基本上,当通过为cassandra编写文件启动时,网络并没有得到解决。不知道为什么。您的应用程序和cassandra都在同一台服务器上吗?使用一个网络运行cassandra,使用外部网络、本地计算机运行应用程序。仅用于测试目的。如果您可以向我指出任何服务+应用程序docker,请使用网络示例编写v3。如果卡桑德拉的docker compose和应用程序的docker compose都在同一个文件夹中,那就太棒了。当您在文件夹中创建包含compose的容器时,它会创建一个默认为folderName_的网络,如果两个compose文件都位于同一文件夹中,那么它们都将在同一网络下运行。所以需要创建一个外部网络。如果两者都在不同的文件夹中,那么你需要创建一个网络并使其在该网络下运行。我能想到的一个愚蠢的原因是,也许该应用程序会在cassandra启动并运行之前尝试连接。(我添加了链接并依赖于,但我想我还需要添加healthcheck以确保客户端连接是可能的。)我正在尝试这个。不过,我已经解决了这个问题。如果我使用--network preexistingnetwork
的预先存在的网络运行我的容器,然后在docker compose中将其作为默认的预先存在的网络与已检查的IP一起提供,那么它可以工作,否则就不能工作。基本上,当通过为cassandra编写文件启动时,网络并没有得到解决。不知道为什么。您的应用程序和cassandra都在同一台服务器上吗?使用一个网络运行cassandra,使用外部网络、本地计算机运行应用程序。仅用于测试目的。如果您能告诉我任何服务+应用程序docker,请使用networ编写v3