我们有一个在单个数据库服务器上使用 SQL Server 2008 的 Web 应用程序。所有存储都是本地的。在过去的一年里,我们一直试图让任何形式的 SQL Server 复制与我们的配置一起工作,但它不会。原因是我们有超过 2,000 个数据库在不断更新(每个客户一个),所以我们的测试表明所有形式的复制都过于占用资源。
每次我问这个问题时,人们都会关注我们有太多数据库这一事实。这是无法改变的(出于监管和其他原因),所以我想专注于我们如何复制数据。
有人告诉我们,一种选择是将所有数据移动到 SAN 并让 SAN 复制数据(或拍摄频繁的快照)。但是,如果我们的数据库服务器出现故障,在这种情况下是否存在数据库损坏的风险?是否有可能利用复制到另一个 SAN 的 SAN 来提供一个体面的 DR 解决方案(在我们的例子中,我们可能会丢失大约 30 分钟的数据,但我们不能丢失一整天的价值......即我们可以' t 去前一晚的备份)。
如其他答案所述:
旧式数据库镜像和新式 AlwaysOn 需要线程,您肯定会用完 2000 个数据库的线程。我模糊地记得实际限制远低于 200 个数据库。(在某处有一份白皮书,但我现在懒得去寻找它,而且这个答案已经超长了。)当然,每个实例有 200 个数据库。理论上,您可以启动 20 个实例并在每个实例上运行 100 个数据库。管理所有这些会很麻烦,而且我怀疑管理所有这些实例之间的内存会让人头疼。
SQL Server 复制(复制表(或表的子集),而不是文件)并不是真正用于 DR。即使对于一些数据库,也很难设置和管理。您可能需要更改您的数据模型以使其正常工作,这可能意味着您的应用程序的更改。您需要一种自动化方式将相同的复制配置应用于您的 2000 个(可能相同或几乎相同)数据库中的每一个。您需要用于配置复制的存储过程很混乱。通过 GUI 管理配置为复制的 2000 个数据库将是一场噩梦。当/如果您进行故障转移,您可能需要进行更改以使一切恢复正常。故障转移时间不是您想要进行任何可以避免的挑剔更改或工作的时间。您希望尽快恢复一切并运行。
SAN 存储单元之间的复制可能会很昂贵,尤其是当您谈论来自 EMC 等公司的硬件时。一旦您从供应商开始,您就几乎与他们结婚以进行升级、维护、额外空间等。
建议 #1: 你看过 Steeleye 的 DataKeeper 之类的东西吗?它是一种基于软件的复制产品,可在您的服务器上运行,并利用 Windows 故障转移群集。我从来没有真正使用过它,除了观看一些狗和小马表演外,我与公司没有任何联系。它看起来非常适合您的情况。
建议2: 如果是我,我绝对没有预算,我会考虑一些本土的原木运输系统。我怀疑内置的日志传送能否很好地处理 2000 个数据库。编写日志传送系统并不难,它可以解决特定于您的环境的所有问题。(例如,您可能需要通过 sftp 将文件发送到您的 DR 站点。)
基本上,该系统分为三个部分。每个部分都需要定期运行:
一部分是事务日志备份,将每个数据库的 tlog 备份文件放到不同的文件夹中(用于文件系统扩展)。我不会为此使用维护向导,我已经看到它多次出现问题并开始跳过数据库并且通常行为不端。如果您想提供 30 分钟的保证,则可能每 15 分钟运行一次。
一部分将备份文件从暂存区域复制到您的 DR 站点。如果您的 DR 有 VPN,这可能就像 robocopy CMD 文件一样简单。如果您需要更高级的东西(sftp 或 ssh/scp,或者如果您没有内置备份压缩功能,则可能是 zip/unzip),您可以编写一个包或一个 powershell 脚本。这可以运行得更快,也许每 5 分钟一次,以确保它得到一切。一旦某些东西被复制到异地,它就是“安全的”。
您想要审核所有三个步骤的表,一些报告/脚本向您显示发生了什么(是在您的主站点或辅助站点上运行的特定数据库?辅助站点上是否有任何数据库在两个小时内没有看到 tlog 恢复? ) 和警报方案。
最重要的是,我还希望能够选择一个特定的数据库进行故障转移,以及能够对所有内容进行故障转移。能够选择一个数据库进行故障转移可以轻松进行测试(您故障转移一个测试数据库,而不是客户的数据库),并且如果您遇到扩展问题,可能会给您一个基本的负载平衡方案。您还需要一种自动方式在主服务器和辅助服务器之间“重新同步”(从主服务器获取完整备份并将其应用到辅助服务器,启动 tlogs 流动等)。这些功能对于 2.0 版本可能会更好。
(大家都忘记了 MS 支持的最早的 tlog 传送是通过一些脚本实现的,你可以下载并在 SQL 7.0 上运行。有 go GUI,UI 是一些 SQL 报告和一些存储过程。)
除了编写一点 tsql 代码之外,这里的挑战是:
更改为完整恢复模式(在我看来,您可能在简单恢复模式下运行)以及可能用于日志备份的存储使用量的增加、数据库大小的增加、您有什么。
确保您的存储系统能够处理频繁的 tlog 备份负载并及时将它们复制到 DR 站点。IOW,如果您有 2000 个数据库并希望保证数据直到最后一小时,您需要能够对这 2000 个数据库中的每一个数据库进行一个事务日志备份并将其放到网络存储中(不在您的主服务器中的某个位置) )。
确保一切正常。
在我完成所有这些工作后,我将开始研究自动故障转移,如何告诉我的网站运行特定客户数据库的实时版本等。如果您没有运行集群系统,请确保您保持所有登录名/密码、工作、链接服务器等同步是 PITA。
是的,数据库有可能损坏,就像盒子断电一样(你有“崩溃一致性”)。
然而,数据库引擎采取了很多预防措施。每次您更改数据库中的数据时,它都会说“我要进行更改”,然后它会进行更改,然后它会说“我进行了更改”。粒度级别取决于它的设置方式,但您几乎总是能够通过重播日志(它打算做什么)来回滚到一致的状态。
这并不意味着您不会丢失数据,它只是意味着那里的数据是准确的。
在这种情况下,您可能想要的(假设您在 10 分钟或其他时间恢复时不会损失数千美元)是异步复制(您不想等待远程存储确认对数据库的写入)。对于大多数常见的存储系统,您只需说“每 X 分钟快照一次”,您就会被设置好。
最后,这不是 100% - 您仍然需要进行传统备份。但它相当可靠。这种设置非常常见,并且适用于虚拟机和数据库。
查看意图日志、回放、日志传送、高水位标记和一致性检查点以获取更多信息。
这绝对是可行的,我不知道有一种免费的方法可以做到这一点,但我们使用THIS,它基本上允许 MSSQL 框静默其文件,然后告诉 3Par 数组进行快照 - 这本质上是连贯的,并且然后继续。然后,该数组会快速处理并允许您拥有几乎所有想要的数量 - 实际上您只想说 24 小时左右,因此您只需在此基础上转储它们即可。正如我所说,远非免费,但每次都能 100% 工作,并且专为这种情况而设计。我很确定 NetApp 做了类似/相同的事情 - 我只是不知道那个产品对不起。
是的,有腐败的机会。短版:崩溃后,SQL 会重放事务日志以验证您的数据完整性。如果日志文件损坏,您的数据库将被标记为可疑。(这里还有更多。)
至于复制:听起来日志传送可能是你最好的选择。如果您可以浪费 30 分钟,您可能(取决于数据库的大小和它们的繁忙程度)在 30 分钟的窗口中每 10 分钟发送 1/3 的数据库。(换句话说,如果发生崩溃,1/3 的数据库将是 10 分钟,另外三分之一是 20 分钟,另外三分之一是 30 分钟。)
我在一个类似的应用程序上工作。不是我们假装的多租户应用程序是多租户的,因此每个客户一个数据库。糟透了。
您可以尝试将数据库拆分到多个 SQL 服务器上,以便在镜像/复制/日志传送时不会耗尽工作线程或遇到其他瓶颈之一。
我查看了 SQL 2012 中的 AlwaysOn,它看起来与 2008 镜像工作线程的要求相同,因此升级对您没有帮助。
您可以按照您的要求尝试存储层复制。我对这些没有太多经验。