13

我们的应用程序运行在网络上,主要是一个查询工具,做一些交易。我们托管 Oracle 数据库。该应用程序始终为每个客户提供不同的 Oracle 实例。客户是向我们支付费用以向公司员工提供服务的公司,通常每个客户有 10,000-25,000 名员工。我们打算有几百个客户。我们每隔几年发布一次主要版本,迁移到新版本具有挑战性:我们可能会有一个团队在客户站点工作几周,解释新功能并设置适合该客户的驾驶数据。

我们正在考虑采用多客户端,将我们所有的客户放在一个大型 Windows Server 2008 服务器上的单个共享 Oracle 11g 实例中——以降低成本。我想知道这是否可取。

为每个客户提供单独的实例有一些优势。请告诉我这些是不是假的。在我关于重要性降低的粗略猜测中:

  • 当对架构进行重大更改时,我们的客户 MyCorp 和 YourCo 可以单独迁移。(使用多客户端,我们将在一夜之间迁移 300 多个客户!?!)

  • MyCorp 的数据可以轻松备份和 (!!!) 恢复,而不会影响其他客户。

  • MyCorp 的数据与其竞争对手 YourCo 的数据安全分离,无需依赖开发人员来获得正确的代码和/或 DBA 获得正确的配置。

  • 多个实例的风险较低,因为一个客户的灾难(有人不小心将每个人的工资翻倍,并且在发薪日后发现错误)不会影响其他客户。影响我们所有客户的灾难(哎呀,新 DBA,突然间每个参与者都拥有相同的 SSN!?!)可能会使我们公司陷入困境。

  • 在一台服务器上拥有一个实例会导致单点故障,如果飓风将建筑物倒塌,我们的整个客户群都会倒闭。多台服务器上的多个实例允许地理分散:任何灾难都不会影响我们大部分客户,其他地区未受影响的服务器可以承担故障服务器的负载。

  • 性能更好,因为数据库更小(约 50 个表中的 10,000 对 2,000,000 行)。

  • 如果 MyCorp 的办公室(大部分)仅位于一个区域,那么 MyCorp 的实例可以在地理上共同位于那里,因此网络延迟不会影响性能。出于同样的原因,我们可以为全球客户提供更好的服务。

  • 在 MyCorp 想要把他们的数据库放在内部,然后我们可以很容易地导出他们的实例,来获取 MyCorp 他们的数据。

  • 负载平衡更容易,因为实例可以放置在不同的服务器上(这是使用网络场)。

  • 当需要 DEV 或 QA 实例时,克隆真实实例和匿名数据会更容易,因为数据要少得多。

  • 因为它们足够小,开发人员可以让他们自己的实例在本地运行,这样他们就可以在机场等待和飞行中处理代码,而无需担心 VPN 的麻烦。

Q1:独立实例还有哪些优势?

我们正在考虑更改数据库架构并将我们所有的客户合并到一个 Oracle 实例中,并在一台大型服务器上运行。

以下是多客户端实例方法的优点,首先是最重要的(我的 WAG)。如果这些是假的,请狙击:

  • DBA 的工作量更少,因为他们只需要维护一个实例而不是数百个实例。更少的 DBA 工作转化为更便宜的成本,这是我们进行此更改的主要动机。

  • 只需一个实例,DBA 就可以更好地优化性能。他们将有时间添加适当的索引并查看我们的 SQL。

  • 开发人员调试和增强应用程序会更容易,因为只有一个模式和一个应用程序(如果有数百个实例,可能会有几十个模式版本,每个版本的模式都有不同的应用程序版本)。这也降低了成本。另一种方法是必须在每个调试会话开始时(1)这个客户正在运行什么版本,(2)让我们努力重新创建相应的开发环境、代码和数据库。(我们需要一个包含每个补丁和版本的代码和数据库实例的虚拟机!)

  • 许可甲骨文更便宜,因为它是按服务器定价的,而与重量无关(或其他东西——我对这个主题一无所知)。

  • 该数据库成为 Web 会话数据的可行持久存储,因为只有一个实例。

  • 使用一个多客户端实例,一些数据库操作会更容易,例如当他们不清楚他们(或他们的配偶,也许)为哪个客户工作时找到一个参与者:所有的名字都在一个表中。跨客户报告很简单。

