2016-09-14 9 views
0

Я бегу веб-приложение, используя следующие компоненты:Кассандру не удалось создать пул соединений для нового хозяина

  • Python 3.5.2
  • uWSGI 2.0.11.2
  • Cassandra-водитель 3.6.0
  • Cassandra 3,7

С кластера Cassandra (3 узлов):

  • Узел 1 - IP: 172.17.0.4
  • Узел 2 - IP: 172.17.0.5
  • Узел 3 - IP: 172.17.0.6

Используя конфигурацию NetworkTopolo gyStrategy и GossipingPropertyFileSnitch.

Я следовал uWSGI connection example from cqlengine:

from cqlengine import connection 
from cassandra.io.libevreactor import LibevConnection 
from cqlengine.connection import (
    cluster as cql_cluster, 
    session as cql_session 
) 


try: 
    from uwsgidecorators import postfork 
except ImportError: 
    # We're not in a uWSGI context, no need to hook Cassandra session 
    # initialization to the postfork event. 
    pass 
else: 
    @postfork 
    def cassandra_init(): 
     """ Initialize a new Cassandra session in the context. 

     Ensures that a new session is returned for every new request. 
     """ 
     if cql_cluster is not None: 
      cql_cluster.shutdown() 
     if cql_session is not None: 
      cql_session.shutdown() 

     connection.setup(
      ['172.0.4'], 
      'my_keyspace', 
      port=9042, 
      connection_class=LibevConnection 
     ) 

Но я получаю сообщение об ошибке "Не удалось создать пул соединений для нового хозяина хххх" на всех узлах Cassandra (172.17.0.4, 172.17. 0,5 и 172.17.0.6):

Respawned uWSGI worker 2 (new pid: 90) 
mapping worker 2 to CPUs: 3 4 5 
2016-09-14 21:00:47,434 WARNI [cassandra.cluster][Thread-2] Failed to create connection pool for new host 172.17.0.4: 
Traceback (most recent call last): 
    File "cassandra/cluster.py", line 2232, in cassandra.cluster.Session.add_or_renew_pool.run_add_or_renew_pool (cassandra/cluster.c:38826) 
    File "cassandra/pool.py", line 328, in cassandra.pool.HostConnection.__init__ (cassandra/pool.c:6243) 
    File "cassandra/cluster.py", line 1107, in cassandra.cluster.Cluster.connection_factory (cassandra/cluster.c:14943) 
    File "cassandra/connection.py", line 330, in cassandra.connection.Connection.factory (cassandra/connection.c:5766) 
cassandra.OperationTimedOut: errors=Timed out creating connection (5 seconds), last_host=None 
2016-09-14 21:00:47,437 WARNI [cassandra.cluster][Thread-1] Failed to create connection pool for new host 172.17.0.6: 
Traceback (most recent call last): 
    File "cassandra/cluster.py", line 2232, in cassandra.cluster.Session.add_or_renew_pool.run_add_or_renew_pool (cassandra/cluster.c:38826) 
    File "cassandra/pool.py", line 328, in cassandra.pool.HostConnection.__init__ (cassandra/pool.c:6243) 
    File "cassandra/cluster.py", line 1107, in cassandra.cluster.Cluster.connection_factory (cassandra/cluster.c:14943) 
    File "cassandra/connection.py", line 330, in cassandra.connection.Connection.factory (cassandra/connection.c:5766) 
cassandra.OperationTimedOut: errors=Timed out creating connection (5 seconds), last_host=None 
...The work of process 19 is done. Seeya! 
worker 7 killed successfully (pid: 19) 

Accordin г журналов это возможность подключения к узлам, но по какой-то причине швов отключиться и выбросить предыдущие ошибки:

2016-09-15 23:23:03,786 DEBUG [cassandra.pool][Thread-2] Initializing connection for host 172.17.0.4 
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Not sending options message for new connection(139905425534704) to 172.17.0.4 because compression is disabled and a cql version was not specified 
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Sending StartupMessage on <LibevConnection(139905425534704) 172.17.0.4:9042> 
2016-09-15 23:23:03,787 DEBUG [cassandra.connection][Thread-2] Sent StartupMessage on <LibevConnection(139905425534704) 172.17.0.4:9042> 
2016-09-15 23:23:03,788 DEBUG [cassandra.connection][event_loop] Got ReadyMessage on new connection (139905425534704) from 172.17.0.4 
2016-09-15 23:23:03,788 DEBUG [cassandra.pool][Thread-2] Finished initializing connection for host 172.17.0.4 
2016-09-15 23:23:03,788 DEBUG [cassandra.cluster][Thread-2] Added pool for host 172.17.0.4 to session 
2016-09-15 22:24:29,239 DEBUG [cassandra.io.libevreactor][Thread-2] Closing connection (139945376028152) to 172.17.0.4 
2016-09-15 22:24:29,240 DEBUG [cassandra.io.libevreactor][Thread-2] Closed socket to 172.17.0.4 
2016-09-15 22:24:29,240 DEBUG [cassandra.connection][Thread-2] Connection to 172.17.0.4 was closed during the startup handshake 
2016-09-15 22:24:29,242 WARNI [cassandra.cluster][Thread-2] Failed to create connection pool for new host 172.17.0.4: 

