100'den fazla istemci DB'sindeki verilerin merkezi bir raporlama veritabanına nasıl entegre edileceğine dair tavsiye arıyorum


10

Ben küçük bir (~ 50 çalışan) SaaS şirketi için bir SQL Geliştiricisi (DBA veya Mimar değil). Nasıl yapılacağını bulmakla görevlendirildim:

  1. 100'den fazla OLTP veritabanımızdan düşük operasyonel raporlama
  2. Bu raporların birden çok istemci veritabanındaki verilerle çalışmasına izin ver
  3. Şirketimizi gelecekte daha fazla analitik tabanlı çözüm sunacak şekilde konumlandırın

İşlem çoğaltması (özellikle birden bire / merkezi abone modeli), SQL hizmet komisyoncusu, günlük gönderimi, Değişiklik İzleme (CT) ve Veri Yakalama (CDC, Değişiklik) gibi çeşitli teknolojiler hakkında birkaç makale okudum bu yalnızca kuruluştur) ve hangi yolun izlenmesinin en iyi yol olduğundan emin değilim.

Bazılarınızın entegrasyon uzmanlığına sahip olduğumuzu, bizimkine benzer bir kurulumla karşılaşmış olabileceğini ve beni başarılı bir yola yönlendirebileceğini veya beni yardımcı olabilecek bazı kaynaklara yönlendirebileceğini umuyorum.

Maliyet kısıtlamaları nedeniyle, çözümümüzün SQL Server Standard Edition içinde çalışması gerekir. Ayrıca, çözüm küçük organizasyonumuzda destek / bakım için makul olmalıdır.

Temel yapılandırma:

Şu anda 100'den fazla bireysel istemci veritabanımız var, bunların çoğu veri merkezimizdeki SQL sunucularına dağıtıldı, ancak bazıları veri merkezlerindeki uzaktan kumanda edebileceğimiz istemci sunucularına dağıtıldı. Bunların tümü SQL Server 2008 R2 veritabanlarıdır, ancak yakında SQL 2016'ya geçmeyi planlıyoruz.

Entegre edilecek tüm istemci veritabanlarında şemanın aynı olmasını sağlamak için veritabanı projeleri ve dacpacs kullanıyoruz. Ancak, tüm istemcileri aynı anda yeni sürümlere yükseltmeye zorlamadığımız için, yükseltmeler arasında bazı şema farklılıkları mümkündür. İstemci A, yazılım sürümü 1.0 ve istemci B, sürüm 1.1 ise çözüm kırılmayacak kadar esnek olmalıdır.

Operasyonel raporlar şu anda doğrudan her müşterinin OLTP veritabanından çalıştırılmaktadır. Boşaltmazsak uygulamanın performansı üzerindeki etkisinden endişe duyuyoruz.

Üst Düzey Gereksinimler:

