1

我正在开发一个 Web 应用程序,对于每个客户(一个小型​​大型组织),他们不能(也不应该)能够查询其他客户的记录。

将数据保存在单个数据库中会很容易,并且使更新和维护变得简单(直到我遇到可伸缩性问题)。但我现在想对应用程序进行未来验证。如果每个客户端的数据都包含在隔离的数据库中,那么每个客户端都会有更好的性能并且应该可以更好地扩展。我不确定它是否等同于数据库“分片”,因为我没有在多个数据库中划分单个模式。我基本上会在每个数据库中复制一个单一的模式(就像你在 CD 上发布软件的日子一样——每个都有自己的数据库)。

我已经对此进行了一些阅读,因此我对一般概念有所了解。但是,我脑子里有很多问题。我不确定这个过程有多透明。或者,每当我想推出更改时,我会遇到更新数百个模式的维护噩梦。

真的,我只是在寻找一个简单的“完整”示例(希望使用 spring/java)。

  1. 我想我可以有一个应用程序服务器从一个数据源开始,假设一个 mysql 实例具有一个将用户 ID 映射到数据库的表。

    • 用户身份
    • 数据库/分片 ID

    对于每个请求(查询),忽略数据库缓存,是否必须为用户查找分片 ID?或者这是它最初可以在每个会话中执行一次并直接与目标数据库对话的事情?(你可能会说我不擅长服务器端的东西)。

  2. 有人可以对这在 Spring 中可能如何连接进行高级概述吗?目前,我的架构非常简单。我有使用 jdbctemplate 的简单 Spring 组件 DAO。注入 DAO 的数据源(数据源在 applicationContext.xml 上配置)。DAO 自动连接到我的服务类中。很标准的东西。

  3. 假设我让上一步工作,现在我必须更改架构。是否有管理工具可用于一次应用架构更改并将其传播到 100 个其他数据库?

我正在使用 MySQL。我相信“MySQL 代理”可能能够解决问题 1 和 2。有没有人有这方面的经验?我想它无法处理管理模式更新,所以我可能不得不推出自己的解决方案。

谢谢!

4

5 回答 5

1

我在我的公司使用弹簧和分片的想法是

  1. 您将实现一个ShardDataSourceManager基本上是连接池的池,并且您将通过分片 id 查找数据源。
  2. 您将定义自己的事务注释并用它注释方法
  3. 您需要在 dao 层编写一个拦截器,该拦截器将读取方法上的注释和一些上下文信息。从上下文信息中,您将查找分片 ID 并查找数据源并注入本地线程。
  4. dao 层在查找数据源时会查找线程本地以构造 jdbc 模板并在其上执行查询。
于 2012-05-04T04:23:52.230 回答
0

我不太了解春天,所以不能多谈。但是对于数据库分片,我建议你看看这篇关于High Scalability的帖子

新的 Relic 架构 - 每天收集超过 200 亿个指标

它讨论了良好的分片策略以及当负载变化时它如何提供帮助。还可以查看评论部分,其中他提供了更多关于分片的详细信息。

于 2011-08-12T14:36:06.843 回答
0

我无法与 Spring 交谈,因为我不使用它。

如果是我,戴着我的 Java EE 帽子,我会简单地使用 JNDI 数据源,为每个客户端创建一个,然后通过客户端名称或您用来区分客户端的任何标识符来查找它。

现在,我确信这可以用 Spring 完成,我只是不能告诉你怎么做。

常见的数据库连接池实现如何处理具有多少连接的“100 个数据库”也是一个不同的问题(想到数百个打开的连接套接字的愿景)。我也不能谈那个,没有做过。

但是在那之后,由于每个池都指向一个单独的数据库,那么你基本上就完成了。每个池都可以有自己的配置,因此您可以将数据库移动到不同的主机等。

这将是我第一次解决这个问题,直到它在测试中失败,但我猜测失败点将是数据库池实现或与之相关的。其他一切都是通用数据库服务器的东西和 Java。

于 2011-08-09T04:34:23.827 回答
0

你可以使用DDAL在DAL中实现访问不同的数据库,它不依赖于spring的数据源和事务管理。并且有一个演示项目来展示如何使用它:https ://github.com/hellojavaer/ddal-demos 。你可以试一试。

于 2017-07-22T07:00:03.217 回答
-1

这是一种分片/多租户情况。您将面临维护噩梦,并且需要编写大量代码。您可以使用第三方 - 您可以尝试ScaleBase(披露:我在那里工作)他们完全按照您的描述进行操作,以对您的应用程序透明的方式进行。

于 2011-08-09T06:36:25.617 回答