У меня есть сервер с двумя сетевыми интерфейсами. Кассандра прослушивает выделенную внутреннюю сеть базы данных на eth1 (недоступна извне). Итак, я делаю свой туннель так:
ssh -f -N -L9161:192.XXX.XXX.200:9160 user@192.YYY.YYY.200 -P 9922
Где XXX - это внутренняя сеть базы данных, а YYY - это сеть, которую прослушивает ssh. Когда я пытаюсь cqlsh localhost 9161
Я получаю следующее исключение:
Connection error: ('Unable to connect to any servers', {'localhost': ConnectionShutdown('Connection <AsyncoreConnection(139691023521360) localhost:9161 (closed)> is already closed',)})
Но когда я telnet localhost 9161, я успешно получаю оболочку telnet. И конечно кассандра работает.
Есть идеи, как заставить работать туннель?
Вам необходимо проксировать порт 9160 (порт клиента Cassandra) и порт 9042 (собственный порт CQL). Либо запустите два терминала, либо заставьте ssh-клиент работать в фоновом режиме с этими флагами:
ssh -f -N -q -L 9042:192.XXX.XXX.200:9042 user@192.YYY.YYY.200 -P 9922
ssh -f -N -q -L 9160:192.XXX.XXX.200:9160 user@192.YYY.YYY.200 -P 9922
Теперь у вас должна быть возможность подключиться к cqlsh через порт по умолчанию на localhost. Localhost также является хостом по умолчанию.
cqlsh -u [username] -p [password]
У меня была такая же проблема, и это выглядело как несовместимость между cqlsh 5.0.1 (в комплекте с Cassandra 2.1.4, установленным из их официального репозитория APT) и нашими старыми узлами Cassandra 2.0.14 (поставляется с DataStax).
Временное понижение версии до cqlsh 4.1 в комплекте с datastax решило проблему.