Müşterilerimiz, şimdiye kadar işledikleri, envanterin nerede olduğu, vb. Hakkında güncel raporlar isteyen hastane steril işleme departmanlarıdır (SPD'ler). Bu çabanın temel amaçlarından biri operasyonel raporlamayı daha iyi desteklemek olduğundan, verilerin müşterilerin ihtiyaçlarını karşılamaya devam etmek için mümkün olduğunca gerçek zamana yakın olmasını istiyoruz.

Şu anda, aynı hastane sisteminin bir parçası olan ayrı veritabanlarında bazı SPD'lerimiz var. Bu istemciler, sistemlerindeki tüm SPD'lere karşı bildirimde bulunma yeteneğini ister.

Stratejik olarak konuşursak, dahili analitik girişimlerimizi desteklemek için tüm müşterilerimiz arasında kolayca veri toplama yeteneğini istiyoruz. Beklentimiz, toplanan operasyonel verileri veri pazarları / depo için bir kaynak olarak kullanabileceğimizdir.

Şu ana kadarki düşünceler:

İşlemsel çoğaltma, en "gerçek zamanlı" çözümü sağlayacak gibi görünüyor. Bu yanıtı özellikle yararlı buldum, ancak şema farklılıkları potansiyeli ile bizim için işe yaramayacağı konusunda endişeliyim: SQL Server Çoktan Bire çoğaltma

Sorgular etkinken günlüğün geri yüklenemeyeceği göz önüne alındığında, günlük gönderimi ideal görünmüyor. Ya günlüğü geri yükleyebilmek ya da veriler eski haline gelmek için ya herkesi kovmak zorundayım. Gönderilen her günlük yalnızca geldiği tek bir veritabanı için olacağından, bu yöntemin birden çok veritabanındaki verileri merkezileştirmek için kullanılıp kullanılamayacağı konusunda net değilim.

SQL hizmet aracısı kullanılarak, bir kuyruk işlenecek ileti sayısını yakalayamazsa gecikme öngörülemez.

CT yalnızca her tablo satırı için bir sürüm tanımlar. Gecikme, verileri almak ve merkezi bir depoya eklemek için her veritabanına SSIS paketi gibi bir şeyi ne kadar hızlı işleyebileceğimize bağlı olacaktır.

Her bir veritabanını tek tek kopyalamayı düşünmeli ve daha sonra çeşitli çoğaltılmış kaynaklardan gelen verileri birleştirmek için belki de bir çeşit veri sanallaştırma tekniği kullanmalı mıyız?

Vermek istediğiniz herhangi bir tavsiye veya yön çok takdir edilecektir.


1
(Yakın) gerçek zamanlı gereksiniminiz nedeniyle, yalnızca bazı ileti kuyruğu uygulamalarıyla (teslimat garantileri için) olay tabanlı işleme bakarım. Umut etmek bu yardım etmek
Grimaldi

1
HTAP'ı karışıma atarım. en.m.wikipedia.org/wiki/Hybrid_Transactional/… BIML ve SSIS ortak mağaza doldurmak için.
Michael Green

@Grimaldi, olay tabanlı işleme / ileti kuyruklarını veya başka bir ileti teknolojisini uygulamak için SQL hizmet aracısını kullanmanızı önerir misiniz?
bperry

Öneri için teşekkürler, @MichaelGreen. Temel olarak HTAP, tablolarımıza kümelenmemiş sütun mağaza dizinleri (NCCI) ekleyerek hem OLTP hem de OLAP için mevcut veritabanlarımızı kullanmamıza izin verecek gibi görünüyor. Rapor sorguları NCCI kullanır, böylece işlem işlemlerini engellemezler. SQL 2016, Standard Edition'da (SE) HTAP desteği içerir, ancak sütun deposu önbelleğinin tüm SQL örneği boyunca 32 GB ile sınırlı olduğu görülmektedir. Aynı örnekte onlarca veri tabanımız olduğu için bu bizim için bir sorun olabilir. microsoft.com/en-us/sql-server/sql-server-2016-editions
bperry

1
Sunucu özellikleriniz oraya gitmenize izin veriyorsa, sütun deposunun yanı sıra bellekte de evet Sunil Agarwal'ın bu konuda konuştuğunu duydum. MS'in temel kuralı sıfır gecikme raporlamasının faydası için OLTP'nin yaklaşık% 3'lük bozulmasıydı. Ne yazık ki ücretsiz öğle yemeği yoktur; raporlama DB'sini tutmak için yeni örnekler oluşturabilir veya HTAP'yi desteklemek için yeterli boşluk kazanmak için yeni örnek oluşturabilirsiniz. Bu modeli savunmuyorum. Sizin için işe yaramayabilir. Sadece var olduğunun farkında olmanı istedim.
Michael Green

Yanıtlar:


1

Her bir veritabanını tek tek kopyalamayı düşünmeli ve daha sonra çeşitli çoğaltılmış kaynaklardan gelen verileri birleştirmek için belki de bir çeşit veri sanallaştırma tekniği kullanmalı mıyız?

Evet. Birden çok abone veritabanını tek bir örnekte barındırabilir ve ardından görünümler arasında sorgulayabilir veya bunları birleştirilmiş bir veritabanına yükleyebilirsiniz.


Bu görünümleri oluşturmanın daha zarif bir yolu var mı? [SELECT Field1, Field2, Field3 FROM [Database1]. [Şema]. [TableName] UNION ALL SELECT Field1, Field2, Field3 FROM [Database2]. [Şema [TableName]
bperry

1

Yukarıdaki açıklamaya göre bağlantı size ve ben de aynı senaryoda çalışmanıza yardımcı olacaktır.

  1. 1,2,3 gibi varsayılan değerlerle server_id gibi bir sütun daha ekleyin ve bunu birincil anahtarın birleşik yapın.

  2. Yayınları oluştururken ve makaleler eklerken, ad kullanılıyorsa Action makalesinin Verileri sil olarak ayarlanması gerekir. Makalede bir satır filtresi varsa, yalnızca filtreyle eşleşen verileri silin. Bu, Yeni Yayın Sihirbazı Makale Özellikleri iletişim kutusu kullanılarak veya sp_addarticle çoğaltma saklı yordamları kullanılarak ve @pre_creation_cmd bağımsız değişkeni için silme değeri belirtilerek ayarlanabilir. Bu şekilde, merkezi abone birden çok yayın anlık görüntüsünden başlatıldığında veya yeniden başlatıldığında, yalnızca filtre maddesiyle eşleşen veriler silineceğinden, önceden uygulanan anlık görüntü verileri korunur.

resim açıklamasını buraya girin

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


makale için teşekkürler. Merkezi abone modelini kullanarak yayıncılarınızın şemasındaki güncellemeleri nasıl ele alacağınızı öğrendiniz mi (örneğin, sürüm yükseltmeleriyle)? Tüm yayıncı veritabanlarını aynı anda güncellenmeye zorlayacak mısınız? Çevremde, her zaman bu seçeneğe sahip değiliz ve bu, merkezi bir abone çoğaltma modelini takip etmede birincil tereddütümdü. Bu engelin etrafında bir yol varsa, bilmek isterim!
bperry

Ben 'Publisher Güncelleme' kullanmıyorum. Ben detaylı yayıncı (Merkezi aboneye Yayıncı) bazı tablo (iki çoğaltma iki) gibi iki bölüme bölünmüş veritabanı ve bazı ana yayıncı (tüm yayıncıya merkezi abone) .... Merkezi abonem ayrıca rapor sunucusu olarak ikincil çoğaltma çalışmam için AlwaysOn avaibality grubunun bir parçasıdır.
Gulrez Khan

Çözümünüzü anladığımdan emin olalım. Diyelim ki Yayıncı A sürüm 1'de ve Yayıncı B sürüm 2'de. 1) Her iki yayıncıda şema değişikliklerinin çoğaltılmasını kapattınız (kurulumda replicate_ddl = 0 kullanarak). 2) Sürüm 2 yeni bir sütun içerir, bu nedenle merkezi aboneye manuel olarak ekleyebilirsiniz. 3) Publisher B'de (yeni sürüm), yeni sütunu manuel olarak çoğaltmaya eklersiniz (sp_articlecolumn kullanarak). Yayıncı A'da hiçbir değişiklik yapılmaz. Bu, her iki yayıncının da çoğaltmayı bozmadan merkezi aboneye çoğaltmaya devam etmesine izin verir mi?
bperry

