【问题标题】:DB Scalability for a high load application?高负载应用程序的数据库可扩展性?
【发布时间】:2016-03-18 11:48:39
【问题描述】:

我已经看到应用程序具有集群 Web 服务器(例如 10 到 20 个服务器)以具有可扩展性,它们可以在其中分发 在网络服务器之间加载。但我一直看到所有网络服务器都使用单个数据库。

现在考虑任何有数百万用户在任何时间点访问应用程序的电子商务或铁路网络应用程序。 为了在网络服务器端进行扩展,我们可以拥有服务器集群,但是我们如何扩展数据库呢?因为我们不能像多个网络服务器一样拥有多个 DB,因为一个 dB 的状态将与另一个 DB 不同:)

更新:- 是否无法在关系 DBMS 中缩放数据库,而只能在 mongo db 等 NO SQL DB 中缩放?

【问题讨论】:

  • 更多关于如何扩展关系数据库和无 sql 数据库的技巧jamesgolick.com/2010/3/30/what-does-scalable-database-mean.html
  • 一些 RDBMS 确实支持集群。不过通常不便宜。示例:Oracle RAC.
  • 集群并不是分散数据库负载的唯一解决方案。您还可以使用分片,即将数据库内容分布在多个服务器上,每个服务器只保存部分数据库。我记得看过一个关于使用 PostgreSQL 做这件事的大型电子商务供应商的讨论。
  • @JBNizet You can also use sharding, i.e. spread database contents across multiple servers, with each server holding only part of the database 但通常所有应用程序服务器都需要访问所有部件/数据库对象(我相信当您说部件时,您的意思是表、过程等数据库对象)。根据哪个应用服务器需要哪些 db 对象的标准来隔离 db 是不是太乏味了?
  • 没有。分片的意思是单个表的数据分布在多个服务器上。见en.wikipedia.org/wiki/Shard_%28database_architecture%29。例如,您可以想象您的电子商务网站在查找鞋子时将访问数据库 1,在查找 T 恤时将访问数据库 2,在查找裤子时将访问数据库 3,尽管鞋子、T 恤和裤子都存储在相同的概念表“产品”。您的铁路应用程序可以在 db1 中查找从巴黎的出发时间,在 db2 中查找从马赛的出发时间。

标签: java database scalability


【解决方案1】:

在数据库端有两种不同的可扩展性。一种是读取可扩展性,另一种是写入可扩展性。您可以同时进行垂直缩放,这意味着在一定程度上增加更多的 CPU 和 RAM。但是,如果您需要在非常大的数据上扩展超过单台机器的限制,您应该使用只读副本来满足读取可扩展性的需求,并使用分片来实现写入可扩展性。

分片不像将一些实体(鞋子)放在一台服务器上,而将另一些(T 恤)放在另一台服务器上那样工作。它的工作原理就像将一些鞋子和一些 T 恤放在一台机器上,然后对其他实体也这样做。

大容量数据管理的另一个解决方案是使用与您的示例更相似的微服务。我的意思是为鞋子提供服务,为 T 恤提供另一种服务。使用微服务,您可以将代码和数据划分到不同的项目以及不同的应用程序和数据库服务器。因此,您可以以不同的方式处理数据不同部分的可伸缩性。

【讨论】:

  • 如果我将一些鞋子和一些 T 恤存储到一台机器上,将一些鞋子和一些 T 恤存储到另一台机器上,java 代码如何知道它必须存储哪个数据库从 while 查询中读取特定鞋子?
  • 这是分片中最重要的问题。您应该决定使用什么来分片您的数据。它可以是鞋号,也可以是最适合您要求的品牌名称。但是您应该明智地选择它,以便数据和查询负载在分片之间均匀分布。
猜你喜欢
  • 2015-07-08
  • 2014-12-28
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多