数据库分片(每个用户都有自己的数据库)

时间:2013-09-19 21:23:57

标签: sharding

我有一个应用程序,其中用户获得自己的数据库,该数据库根据它们所在的子域进行查找。目前我有超过100个用户,它工作正常。我有1个Web和1个数据库服务器。

我想我可以在没有任何变化的情况下扩展到500-1000个用户。

对于Web服务器,我可以非常轻松地添加负载均衡器,这不应该是一个问题。

当您对数据库进行分片时,我无法读取数据库,因为这会破坏目的。

这样做的最佳方法是什么?

似乎很难管理,因为我不得不重新平衡服务器而添加分片。

使这个易于管理的好方法是什么?

3 个答案:

答案 0 :(得分:1)

如果用户名是唯一的,并且命名约定与数据库命名约定兼容,则数据库可以使用与用户相同的名称。

或者,如果用户通过网站进行连接,则可以使用部分URL。例如:

http://bobscarshop.wordpress.org/可以指向数据库bobscarshop

或者,如果您想要一次性查找服务器和数据库,可以使用memcached或redis等技术来实现此目的。它们是分布式内存对象缓存系统,允许您保持名称/值对是一种非常可扩展的方式。

使用http://bobscarshop.wordpress.org/作为您的名字,它可以为您提供大量数据,无论您需要什么。

答案 1 :(得分:1)

你不是分片。您只是使用多个数据库。

http://en.wikipedia.org/wiki/Shard_(database_architecture)

  

数据库分片是数据库或搜索中的水平分区   发动机。每个单独的分区称为分片或   数据库分片。

解决问题的最简单方法是:

  • 根据需要添加新的数据库服务器,并根据需要将数据库重新分配到不同的服务器(即,不要将所有重度用户保留在同一系统上)

  • 使用某种集中式服务将用户/应用程序映射到特定数据库。

对于集中式服务,最好通过它自己的集中式数据库实例来管理它。在向外扩展时,可以引入某种缓存层来查找此信息(即,Web服务器首先询问memcached),或者定期向群集中的每台机器发布flatfile查找。

您可以根据名称使用某种调度,但是您无法轻松地将数据库从一台物理机迁移到另一台物理机。

还有各种数据库的负载平衡器/连接分配器可以处理大量此类数据。

答案 2 :(得分:0)

您可以将分片基于子域的第一个字符,并根据该子域决定在代码中使用哪个服务器。例如(在伪代码中):

if $username.charAt(0) < 'N' 
   $server = "database-server-1"
else 
   $server = "database-server-2"
end

会将Clownland放在database-server-1上,而TastyTreat放在database-server-2上。

稍后添加服务器将需要在服务器之间移动数据库,但如果您可以安排维护窗口,则不应该太痛苦。

这样做的好处是不需要跟踪数据库来将数据库与服务器匹配。