Cassandra数据同步问题

时间:2015-04-07 06:18:40

标签: cassandra

我正在研究Cassandra超过2周,只是完全掌握了相同的内容。我已经阅读了几乎所有关于Cassandra的网页,但仍然不清楚一些概念。以下是: -

根据文档: - 我们根据查询对列族进行建模。因此我们需要事先知道我们的查询,这在现实世界的场景中根本不可能。我们可以预先拥有一组特定的查询,这些查询都会随着时间的推移而不断变化。因此,如果我根据之前的查询设计了一个模型,那么在新的需求出现后,我需要重新设计一个模型。读取一个SO线程将来很难修复一个糟糕的Cassandra数据模型。例如: - 我有一个user模型,其字段为

name, age,phone,imei,address, state,city,registration_type, created_at

目前,我需要仅通过state过滤(假设)。我将PK作为state。让我们为模型UserByState命名。 现在2-3个月后,我需要按created_at过滤。现在,我将创建一个模型UserByCreatedAt,其PK为created_at

现在有两个问题: -

a)如果我在需求出现时创建新模型,那么我需要将数据迁移到新模型中,即如果我创建新模型,我需要在当前模型中包含先前的数据。因此,我需要将数据从UserByState迁移到UserByCreatedAt,即我需要编写一个脚本来将数据从UserByState复制到UserByCreatedAt如果我错了,请纠正我!!!

如果有另一个新的过滤要求,我将创建新模型,然后迁移等等。

b)要根据查询预先创建模型,我需要保持数据同步,即在上述用户的情况下,我为2个查询创建了2个模型。

UserByStateUserByCreatedAt

所以我需要应用2个不同的写查询,即

UserByState.create(row = value,......)
UserByCreatedAt.create(row = value,......)

如果我有其他模特,比如'UserByGender'等等。我是否需要手动对不同的模型应用不同的写入查询,还是单独进行?出现了保持数据同步的问题。

1 个答案:

答案 0 :(得分:2)

在分布式系统中没有免费的午餐,而且你已经遇到了一些关键限制。

如果您想要水平扩展的极其高性能的写入,最终必须在数据库的其他pat上做出让步。 Cassandra选择牺牲查询模式的灵活性,以确保非常快速地访问定义良好的查询模式。

当大多数用户遇到需要极其不同且频繁查询模式的情况时,他们会构建第二个表并立即更新。为了获得多表写入的原子性,可以使用记录的批处理来确保写入所有数据或者不写入任何数据。记录的批处理增加了成本,因此这仍然是性能的另一个权衡。除此之外,正常的一致性水平权衡仍然适用。

为了将数据从旧表移动到新表,Hadoop / Spark是不错的选择。这些是基于批处理的系统,因此它们不会提供低延迟,但对于一次性使用很有用,例如使用新索引和cronjob操作重建表。