【问题标题】:Apache Cassandra 2.1.11 cluster failover does not work with datastax php driverApache Cassandra 2.1.11 集群故障转移不适用于 datastax php 驱动程序
【发布时间】:2016-03-01 19:25:31
【问题描述】:

我是 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 驱动的问题吗?

【问题讨论】:

    标签: php cassandra datastax-php-driver


    【解决方案1】:

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

    【讨论】:

    • 感谢 Jeff 的回答,但几个小时前已经使用 c/c++ 驱动程序使用 c 代码对其进行了测试,并且工作正常!问题显然出在 php-deriver 本身。是的,我使用的是 RF=1,但这似乎不是重点
    • 您是否使用 datastax-php-driver 测试过故障转移?它对你有用吗?很高兴知道因为我现在正在研究驱动程序
    • 据我所知,datastax PHP 驱动程序使用datastax C++ 驱动程序——它只是一个非常薄的包装器。如果 C++ 工作,我希望 PHP 也能工作。如果这不正常,那我就不知所措了。
    • 我完全同意你的观点,这正是我感到困惑的地方
    • 主机是否在同一个DC? datastax 驱动程序共同具有可插入/可配置的负载主机选择策略(datastax.github.io/cpp-driver/topics/configuration),我想知道 PHP 驱动程序是否默认为意外
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢亚历克西斯。你完全适合你的情况。但我的问题是不同驱动器之间的有线行为和 clqsh 本身。
    【解决方案3】:

    您可以尝试重试策略

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

    为我工作。

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 2014-10-13
      • 2017-10-04
      • 2016-02-27
      • 2016-07-26
      • 2019-01-31
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多