Q2:在一个实例中拥有多个客户端还有哪些其他优势?

Q3:您认为哪种方法更好(为什么)?每个客户一个实例,还是一个实例中的所有客户?

我担心拥有一个多客户端实例会使迁移几乎不可能,这是一个交易杀手......

...除非有一个折衷的解决方案,比如拥有两个多客户端实例,旧的和新的。在这种情况下,我们将设计用于查找参与者、报告等的跨实例解决方案,以便客户可以从一个多客户端实例转到下一个而不会出现任何中断。

4

6 回答 6

3

除非您使用的是 Oracle XE(有限的免费版),每台服务器只有一个数据库,否则即使您购买的是单核、单 CPU 机器,也会很快变得非常昂贵。每台服务器拥有多个数据库效率低下,因为每个数据库都会产生 CPU 和 RAM 使用开销。调整更困难,因为争用更难诊断。

因此,除了更易于管理外,单个大型服务器应该比许多离散的小型服务器更便宜(没有保证,没有退款!)。确保您购买最大、最快的芯片,并尽可能多地购买可用插槽的 RAM。这些东西可以在不影响许可成本的情况下为您提供更好的性能。

如果您负担得起,请考虑分区选项。这将解决您对备份和恢复的担忧,因为每个分区都可以有自己的表空间。因此(根据 client_id 进行分区)可以在不影响其他客户端的情况下备份或恢复单个客户端的数据。我们甚至可以导出和导入单个分区。David 发现分区修剪不适用于 VPD,这让我很惊讶。但是我还没有尝试过这个组合,所以我会相信他的话。

您可能会因整合而失去的一件事是在不同版本的应用程序上支持不同客户端的能力。然而,这不一定是坏事。正如您所观察到的,如果您放弃应用程序的个性化版本,维护数百个客户将会容易得多。如果您确实需要提供一些定制功能 - 即使您只是想使用单个客户端对某些功能进行 beta 测试 - 请查看11gR2 中基于版本的重新定义:这是一个非常棒的功能。它还适用于所有 Oracle 许可证,而不仅仅是 Enterprise。

于 2010-03-09T06:10:17.373 回答
2

当您说“单独的实例”时,您是在谈论一个具有多个模式的实例吗?或者你真的是指在一台机器上运行多个实例?几乎没有理由在一台机器上运行多个实例,而不是在单个实例上运行多个模式——每个模式仍然有自己的一组表、索引等。

无论如何,我没有完整的答案,但要记住一件事是甲骨文的许可成本,以及它如何影响最佳解决方案。

根据 Oracle 商店,

  • Oracle 标准版 1 是 5,800.00 美元/处理器(在 x86 上,一个处理器是一个插槽,您最多可以使用 2 个插槽)
  • Oracle 标准版是 17,500.00 美元/处理器(在 x86 上,一个处理器是一个插槽,您最多可以使用 4 个插槽)
  • Oracle 企业版是 47,500.00 美元/处理器(在 x86 上,一个处理器是 2 个核心 - 所以你必须有效地将四核 CPU 的价格翻倍)

因此,例如,如果您需要 8 个四核 CPU 来处理 100 个客户,那么在单个数据库上获得许可要比拥有 4 个单独的数据库(每个数据库有 2 个四核 CPU,每个运行 25 个客户)要贵得多。

8 个四核 CPU 需要企业版,标价为 16 x 47,500 美元 = 760,000 美元。4 台机器,每台运行标准版,每台配备 2 个四核 CPU,标价为 8 x 5,800.00 美元 = 46,400 美元 - 相差 16 倍。现在,请记住,没有人为企业版支付标价,但仍有巨大差异需要考虑。

如果您对跨客户端的数据库操作没有巨大需求,并且不需要企业版功能,并且您需要这种级别的 CPU 能力(或预计会增长到需要这种级别的 CPU 能力),那么许可成本将是单一实例方法的一个巨大缺点。

于 2010-03-09T01:03:26.850 回答
2

可能值得研究销售人员,而您正在寻找的流行词是“多租户架构”

这是一个很好的阅读:

http://blog.dayspring-tech.com/2009/02/forcecom-multitenant-architecture-under-the-covers/

这是一个很好的例子,因为 Salesforce 确实在幕后使用了 Oracle 数据库。

