Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 消除关于NoSQL数据库的混淆_Cassandra_Database_Nosql - Fatal编程技术网

Cassandra 消除关于NoSQL数据库的混淆

Cassandra 消除关于NoSQL数据库的混淆,cassandra,database,nosql,Cassandra,Database,Nosql,这个问题是关于NoSQL的(例如,以cassandra为例) 当您使用没有数据复制的NoSQL数据库时,是否确实没有一致性问题?也不是在访问并发的情况下 如果一个分区在两个分区中都写入了同一行(可能多次),会发生什么情况?当分区消失时,使用哪个写值 假设你使用N=5w=3r=3。这意味着您已经保证了一致性,对吗?使用这个法定人数有多好?有3个节点返回数据,这不是很大的开销吗 能否在cassandra中指定每个查询是否希望查询具有保证的一致性?例如,您执行一个insert查询,并希望强制所有复制

这个问题是关于NoSQL的(例如,以cassandra为例)

  • 当您使用没有数据复制的NoSQL数据库时,是否确实没有一致性问题?也不是在访问并发的情况下

  • 如果一个分区在两个分区中都写入了同一行(可能多次),会发生什么情况?当分区消失时,使用哪个写值

  • 假设你使用N=5w=3r=3。这意味着您已经保证了一致性,对吗?使用这个法定人数有多好?有3个节点返回数据,这不是很大的开销吗

  • 能否在cassandra中指定每个查询是否希望查询具有保证的一致性?例如,您执行一个insert查询,并希望强制所有复制副本在读取操作返回值之前完成插入

  • 如果您有:employeeID{PK:employeeID,departmentId,employeeName,birthday}和部门{PK:departmentId,departmentName},并且您希望使用特定的部门名称获取所有员工的生日。两个问题:

  • 您不能要求所有员工都有一个给定的生日(因为您只能查询主键)
  • 无法加入员工和部门列族,因为无法加入
因此,您可以创建柱族:

部门生日{PK:(部门名称,生日),[员工生日]}


在这种情况下,无论何时员工被解雇/雇用,都必须将其删除/添加到“部门生日”列中。这个过程是你必须手动完成的吗?因此,您必须手动创建查询以更新所有冗余/非规范化数据?

我将从cassandra的角度回答这一问题,因为这正是您所看到的(几乎没有任何两个nosql存储是相同的!)

  • 对于单个节点,所有操作都是按顺序进行的。并发性问题可能是正交的……您的web客户端可能发出了一个请求,然后又发出了另一个请求,但由于网络负载,cassandra首先得到了第二个请求。这可能是问题,也可能不是问题。有一些方法可以解决这些问题,比如不可变数据。您还可以利用“轻量级事务”

  • Cassandra使用上次写入的胜利来解决冲突。根据您查询的复制因子和一致性级别,这可以很好地工作

  • 用于读写的Quurom将为您提供一致性。存在一个边缘情况。如果协调器不知道仲裁节点已关闭,它将发送写入请求,然后在重新建立仲裁时写入将完成。在这种情况下,客户端将获得超时,而不是失败。后续的查询可能会获取过时的数据,但之后的任何查询都将获取最新的数据。这是一个极端的边缘情况,通常N=5,R=3,W3=将为您提供完全一致性。从三个节点读取数据实际上并没有那么大的开销。对于R=3的查询,客户端将向其连接的节点(协调器)发出该请求。协调器将并行(而不是顺序)查询副本。它将结果与LWW合并以获得结果(并在需要时发布读取修复等)。由于查询是并行进行的,因此开销大大减少

  • 这是一个数据建模问题。您描述了一种方法(尽管在生日而不是dept进行分区可能会更好,并导致分区分布更均匀)。您是否需要employee表和department表…其他查询是否需要它们?如果没有,也许你只需要一个。如果取消规范化,则需要手动维护数据。在Cassandra 3.0中,全局索引将允许您查询索引,而不会导致效率低下(现在使用辅助索引而不指定分区键就是这种情况)。是的,另一个选项是按生日划分employeed,执行两个查询,并在客户机内存中执行联接。Cassandra查询命中一个分区的速度非常快,所以执行两个分区并不会太贵