代码之家  ›  专栏  ›  技术社区  ›  Thomas Winsnes

在编写RDBMS缺陷时,是否没有水平可伸缩性?还是所有DBMS都会发生这种情况?

  •  1
  • Thomas Winsnes  · 技术社区  · 14 年前

    当您从数据库中读取数据时,有两个选择:通过在服务器中放置更多硬件来垂直缩放,或者通过放置第二个服务器来帮助卸载读取数据来水平缩放。

    将读取卸载到第二个服务器,意味着所有写入都将同时命中两个服务器,而只读只命中一个服务器。

    问题是,当您写东西的时候遇到了麻烦,因为所有的服务器都必须写东西,这意味着所有的服务器都将被写请求超载,服务器将无法使用。向问题中添加更多的服务器并没有帮助,因为它只会添加更多的服务器,而这些服务器将超载。所以你必须垂直缩放。

    这是RDBMS特有的吗?还是所有DBMS都会发生这种情况?

    我知道你可以在软件方面做些事情,将数据库分成两部分,例如,所有以0-m开头的条目放在一个数据库中,而N-Z放在另一个数据库中,但我知道这与其说是解决问题的方法,不如说是解决问题的方法。

    3 回复  |  直到 10 年前
        1
  •  1
  •   paxdiablo    14 年前

    我看不出这是特定于关系模型的。所有必须读写的数据库(其中大部分)都会有类似的问题。

    值得一提的是,大多数数据库读的比写的要多得多,所以写屋顶的发生频率比你想象的要低。此外,根据您的方法,负载平衡数据库往往是立即向主数据库写入,并对所有辅助数据库进行排队写入(至少在我的经验中是这样)。

    在这种情况下,作为一个用户,您实际上并不需要等待多个写入操作,而是等待第一个写入操作。DBMS本身管理实例之间的同步。当然,这意味着辅助数据库可能并不完全是最新的,但这是可以控制的。从技术上讲,这会破坏整个系统的酸性特性,但这可以被架构起来。

        2
  •  1
  •   Eric Petroelje    14 年前

    我认为任何DBMS都是如此,尽管有些DBMS比其他DBMS处理得更好。正如您所提到的,在软件中对数据库进行分区似乎是最常见的解决方案。

    然而,在许多应用程序中,如果您的规模如此之大以致于有必要对数据库进行这样的分区,无论如何都是有意义的。例如,如果您有一个社交网络应用程序,那么按国家或其他地理区域划分数据库可能是有意义的。这将使您的服务器在地理位置上靠近它们所服务的区域。它还可以帮助缓解跨数据库“社交图”的任何问题,因为人们的朋友往往住在附近。

        3
  •  0
  •   jmarranz    10 年前

    由于所有服务器都必须进行写操作,所以您很难“用写来达到顶峰”,因为在大多数RDBMS安装中:

    1)读比写更频繁。

    2)现代RDBMS具有多版本并发控制,能够减少读写时的阻塞。