卡桑德拉不一致
Cassandra Inconsistent
我们是 运行 具有 3 个节点且复制因子为 2 的 cassandra 集群。
我们的 nodejs 服务器是唯一查询此集群的地方。
我们正在使用 datastax node.js 驱动程序来创建一个客户端,如下所示:
var client = new cassandra.Client({contactPoints: [<contact point>], keyspace: 'test_keyspace', queryOptions: {consistency: cassandra.types.consistencies.two}});
我的理解是,只要我们在继续下一个查询之前等待响应,将此一致性参数设置为 2 应该使我们的 reads/writes 保持一致,但这并没有发生。
如果我们在请求数据之前等待响应,上面是否应该保证一致性?
是否还有其他地方可能设置了可能导致查询不一致的参数?
卡桑德拉 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
}
});
问题是我的 cassandra 服务器上的时钟没有同步。
我们是 运行 具有 3 个节点且复制因子为 2 的 cassandra 集群。
我们的 nodejs 服务器是唯一查询此集群的地方。
我们正在使用 datastax node.js 驱动程序来创建一个客户端,如下所示:
var client = new cassandra.Client({contactPoints: [<contact point>], keyspace: 'test_keyspace', queryOptions: {consistency: cassandra.types.consistencies.two}});
我的理解是,只要我们在继续下一个查询之前等待响应,将此一致性参数设置为 2 应该使我们的 reads/writes 保持一致,但这并没有发生。
如果我们在请求数据之前等待响应,上面是否应该保证一致性?
是否还有其他地方可能设置了可能导致查询不一致的参数?
卡桑德拉 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
}
});
问题是我的 cassandra 服务器上的时钟没有同步。