Проблема OperationTimedOut с драйвером Cassandra Python

У меня есть скрипт python, который используется для взаимодействия с cassandra с помощью драйвера python datastax

Он работает с 14 марта 2016 года и до сегодняшнего дня не было проблем.

2016-06-02 13:53:38,362 ERROR ('Unable to connect to any servers', {'172.16.47.155': OperationTimedOut('errors=Timed out creating connection (5 seconds), last_host=None',)})
2016-06-02 13:54:18,362 ERROR ('Unable to connect to any servers', {'172.16.47.155': OperationTimedOut('errors=Timed out creating connection (5 seconds), last_host=None',)})

Ниже приведена функция, используемая для создания сеанса и закрытия сеанса (session.shutdown()) каждый раз, когда выполняется запрос. (Каждый день у нас есть только менее 100 запросов со стороны подписчиков, поэтому я выбрал построить соединение, запрос и закройте его вместо того, чтобы оставлять соединение активным)

Сеанс не разделяется между потоками и процессами. Если я вызову приведенную ниже функцию в консоли Python, она правильно соединится с БД, но работающий скрипт больше не сможет подключиться к БД.

Кто-нибудь может помочь или пролить свет на этот вопрос? Спасибо

def get_cassandra_session(stat=None):
    """creates cluster and gets the session base on key space"""
    # be aware that session cannot be shared between threads/processes
    # or it will raise OperationTimedOut Exception
    if config.CLUSTER_HOST2:
        cluster = cassandra.cluster.Cluster([config.CLUSTER_HOST1, config.CLUSTER_HOST2])
    else:
        # if only one address is available, we have to use older protocol version
        cluster = cassandra.cluster.Cluster([config.CLUSTER_HOST1], protocol_version=2)

    if stat and type(stat) == BatchStatement:
        retry_policy = cassandra.cluster.RetryPolicy()
        retry_policy.on_write_timeout(BatchStatement, ConsistencyLevel, WriteType.BATCH_LOG, ConsistencyLevel.ONE,
                                      ConsistencyLevel.ONE, retry_num=0)
        cluster.default_retry_policy = retry_policy
    session = cluster.connect(config.KEY_SPACE)
    session.default_timeout = 30.0
    return session

Спецификации: питон 2.7 Кассандра 2.1.11

Цитаты из документа datastax:

Операция заняла больше времени, чем указанное время ожидания (на стороне клиента). Это не ошибка, сгенерированная Cassandra, а только драйвер.

Проблема в том, что я не трогал драйвер. Я установил тайм-аут по умолчанию на 30,0 секунд, но почему он истекает через 5 секунд (это сказано в журнале)


person Haifeng Zhang    schedule 02.06.2016    source источник


Ответы (2)


Время ожидания подключения по умолчанию составляет пять секунд. В этом случае вам нужно будет установить Cluster .connect_timeout. Сеанс default_timeout применяется к запросам на выполнение.

Это все еще немного удивительно, когда для установления любого TCP-соединения требуется более пяти секунд. Еще одна вещь, которую нужно проверить, это исправление обезьян. Что-то в приложении поменял патчинг для Gevent или Eventlet? Это может привести к изменению поведения драйвера по умолчанию.

person Adam Holmberg    schedule 21.06.2016

Я узнал, что модуль gevent мешает работе модуля cassandra-driver.

  • кассандра-драйвер (3.10)
  • гевент (1.1.1)

Удаление gevent решило проблему для меня

pip uninstall gevent
person Emanuel George Hategan    schedule 12.06.2017