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.
Respostas:
Sim. Você pode hospedar vários bancos de dados de assinantes em uma única instância e, em seguida, consultá-los com visualizações ou carregá-los em um banco de dados consolidado.
fonte
De acordo com a descrição acima, o link abaixo ajudará você e eu também a trabalhar no mesmo cenário. Vários editores com um único assinante.
Adicione mais uma coluna como server_id com valor padrão como 1,2,3 e assim por diante e torne-a chave primária composta.
Ao criar as publicações e adicionar artigos, a propriedade Ação do artigo, se o nome estiver em uso, deve ser configurada como Excluir dados. Se o artigo tiver um filtro de linha, exclua apenas os dados que correspondem ao filtro. Isso pode ser definido usando o diálogo Novas Propriedades do Artigo do Assistente para Publicação ou usando os procedimentos armazenados de replicação sp_addarticle e especificando um valor de exclusão para o argumento @pre_creation_cmd. Dessa forma, quando o assinante central for inicializado ou reinicializado a partir de vários instantâneos de publicação, os dados de instantâneo aplicados anteriormente serão preservados, pois somente os dados correspondentes à cláusula de filtro serão excluídos.
http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/
fonte
Uma arquitetura possível:
Considere os relatórios como uma solução baseada em data warehouse.
Normalmente, um data warehouse é um banco de dados com um esquema que representa o subconjunto necessário dos sistemas de origem. O AdventureWorks e o AdventureworksDW demonstram essa modelagem.
Em seguida, o ETL: Movendo dados das fontes para o armazém de dados.
Uma possível implementação aqui é usar o rastreamento de alterações.
Em primeiro lugar, pode-se implementar visualizações que são específicas da versão no que consomem, mas em termos do que retornam, são uniformes. Por exemplo, se o Person.Gender existir na versão 2, mas não na versão 1, a visualização da pessoa para a versão 1 poderá retornar, por exemplo, nulo para a versão 1.
Para o consumidor do armazém, lendo apenas as visualizações, os dados têm a mesma forma (com abrangência variável).
O rastreamento de alterações fornece uma maneira (relativamente) leve de determinar quais dados precisam ser alterados a cada atualização.
A implementação das opções acima depende de ferramentas manuais, para que você tenha confiança na codificação SQL e teste os cenários de desempenho para ver a rapidez com que os incrementos são executados. Em muitos casos, eles podem ter menos de 1 segundo, mas algumas tabelas de transações altas podem gerar alta carga nas alterações de processamento. (O rastreamento de alterações é 'relativamente' leve ... somente os testes provam isso).
A coisa boa aqui é que você tem um alto grau de controle sobre como as diferenças de esquema se manifestam e, com o rastreamento de alterações, não há chance de problemas de integridade quando implementados corretamente, pois o rastreamento é feito no nível do mecanismo.
Se isso é definitivamente certo para você, seria difícil dizer.
fonte