0

我有一个应用程序,用户可以在那里获得自己的数据库,该数据库根据他们所在的子域进行查找。目前我有 100 多个用户,并且运行良好。我有 1 个网络和 1 个数据库服务器。

我想我可以扩大到 500-1000 个用户而无需任何更改。

对于网络服务器,我可以很容易地添加一个负载均衡器,所以这应该不是问题。

当你对数据库进行分片时,我会读到你不能有一个查找数据库,因为这违背了目的。

最好的方法是什么?

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

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

4

3 回答 3

1

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

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

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

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

使用http://bobscarshop.wordpress.org/作为你的名字,它可以返回一大堆数据,里面有你需要的任何东西。

于 2013-09-19T21:28:48.353 回答
1

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

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

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

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

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

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

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

您可以使用某种基于名称的调度,但是您不能轻松地将数据库从一台物理机器迁移到另一台物理机器。

还有用于处理大量此类问题的各种数据库的负载平衡器/连接池。

于 2013-09-19T22:54:05.640 回答
0

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

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

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

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

这具有不需要跟踪数据库来将数据库与服务器匹配的优点。

于 2013-09-19T22:31:27.090 回答