我很想知道在用户写的和读的一样多的情况下,大型网站如何在不同的数据库服务器之间分配负载,即。当一个主服务器接受写入,几个从服务器只让用户读取数据的标准解决方案不起作用时,因为它只会将主服务器变成瓶颈。
对于使用负载均衡器管理大型站点的人 -> 多个 Web 服务器 -> 多个 DB 服务器,如何在 DB 服务器之间平均分配负载,以便用户(最多)不必等待master 更新从属,或者(最坏的情况)用户最终从尚未更新的从属读取脏数据?
谢谢你。
我很想知道在用户写的和读的一样多的情况下,大型网站如何在不同的数据库服务器之间分配负载,即。当一个主服务器接受写入,几个从服务器只让用户读取数据的标准解决方案不起作用时,因为它只会将主服务器变成瓶颈。
对于使用负载均衡器管理大型站点的人 -> 多个 Web 服务器 -> 多个 DB 服务器,如何在 DB 服务器之间平均分配负载,以便用户(最多)不必等待master 更新从属,或者(最坏的情况)用户最终从尚未更新的从属读取脏数据?
谢谢你。
查看http://highscalability.com/
您可以使用更复杂的方法来存储数据,以将其反规范化并将其分割成可以跨服务器负载平衡的块。寻找碎片。
一般的答案似乎是在您转向其他方法之前尽可能长时间地使单写数据库机器变得越来越强大。
在大多数情况下,解决问题的最佳方法是重新考虑您的站点如何工作以减少写入次数/使其可批处理。
您需要的是一个合适的多主数据库。据我所知,迄今为止唯一以可靠方式实现这一点的数据库引擎是 Oracle。这在某种程度上解释了为什么所有大男孩都使用 Oracle。
话虽如此,MySql 确实支持多主复制,尽管(AFAIK)不在完整的生产版本中。有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication-multi-master.html 。
这个答案没有回答问题的标题,因为它没有尝试使数据库保持同步,但它确实回答了问题的主体,以分发对大规模网站的请求。
您可以使用分片来划分数据,例如,您有 26 个数据库服务器,每个服务器对应一个字母。所有名称以 A 开头的用户都转到一台服务器。您可以使用各种算法来平均分配您的请求。这是一个复杂的解决方案,在用尽其他选项之前不应真正使用。
https://en.wikipedia.org/wiki/Shard_(database_architecture)
根据您的条款,我认为您正在谈论 MySQL。不幸的是,这个 DBMS 缺乏对分布式写入的支持,只有 NDB 支持。
http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-overview.html
http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-nodes-groups.html
另一种解决方案可以是:根据您的客户端 GEO 位置使用 DNS 级别分区解析不同的 IP 地址连接到哪里,并通过此信息基本上分离数据。这种解决方案存在一个问题,例如,如果您有一个查询,您想知道您在全球范围内有多少项目,那么这将无法很好地工作。
这取决于站点和站点的一部分。
有些片段将有一个写入服务器,然后将复制到一堆读取服务器。
该站点的其他部分将有许多服务器,每个服务器都保存一小部分数据。例如,每个数据库服务器有几百万个客户帐户,应用程序中有逻辑,因此它可以根据您的 UserId 知道您在哪个服务器上。
一个解决方案是重新考虑您的应用程序,以便您可以在多个数据库服务器之间拆分数据。有时很容易……有时则不然。