我很好奇,在用户写入和读取的次数一样多的情况下,大型网站如何在不同的数据库服务器之间分散负载,即当有一个主服务器接受写入,而几个从服务器只允许用户读取数据的标准解决方案不起作用时,因为它只会将主服务器变成瓶颈。
对于那些使用负载平衡器->多个 Web 服务器->多个 DB 服务器来管理大型网站的人来说,如何在 DB 服务器之间均匀分布负载,以便用户(最好)不必等待主服务器更新从服务器,或者(最坏的情况下)用户最终从尚未更新的从服务器读取脏数据?
谢谢。
答案1
您可以使用更复杂的方法来存储数据,基本上就是将其非规范化并分割成块,这样您就可以在服务器之间进行负载平衡。寻找碎片。
一般答案似乎是在转向其他方法之前,尽可能长时间地使单一写入数据库机器变得越来越强大。
在大多数情况下,解决问题的最佳方法是重新考虑您的网站如何运作,以减少写入次数/使它们可批处理。
答案2
您需要的是一个合适的多主数据库。据我所知,迄今为止唯一以可靠方式实现这一点的数据库引擎是 Oracle。这在某种程度上解释了为什么所有大公司都使用 Oracle。
话虽如此,MySql 确实支持多主复制,尽管(据我所知)不是在完整的生产版本中。请参阅http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication-multi-master.html了解更多详情。
答案3
这个答案没有回答问题的标题,因为它没有尝试保持数据库同步,但它确实回答了与分发高规模网站请求有关的问题主体。
您可以使用分片来划分数据,例如,您有 26 个数据库服务器,每个服务器对应字母表中的每个字母。所有名称以 A 开头的用户都使用一个服务器。您可以使用各种算法来均匀划分请求。这是一个复杂的解决方案,在其他选项用尽之前不应真正使用。
答案4
这取决于站点和站点的各个部分。
有些部分将有一个单独的写入服务器,然后将其复制到一组读取服务器。
网站的其他部分将拥有许多服务器,每个服务器都保存一小部分数据。例如,每个数据库服务器有几百万个客户帐户,应用程序中有逻辑,以便根据您的 UserId 知道您在哪个服务器上。