Невозможно подключиться к контейнеру Cassandra на основе Docker - «Все хосты пытались выполнить запрос, не удалось» - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать простое приложение Java, которое может подключаться к Cassandra, работающему внутри контейнера Docker, запущенного на моем локальном компьютере. Да хоть убей не могу заставить его подключиться к контейнеру!

Я запускаю свой контейнер вот так.

docker run -p 9042:9042 cassandra:latest

Мой Java код не очень изящный ..

   private Cluster cluster;
    private Session session;
    String serverIP = "localhost";

    String username = "cassandra";
    String password = "cassandra";
    String keyspace = "DefaultKeyspace";
    public static void main(String[] args) {
        CassandraTest cassandraTest = new CassandraTest();
        cassandraTest.connect("localhost");
    }

    public void connect(String node) {

        try {
            String username = "cassandra";
            String password = "cassandra";
            String keyspace = "DefaultKeyspace";

            cluster = Cluster.builder()
                    .addContactPoints(serverIP).withCredentials(username.trim(), password.trim())
                    .build();

            session = cluster.connect(keyspace);

            //  createSchema();
            Metadata metadata = cluster.getMetadata();
            System.out.println("Connected to cluster:" + metadata.getClusterName());
            for (Host host : metadata.getAllHosts()) {
                System.out.println("Datatacenter: " + host.getDatacenter()
                        + "; Host: " + host.getAddress() + "; Rack: "
                        + host.getRack());
            }
        } catch (Exception e) {

            e.printStackTrace();
        }
        getSession();
        createSchema();
    }

Но нет, что я я продолжаю получать это ..

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table schema_keyspaces))
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:220)
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:78)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1231)
    at com.datastax.driver.core.Cluster.init(Cluster.java:158)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:246)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:279)
    at CassandraTest.connect(CassandraTest.java:37)
    at CassandraTest.main(CassandraTest.java:27)
Exception in thread "main" java.lang.IllegalStateException: Can't use this Cluster instance because it was previously closed
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1213)
    at com.datastax.driver.core.Cluster.init(Cluster.java:158)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:246)
    at CassandraTest.getSession(CassandraTest.java:56)
    at CassandraTest.connect(CassandraTest.java:51)
    at CassandraTest.main(CassandraTest.java:27)

Я также пытался использовать IP-адрес хоста docker. Как заставить его подключиться ??

1 Ответ

0 голосов
/ 13 мая 2020

Вам необходимо использовать IP-адрес вашей docker -машины в качестве хоста cassandra. Если cassandra очистилась, вы сможете использовать cql sh в ней, используя docker -machine ip-адрес.

$ docker-machine ip
123.456.78.99
$ export CQLSH_HOST=123.456.78.99
$ cqlsh -u cassandra

Password:
Connected to Test Cluster at 123.456.78.99:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cassandra@cqlsh>

Поэтому в вашем коде вместо использования localhost попробуйте использовать docker -машина ip

...