Назад | Перейти на главную страницу

Множество одновременных подключений к базе данных Cassandra через туннель SSH

У меня есть приложение, которое использует клиент PyCassa Cassandra для открытия множества одновременных подключений к серверу Cassandra. Когда я запускаю клиентское приложение локально на сервере базы данных, оно работает. Однако, когда я перенаправляю порт Cassandra через туннель ssh на сервер базы данных и подключаю клиентское приложение к серверу через этот туннель, несколько подключений проходят, но обычно я получаю такие ошибки:

'2012210105:49:49'|WARNING |_append_historyStorage|75  |Exception when appending to CassandraTimeSeries
Traceback (most recent call last):
  File "atr/cassandratimeseries.py", line 140, in append
    cf = self._getColumnFamily(duration, 'main')
  File "atr/cassandratimeseries.py", line 63, in _getColumnFamily
    return ColumnFamily(ConnectionPool(self._keyspace, pool_timeout=100, timeout=15, max_overflow=5), self._columnFamilyName(duration, table_type), **self._column_family_op_options)
  File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 356, in __init__
    self.fill()
  File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 415, in fill
    conn = self._create_connection()
  File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 403, in _create_connection
    (exc.__class__.__name__, exc))
AllServersUnavailable: An attempt was made to connect to each of the servers twice, but none of the attempts succeeded. The last failure was TTransportException: TSocket read 0 bytes

На терминале, где я был подключен к серверу по ssh, печатается строка сообщений вроде:

channel 1034: open failed: administratively prohibited: open failed
channel 1035: open failed: administratively prohibited: open failed
channel 1036: open failed: administratively prohibited: open failed
channel 1037: open failed: administratively prohibited: open failed
channel 1038: open failed: administratively prohibited: open failed
channel 1039: open failed: administratively prohibited: open failed
channel 1040: open failed: administratively prohibited: open failed

Интересно, что если я затем попытаюсь подключиться к серверу по ssh, я получу:

channel 1023: chan_read_failed for istate 1
channel 1023: chan_write_failed for ostate 3
Shared connection to xx.xxx.xxx.xxx closed.

Если я удалю главный файл сокета в / tmp, я снова могу использовать ssh.

Есть идеи, что может пойти не так? Я уже увеличил лимит nofile через /etc/security/limits.conf как для клиента, так и для сервера (до десяти тысяч) и перезагрузился. Фраза «Ошибка открытия: административно запрещена» предполагает, что достигнут административный предел. Что это такое и как его поднять (и как я должен был в этом разобраться?)

Есть ли другие способы, которыми ssh-туннели более ограничены, чем подключение к локальному порту?

Спасибо

Интересно, я с этим раньше не сталкивался. Я бы попробовал то, что вы уже сделали, для следующих шагов я преследовал сообщение «административно запрещено» в источнике ssh, это происходит только в одном случае, и оно возникает в sshd.c, оттуда я следовал логике в channels.c и session.c

Похоже, это единственный код в SSH, который снимает ограничения на количество разрешенных каналов, нет жесткого ограничения, которое я вижу в sshd.c или channels.c.

/* setup the channel layer */
if (!no_port_forwarding_flag && options.allow_tcp_forwarding)
    channel_permit_all_opens();

Можете ли вы проверить свой sshd_config на сервере и убедиться, что установлен следующий параметр:

AllowTcpForwarding yes

Что мне не нравится в моем ответе, так это то, что где-то есть предел в 1024, который я ожидал бы проследить в коде. 1024 часто является пределом по умолчанию для количества открытых файлов в limits.conf - есть ли еще где-нибудь в оболочке, из которой запускается sshd, устанавливается ulimit?