Потрібні поради щодо інтеграції даних із 100+ клієнтських БД у централізовану базу даних звітів


10

Я розробник SQL (не DBA або архітектор) для невеликої (близько 50 співробітників) компанії SaaS. Мені доручено з'ясувати, як:

  1. Вивантажте оперативну звітність з наших 100+ баз даних OLTP
  2. Дозвольте цим звітам працювати з даними з декількох клієнтських баз даних
  3. Позиціонуйте нашу компанію надавати більше рішень на основі аналітики у майбутньому

Я прочитав ряд статей з різних технологій, таких як транзакційна реплікація (зокрема модель "багато в одному / центральній абонентській"), брокер служби SQL, доставка журналів, відстеження змін (CT) та зйомка даних змін (CDC, наскільки я розумію) це лише для підприємств), і я не впевнений, який шлях найкраще пройти.

Я сподіваюся, що хтось із вас із досвідом інтеграції, можливо, зіткнувся з настановою, подібною до нашої, і зможе вказати мені на успішний шлях або направити мене на деякі ресурси, які були б корисні.

Через обмеження витрат наше рішення має працювати в стандартній версії SQL Server. Також рішення повинно бути розумним для підтримки / підтримки в нашій невеликій організації.

Основна конфігурація:

В даний час у нас є більше 100 індивідуальних клієнтських баз даних, більшість яких розгорнута на SQL-серверах у нашому центрі обробки даних, але деякі розгорнуті на клієнтських серверах у їх центрі обробки даних, до яких ми можемо віддалено працювати. Це все бази даних SQL Server 2008 R2, але незабаром ми плануємо оновити до SQL 2016.

Ми використовуємо проекти баз даних і дакпаки для того, щоб схема була однаковою для всіх клієнтських баз даних, які були б інтегровані. Однак, оскільки ми не змушуємо всіх клієнтів одночасно переходити на нові версії, деякі оновлення можливі між оновленнями. Рішення повинно бути досить гнучким, щоб не порушуватися, якщо клієнт A має версію програмного забезпечення 1.0, а клієнт B - версію 1.1.

Наразі операційні звіти запускаються безпосередньо з баз даних OLTP кожного клієнта. Ми стурбовані впливом, яке це матиме на продуктивність програми, якщо ми не завантажимо її.

Вимоги високого рівня:

Нашими клієнтами є відділення для стерильної обробки в лікарнях (SPD), які хочуть отримувати актуальні звіти про те, що вони обробляли дотепер, де проводиться інвентаризація та ін. Оскільки однією з головних цілей цих зусиль є краща підтримка оперативної звітності, ми хотіли б, щоб дані були максимально наближені до реального часу, щоб продовжувати задовольняти потреби клієнтів.

Наразі у нас є окремі SPD в окремих базах даних, які фактично є частиною тієї ж лікарняної системи. Ці клієнти хочуть можливість звітувати проти всіх SPD в їх системі.

Стратегічно кажучи, ми хотіли б можливість легко агрегувати дані для всіх наших клієнтів для підтримки наших ініціатив внутрішньої аналітики. Ми сподіваємось, що ми зможемо використовувати зібрані оперативні дані як джерело для маркшейдів / сховищ даних.

Поки що думки:

Транзакційна реплікація, схоже, забезпечила б найбільш рішення у режимі реального часу. Я вважав, що ця відповідь є особливо корисною, але я стурбований тим, що з можливістю відмінностей у схемі вона не буде працювати для нас: реплікація "багато на один" SQL Server

Доставка журналу не здається ідеальною, враховуючи те, що журнал не може відновитись під час активних запитів. Мені або потрібно вигнати всіх, щоб журнал міг відновитись, або дані стануть застарілими. Мені незрозуміло, чи міг би цей метод використовуватись для централізації даних із кількох баз даних, оскільки кожен відправлений журнал був би лише для окремо взятої бази даних.

За допомогою сервісного брокера SQL затримка може бути непередбачуваною, якщо черга не змогла не відставати від кількості повідомлень, які обробляються.

КТ ідентифікує лише версію для кожного рядка таблиці. Затримка залежатиме від того, наскільки швидко ми зможемо обробити щось на зразок пакета SSIS проти кожної бази даних, щоб отримати дані та вставити їх у центральний сховище.

Чи потрібно розглядати реплікацію кожної бази даних окремо, а потім, можливо, використовувати якусь техніку віртуалізації даних для об'єднання даних з різних реплікуваних джерел?

Будемо дуже вдячні за будь-яку пораду чи напрямок, який ви готові надати.


1
Зважаючи на ваші (найближчі) вимоги в режимі реального часу, я би розглядав обробку на основі подій лише з деякими реалізаціями черги повідомлень (для гарантій доставки). Сподіваюся, що це допомагає
Grimaldi

1
Я б кинув HTAP у суміш. en.m.wikipedia.org/wiki/Hybrid_Transactional/… BIML та SSIS для заселення загального магазину.
Майкл Грін

@Grimaldi, чи рекомендуєте ви скористатися сервісним брокером SQL для реалізації подій, що працюють на основі подій, черг чи повідомлень чи іншої технології обміну повідомленнями?
bperry

Дякую за пропозицію, @MichaelGreen. По суті, схоже, що HTAP дозволить нам використовувати наявні бази даних як для OLTP, так і для OLAP, додаючи до наших таблиць некластеризовані індекси стовпчиків стовпців (NCCI). У запитах звітів використовується NCCI, щоб вони не заважали трансакційним операціям. SQL 2016 включає підтримку HTAP у стандартній версії (SE), але схоже, кеш-пам'ять кеша обмежена 32 ГБ у всьому екземплярі SQL. Це може бути проблемою для нас, оскільки у нас є десятки баз даних в одному екземплярі. microsoft.com/en-us/sql-server/sql-server-2016-editions
bperry

