我们的应用程序运行在网络上,主要是一个查询工具,做一些交易。我们托管 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:您认为哪种方法更好(为什么)?每个客户一个实例,还是一个实例中的所有客户?
我担心拥有一个多客户端实例会使迁移几乎不可能,这是一个交易杀手......
...除非有一个折衷的解决方案,比如拥有两个多客户端实例,旧的和新的。在这种情况下,我们将设计用于查找参与者、报告等的跨实例解决方案,以便客户可以从一个多客户端实例转到下一个而不会出现任何中断。