我有 2 台服务器。它们都托管相同的应用程序,每个应用程序都有自己的本地数据库。应用程序有时需要锁定数据库行进行写入,因此共享同一个数据库会对性能造成影响(是吗?)。
如果我想让两台服务器共享同一个数据库以避免数据冗余,我该怎么做才能不影响性能?数据库集群是正确的方向吗?
答案1
你可以把所有的数据库负载放在一台服务器上,把所有的 web 服务器负载放在另一台服务器上,也就是说,只有一个数据库和一个 web 服务器。这可能是最简单的分配负载的方法,不需要复杂的集群。
正确的解决方案取决于每个组件产生的负载以及瓶颈在哪里。
答案2
如果两个应用程序共享相同的数据(我的意思是实际上相同的数据、相同的模式、相同的表,而不仅仅是相同的数据库服务器进程),那么在更新共享数据时需要同步它们。您提到了行锁。无论是否对数据库进行集群,都需要存在这些锁。但是这些锁是细粒度的,它们只阻止对同一行(或在表锁的情况下阻止对表)的并发访问。对于 Oracle,行锁甚至不会阻止对同一行的查询(只是其他更新)。因此,只有当两个应用程序确实非常频繁地更新同一个共享表时,您才会遇到锁争用。
如果两个应用程序不共享任何数据,那么对表或行的任何锁定都不会影响另一个应用程序。它们只会争夺全局锁定(在复杂的数据库服务器中非常罕见)和共享资源(内存、服务器 CPU、磁盘空间、I/O 和网络带宽)。如果单个数据库服务器实例在托管两个应用程序时甚至还没有接近饱和,那么您就不会遇到任何问题。当您看到饱和时,您可以将两个应用程序的模式放在不同的机器上。
答案3
您可以使用 ETL 提取转换加载技术来迁移数据。使用 ETL 后,您的两个数据库都存在。您可以在并行测试上运行它们以避免性能受损。此问题不需要数据库集群。