1

我正在考虑使用 cockroachdb 以具有 ACID 保证的第三范式写入数据。所以所有的写入都会被转移到 cockroachdb。

读取都可以是基于对 Cassandra 的行键的点查找。我相信这样的读取设置将消除对 redis 缓存的需要,因为 Cassandra 本身会提供快速读取。因此 Cassandra 表将根据访问路径进行非规范化。

可能存在从 cockroachdb 规范化模式中的插入/更新/删除到插入/更新/删除到 cassandra 非规范化模式的基于事件的同步。

问题一:

这种读/写分离是否适合使用 cockroachdb 的有效用例?目的是减少连接并实现快速读取和写入。Cockroachdb 成为获取事件源类数据的单一事实来源。而 cassandra 和 elasticsearch 等其他数据库最终成为保持同步的查询投影。

问题2 :

这种设置是否适合需要以原子方式完成 N 语句的金融交易?根据我的理解,假设有 N 个 SQL 语句在 cockroachdb 3NF 模式中以事务方式完成。在此之后,读取发生在 Cassandra/ElasticSearch 中,由于同步延迟,它们尚未同步。在这种最终一致性场景中,如果用户发送另一个命令以从其他机器并行获得相同的结果,这将转到命令处理程序,该处理程序将在 cockroachdb 中查找。我认为由于 CockroachDb 符合 ACID,我们将确保在查找 cockroachdb 后的命令验证步骤中使命令无效。我相信这个 cockroachdb 会抛出乐观锁异常,因为写入同一张表的事务已经在进行中。所以问题是 - 在这种情况下,

问题 3

我想到的最后一个用例是让 cockroachdb 扮演火花集群对 cassandra 的聚合作用。我们可以在 cockroachdb 中进行聚合,其中包含所有数据并存储在 cassandra 的预聚合表中。虽然 ElasticSearch 也能够进行聚合,但这里有一个问题 - 这个用例是否也听起来正确 wrt 使用 cockroachdb 而不是 elasticsearch 进行聚合?

4

1 回答 1

2

作为一般准则,我建议从头开始设计系统,而不是从如此复杂的架构开始。如果您从 CockroachDB 作为您的“单一事实来源”开始,那么单独使用 CockroachDB 可以走多远?您是否有只有缓存层才能满足的性能要求?您是否需要一个单独的系统来进行汇总/报告?如果答案是“是”,那么您可以开始考虑这些组件应该采用什么形式。

可能存在从 cockroachdb 规范化模式中的插入/更新/删除到插入/更新/删除到 cassandra 非规范化模式的基于事件的同步。

请注意,CockroachDB 还没有一种将更新流式传输到外部系统的好方法,因此这并不容易。

对于您的具体问题:

  1. 读缓存可以是对系统的一个有价值的补充,但它也增加了很多复杂性,所以在你知道你需要它之​​前不要引入它。您也可以对 SQL 数据库中的事物进行非规范化,而 CockroachDB 的交错表等功能可以减少对非规范化的需求。

  2. 对于在事务中进入 CockroachDB 的读取,您只有事务保证。这里的确切行为将取决于您的事务是如何编写的。例如,两个“添加评论”事务可以同时应用而不会相互冲突,具体取决于您的架构。您可能需要通过提供适当的唯一 ID 或在事务开始时执行 SELECT 来防止这种情况,以确保数据库的状态符合您的预期。(另外,不要对“乐观锁异常”做太多假设。CockroachDB的并发是乐观和悲观模型的混合)

  3. 再次,这取决于。ElasticSearch 可以做很多 CockroachDB 做不到的事情,而 CockroachDB 还没有(还)做很多预聚合。但是 SQL 是一种用于聚合和报告的非常灵活的语言,因此您可以在 CockroachDB 中做您需要的事情。

于 2017-08-27T14:55:14.870 回答