寻找有关如何将100多个客户数据库中的数据集成到集中式报告数据库中的建议


10

我是一家小型SaaS公司(约50名员工)的SQL开发人员(不是DBA或架构师)。我的任务是弄清楚如何:

  1. 从我们100多个OLTP数据库中卸载运营报告
  2. 允许这些报告针对来自多个客户端数据库的数据运行
  3. 定位我们的公司以在将来提供更多基于分析的解决方案

我已经阅读了许多有关各种技术的文章,例如事务复制(特别是多对一/中央订户模型),SQL服务代理,日志传送,变更跟踪(CT)和变更数据捕获(CDC),我的理解是这仅适用于企业),我不确定最好采用哪种方法。

我希望一些具有集成专业知识的人可能会遇到与我们类似的设置,并且能够指出成功的道路或将我引向一些有帮助的资源。

由于成本限制,我们的解决方案必须在SQL Server Standard Edition中运行。另外,解决方案必须合理,才能在我们的小型组织内提供支持/维护。

基本配置:

目前,我们有100多个单独的客户端数据库,大多数部署在我们数据中心的SQL服务器上,但是有些部署在我们数据中心内的客户端服务器上,我们可以远程访问这些数据库。这些都是SQL Server 2008 R2数据库,但是我们计划很快升级到SQL 2016。

我们使用数据库项目和dacpacs来确保所有要集成的客户端数据库中的架构都是相同的。但是,由于我们不强制所有客户端同时升级到新版本,因此升级之间可能会存在一些架构差异。如果客户端A在软件版本1.0上并且客户端B在软件版本1.1上,则解决方案必须足够灵活,以免损坏。

当前,操作报告直接从每个客户端的OLTP数据库运行。如果我们不卸载应用程序,则会担心它会对应用程序性能产生影响。

高级要求:

我们的客户是医院无菌处理部门(SPD),他们需要有关其到目前为止所处理的内容,库存在何处等的最新报告。SPD每天(包括周末和节假日)的过程库存。由于这项工作的主要目的之一是更好地支持运营报告,因此我们希望数据尽可能接近实时,以继续满足客户的需求。

目前,我们在单独的数据库中有一些SPD,这些数据库实际上是同一医院系统的一部分。这些客户希望能够针对其系统中的所有SPD进行报告。

从战略上讲,我们希望能够轻松汇总所有客户的数据以支持我们的内部分析计划。我们的期望是,我们将能够使用收集到的运营数据作为数据集市/仓库的来源。

思念至今:

事务复制似乎将提供最“实时”的解决方案。我发现此响应特别有用,但我担心由于存在架构差异的可能性,因此对我们不起作用:SQL Server多对一复制

鉴于查询活动时日志无法还原,日志传送听起来并不理想。我要么将所有人踢出去,以便可以恢复日志,否则数据将变得过时。我不清楚该方法是否可用于集中多个数据库中的数据,因为每个出厂的日志仅适用于它来自的单个数据库。

使用SQL Service Broker,如果队列无法跟上要处理的消息数量,则延迟可能是不可预测的。

CT仅为每个表行标识一个版本。延迟时间取决于我们对每个数据库处理诸如SSIS包之类的东西以检索数据并将其插入中央存储库的速度。

我们是否需要考虑分别复制每个数据库,然后使用某种数据虚拟化技术来组合来自各种复制源的数据?

您愿意提供的任何建议或指示将不胜感激。


1
由于您的(接近)实时需求,我将只看一些消息队列实现(基于传递保证)的基于事件的处理。希望这会
有所

1
我会将HTAP加入其中。zh.m.wikipedia.org/wiki/Hybrid_Transactional/…BIML 和SSIS用于填充公用存储。
迈克尔·格林

@Grimaldi,您是否建议使用SQL服务代理来实现基于事件的处理/消息队列或某些其他消息技术?
bperry

谢谢您的建议,@ MichaelGreen。基本上,看起来HTAP可以通过向表中添加非集群列存储索引(NCCI)来使我们将现有数据库用于OLTP和OLAP。报表查询使用NCCI,因此它们不会干扰事务操作。SQL 2016在标准版(SE)中包括HTAP支持,但在整个SQL实例中,列存储缓存似乎限制为32GB。对于我们来说这可能是个问题,因为我们在同一实例上有数十个数据库。microsoft.com/en-us/sql-server/sql-server-2016-editions
bperry

