2011-08-09 112 views
1

我正在开发一个Web应用程序,其中,对于每个客户端(小型大型组织),他们没有(也不应该)能够查询到其他客户端的记录。将数据保存在单个数据库中会很容易,并且使更新和维护变得简单(直到遇到可伸缩性问题)。但我现在想要面向未来的应用程序。如果每个客户的数据都包含在孤立的数据库中,则每个客户都会获得更好的性能,并且应该更好地扩展。我不确定它是否相当于数据库“分片”,因为我没有在多个数据库之间划分单个模式。我基本上会在每个数据库中都有一个复制的模式(就像当天在CD上发布软件时一样 - 每个数据库都有自己的数据库)。设置数据库分片 - 没有跨数据库查询

我已经读了一点,所以我有一个概念的想法。但是,我的头脑里有很多问题。我不确定这个过程的透明度如何。或者,如果我想要推出更改,就会遇到更新数百个架构的维护噩梦。

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

  1. 我会想象我能有一个单一的应用程序服务器开始单一的数据源,比方说,一个MySQL实例与单个表映射用户ID到数据库。

    • 用户ID
    • 数据库/碎片-ID

    对于每一个请求(查询),忽略数据库高速缓存,那就要查找的碎片ID的用户?或者,这是否可以在每个会话中最初执行一次并直接与目标数据库进行交谈? (正如你可能能够告诉我对服务器端的东西不够强大)。

  2. 有人可以提供一个关于在Spring中如何连接的高层概述吗?目前,我的架构非常简单。我有简单的Spring组件DAO使用jdbctemplate。 DAO的数据源被注入(数据源在applicationContext.xml上配置)。 DAO自动装入我的服务类。相当标准的东西。

  3. 比方说,我得到了上一步工作,现在我必须改变架构。是否有管理工具可以用于一次应用模式更改并将其传播到100个其他数据库?

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

谢谢!

回答

0

我不能跟Spring说话,因为我不使用它。

如果是我,用我的Java EE帽子,我只需使用JNDI数据源,为每个客户端创建一个,然后通过客户端名称或任何标识符来查看,以区分客户端。

现在,我相信可以用Spring来完成,我只是不能告诉你如何。

通用数据库连接池实现如何处理“100个数据库”,但连接数很多,也是一个不同的问题(想到几百个开放连接套接口的愿景)。我也无法与此交谈,没有做到这一点。

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

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

-1

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

1

我使用的春季和分片在我的公司的想法是,

  1. 你会实现一个ShardDataSourceManager这将是基本连接池的池,你会查找一个数据源的碎片ID。
  2. 您将定义自己的事务性注释并使用它注释方法
  3. 您需要在dao层编写一个拦截器来读取方法和某些上下文信息的注释。从上下文信息中查找分片ID并查找数据源并注入到本地线程中。
  4. 查找数据源时的dao层会查看本地线程以构建jdbc模板并对其执行查询。