摆脱NoSQL数据库的困惑

时间:2014-12-05 11:54:27

标签: cassandra database nosql

这个问题是关于NoSQL的(例如拿cassandra)。

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

  • 如果分区中的同一行已写入两个分区,可能会多次出现?分区消失后,使用了哪个写入值?

  • 假设您使用N = 5 W = 3 R = 3。这意味着你保证一致性吗?使用此法定人数有多好?有3个节点返回数据并不是一个很大的开销吗?

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

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

    1. 你不能要求所有给定生日的员工(因为你只能查询主键)
    2. 您无法加入员工和部门列系列,因为加入是不可能的。

所以你可以做的是创建一个列族:

departmentBirthdays {PK :( departmentName,birthday),[employees-whos-birthday-it-is]}

在这种情况下,员工被解雇/雇用时,必须在departmentBirthdays列系列中删除/添加。这个过程是否需要手动完成?那么你必须手动创建查询来更新所有冗余/非规范化数据吗?

1 个答案:

答案 0 :(得分:2)

我会从cassandra的角度回答这个问题,因为你似乎正在看的东西(几乎没有两个nosql商店是相同的!)。

  1. 对于单个节点,所有操作都按顺序进行。并发问题可以是正交的......你的web客户端可能已经发出请求,然后是另一个,但由于网络负载,cassandra首先得到了第二个。这可能是也可能不是问题。存在围绕这些问题的方法,例如不可变数据。您还可以利用“轻量级交易”。

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

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

  4. 这是数据建模的问题。您描述了一种方法(尽管在生日而不是dept上进行分区可能会更好,从而可以更均匀地分配分区)。您是否需要员工和部门表...是否需要其他查询?如果没有,也许你只需要一个。如果进行非规范化,则需要手动维护数据。在Cassandra 3.0中,全局索引将允许您在不低效的情况下查询索引(在使用辅助索引而未指定分区键的情况下就是这种情况)。是的另一种选择是按生日进行分区并进行两次查询,并在客户端的内存中进行连接。 Cassandra查询命中分区非常快,所以做两件事并不会那么贵。