aşağıdaki bağlantıya bakın .. dba.stackexchange.com/questions/142449/…
Gulrez Khan


1

Olası bir mimari:

Raporlamayı veri ambarı tabanlı bir çözüm olarak düşünün.

Tipik olarak bir veri ambarı, kaynak sistemlerin gerekli alt kümesini temsil eden bir şemaya sahip bir DB'dir. AdventureWorks ve AdventureworksDW bu modellemeyi gösteriyor.

Ardından, ETL: Verileri kaynaklardan veri ambarına taşıma.

Burada olası bir uygulama, değişiklik izlemeyi kullanmaktır.

İlk olarak, tükettikleri şeyde sürüme özgü görünümler uygulanabilir, ancak geri döndükleri açısından tekdüze olurlar. örneğin, Person.Gender sürüm 2'de mevcut ancak sürüm 1'de mevcut değilse, birinci sürüm için kişi görünümü, örneğin sürüm 1 için null değerini döndürebilir.

Depo tüketicisi için, yalnızca görüşleri okuyarak, veriler aynı şekildedir (değişen eksiksizlikle).

Değişiklik izleme, her yenilemede hangi verilerin değişmesi gerektiğini belirlemenin (nispeten) hafif bir yolunu sunar.

Yukarıdakileri uygulamak her şeyi elden geçirmeye dayanır, bu nedenle SQL kodlamasından emin olmanız ve artışların ne kadar hızlı çalıştığını görmek için performans senaryolarını test etmeniz gerekir. Çoğu durumda 1 saniyenin altında olabilirler, ancak bazı yüksek işlem tabloları işleme değişikliklerinde yüksek yük oluşturabilir. (Değişim izleme 'nispeten' hafiftir ... sadece test bunu kanıtlar).

Burada şema farklılıklarının nasıl ortaya çıktığı üzerinde yüksek derecede kontrol sahibi olmanız iyi bir şeydir ve değişiklik izleme ile, izleme motor düzeyinde yapıldığından, doğru uygulandığında bütünlük sorunları olasılığı yoktur.

Bunun sizin için kesinlikle doğru olup olmadığını söylemek zor olurdu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.