【问题标题】:Complex Query on cassandracassandra 上的复杂查询
【发布时间】:2011-02-10 13:14:13
【问题描述】:

几天前我听说过 cassandra 数据库引擎,并正在寻找关于它的好文档。在学习了 cassandra 之后,我发现 cassandra 比其他数据引擎更具可扩展性。 我也在 Amazon SimpleDB 上阅读过,但由于 SimpleDB 有 10GB/表的限制,而且 Google Datastore 比 Amazon SimpleDB 慢,我不想使用它们(Google Datastore、Amazon SimpleDB)。因此,为了让我们的网站在海量数据中实现特别高的写入率,我喜欢使用 Cassandra 作为我们的数据引擎。

但在开始使用 cassandra 之前,我对“如何使用 casssandra 处理复杂数据”感到困惑。下面我给大家介绍一下MySQL数据库结构,请看这里给我一个好的建议。

用户表
hasColum ID 主要
hasColum 电子邮件唯一
hasColum 名字
hasColum 姓氏

分类表
hasColum ID 主要
hasColum 父级
hasColum 类别

帖子表
hasColum ID 主要
hasColum UID 索引外键链接到用户->ID
hasColum CID 索引外键链接到 Category->ID
has列标题
hasColum 帖子索引
hasColum PunDate

评论
hasColum ID 主要
hasColum UID 索引外键链接到用户->ID
hasColum PID 索引外键链接到 Posts->ID
hasColum 注释

用户组
hasColum ID 主要
有列名

UserToGroup 表(仅适用于多对多关系)
hasColum UID 外键链接到用户->ID
hasColum GID 外键链接到 Group->ID

最后供大家参考,我喜欢使用 SimpleCassie PHP Class http://code.google.com/p/simpletools-php/ 所以,如果你能给我举个使用 SimpleCassie 的例子,那将非常有帮助

【问题讨论】:

  • 那么问题来了,在使用非关系型 NoSQL 数据库时如何建立关系?出于好奇,您正在构建什么 MySQL 无法扩展?
  • 是的,这就是问题所在。我们正在考虑开发一个应用程序(主要是一个分类网关,网站开发人员将通过 API 设置/获取数据)。

标签: php database nosql cassandra


【解决方案1】:

非规范化。请参阅 twissandra.com 和http://github.com/ericflo/twissandra的文档

更多示例请访问http://wiki.apache.org/cassandra/ArticlesAndPresentations

【讨论】:

    【解决方案2】:

    您真的在流量方面与 Google 和 Amazon 竞争吗?我建议从升级您当前的 MySQL 基础架构开始——您目前在集群中运行了多少数据库服务器?你对数据进行分区吗?

    C.

    【讨论】:

    • 我不是在谈论流量......我更喜欢 cassandra 的性能......请参阅 cassandra 的架构wiki.apache.org/cassandra/ArchitectureOverview MySQL 需要 300 毫秒来写入 50GB 数据,而 cassandra 只需要 0.12 毫秒 ..它是最快的数据引擎 MySQL 读取 50GB 数据需要 350 毫秒,而 cassandra 只需要 15 毫秒读取 最受欢迎的网站正在迁移到 cassandra 以进行扩展和提高性能,包括 facebook、twitter、digg 等......
    • 这些标题数字看起来令人印象深刻 - 但没有关于他们如何配置测试的详细信息。此外,即使使用最新的光纤通道交换结构(即可用的最快磁盘技术),您也很幸运能够获得持续的 20Gb/s - 并且假设底层磁盘可以处理这种速率/数据量 - 或 20,000比本页上为 Cassandra 引用的数据慢几倍。事实上,20Gb/s 大约是中/高端非 NUMA 系统的内存带宽。这些数字可能有意义的唯一方法是,如果您正在查看一个非常大的数据库集群。
    【解决方案3】:

    来自cassandra's wiki data model reference

    与关系系统不同,在关系系统中,您对实体和关系进行建模,然后只需添加索引以支持任何必要的查询,而对于 Cassandra,您需要提前考虑要有效支持哪些查询,并进行适当的建模。由于没有自动提供的索引,因此每次查询与使用表:关系的查询相比,您将更接近一个 ColumnFamily。不要害怕相应地去规范化;

    一篇谷歌文章here

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      这是一篇关于 Twissandra(Cassandra 上的 Twitter 克隆)的好文章,讨论了基于数据访问要求的架构设计。你可能会发现它很有用http://www.rackspacecloud.com/blog/2010/05/12/cassandra-by-example/

      【讨论】:

        【解决方案5】:

        我会假设您的系统负载很重,并且有大量数据通过您的系统,我再次假设您已经尝试过关系数据库并在繁重的负载下崩溃,达到数百万行,每秒 10k+ 请求等等

        在这些假设之后,我会告诉你,你需要改变你的思维方式。例如,在您的问题中,您写下了表结构,这在您考虑关系数据库时非常重要。但在列存储(如 cassandra/hbase/etc)中,它并不那么重要,它的请求类型很重要。由于在列存储中,您始终可以在新列中添加新的元数据(您不会在请求中使用但在响应中使用的额外列),因此您不必更改设计。但在关系数据库中,您需要更改表甚至获取另一个具有 pk-fk 关系的表。

        使用 cassandra(或任何其他列数据库)时,您应该将所有 api 放在您面前。

        例子:

        如果你的 api 中有getAllUserPosts($userId),你应该有:UserPosts ColumnFamily 或 Posts ColumnFamily 上的二级索引(在后台执行类似的操作)。更进一步,您需要如何对结果进行排序?是的,它也是设计中的一个关键点,如果您希望它按创建日期排序,那么您最好使用 TimeUID 作为键,或者使用第 3 方机制来为您生成增加的 uid。也许你想用它们的“最后更新”对它们进行排序,那么你最好在上面放一个二级索引。

        根据我的经验,我会告诉你,当你的 api 或你需要的数据非常清楚时,用 cassandra 开发东西真的很酷,但是当你想改变一个大功能时,你将面临一些非常大的挑战你,小心。还要确保您了解使 cassandra 快速的底层“最终一致性”。因为您必须多次敲击键盘才能完成交易(至少我这样做了)。当然,在某些时候,您可能希望对 cassandra 上的大量数据进行大规模操作:准备好使用云计算。 Hadoop。

        PS:我相信这里有很多人对 cassandra 有丰富的经验和知识,然后是我,他们会比我更好地帮助你设计你的系统。我只是想分享我在生产中使用 cassandra 时的经历和理解。

        【讨论】:

          猜你喜欢
          • 2015-08-20
          • 2017-08-15
          • 2015-07-16
          • 2015-12-16
          • 1970-01-01
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多