【发布时间】:2016-04-16 02:28:39
【问题描述】:
我们正在运行一个具有 3 个节点和 2 个复制因子的 cassandra 集群。
我们的 nodejs 服务器是唯一查询此集群的地方。
我们正在使用datastax node.js驱动来创建一个客户端,如下:
var client = new cassandra.Client({contactPoints: [<contact point>], keyspace: 'test_keyspace', queryOptions: {consistency: cassandra.types.consistencies.two}});
我的理解是这个一致性参数设置为两个应该使我们的读/写一致,只要我们在继续下一个查询之前等待响应,但这不会发生。
如果我们在请求数据之前等待响应,上面是否应该保证一致性?
还有其他地方可能设置了可能导致查询不一致的参数吗?
cassandra v2.2.4 nodejs驱动版本v3.0.0
编辑 - 添加我正在做的示例:
表格:
test_keyspace.users(id uuid, 用户名文本, join_date 时间戳, PRIMARY KEY(id))
test_keyspace.username(username text, uuid id, PRIMARY KEY(username, id))
创建用户时:
1) 检查用户名未被占用
var query = "SELECT * FROM test_keyspace.username WHERE username=?";
db.execute(query, [username], function(err, result){
if(err){
//fail check - api responds with internal server error
} else {
if(result.rows.length == 0){
//pass check, proceeed to #2
} else {
//fail check, username taken, respond with error
}
}
});
2) 创建用户
var queries = [
{
query: "INSERT INTO test_keyspace.users (id, username, join_date) VALUES(?, ?, ?)",
params: [userid, username, date]
},
{
query: "INSERT INTO test_keyspace.username(id, username) VALUES(?, ?)",
params: [userid, username]
}
]
db.batch(queries, {prepare: true}, function(err){
if(err){
//api responds here with error
} else {
//api responds here with success
}
});
【问题讨论】:
-
你对一致性的理解是正确的。您能否详细说明您的查询以及结果如何不一致?一个常见的问题是查询时间戳,这可能会导致以与预期不同的顺序应用更新。你的服务器时钟同步了吗?
-
服务器时间已同步。为我如何查询、我期待什么以及我似乎收到什么的问题添加一个示例。
-
有趣的是,我以为用户名上的PK只是用户名,但它包括ID。看起来用户表有可能在帐户删除时没有被正确删除。这是在类似于插入的批处理查询中完成的。正在调查。
-
原来数据库没有不一致,是数据不一致导致部分失败删除批量查询成功从username表中删除而不是从users表中删除,应该解决重试
-
重试没有解决,我重新同步了时钟,现在无法重现问题,所以这很可能是问题所在。
标签: node.js cassandra datastax