1

我是 cassandra 的新手,但有 Nosql 的背景和其他技术的高可用性。几天前我安装了 Cassandra 3.0,但听起来 Datastax php 驱动程序根本不支持它!所以我降级到 2.1.11 版本并编写了一个简单的 php 脚本来使用 Datastax php-driver 对其进行查询,它可以正常工作。

<?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();
}
?>

然后我在同一台机器(Ubuntu 11.10!)中使用不同的 IP 地址启动了两个 Cassandra 实例。然后将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 驱动程序有关吗?

4

3 回答 3

1

您在密钥空间上使用什么复制因子?如果您使用 RF=1,则错误可能表明没有足够的活动主机来满足所有范围。提高复制因子将有助于解决这个问题。

于 2015-11-29T00:42:04.393 回答
0

在我的情况下,我在一个带有 ONE 节点的隔离环境中运行测试,但我正在设置复制因子为 2 的上下文。因此某些函数会因超时而失败,因为它永远无法完成对另一个非- 已存在的节点要及时更新。

因此,一种解决方案是确保您的复制因子不大于集群中的节点数(是的,我不明白为什么 Cassandra 不能只告诉我们:RF 太大作为错误。)

于 2016-04-17T02:27:57.420 回答
0

您可以尝试重试策略

$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);

为我工作。

于 2017-07-25T12:48:36.730 回答