1
是的,如果您的服务器规格允许您访问列存储,也可以在内存中。我最近听到苏尼尔·阿加瓦尔(Sunil Agarwal)谈论这个话题。MS的经验法则是OLTP降低约3%,以实现零延迟报告。可惜没有免费的午餐。您可以创建新实例来保存报告数据库,也可以创建新实例以获得足够的空间来支持HTAP。我不主张这种模式。它可能对您不起作用。只是想让您知道它的存在。
迈克尔·格林

Answers:


1

我们是否需要考虑分别复制每个数据库,然后使用某种数据虚拟化技术来组合来自各种复制源的数据?

是。您可以在一个实例上托管多个订户数据库,然后使用视图在它们之间进行查询,或将它们加载到统一数据库中。


除了诸如... SELECT Field1,Field2,Field3 FROM [Database1]。[schema]。[TableName] UNION ALL SELECT Field1,Field2,Field3 FROM [Database2]。[schema]之外,还有没有一种更优雅的方式来设置这些视图。 ]。[TableName]
bperry

1

根据您上面的描述,下面的链接将帮助您和我也使用相同的方案。多个发布者和单个订阅者。

  1. 再添加一列,例如server_id,其默认值例如1,2,3,依此类推,然后使其成为复合主键。

  2. 在创建出版物和添加文章时,需要将文章属性“如果正在使用名称,请执行操作”设置为“删除数据”。如果article具有行过滤器,请仅删除与过滤器匹配的数据。可以使用“新建发布向导文章属性”对话框或使用复制存储过程sp_addarticle并为@pre_creation_cmd参数指定delete值来进行设置。这样,当从多个发布快照初始化或重新初始化中央订户时,将保留先前应用的快照数据,因为仅会删除与filter子句匹配的数据。

在此处输入图片说明

http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/


谢谢你的文章。使用中央订户模型,您是否已确定如何处理发布者的架构的更新(例如,版本升级)?您是否将强制同时更新所有发布者数据库?在我的环境中,我们并不总是具有此选项,这是我追求中央订户复制模型的主要犹豫。如果有办法解决这个障碍,我很想知道!
bperry

我没有使用“更新发布者”。我将数据库分为两部分,例如(两种复制类型),一些详细发布者中的表(发布者到集中订阅者),一些是主发布者(集中式订阅者到所有发布者)。我的集中订户也是AlwaysOn可用性组的一部分,因此我的辅助副本充当报表服务器。
Gulrez Khan

让我确保我了解您的解决方案。假设发布者A在版本1上,发布者B在版本2上。1)您已经关闭了两个发布者上架构更改的复制(在安装时使用plicate_ddl = 0)。2)版本2包括一个新列,因此您可以在中央订户处手动添加它。3)在Publisher B(已升级)上,您将随后手动将新列添加到复制中(使用sp_articlecolumn)。发布者A上没有进行任何更改。这是否允许两个发布者在不中断复制的情况下继续复制到中央订阅者?
bperry

参见下面的链接。dba.stackexchange.com
questions/


1

一种可能的架构:

将报告视为基于数据仓库的解决方案。

通常,数据仓库是具有表示源系统所需子集的架构的DB。AdventureWorks和AdventureworksDW演示了该建模。

接下来是ETL:将数据从源移动到数据仓库。

这里可能的实现是使用变更跟踪。

首先,人们可以实现使用特定于视图的视图,但是就返回而言,视图是统一的。例如,如果Person.Gender存在于版本2中,而不存在于版本1中,则版本1的人员视图可以返回,例如,版本1的null。

对于仅阅读视图的仓库用户而言,数据是相同的形状(具有不同的完整性)。

更改跟踪提供了一种(相对)轻量级的方法,可确定每次刷新时需要更改哪些数据。

实施上述操作全部依靠手工工具,因此您需要对SQL编码充满信心,并测试性能方案,以了解增量运行所需的速度。在许多情况下,它们可能不到1秒,但是某些高事务表可能会在处理更改时产生高负载。(更改跟踪“相对”轻巧……只有测试证明了这一点)。

这样做的好处是,您可以高度控制架构差异的表现方式,并且通过更改跟踪,在正确实现的情况下就不会出现完整性问题,因为跟踪是在引擎级别进行的。

这是否绝对适合您,很难说。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.