【问题标题】:Getting rid of confusion regarding NoSQL databases摆脱关于 NoSQL 数据库的困惑
【发布时间】:2015-02-03 14:13:20
【问题描述】:

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

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

  • 如果一个分区在两个分区中写入了相同的行,并且可能多次写入,会发生什么情况?分区没了,用的是哪个写入值?

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

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

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

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

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

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

在这种情况下,每当员工被解雇/雇用时,都必须将其删除/添加到 departmentBirthdays 列族中。这个过程是你必须手动完成的吗?所以你必须手动创建查询来更新所有冗余/非规范化数据?

【问题讨论】:

    标签: cassandra database nosql


    【解决方案1】:

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

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

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

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

    4. 是的。

    5. 这是数据建模的问题。您描述了一种方法(尽管在生日而不是部门进行分区可能会更好,并导致分区分布更均匀)。您是否需要员工和部门表……其他查询是否需要它们?如果没有,也许你只需要一个。如果进行非规范化,则需要手动维护数据。在 Cassandra 3.0 中,全局索引将允许您在索引上进行查询而不会降低效率(今天使用二级索引而不指定分区键时就是这种情况)。是的,另一种选择是按生日对员工进行分区并执行两个查询,然后在客户端的内存中进行连接。访问分区的 Cassandra 查询非常快,因此执行两个查询并不会那么昂贵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2018-04-26
      • 2015-04-08
      • 2019-05-17
      • 2020-03-06
      相关资源
      最近更新 更多