Sou desenvolvedor SQL (não DBA ou arquiteto) de uma empresa SaaS pequena (~ 50 funcionários). Tenho a tarefa de descobrir como:
- Descarregue relatórios operacionais de nossos mais de 100 bancos de dados OLTP
- Permitir que esses relatórios sejam executados com dados de vários bancos de dados do cliente
- Posicione nossa empresa para fornecer mais soluções baseadas em análises no futuro
Eu li vários artigos sobre várias tecnologias, como replicação transacional (especificamente o modelo de assinante muitos-para-um / central), SQL service broker, envio de logs, Change Tracking (CT) e Change Data Capture (CDC). isso é somente corporativo) e não tenho certeza de qual caminho é melhor seguir.
Espero que alguns de vocês com experiência em integração possam ter encontrado uma configuração semelhante à nossa e possam me indicar um caminho bem-sucedido ou me direcionar para alguns recursos que seriam úteis.
Devido a restrições de custo, nossa solução deve funcionar no SQL Server Standard Edition. Além disso, a solução deve ser razoável para apoiar / manter dentro de nossa pequena organização.
Configuração básica:
Atualmente, temos mais de 100 bancos de dados de clientes individuais, a maioria implantada em servidores SQL em nosso data center, mas alguns implantados em servidores clientes em seus datacenters nos quais podemos conectar remotamente. Esses são todos os bancos de dados do SQL Server 2008 R2, mas planejamos atualizar para o SQL 2016 em breve.
Usamos projetos de banco de dados e dacpacs para garantir que o esquema seja o mesmo em todos os bancos de dados clientes que seriam integrados. No entanto, como não forçamos todos os clientes a atualizar para novas versões ao mesmo tempo, algumas diferenças de esquema são possíveis entre as atualizações. A solução deve ser flexível o suficiente para não ser interrompida se o cliente A estiver na versão 1.0 do software e o cliente B estiver na versão 1.1.
Atualmente, os relatórios operacionais são executados diretamente do banco de dados OLTP de cada cliente. Estamos preocupados com o impacto que isso terá no desempenho do aplicativo se não o descarregarmos.
Requisitos de alto nível:
Nossos clientes são departamentos de processamento estéril (SPDs) de hospitais que desejam relatórios atualizados sobre o que foram processados até o momento, onde está o inventário, etc. Como um dos principais objetivos desse esforço é oferecer melhor suporte aos relatórios operacionais, gostaríamos que os dados estivessem o mais próximo possível do tempo real para continuar atendendo às necessidades dos clientes.
Atualmente, temos alguns SPDs em bancos de dados separados, que na verdade fazem parte do mesmo sistema hospitalar. Esses clientes desejam a capacidade de relatar todos os SPDs em seus sistemas.
Estrategicamente falando, gostaríamos da capacidade de agregar dados com facilidade em todos os nossos clientes para apoiar nossas iniciativas de análise interna. Nossa expectativa é que possamos usar os dados operacionais coletados como uma fonte para data marts / warehouse.
Pensamentos até agora:
A replicação transacional parece fornecer a solução mais "em tempo real". Achei esta resposta especialmente útil, mas estou preocupado que, com o potencial de diferenças de esquema, ela não funcione para nós: Replicação muitos-para-um do SQL Server
O envio de logs não parece ideal, pois o log não pode ser restaurado enquanto as consultas estão ativas. Eu tenho que expulsar todo mundo para que o log possa restaurar ou os dados ficarão obsoletos. Não estou claro se esse método poderia ser usado para centralizar dados de vários bancos de dados, pois cada log enviado seria apenas para o banco de dados individual de onde veio.
Usando o SQL service broker, a latência pode ser imprevisível se uma fila não conseguir acompanhar o número de mensagens a serem processadas.
O CT identifica apenas uma versão para cada linha da tabela. A latência dependeria da rapidez com que poderíamos processar algo como um pacote SSIS em cada banco de dados para recuperar os dados e inseri-los em um repositório central.
Precisamos considerar a replicação de cada banco de dados individualmente e, em seguida, talvez usar algum tipo de técnica de virtualização de dados para combinar dados das várias fontes replicadas?
Qualquer conselho ou orientação que você esteja disposto a fornecer seria muito apreciado.