【问题标题】:Scalability of a multi-tenant approach using MySQL and Spring使用 MySQL 和 Spring 的多租户方法的可扩展性
【发布时间】:2013-12-06 19:34:53
【问题描述】:

我正在使用文章 Dynamic DataSource Routing 之后的多租户架构,但动态创建新租户(数据源)(在用户注册时)。

一切运行正常,但我担心可扩展性。该应用程序阅读量很大,今天我们有 10 个租户,但我们会将应用程序向公众开放,这个数字会增加很多。

每个用户数据源都是使用以下代码创建的:

            BasicDataSource ds = new org.apache.commons.dbcp.BasicDataSource();
            ds.setDriverClassName(Driver.class.getName());
            ds.setUsername(dsUser);
            ds.setPassword(dsPassword);
            ds.setPoolPreparedStatements(true);
            ds.setMaxActive(5);
            ds.setMaxIdle(2);
            ds.setValidationQuery("SELECT 1+1");
            ds.setTestOnBorrow(true);

这意味着它正在为每个用户创建至少 2 个和最多 5 个连接。

MySQL 服务器(4 个 CPU 2.3Mhz/8GB Ram/80GB SSD)支持多少连接和架构,如何通过更改数据源参数或 mysql 配置来改进它?

我知道这个答案取决于很多附加信息,请在 cmets 中询问。

【问题讨论】:

  • 你的应用是读重还是写重?
  • 那么您总是可以水平扩展并添加读取从属以处理更多并发。在mysql中查找主从复制
  • 是的,我可能会这样做,但我想知道何时需要这样做。我对 MySQL 的了解并不深入,无法知道我可以拥有的数据源的限制。
  • 连接限制并不是您现在必须担心的巨大限制。监控一切并使用缓存,您可以在单个服务器上为大量用户提供服务。内存使用比连接更受关注。
  • 同时打开的模式和表是否有限制?

标签: mysql spring datasource multi-tenant apache-commons-dbcp


【解决方案1】:

在大多数情况下,您的连接数不会超过 300 个/秒。也就是说,如果您添加了像 memcached 这样的良好缓存机制。如果你有超过 1000 个连接/秒,你应该考虑持久连接和连接池。

【讨论】:

  • 我可以同时运行多少这样的数据源? MySQL 是否有连接数限制?
  • 有一个 max_connection 变量可以更改,但每秒 200 个连接可以为成千上万的用户提供服务
  • org.apache.commons.dbcp.BasicDataSource 与服务器保持打开的连接,在我的示例中,它们是用户的 2 个。所以,我必须为每个用户访问建立一个连接才能达到数千的可扩展性?
  • 当您对大多数操作使用缓存时,用户不使用连接而是使用内存来检索数据。是的,因为所有用户都没有访问数据库,而且不是每秒数千。
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多