我是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();
}
?>
然后我使用不同的ip地址在同一台机器(Ubuntu 11.10!)中启动了两个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驱动程序的吗?
答案 0 :(得分:1)
您在密钥空间使用了哪些复制因子?如果您使用RF = 1,则错误可能表示没有足够的主机存活以满足所有范围。提高复制因子有助于解决这个问题。
答案 1 :(得分:0)
在我的情况下,我在一个节点的隔离环境中运行测试,但我正在设置复制因子为2的上下文。因此某些函数会因超时而失败,因为它永远无法完成等待其他不存在的节点要及时更新。
因此,一个解决方案是确保您的复制因子不大于群集中的节点数(是的,我无法理解为什么Cassandra不能告诉我们:RF太大而不是错误。)
答案 2 :(得分: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);
为我工作。