Подключение к кластеру кассандры, развернутому на GCP - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть кластер с 3 узлами, работающий на GCP в Кубернетесе.Я могу перенаправить порт и подключиться с помощью инструмента DB в кластер:

$ kubectl port-forward elassandra-0 9042

Когда я пытаюсь подключиться к кластеру cassandra из приложения Spring Boot, я получаю следующую ошибку:

2018-11-14 17:43:36,339 INFO  [5914] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /10.4.3.3:9042 added
2018-11-14 17:43:36,339 INFO  [5914] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /10.4.2.4:9042 added
2018-11-14 17:43:36,340 INFO  [5915] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /127.0.0.1:9042 added
2018-11-14 17:43:41,391 WARN  [10966] [cluster1-nio-worker-2] c.d.d.c.HostConnectionPool [HostConnectionPool.java:184] Error creating connection to /10.4.2.4:9042

com.datastax.driver.core.exceptions.TransportException: [/10.4.2.4:9042] Cannot connect
at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:167)
at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:150)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:121)

Я пытаюсь подключиться к 127.0.0.1:9042, другие хосты вытягиваются из кластера с помощью Spring-Data Framework.

Что я здесь не так делаю?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Чтобы добавить больше деталей, поскольку у вас включено автоматическое разрешение адресов, ваш клиент пытается добавить точки контакта ко всем узлам в вашем кластере:

10.4.3.3:9042
10.4.2.4:9042
127.0.0.1:9042

Однако 2 верхних узла не могут быть найдены на вашем локальном хосте, поскольку они не проксируются. Если вы добавили их в качестве прокси-серверов, это тоже не сработало бы, потому что вы не можете использовать прокси-сервер на том же порту с вашего ноутбука. Решение, подобное упомянутому @AlexTbk, заключается в использовании единой точки контакта, но с указанием разрешения адреса на клиенте с единственной 127.0.0.1:9042 точкой контакта.

0 голосов
/ 14 ноября 2018

Отвечая на свой вопрос:

Необходимо указать пользовательское разрешение адреса со стороны водителя, как описано здесь:

https://docs.datastax.com/en/developer/java-driver/2.1/manual/address_resolution/

Подробно, если вы хотите использовать только один узел:

public class MyAdressTranslator implements AddressTranslator {
    @Override
    public void init(Cluster cluster) {}

    public InetSocketAddress translate(InetSocketAddress address) {
        return new InetSocketAddress("127.0.0.1", 9042);
    }

    @Override
    public void close() {}
}
...