Управление подключениями через datastax/php-драйвер

Как мне управлять общим количеством соединений с datastax/php-driver?

Мы столкнулись с проблемой чрезмерного количества соединений TCP, и мы подозреваем, что это связано с тем, как работает этот драйвер.

Мы переместили драйвер YACassandra PDO на этот. Одна из самых больших проблем, которые я обнаруживаю, заключается в том, что пул соединений будет подключаться к всем серверам в кластере для каждого потока HTTP.

У нас есть 4 коробки в нашем кластере. Это 4 открытых постоянных соединения, на дочерний элемент Apache. Я подозреваю, что это виновник наших бед.

Исторически мы использовали YACassandra PDO, который использовал только одно соединение на поток.

Как мы это оптимизируем? Можно ли как-то помешать datastax/php-drive выполнять обнаружение кластера?


person guice    schedule 12.12.2017    source источник


Ответы (1)


Драйвер автоматически обнаружит узлы в кластере и на основе политики балансировки нагрузки установит соединения с каждым узлом при установлении сеанса (соединения). Чтобы ограничить подключение к определенному хосту, вы можете использовать политика белого списка; однако это не рекомендуется, так как это аннулирует преимущества или запросы на маршрутизацию в случае отказа или недоступности хостов. Политика белого списка имеет свое место, но, на мой взгляд, в основном для целей тестирования.

Другая проблема, которая может возникнуть, связана с разветвлением. Проблема в том, что все дочерние и родительские процессы используют одни и те же базовые сокеты, и для php-драйвера нет переносимого способа справиться с этим. Вот пример того, как вы можете обрабатывать это в своем коде приложения при разветвлении:

$cluster = Cassandra::cluster()->build();

// fork!

if ($pid) { // parent process
    $session = $cluster->connect();

    // do parent stuff
} else { // child process
    $session = $cluster->connect();

    // do child stuff
}
person Fero    schedule 12.12.2017
comment
Все работает нормально, пока не открывается слишком много TCP-соединений, потому что Apache создает новый поток httpd для обработки дополнительных запросов. Моя проблема в том, что мы на самом деле вносим в белый список наши серверные узлы: два для отслеживания, два для отчетов, но это один и тот же кластер. Раньше с PDO потоки открывали отдельное соединение, используя случайное/циклическое соединение с Cassandra. Мне не нравится автообнаружение php-драйвера - person guice; 12.12.2017
comment
Понял. Похоже, вам нужны быстрые соединения, которые быстро исчезают, и это можно сделать с помощью постоянные сеансы и метаданные схемы отключены вместе с политикой белого списка для принудительного подключения к одному узлу. Однако это не идеально, так как может увеличиться количество потоков ввода-вывода и увеличиться время соединения. - person Fero; 12.12.2017
comment
увеличенное количество потоков ввода-вывода и длительное время соединения. -- Это меня беспокоит. На данный момент я отключу метаданные схемы, но оставлю постоянные соединения + белый список, чтобы свести к минимуму влияние tcp. Пока все выглядит стабильно. - person guice; 13.12.2017
comment
Обновление: добавлен белый список, но это не исправило ситуацию. Через несколько минут после добавления в наш кластер сервер полностью сломался. На YACassandra PDO все нормально. Есть ли (все еще поддерживаемое) расширение PDO Cassandra? Наш сервер получает тысячи обращений в минуту, единственное изменение в том, что мы перешли на php-драйвер, по-прежнему используя mod_php. Нам нужен драйвер, который может быстро подключаться и отключаться, например PDO. Наш код должен входить и выходить за миллисекунды, именно для этого и разработана Cassandra. Будет ли это лучше работать под fpm? - person guice; 29.12.2017