Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 通过散列将用户(或任何其他内容)分发到数据库服务器_Database_Hash_Scaling - Fatal编程技术网

Database 通过散列将用户(或任何其他内容)分发到数据库服务器

Database 通过散列将用户(或任何其他内容)分发到数据库服务器,database,hash,scaling,Database,Hash,Scaling,我正在为一个应用程序进行早期设计,该应用程序需要从小规模开始,但具有高度可扩展性。我特别担心用户数据库,在这种情况下,它将有很高的插入和更新负载,并且不可能在单个主机上长期存在 (虽然我的问题与任何特定的RDBMS无关,但作为记录,我们将使用MySQL,而MySQL集群并不能真正满足我们的需求,因此我们需要使用库存MySQL+InnoDB在这个问题上推出我们自己的解决方案。) 我正在考虑一种策略,根据MySQL用户的用户名散列(加上一个用户不知道的salt,就像为任何有趣的游戏添加保险一样),将

我正在为一个应用程序进行早期设计,该应用程序需要从小规模开始,但具有高度可扩展性。我特别担心用户数据库,在这种情况下,它将有很高的插入和更新负载,并且不可能在单个主机上长期存在

(虽然我的问题与任何特定的RDBMS无关,但作为记录,我们将使用MySQL,而MySQL集群并不能真正满足我们的需求,因此我们需要使用库存MySQL+InnoDB在这个问题上推出我们自己的解决方案。)

我正在考虑一种策略,根据MySQL用户的用户名散列(加上一个用户不知道的salt,就像为任何有趣的游戏添加保险一样),将用户分配到MySQL主机中。我以前见过这样的解决方案被成功使用,但我从未亲自设计/实现过

我想了解的是:

1) 合适的散列算法。我希望SHA-1甚至MD5可以很好地解决这一问题,因为加密安全性并不是目标,但我不确定是否还有其他算法可以解决这类问题。再快一点也不错

2) 任何人都能想到的重大警告。(我已经非常清楚潜在的连接池问题,以及在池中添加新主机和迁移受影响用户的乐趣。)


谢谢

基于哈希的解决方案的问题是移动用户。考虑下面的场景——你有3个用户和3个服务器。用户A有一个哈希值,导致他们的连接被您的软件分配到服务器A,用户B连接到服务器B,用户C连接到服务器C。如果服务器B宕机,或者您想将用户B迁移到新服务器D,因为服务器B过载-您不能,因为您的软件被编码为使用用户名哈希值,并连接到一个服务器的基础上,有

此外,您还将遇到分发问题—用户A、B和C的哈希可能会解析为服务器A,因此服务器B和C处于空闲状态


就我个人而言,我会在所有服务器之间复制用户数据库表,然后在启动时随机连接到一个服务器,找到它们的实际数据库服务器,然后在该点继续。这样,您就可以轻松地移动用户,如果您在至少两台服务器之间复制数据,那么在服务器发生故障时,您就有了冗余。

基于哈希的解决方案的问题是移动用户。考虑下面的场景——你有3个用户和3个服务器。用户A有一个哈希值,导致他们的连接被您的软件分配到服务器A,用户B连接到服务器B,用户C连接到服务器C。如果服务器B宕机,或者您想将用户B迁移到新服务器D,因为服务器B过载-您不能,因为您的软件被编码为使用用户名哈希值,并连接到一个服务器的基础上,有

此外,您还将遇到分发问题—用户A、B和C的哈希可能会解析为服务器A,因此服务器B和C处于空闲状态


就我个人而言,我会在所有服务器之间复制用户数据库表,然后在启动时随机连接到一个服务器,找到它们的实际数据库服务器,然后在该点继续。通过这种方式,您可以轻松地移动用户,如果您在至少两台服务器之间复制数据,那么在服务器发生故障时,您就有了冗余。

首先,我觉得有义务告诉您,如果您仔细考虑设计,您可能不需要共享数据。切分是最后的手段。下面是Percona的Baron Swartz谈到的(不要错过幻灯片的直接链接):

根据实际建议

要考虑的是如何重新平衡你的应用程序。从3个节点开始;在某个点上添加第四个。如何迁移四分之一的数据?通过对每个用户进行重新分级?可能是个坏主意。需要考虑的是将分区划分为多个编号模式,并将模式编号散列到DB机器上。通过这种方式,您可以只移动需要接触的模式,而不重新格式化所有数据,从而进行迁移。由于模式的数量(数量级)大于机器的数量,因此您也不能依靠哈希来查找db机器,而是使用可以为迁移更新的静态映射。这样,如果您的一些用户比其他用户更活跃,并且创建了一个倾斜,那么您还可以在每台机器上使用非均匀分布的模式——您可以手动重新分配负载,使其工作得更好

您仍然需要将用户映射到模式。我一直在读的一个有趣的方法不是对一个bucket进行散列,而是使用2个散列函数将其散列为2个bucket,并选择其中加载最少的(按用户数、记录数或其他指标)作为目标。这将导致更均匀的分发,但在需要为用户获取数据时,会产生检查这两个分发的开销。这可以通过缓存来缓解,但仍然存在。不过,还是要考虑一下

您可能需要考虑复制碎片-可能是异步的,作为后台进程,用于热备份


最后,您是否考虑过替代技术?各种BigTable克隆虽然不提供关系模型,但在读写方面都具有非常好的伸缩特性。首先,我觉得有责任告诉你,如果你足够认真地考虑设计,你可能不需要分割东西。切分是最后的手段。下面是Percona的Baron Swartz谈到的(不要错过幻灯片的直接链接):

根据实际建议

要考虑的是如何重新平衡你的应用程序。从3个节点开始;在某个点上添加第四个。如何迁移四分之一的数据?通过对每个用户进行重新分级?可能是个坏主意。有一件事需要欺骗