Database 试图了解一致性哈希如何在数据库服务器上更好地工作

Database 试图了解一致性哈希如何在数据库服务器上更好地工作,database,database-design,nosql,foreign-keys,relational-database,Database,Database Design,Nosql,Foreign Keys,Relational Database,关于Twitter或Instagram设计 基于UserID的分片:我们可以尝试将用户的所有数据存储在一台服务器上。在存储时,我们可以将用户ID传递给哈希函数,该函数将用户映射到数据库服务器,在那里我们将存储用户的所有推文、收藏夹、关注等。在查询用户的推文/关注/收藏夹时,我们可以问哈希函数在哪里可以找到用户的数据,然后从那里读取数据。这种方法有两个问题: 如果用户变热怎么办?服务器上可能会有很多查询容纳用户。这种高负载将影响我们服务的性能。 随着时间的推移,与其他用户相比,一些用户最终可能会存

关于Twitter或Instagram设计 基于UserID的分片:我们可以尝试将用户的所有数据存储在一台服务器上。在存储时,我们可以将用户ID传递给哈希函数,该函数将用户映射到数据库服务器,在那里我们将存储用户的所有推文、收藏夹、关注等。在查询用户的推文/关注/收藏夹时,我们可以问哈希函数在哪里可以找到用户的数据,然后从那里读取数据。这种方法有两个问题:

如果用户变热怎么办?服务器上可能会有很多查询容纳用户。这种高负载将影响我们服务的性能。 随着时间的推移,与其他用户相比,一些用户最终可能会存储大量tweet或拥有大量的关注。保持不断增长的用户数据的均匀分布是相当困难的。 要从这些情况中恢复,我们必须重新分区/重新分发数据或使用 基于TweetID的切分:我们的散列函数将把每个TweetID映射到一个随机服务器,我们将在那里存储该Tweet。要搜索tweets,我们必须查询所有服务器,每个服务器将返回一组tweets。集中式服务器将聚合这些结果以将其返回给用户。让我们看看时间线生成示例;以下是我们的系统生成用户时间线必须执行的步骤数:

我们的应用程序(app)服务器将找到用户跟踪的所有人。 App server将向所有数据库服务器发送查询,以查找这些人的推文。 每个数据库服务器将找到每个用户的tweet,按最近情况对它们进行排序,并返回最热门的tweet。 App server将合并所有结果并再次对其排序,以将最重要的结果返回给用户。 这种方法解决了热用户的问题,但与按用户ID进行切分不同,我们必须查询所有数据库分区以查找用户的tweet,这可能会导致更高的延迟

我的问题是,一致性哈希在这里有什么帮助?一致散列创建了一个环,并尝试将均匀分布的服务器与虚拟副本放在一起。一致性哈希对流行的tweetID或热点地区有什么帮助?

在添加和删除服务器时,一致性哈希非常有用,无需重新设置所有数据库,只需将所需的映射部分平均重新设置为k/n大小调整,其中k是数据键,n是服务器数