редактируется (Добавлено более отладки информации о выпуске)

приложения может ping любой из узлов на порту 9042, так что это не проблема подключения. Если я бегу nodetool status три узла в кластере, кажется, хорошо:

-- Address  Load  Tokens  Owns (effective) Host ID        Rack 
UN 172.17.0.5 111.72 KiB 256   67.3%    fdd4740d-1ce5-4deb-9a3e-5c18c80ee63e rack1 
UN 172.17.0.4 98.96 KiB 256   66.8%    4fe5a60c-2b6a-4d57-ab6a-e4176ce69b68 rack1 
UN 172.17.0.6 94.67 KiB 256   66.0%    5e2675e3-c2a7-4af1-80f0-4cb9573ecf2b rack1 

Я попытался с Кассандрой 3,7 и 2.2.7 но получать те же результаты. Но если я попытаюсь запустить приложение только с Node1, он работает!

Бревна в Кассандре узлах отображает следующее:

INFO 22:14:33 Unexpected exception during request; channel = [id: 0xd6d3c9ae, L:/172.17.0.6:9042 ! R:/172.17.0.5:42944] 
io.netty.channel.unix.Errors$NativeIoException: syscall:read(...)() failed: Connection reset by peer 
INFO 22:16:26 Unexpected exception during request; channel = [id: 0x2cfa996f, L:/172.17.0.6:9042 - R:/172.17.0.5:42954] 
io.netty.channel.unix.Errors$NativeIoException: syscall:read(...)() failed: Connection reset by peer 
INFO 22:54:13 Unexpected exception during request; channel = [id: 0x4134ec0f, L:/172.17.0.6:9042 ! R:/172.17.0.5:42992] 

Знает ли кто-то, что здесь происходит? Любая помощь будет оценена по достоинству.

ответ

2

Обратите внимание, что ping не является TCP, поэтому вы также можете проверить TCP с помощью nc -nz <ip> 9042. Однако, поскольку вы получаете тайм-ауты, а не «Connection Refused», я предполагаю, что это не подключение.

Главное, что вы должны проверить, является ли ваша конфигурация uWSGI активированной патчей обезьян (например, gevent). Libevreactor, используемый в этом примере, использует стандартные библиотеки и не предполагает патчей.

Я думаю, что вы сможете решить эту проблему, отключив исправление или удалив явный параметр connection_class, и в этом случае драйвер обнаружит исправление и по умолчанию реализацию реактора соответственно.

+0

Спасибо за помощь @ Адам Хольмберг, я очень ценю это. Я попытался использовать 'AsyncoreConnection' вместо' LibevConnection', но все равно получаю ту же проблему. Я не использую никаких патчей обезьян на моем uWSGI (если он не активируется по умолчанию в версии uWSGI ** 2.0.11.2 **). Когда я запускаю 'nodetool status', я вижу, что 3 узла правильно отображаются в кластере. – Ander

+1

Странно. Это почти всегда комбинация патчей/реакторов. Попробуйте выполнить печать 'connection.cluster.connection_class' после настройки. Правильно ли это? Можете ли вы убедиться, что socket.socket является socket._socketobject, а не исправленным ref? Включить ведение журнала отладки для драйвера? Вы пытались написать сценарий для подключения внешнего контекста uWSGI? –

+0

Я пробовал 'connection.Cluster.connection_class' и, похоже, использует ** cassandra.io.libevreactor **, даже когда я передаю param ** connection_class = AsyncoreConnection **! Поэтому я предполагаю, что этот параметр был удален из драйвера в некоторых из последних версий. Из 'socket.socket' я получаю' '. Я попытался удалить libev с моего сервера, чтобы проверить, не отступит ли он от Asyncore, но не удастся, он сработает: 'ImportError: расширение C, необходимое для использования libev, не было найдено. ' – Ander

 Смежные вопросы

  • Нет связанных вопросов^_^