Отказоустойчивость кластера Apache Cassandra 2.1.11 не работает с драйвером PHP datastax

Я новичок в Кассандре, но у меня есть опыт работы с Nosql и высокая доступность с другими технологиями. Несколько дней назад я установил Cassandra 3.0, но, похоже, PHP-драйвер Datastax его вообще не поддерживает! Поэтому я опустился до версии 2.1.11 и написал простой php-скрипт для запроса его с помощью php-драйвера Datastax, и он работает так, как и должно быть.

<?php

try {
    $cluster   = Cassandra::cluster()
                    ->withContactPoints('127.0.0.1')
                     ->build();
    $keyspace  = 'mykeysssspace';
    $session   = $cluster->connect($keyspace);
    $statement = new Cassandra\SimpleStatement('SELECT userid, created_date, email FROM users');
    $future    = $session->executeAsync($statement);
    $result    = $future->get();
    foreach ($result as $row) {

        printf("userId: %s, email: %s\n", $row['userid'], $row['email']);
    }
}catch(Exception $e) {

    print $e->getMessage();
}
?>

Затем я запустил два экземпляра Cassandra на одной машине (Ubuntu 11.10!), Используя разные IP-адреса. Затем изменил код php:

$cluster   = Cassandra::cluster()
                    ->withContactPoints('127.0.0.1', '127.0.0.2')
                     ->build();

Проблема в том, что пока оба экземпляра работают, все работает как положено, а php выдает ожидаемые результаты. Но когда я останавливаю один из случаев (неважно, какой), это дает

Все хосты в текущей политике пытались и были недоступны или не удалось

Даже если я вернусь к

$cluster   = Cassandra::cluster()
                    ->withContactPoints('running_instance_ip')
                     ->build();

это дает мне ту же ошибку. Но cqlsh работает в любом сценарии.

Это что-то о драйвере Datastax php?

3 ответа

Какой фактор репликации вы используете в вашем пространстве ключей? Если вы используете RF=1, ошибка может указывать на то, что хостов недостаточно для выполнения всех диапазонов. Повышение коэффициента репликации поможет решить эту проблему.

В моем случае я выполнял тест в изолированной среде с ОДНЫМ узлом, но я настраивал контекст с коэффициентом репликации 2. Таким образом, некоторые функции не будут работать с таймаутом, так как он никогда не сможет завершить ожидание другого -существующие узлы должны быть обновлены вовремя.

Поэтому одно из решений - убедиться, что ваш коэффициент репликации не превышает количество узлов в вашем кластере (и да, я не понимаю, почему Cassandra не может просто сказать нам: RF слишком велика как ошибка).

Вы можете попробовать повторить политику

$retry_policy = new Cassandra\RetryPolicy\DowngradingConsistency();
$cluster     = Cassandra::cluster()
                 ->withContactPoints('127.0.0.1','127.0.0.2')
                 ->withRetryPolicy(new Cassandra\RetryPolicy\Logging($retry_policy))
                 ->build();
$session     = $cluster->connect("simplex");
$statement   = $session->prepare("INSERT INTO playlists (id, song_id, artist, title, album)
                                 VALUES (62c36092-82a1-3a00-93d1-46196ee77204, ?, ?, ?, ?)");
$options     = array(
                    'consistency' => Cassandra::CONSISTENCY_ONE,
                    );
$session->execute($statement, $options);

Работаю на меня.

Другие вопросы по тегам