1

我正在开始一个项目,并试图抽象出它面临的挑战。我来自 RDBMS 背景,希望为我的下一个项目对存储技术做出明智的决定。我知道如果 RDBMS 是我唯一的选择,我将如何解决这些问题,但我有兴趣了解该行业的发展方向——理想情况下,有人看到这一点并说:'我正是这样做的,并使用了 ###,它工作得很好,但我们不得不使用### 来处理使用高峰。如果这是业务的最佳选择,我并不害怕爬回我的 RDBMS 洞穴。

所以问题:

[object A] – type: person
{
  /*some fields that every person has*/
  name: “A”
  email: “a@example.com”
  age: 22

  /*some fields that can be dynamically*/
  my_custom_user_property : 332 /* or maybe a struct of some type */

  /*some relations (fixed)*/
  groups: member of C; administrator of C; member of F; reader of G

  /*some more arbitrary relations*/
  mother_of: B
}

[list of groups]

也就是说,每个客户都可能希望将自己的“列”添加到数据库中,然后再针对它们进行搜索。

我的期望是数据不会快速变化(高读写比),我可以很高兴地异步[例如报告的生成]。但是基于简单标准的提取需要快速并针对自定义字段。

在数据库之上是一些限制在列级别可以看到的功能——例如,只有 F 的成员可以查看 G 成员的电子邮件。这些再次需要是动态的(假设我的自定义用户属性是敏感的,并且我有一些方法可以围绕它设置业务规则)。根据技术,我想这可能存在纯粹的应用程序(获取整个对象,然后根据规则进行限制)或更复杂的查询构建器类型系统。

接下来是“图表”类型的搜索——我目前看不到这超出了几个自由度,但能够通过几个不同的路线找到例如与组的 2 度连接的用户(某些连接可能不固定在开发时间)。如上所述,这可能是可以异步处理的东西,

我想寻找目前能够处理 1000 万用户、100 万组、100K 日活跃用户、5K 能够管理的用户(例如添加列)的东西。(是的,使用 MySQL 或类似工具完全可以实现,但需要合理的工程量)

就实际开发/基础设施而言:

  • 我不想用无证的配置/陷阱之类的东西撕掉我的头发(这就是说我很高兴学习东西,只要它不会让我为了起步而获得学位)
  • 可以设置高可用性和健壮性的东西——例如体面的集群管理和可用的报告(或者在专家的帮助下不那么昂贵)
  • 最好是开箱即用的相对较快部署的东西
  • 我可能有一个金融交易模块(未确认),所以 ACID 是加分项
  • 具有成熟的库,可以很好地与 Spring 框架配合使用。
  • 当然,好的文档/示例。足够的信息来掌握概念模型以及实用的操作方法
  • 开源

我已经阅读了[很多]关于那里的产品的信息,但想将其缩减为 2 个我可以淘汰的明智选择。阅读时:MongoDB;卡桑德拉;沙发底座;沙发数据库;新4J;(还有更多),我选择了 CouchBase。但我也知道有大量的营销材料旨在吸引像我这样的人对某个特定的想法。

所以这个问题总结为三个问题:有没有什么方法行不通?有没有被证明有效的方法?目前是否有明确的最佳选择?

4

1 回答 1

1

这是有关您的问题的一些信息。以下是我对 Cassandra、MongoDB、MySQL 和 Oracle 支持的用户数据库的接触。

行不通的方法

有些方法是行不通的,例如那些基于简单键值存储或存储固定数量数据的缓存的方法,而其他方法则不那么理想。一个有趣的例子是 Cassandra,它很好地支持多数据中心。Cassandra 专家告诉我,像 MongoDB 这样的文档存储对于某些用户数据库用例来说是更合适的解决方案,但也有组织使用它,包括管理数百万用户的组织在生产中使用的Apache Usergrid 项目。当然,Apache Usergrid 项目正在寻求添加 Elasticsearch 以获得更好的查询功能,但是几乎任何数据库都需要添加全文搜索。

被证明有效的方法

有一些已知的生产系统允许客户添加他们自己的列。最著名的之一是 Salesforce,它在 Oracle 上运行,我在几家公司使用过。每个客户都可以定义自己的自定义字段/列并针对这些列运行 SOQL (Salesforce SQL)。由于每个客户都可以创建自己的列,这可能导致多租户表比 Oracle 允许的要宽得多,因此他们使用“弹性列”,其中一个列可以包含许多不同类型的数据甚至数据类型。另一种被证明有效的方法是 MongoDB,它被我使用过的另一个供应商使用,它支持多租户数据存储中的每个客户字段。在这两种解决方案中,自定义字段都是用于存储和搜索自定义字段的一流字段。

清除最佳选项

我认为目前没有明确的最佳选择。除了功能之外,还有一些要求,例如多数据中心支持、无单点故障 (SPOF) 和搜索,这些要求在某些解决方案中得到更好的支持,而在其他解决方案中得到的支持较少。“最佳”解决方案将取决于您在各种因素中的全部要求,并且可能涉及多个解决方案,例如提到的 Cassandra / Elasticsearch 组合。

期权和 CAP 定理

要选择数据库系统,考虑我在这里描述的 CAP 定理很有用:

大数据还是关系数据库(如 Mysql 集群)?

在此模型中,您可以选择以下三者中的任意 2 个:一致性、可用性和分区容错性,但不是全部 3 个。如果您希望按顺序保持一致性、快速读取、可用性和快速写入,请考虑 CAP 的含义. 一致性和可用性是显而易见的。快速读取和写入取决于驱动分区容限要求的规模。如果您谈论的是 1000 万用户,这在更大的方案中并不是很大,您可以使用更少的分区容差来完成。一旦您决定是需要 CA 系统还是 CP 系统,请沿着图中三角形的一侧查看哪些解决方案是合适的。

Couchbase 是一个 CP 系统,因此这似乎符合您对一致性和分区容限(缩放)的优先级要求。但是,由于您只有 1000 万用户,因此您应该考虑实际需要多少分区容差。

于 2015-03-30T05:30:46.047 回答