答案 0 :(得分:3)
除非您使用的是Oracle XE(有限的免费版),即使您购买单核,单CPU盒,每台服务器只有一个数据库也会非常快速地变得非常昂贵。每个服务器有几个数据库是低效的,因为每个数据库都会产生CPU和RAM使用的开销。调整更加困难,因为争用更难以诊断。
因此,除了更容易管理之外,单个大型服务器应该比许多离散的小型服务器更便宜(没有保证,没有退款!)。确保你购买最大,最快的芯片和尽可能多的RAM以及免费插槽。这些都可以在不影响许可成本的情况下为您提供更好的性能。
如果您能负担得起,请考虑分区选项。这将解决您对备份和恢复的担忧,因为每个分区都可以拥有自己的表空间。因此(通过client_id进行分区)可以备份或恢复单个客户端的数据,而不会影响其他客户端。我们甚至可以导出和导入单个分区。大卫观察到分区修剪与VPD无关,我感到很惊讶。但我没有试过这个组合,所以我会接受他的话。
您可能从合并中丢失的一件事是能够在不同版本的应用程序上支持不同的客户端。但是,这不一定是坏事。如您所见,如果您放弃应用程序的个性化版本,维护数百名客户将会容易得多。如果您确实需要提供一些定制功能 - 即使您只是想对某个客户端测试一些功能 - 那么请查看Edition-Based Redefinition in 11gR2:这是一个非常好的功能。此外,它适用于所有Oracle许可证,而不仅仅是Enterprise。
答案 1 :(得分:2)
当你说'单独的实例'时,你是在谈论一个有多个模式的实例吗?或者你真的是指在一台机器上运行多个实例?没有理由在单个机器上运行多个实例,而不是在单个实例上运行多个模式 - 每个模式仍然有自己的一组表,索引等。
无论如何,我没有完整的答案,但要记住的一件事是Oracle的许可成本,以及它如何影响最佳解决方案。
根据Oracle商店,
因此,例如,如果您需要8个四核CPU来处理100个客户,那么在单个数据库上进行许可比拥有4个独立数据库要昂贵得多,每个数据库都有2个四核CPU,每个CPU运行25个客户。
8个四核CPU需要企业版,其定价为16 x 47,500 = $ 760,000。 4台机器,每台运行标准版一台,每台机器配备2个四核CPUS,定价为8 x $ 5,800.00 = 46,400美元 - 相差16倍。现在,请记住,没有人支付企业版的定价,但仍有很大的差异需要考虑。
如果您不需要跨客户端进行数据库操作,并且您不需要企业版功能,并且您需要此级别的CPU能力(或者希望增长到需要此级别的CPU功率),许可成本将成为单一实例方法的巨大缺点。
答案 2 :(得分:2)
值得研究salesforce,你正在寻找的热门话题是“多租户架构”
这是一个很好的阅读:
http://blog.dayspring-tech.com/2009/02/forcecom-multitenant-architecture-under-the-covers/
这是一个很好的例子,因为Salesforce确实使用了Oracle数据库。
答案 3 :(得分:1)
好问题,很高兴看到你正在考虑所有的选择。很多好点,但我会坚持只解决一个问题。
我是托管应用程序的DBA,开发人员决定使用Oracle虚拟专用数据库功能。
构建应用程序的目的是让客户共享应用服务器池以实现负载平衡,并在后端共享单个数据库架构。
在VPD之前,我们有一个Java类,其中包含“where customer_id =?”或“和customer_id =?”在每个查询进入数据库之前,所以客户只能看到他们的数据。要在登录数据库时在VPD中实现此功能,我们会让应用程序在应用程序上下文中设置一个变量,VPD策略将使用该变量来允许会话仅查看其记录。所以,是的,你必须正确编码并将VPD策略分配给表,并且还相信Oracle会阻止他们讨价还价。
对我们有好处吗?理论上,将SQL谓词处理卸载到我们的应用程序之外的东西是很好的,但在实践中,优点并没有超过缺点。
当我们在一个数据库中有几十个客户端时,当我们升级时,它们都必须同时升级。我们与客户进行了大量的拉锯战,他们不想因为某种原因升级,或者想在新版本上做自己的QA。
我们接受了升级的旧实例/新实例,但迁移数据存在风险,相关的停机时间并没有让客户满意。我们确实推出了自己的程序,可以逐步执行表格并导出数据......但肯定不像快速导出或数据泵作业那么简单。
在进行分区时,我们也遇到了VPD谓词分析问题。与许多Oracle功能一样,它们可以自行运行,但是一旦与其他功能结合,事情就变得无法预测。对于我们来说,与当前customer_id无关的分区没有被淘汰,因为谓词分析在处理SQL语句时来得太晚了。我们通过改变从静态到动态的VPD策略来解决这个问题,但我们花了很多时间来解析镜头。
那么毕竟我对它的看法是什么?我会花时间确保我们的应用程序充分利用绑定变量,并继续使用将customer_id添加到SQL语句的旧机制。
答案 4 :(得分:1)
Oracle可以处理这种负载。
我的问题 - 当你有一千个顾客并说一万个时你会怎么做?
你还保留单独的实例/架构吗?
我怀疑有人会这样做。我之前在一个地方工作过,每个客户都有一个单独的数据库以及一个中心位置的副本
变更管理变得令人头疼,您必须保持关于哪个客户/公司在哪个数据库修订,架构,应用程序版本和所有这些事情上的非常好的信息。这本身就成了一个软件。
我建议基于SaaS模型创建软件/设计,这将使您可以轻松维护并为所有用户提供相同的数据库/架构。
对于可靠性,您仍然可以使用群集 - Oracle RAC。
答案 5 :(得分:0)
我不得不多次考虑同样的决定。在我们的例子中,我们使用MySQL,因此在单独的数据库中运行所有客户不会产生任何成本。
在单独的数据库上运行所有客户的好处非常好。我们有一个脚本,可以让我们将客户的整个实例移动到任何服务器以平衡负载。该脚本仅复制数据库,复制任何自定义文件,旋转应用程序,并设置我们的路由系统以将用户发送到新实例。整个过程只需几分钟。
数据库更改在大型mysql数据库上可能需要很长时间。由于我们所有的客户都拥有自己的数据库,因此我们能够保持所有数据集的小型化。备份也非常快。
我们的开发实例的行为方式相同,因此这种方法允许我们在开发和测试新功能时同时运行各种数据库模式。我们经常与客户合作,让他们在我们将其部署到其他实例之前尝试新功能。我们坚持的一条规则(为了避免您提到的一些缺点)是所有客户必须在彼此的一个版本内。在客户端维护多个版本会产生巨大的开销。
Facebook在创办公司时采取了同样的方法。他们启动的每所学校都有一个单独的数据库,他们能够非常快速地建立新的实例。他们最终整合数据库的主要原因是他们希望用户能够在学校之间进行交流。
如果不是潜在的成本问题,我肯定会鼓励你坚持使用单独的数据库方法。