在 Cassandra 的一些表之间同步(复制)数据的标准方法是什么?
What are the standard ways to sync(copy) data between some tables in Cassandra?
我是 Cassandra 的新手,最近我在 DataStax 上看了非常好的 tutorials,那是关于数据建模的。
据我了解,在 Cassandra 中,我们总是必须为我们想要的查询提供不同的 tables,例如,即使是按时间或 ID 对数据进行排序的简单查询。
这意味着我们必须为每个实体提供一些 tables,以便根据我们稍后想要的查询获得数据。假设我们有视频,我们可能有一些 table 视频实体。
第一个问题, 正如我所说,对于每个查询我们必须有一个 table,我们将按不同的列对视频进行不同类型的排序:
我们的 视频 table 专栏是:
video_id | video_title | video_create_year | director | timestap
现在我们是否应该制作其他 table 用于我们可能需要的其他排序?
我们可能需要按导演姓名 (ASC | DESC)、video_create_year (ASC | DESC)、video_title (ASC | DESC) 对 table 进行排序)
我不确定,我们是否应该为每个不同的排序设置不同的 table?
如:
videos_by_diractor_asc
videos_by_diractor_desc
videos_by_title_asc
videos_by_title_desc
等等...
我理解的对吗?
第二个问题,如果我没理解错,那我忘了做一个table,我可能需要在我们的网站(想象一下那天我忘记了 video_by_title_asc) 那我该怎么办?我应该编写一个程序并从视频 table 复制整个数据吗?或者在 Cassandra 中有一些方法可以在必要时复制整个数据?
希望问题没有混淆。
好的,您对 Cassandra 的理解部分正确。
希望我理解正确。您的 table 的主键如下所示:
videos_by_diractor_asc PRIMARY KEY(director)
videos_by_title_asc PRIMARY KEY(title)
但在这种情况下,您忘记了一件事:分区键。分区键是主键的第一部分。我认为,就您而言,这一年是有道理的。具有相同分区键的所有行始终位于同一节点上。 Cassandra 通过分区键拆分行。分区键之后的列(称为列键)已排序。分区键本身未排序。这意味着:node1 可以有 2015、1998 和 1950 年,node2 可以有 2010、1990 和 1577。Cassandra 在节点之间平均分配数据。在建模时,您必须考虑一件重要的事情:一个分区键内的 table 的预期大小是多少。这意味着,在视频案例中,您期望一年内有多少行? 2澪?十亿?如果你将获得超过 20 亿行 x 列,你将遇到一个大问题。 20 亿是每个分区键的最大大小。但请记住:这是最大值。我建议不要超过 500mio。我计算,在最坏的情况下,有 500mio。
现在我们可以谈谈列键了。是的,每次排序都需要一个新的table。如果你想以不同的顺序访问你的 WHERE 条件中的数据,你还需要一个新的 table 。
一个例子:
你有这个主键
PRIMARY KEY(年份,导演,职务)
首先是分区键。这意味着:您始终需要在 where 条件下使用年份。然后你的数据,使用相同的分区键,按导演排序,默认在 ASC 中。在导演之后的称号。在这种情况下,您不能使用此 WHERE 条件:WHERE year = 2016 and title = 'whatever'
好的,现在我来回答你的主要问题:)
关于重复数据的事情。在 Cassandra 3.0 中,您可以使用物化视图。是的,这是一个不错的功能,但它有他的开销。最好的解决方案是围绕 cassandra 编写一个包装器。这个包装器只做一件事:它处理所有这些重复的数据。如果您需要按标题然后按导演排序而不是按导演然后按标题排序,它知道访问数据的最佳方式是什么。还有一件事:不用担心写入数据 5 次或更多次。 Cassandra 针对写作进行了优化。写数据没问题。但不要忘记一件事:Cassandra 是已知查询的数据库。如果您知道您将经常需要此排序顺序中的数据,请为其创建一个 table。但是,如果您不知道它并且您创建此 table 只是为了以下情况:不要创建 table。为此,有时查询,您可以使用 spark 或其他解决方案。
还有一件事:如果您只需要按一件事查询数据,比如只按标题,只按导演,请不要使用 cassandra。这是键值存储的一个主要特点。
我是 Cassandra 的新手,最近我在 DataStax 上看了非常好的 tutorials,那是关于数据建模的。
据我了解,在 Cassandra 中,我们总是必须为我们想要的查询提供不同的 tables,例如,即使是按时间或 ID 对数据进行排序的简单查询。
这意味着我们必须为每个实体提供一些 tables,以便根据我们稍后想要的查询获得数据。假设我们有视频,我们可能有一些 table 视频实体。
第一个问题, 正如我所说,对于每个查询我们必须有一个 table,我们将按不同的列对视频进行不同类型的排序:
我们的 视频 table 专栏是:
video_id | video_title | video_create_year | director | timestap
现在我们是否应该制作其他 table 用于我们可能需要的其他排序?
我们可能需要按导演姓名 (ASC | DESC)、video_create_year (ASC | DESC)、video_title (ASC | DESC) 对 table 进行排序)
我不确定,我们是否应该为每个不同的排序设置不同的 table?
如:
videos_by_diractor_asc
videos_by_diractor_desc
videos_by_title_asc
videos_by_title_desc
等等...
我理解的对吗?
第二个问题,如果我没理解错,那我忘了做一个table,我可能需要在我们的网站(想象一下那天我忘记了 video_by_title_asc) 那我该怎么办?我应该编写一个程序并从视频 table 复制整个数据吗?或者在 Cassandra 中有一些方法可以在必要时复制整个数据?
希望问题没有混淆。
好的,您对 Cassandra 的理解部分正确。
希望我理解正确。您的 table 的主键如下所示:
videos_by_diractor_asc PRIMARY KEY(director)
videos_by_title_asc PRIMARY KEY(title)
但在这种情况下,您忘记了一件事:分区键。分区键是主键的第一部分。我认为,就您而言,这一年是有道理的。具有相同分区键的所有行始终位于同一节点上。 Cassandra 通过分区键拆分行。分区键之后的列(称为列键)已排序。分区键本身未排序。这意味着:node1 可以有 2015、1998 和 1950 年,node2 可以有 2010、1990 和 1577。Cassandra 在节点之间平均分配数据。在建模时,您必须考虑一件重要的事情:一个分区键内的 table 的预期大小是多少。这意味着,在视频案例中,您期望一年内有多少行? 2澪?十亿?如果你将获得超过 20 亿行 x 列,你将遇到一个大问题。 20 亿是每个分区键的最大大小。但请记住:这是最大值。我建议不要超过 500mio。我计算,在最坏的情况下,有 500mio。
现在我们可以谈谈列键了。是的,每次排序都需要一个新的table。如果你想以不同的顺序访问你的 WHERE 条件中的数据,你还需要一个新的 table 。 一个例子: 你有这个主键 PRIMARY KEY(年份,导演,职务)
首先是分区键。这意味着:您始终需要在 where 条件下使用年份。然后你的数据,使用相同的分区键,按导演排序,默认在 ASC 中。在导演之后的称号。在这种情况下,您不能使用此 WHERE 条件:WHERE year = 2016 and title = 'whatever'
好的,现在我来回答你的主要问题:) 关于重复数据的事情。在 Cassandra 3.0 中,您可以使用物化视图。是的,这是一个不错的功能,但它有他的开销。最好的解决方案是围绕 cassandra 编写一个包装器。这个包装器只做一件事:它处理所有这些重复的数据。如果您需要按标题然后按导演排序而不是按导演然后按标题排序,它知道访问数据的最佳方式是什么。还有一件事:不用担心写入数据 5 次或更多次。 Cassandra 针对写作进行了优化。写数据没问题。但不要忘记一件事:Cassandra 是已知查询的数据库。如果您知道您将经常需要此排序顺序中的数据,请为其创建一个 table。但是,如果您不知道它并且您创建此 table 只是为了以下情况:不要创建 table。为此,有时查询,您可以使用 spark 或其他解决方案。
还有一件事:如果您只需要按一件事查询数据,比如只按标题,只按导演,请不要使用 cassandra。这是键值存储的一个主要特点。