1
Так, зберігати стовпці, але також пам’яті пам'яті, якщо ваша серверна специфікація дозволяє вам зайти туди. Нещодавно я чув, як Суніл Агарвал говорив про це. Правила роботи МС складали приблизно 3% деградації OLTP для отримання нульової звітності про затримку. На жаль, безкоштовних обідів немає; ви можете створити нові екземпляри для зберігання БД звітів або ви можете створити новий екземпляр, щоб отримати достатньо місця для підтримки HTAP. Я не виступаю за цю модель. Це може не працювати для вас. Просто хотів, щоб ви знали, що вона існує.
Майкл Грін

Відповіді:


1

Чи потрібно розглядати реплікацію кожної бази даних окремо, а потім, можливо, використовувати якусь техніку віртуалізації даних для об'єднання даних з різних реплікуваних джерел?

Так. Ви можете розмістити декілька баз даних передплатників в одному екземплярі, а потім переглядати їх через представлення даних або завантажити їх у консолідовану базу даних.


Чи є більш елегантний спосіб налаштування цих поглядів, крім чогось, як ... SELECT Field1, Field2, Field3 FROM [Database1]. [Схема]. [TableName] UNION ALL SELECT Field1, Field2, Field3 FROM [Database2]. [Schema ]. [TableName]
bperry

1

Згідно з вашим вище описом нижче, посилання допоможе вам, і я також працюю над тим же сценарієм. Багато видавців з єдиним підписником.

  1. Додайте ще один стовпець на зразок server_id зі значенням за замовчуванням, як 1,2,3 тощо, і зробіть його складовим первинним ключем.

  2. Під час створення публікацій та додавання статей для властивості статті Дія, якщо використовується ім'я, потрібно встановити на Видалити дані. Якщо у статті є фільтр рядків, видаліть лише ті дані, які відповідають фільтру. Це можна встановити, скориставшись діалоговим вікном "Властивості статті майстра публікації" або використовуючи процедури реплікації, що зберігаються sp_addarticle, і вказавши значення видалення для аргументу @pre_creation_cmd. Таким чином, коли ініціалізований або повторно ініціалізований центральний абонент із декількох знімків публікацій, раніше застосовані дані знімків зберігатимуться, оскільки видаляються лише дані, що відповідають клавіші фільтра.

введіть тут опис зображення

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


спасибі за статтю Використовуючи модель центральної підписки, чи розробили ви, як оброблятимете оновлення схеми своїх видавців (наприклад, з оновленням версій)? Чи змусите одночасно оновлювати всі бази даних видавців? У моєму середовищі у нас не завжди є такий варіант, і це було моїм головним ваганням у пошуку моделі центральної реплікації абонентів. Якщо є шлях до цього бар'єру, я хотів би знати!
bperry

Я не використовую "Оновити видавця". Я розділив базу даних на дві частини, наприклад (два типи реплікації), частина таблиці в детальному видавці (Видавець для централізованого абонента), а частина - головний видавець (централізований підписник для всіх видавців) .... . Мій централізований абонент також є частиною групи доступності AlwaysOn для моєї вторинної репліки як сервер звітів.
Гулрес Хан

Дозвольте переконатися, що я розумію ваше рішення. Скажімо, Publisher A є у версії 1, а Publisher B - у версії 2. 1) Ви вимкнули реплікацію змін схеми для обох видавців (використовуючи replicate_ddl = 0 при налаштуванні). 2) Версія 2 містить новий стовпець, тому ви можете вручну додати його у центрального абонента. 3) У Publisher B (оновлений) ви б вручну додали новий стовпець у реплікацію (використовуючи sp_articlecolumn). Зміни у видавці А. не вносяться. Чи це дозволить обом видавцям продовжувати реплікацію до центрального підписника, не порушуючи реплікацію?
bperry

дивіться нижче посилання .. dba.stackexchange.com/questions/142449/…
Gulrez Khan

також дивіться це .. dba.stackexchange.com/questions/146070/…
Gulrez Khan

1

Одна можлива архітектура:

Розглянемо звітність як рішення на основі сховища даних.

Зазвичай сховище даних - це БД зі схемою, яка представляє необхідний підмножина вихідних систем. AdventureWorks та AdventureworksDW демонструють таке моделювання.

Далі, ETL: переміщення даних з джерел до сховища даних.

Можливою реалізацією тут є використання відстеження змін.

По-перше, можна реалізувати погляди, які є специфічними для версії, що вони споживають, але з точки зору того, що вони повертають, є єдиними. Наприклад, якщо Person.Gender існує у версії 2, але не у версії 1, вигляд людини для версії 1 може повернути, скажімо, нуль для версії 1.

Для споживача складу, лише читаючи погляди, дані мають однакову форму (з різною повнотою).

Відстеження змін забезпечує (відносно) легкий спосіб визначення того, які дані потрібно змінювати при кожному оновленні.

Реалізація вищезазначеного покладається на ручне інструментальне налаштування всього цього, тому вам потрібно бути впевненим у кодуванні SQL та тестувати сценарії продуктивності, щоб побачити, наскільки швидко зростають кроки. У багатьох випадках вони можуть бути на 1 секунду, але деякі високі таблиці транзакцій можуть створювати велике навантаження під час обробки змін. (Відстеження змін - це "відносно" невелика вага ... лише тестування підтверджує це).

Хороша річ, що ви маєте високий ступінь контролю над тим, як проявляються відмінності в схемі, і при відстеженні змін немає шансів на питання цілісності при правильній реалізації, оскільки відстеження проводиться на рівні двигуна.

Чи точно це вам підходить, важко сказати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.