于 2010-03-09T15:27:49.287 回答
1

好问题,很高兴看到您正在考虑所有替代方案。很多好点,但我会坚持只解决一个。

我是托管应用程序的 DBA,开发人员决定为此使用 Oracle 虚拟私有数据库特性。

构建该应用程序的目的是让客户共享一个用于负载平衡的应用服务器池和后端的单个数据库模式。

在 VPD 之前,我们有一个 Java 类,它添加了“在哪里 customer_id=?” 或“和 customer_id=?” 在每个查询进入数据库之前,客户只会看到他们的数据。为了在登录数据库时在 VPD 中实现这一点,我们将让应用程序在应用程序上下文中设置一个变量,该变量将由 VPD 策略使用,以允许会话仅查看其记录。所以,是的,您必须正确编码并将 VPD 策略分配给表,并且还要相信 Oracle 会坚持他们的讨价还价。

那么这对我们有好处吗?从理论上讲,将 SQL 谓词处理卸载到我们应用程序之外的东西是很好的,但在实践中,优点并没有超过缺点。

  • 当我们在一个数据库中有几十个客户端时,当我们升级它们时,它们都必须同时升级。我们与那些出于某种原因不想升级或想对新版本进行自己的 QA 的客户进行了多次拔河比赛。

  • 我们接受了旧实例/新实例的升级,但迁移数据是有风险的,并且相关的停机时间不会让客户满意。我们确实推出了自己的程序,可以逐步遍历表格并导出数据……但肯定不像快速导出或数据泵工作那么容易。

  • 在分区方面,我们也遇到了 VPD 谓词分析的问题。与许多 Oracle 特性一样,它们本身可能工作正常,但一旦与其他特性结合使用,事情就会变得不可预测。对于我们来说,与当前 customer_id 无关的分区并没有被消除,因为谓词分析在 SQL 语句的处理中来得太晚了。我们通过将静态 VPD 策略更改为动态 VPD 策略来解决这个问题,但我们花在解析上的时间却猛增。

那么毕竟我的看法是什么?我会花时间确保我们的应用充分利用绑定变量,并继续使用将 customer_id 添加到 SQL 语句的旧机制。

于 2010-03-09T04:49:47.790 回答
1

Oracle 就是为处理这种负载而设计的。

我的问题 -当你有一千个客户并说一万时你会怎么做?
你还保留单独的实例/模式吗?

我怀疑有人会这样做。我之前曾在每个客户都有单独的数据库以及在中心位置的副本的地方工作过。
变更管理变得令人头疼,您必须维护有关哪个客户/公司在哪个数据库修订版、架构、应用程序版本和所有这些方面的非常好的信息。这本身就变成了一个软件。
我建议基于 SaaS 模型创建软件/设计,这将使您易于维护并为所有用户提供相同的数据库/模式。

对于可靠性,您仍然可以使用集群 - Oracle RAC

于 2010-03-09T06:25:45.557 回答
0

我不得不多次考虑同样的决定。在我们的例子中,我们使用 MySQL,因此在单独的数据库中运行所有客户不会产生任何成本。

在单独的数据库上运行我们所有的客户的好处是巨大的。我们有一个脚本可以让我们将客户的整个实例移动到任何服务器以平衡负载。该脚本仅复制数据库,复制任何自定义文件,启动应用程序,并设置我们的路由系统以将用户发送到新实例。整个过程只需几分钟。

在大型 mysql 数据库上,数据库更改可能需要很长时间。由于我们所有的客户都有自己的数据库,我们能够保持我们所有的数据集很小。备份也非常快。

我们的开发实例的行为方式相同,因此这种方法允许我们在开发和测试新功能时同时运行各种数据库模式。我们经常与客户合作,让他们在将新功能部署到我们的其他实例之前试用它。我们坚持的一条规则(为了避免您提到的一些缺点)是所有客户端必须在彼此的一个版本内。跨客户端维护多个版本将产生巨大的开销。

Facebook 在创办公司时采用了同样的方法。他们启动的每所学校都有一个单独的数据库,他们能够非常快速地设置新实例。他们最终整合数据库的主要原因是他们希望用户能够在学校之间进行交流。

如果不是因为潜在的成本问题,我肯定会鼓励您坚持使用单独的数据库方法。

于 2010-03-09T05:19:07.653 回答