当你从数据库中读取时,你有两个选择,通过在服务器中放置更多硬件来垂直扩展,或者通过放置第二个服务器以帮助卸载读取来水平扩展。
将读取数据卸载到第二个服务器,意味着所有写入操作都将命中两个服务器,而只读读取命中一个。
问题是当你在写作时遇到困难,因为写入必须发生在所有服务器上,这意味着所有服务器都会因写入请求而过载,并且服务器无法使用。为问题添加更多服务器没有帮助,因为它只会增加更多将被重载的服务器。所以你必须垂直扩展。
这是特定于RDBMS的东西吗?或者是所有DBMS发生的事情?
我知道你可以在软件方面做事,并将数据库分成两部分,例如。所有条目在一个数据库中以0-m开头,而在另一个数据库中以n-z开头,但恕我直言,它更像是一种解决方法,而不是问题的解决方案。
答案 0 :(得分:1)
我看不出这是关系模型特有的。所有必须读写的数据库(以及大部分数据库)都会遇到类似的问题。
对于它的价值而言,大多数数据库的读取远远超过了写入,因此写入屋顶的发生频率低于您的想象。此外,根据您的方法负载平衡数据库往往是对主服务器的立即写入,并对所有辅助服务器进行排队写入(至少根据我的经验)。
在这种情况下,您实际上并没有等待用户进行多次写入,而只是等待第一次。 DBMS本身管理实例之间的同步。这当然意味着辅助数据库可能不是完全最新的,但这可以控制。从技术上讲,这会破坏整个系统的ACID属性,但这可以围绕它构建。
答案 1 :(得分:1)
我认为任何DBMS都是如此,尽管有些人比其他人更好地处理它。如您所述,在软件中对数据库进行分区似乎是最常见的解决方案。
在许多应用程序中,如果您处于如此巨大的规模以至于必要的话,那么对数据库进行分区是有意义的。例如,如果您有一个社交网络应用程序,按国家或其他地理区域划分数据库可能是有意义的。这样您就可以让服务器在地理位置上靠近他们所服务的区域。它还有助于缓解跨数据库“社交图”的任何问题,因为人们的朋友往往住在附近。
答案 2 :(得分:0)
因为在大多数RDBMS安装中,所以写入必须发生在所有服务器上,所以你很难“通过写作达到顶峰”:
1)读取比写入更频繁
2)现代RDBM具有多版本并发控制,能够在读/写时减少阻塞