Гетерогенная распределенная система как способ миграции больших и не очень баз данных с MSSQL Server на PostgreSQL

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет! Я Владимир Колосков, ведущий разработчик в Softpoint. Сегодня я хочу поделиться своими соображениями по поводу миграции больших и огромных БД с MSSQL Server на PostgreSQL: зачем это делать, стоит ли это делать сейчас и как я вижу такой переход.

Сразу пару слов про «Почему с SQL Server?» и «Почему на PostgreSQL?».

Самая распространенная в России платформа для бизнес-систем – это 1С:Предприятие 8. Причем в компаниях любого размера. Исторически платформа работала всегда с MS SQL Server. Есть, конечно, инсталляции и на других СУБД, но их крайне мало в общей массе. А связке 1С+MSSQL Server уже не один десяток лет, она отлажена, понятна и более-менее предсказуема. На основании собственного опыта и опыта Softpoint могу уверенно утверждать, что если в компании есть крупная ИТ-система, то она почти всегда на MSSQL Server (даже если это не 1С). И чем больше база данных, тем сложнее компании решиться на миграцию, т.к. это длительный процесс, с серьезным функциональным и нагрузочным тестированием, не укладывающийся ни в одно технологическое окно. А перспектива простоев ИТ-систем в бизнесе – такое себе.

Что касается вопроса «Почему на PostgreSQL?», то на данный момент других вариантов просто нет, ниже по тексту я разверну это утверждение.

Одна из целей статьи – показать, что использование гетерогенной информационной системы как инструмента перехода с одной СУБД на другую – это очень оправданный шаг как с экономической точки зрения, так и с учетом возможных рисков. Это позволит, с одной стороны, пользоваться и хранить данные в привычной СУБД, которая годами и десятилетиями оттачивалась крупным вендором, и которая имеет минимальные нарекания в производительности, в поддержке, в ошибках. А, с другой стороны, параллельно пользоваться СУБД с открытым исходным кодом, анализировать ее поведение при таком же профиле нагрузки, плавно увеличивать нагрузку, проводить тестирование столько времени, сколько нужно.

Зачем переходить на PostgreSQL и какие риски, если оставить всё как есть

Я вижу две причины, по которым многим организациям следует взять курс на миграцию СУБД с MS SQL Server на PostgreSQL: законодательство и уход иностранных вендоров.

Причина 1: Законодательство

Эта причина объективная. Особенно для госсектора.

В июне 2015 года был принят закон о создании реестра отечественного ПО, и осенью того же года вышло постановление о запрете закупки ПО из иностранных государств для госзаказчиков. Это был не полный запрет, а скорее, ограничение, к которому прилагался порядок подготовки обоснования невозможности соблюдения запрета. Чем все и пользовались. Иногда действительно обоснованно, т.к. аналогов среди отечественного ПО просто не было. Но, в целом, с 2016 года государство взяло курс на импортозамещение. А в марте 2022 года вышел указ Президента РФ, где дедлайны стали вполне себе четкими и обозримыми – с 1 января 2025 госсектору запрещается использование иностранного ПО на объектах критической инфраструктуры. Кстати, как раз с прошлого года у многих наших клиентов появился активный, а не гипотетический, интерес к процессу миграции с MSSQL Server на PostgreSQL.

Получается, что миграция для многих госкомпаний неизбежна, другого пути нет, и лучше начинать подготовку сейчас, пока в запасе есть год-полтора.

Причина 2: Уход иностранных вендоров с рынка

В 2022 г. IT-подразделения российских компаний оказались в ситуации, когда иностранные вендоры ПО перестали оказывать поддержку, продавать лицензии, закрыли доступ к обновлениям. Таким образом, даже если компания не аффилирована с государством, и на нее не распространяются ограничения на закупку иностранного ПО, сделать это официальным путем становится с каждым разом всё сложнее. Конечно, в арсенале остаются методы получения софта, распространенные в 90-х и 00-х годах, но здесь не про это. Чем крупнее компания, тем больше у нее пользователей и тем больше вероятность словить очередную порцию исключительных ситуаций, которые можно решить, зачастую, только с помощью вендора. Естественно, поддержка вендора нужна далеко не всегда, но, учитывая, что любой продукт вендора – это черный ящик, порешать некоторые проблемы без его участия практически невозможно.

В качестве спойлера. В одной из следующих статей будет разбираться как раз такой пример, где ошибка в СУБД (не хочется думать, что это фича или целенаправленное вредительство) появилась в обновленной версии MSSQL Server и в определенных условиях замедляет работу пользователей.

 Альтернатива – ничего не трогать, оставить все как есть. Оно ж работает.

Компании будут продолжать работать на том же самом софте, потому что у них просто имеется такая возможность. Если она не относится к госсектору, и бизнес устраивает текущая инфраструктура, то зачем что-то менять? Ведь переход на новую СУБД, новую архитектуру – это очень высокорискованное мероприятие.

В любом случае все «За» и «Против» миграции каждый составляет для себя сам. Я лишь хочу сказать, что сейчас все обстоятельства подталкивают организации всё чаще рассматривать импортозамещение ПО, в частности, СУБД, как основной сценарий продолжения функционирования ИТ-систем. И это совсем неплохо. Это развитие и конкуренция )).

Сценарии перехода на другие СУБД

Наиболее вероятным кандидатом сейчас является PostgreSQL. Это достаточно популярный и развивающийся продукт с открытым исходным кодом и множеством сборок, в том числе и отечественных. И в этом огромный плюс. Но необходимо отметить, что MSSQL Server за 20 лет прошел огромную трансформацию и стала очень хорошей СУБД. И во многом сравнение PostgreSQL и MSSQL будут не в пользу первой. Поэтому гарантировать работу вашей большой/высоконагруженной/с множеством интеграций системы на PostgreSQL хотя бы с таким же уровнем комфорта как на MS SQL Server я бы не стал. Сразу не стал. К сожалению, без перехода и проверки на реальной нагрузке не обойтись.

Какие существуют выходы из сложившейся ситуации?

Варианты, предложенные ниже, касаются преимущественно больших и огромных баз данных, перенос которых займет время, во много раз превышающее любое разумное технологическое окно. А значит, перенос и трансформация БД с одной СУБД на другую займет не просто дни, а недели и месяцы, т.к. кроме непосредственно процедуры переноса требуется значительное время на функциональное и нагрузочное тестирование. Именно поэтому я предлагаю гетерогенную информационную систему.

Далее не будет какой-то пошаговой инструкции. Чудес не бывает, это всё сложные и длительные проекты, связанные со множеством рисков. Я покажу наш подход, сформировавшийся за многие годы и основанный на принципах репликации баз данных. Репликация не штатная, а собственный запатентованный продукт DB Replication с отдельным сервером дистрибуции, отдельной служебной базой данных, агентами, службами, утилитами настройки для осуществления сложной логики обмена.

Методика и продукт постепенно совершенствовалась и теперь позволяют решать задачи обмена и синхронизации данных не только в уже достаточно «простых» проектах типа «MS SQL Server v1 – MS SQL Server v2», но и «MS SQL Server – PostgreSQL».

Хочу заметить, что наш подход в корне отличается от существующих сценариев, рекомендуемых 1С: «миграция через выгрузку базы в dt-файл» и «миграция при помощи планов обмена 1С». В платформе 8.3.23 планируется еще третий сценарий – конвертация при помощи утилиты ibcmd сразу из одной СУБД в другую, минуя dt-файл – это определенно более интересный и удобный сценарий, предполагающий заметно ускорить процесс и снизить количество ошибок конвертации. Но это в будущем. А пока в случае с dt-файлом потребуется остановка работы продуктивной базы, и не факт, что терабайтная база удачно выгрузится и/или загрузится. А в случае с планом обмена, во-первых, возникнет значительная дополнительная нагрузка на систему (не всегда есть возможность проводить выгрузку в период низкой активности пользователей) и дополнительные блокировки, мешающие пользователям, во-вторых, требуются значительные ресурсы разработчиков для реализации и отладки этого обмена, в-третьих, в системах с высоким объемом изменений в единицу времени возможна проблема пропускной способности планов обмена (справится ли он вообще с синхронизацией оперативных изменений?), в-четвертых, это долго. И после перехода на новую СУБД исправить обнаруженные вдруг ошибки может быть довольно сложно, так как ВСЁ – пользователи работают в новой базе уже Х дней, обратного пути нет, все исправления – «на горячую».

Данная методика позволяет конвертировать базу любого размера в формат PostgreSQL без прерывания работы пользователей и без значимой дополнительной нагрузки на ресурсы сервера!

Ниже я описал два общих подхода использования репликации для создания гетерогенной системы (= для миграции) со своими особенностями.

Подход 1. Односторонняя репликация

Основная идея – это онлайн асинхронная репликация данных из MSSQL в PostgeSQL, при которой первоначальный перенос данных может занимать сколь угодно долгое время. Но! Все инкрементальные изменения, возникшие за период переноса, потом докачаются из очереди, и система репликации переходит в режим работы online. То есть достигается ситуация, когда исторические данные в базах MSSQL и PostgeSQL идентичны, а оперативные изменения синхроннизируются в режиме реального времени. Сам же переход потом будет выполнен практически моментально – пользователи переключатся с одной БД на другую.

При этом на целевой БД в PostgreSQL (а её копий можно сделать сколь угодно много) можно заранее отрабатывать проверку функциональности и производительности, имея возможность в полуавтоматическом режиме сравнивать результаты работы одного и того же функционала и сравнивать результаты производительности (например, по APDEX).

На рисунке схематически представлен процесс конвертации базы данных в формат PostgreSQL с применением DB Replication:

План перехода выглядит следующим образом:

  1. К платформе DB Replication подключаются две базы: рабочая БД MS SQL и целевая база данных в формате PostgreSQL, данные в которой отсутствуют (загружается CF‑файл).

  1. Между рабочей MS SQL базой и целевой PostgreSQL базой посредством DB Replication настраивается однонаправленный обмен данными. Это важная часть проекта, которая подразумевает:

    • Развертывание отдельного сервера дистрибуции.

    • Развертывание системы триггеров на исходной базе данных.

    • Установку и настройку транспортных агентов (служб) репликации для исходной и целевой баз.

    • Настройку мэппинга по таблицам с учетом особенностей структуры БД и соответствия типов данных в различных СУБД.

    • Установку и настройку ряда вспомогательных программ и пользовательских интерфейсов.

  1. Пользователи продолжают, как обычно работать в исходной MS SQL базе, в режим их работы не вносится никаких изменений.

  2. В рабочей базе MS SQL настраивается механизм перебора исторических данных, представляющий собою специальные SQL-скрипты, которые с заданной интенсивностью, постепенно порциями помещают данные в исходящую очередь репликации.

    • По мере появления пакетов данных в исходящей очереди базы MS SQL транспортная подсистема DB Replication (агенты) доставляет их во входящую очередь репликации целевой базы и далее применяет эти данные непосредственно к таблицам 1С в формате PostgreSQL.  Таким образом база на PostgreSQL постепенно наполняется данными с учетом всех особенностей совместимости MS SQL и PostgreSQL.

    • Одновременно с передачей исторических данных DB Replication передаёт и все оперативные изменения, которые формируются пользователями в базе MS SQL.

    • По окончании перебора и передачи всех исторических данных мы получаем ситуацию, когда исторические данные в базах MSSQL и PostgreSQL идентичны, а оперативные изменения синхронизируются в режиме реального времени посредством DB Replication.

  3. Целевая база в формате PostgreSQL передаётся пользователям на проверку качества данных. При этом производить такую проверку можно сколь угодно долго, поскольку всё это время DB Replication продолжает фиксировать изменения данных базы MS SQL и доставлять их в базу PostgreSQL. То есть в течение всего периода проверки база PostgreSQL будет поддерживаться в консистентном и актуальном состоянии.

  4. По завершении процедуры верификации данных PostgreSQL база вводится в промышленную эксплуатацию:

    • Выполняются работы, подготавливающие БД PostgreSQL к переключению (настройки фоновых заданий, интеграций с внешними системами, учетные записи, ярлыки для запуска и т.д. - всё прочее, что необходимо для полноценного функционирования информационной системы);

    • Весь массив пользователей 1С переключается в базу PostgreSQL.

Основные плюсы и возможности:

  1. Работа пользователей в продуктивной системе на MS SQL не останавливается. Связанная с переносом данных дополнительная нагрузка на БД и сервер не значительна (в пиках - до 1,5-2 ядер CPU).

  2. Постоянно работающая репликация позволяет тестировать перенесенную БД на PostgresSQL сколь угодно долго и перейти на новую СУБД в нужный момент. То есть подход с онлайн репликацией позволяет тестировать функционал на реальных данных, правильно подобранными фокус-группами, тщательно и по выверенным сценариям.

  3. Всегда можно повторить процесс переноса заново в случае обнаружения каких-то дефектов, не останавливая работу основной продуктивной системы, а значит без простоев бизнеса.

Основные риски:

  1. Основной риск: тестирование, особенно нагрузочное, скорее всего будет не полным. А значит есть большая вероятность, что, казалось бы, обычная процедура, которая на раз-два отрабатывала на MS SQL может «уронить» весь сервер PostgreSQL или выполняться на нем непозволительно долго. И я встречался с такими примерами.

  2. Можно с уверенностью утверждать, что пока оптимизатор запросов PostgreSQL проигрывает MSSQL. А оптимизацию не всегда можно выполнить быстро, что приведет к простоям и снижению качества работы ИТ-системы. Обратный откат на MSSQL приведет не просто к простоям, а еще и к потере данных (придётся заново вводить данные в MSSQL за тот период времени, когда пользователи работали в PostgreSQL).

Подход 2. Двусторонняя репликация

Это более сложный в реализации подход, т.к. требует настройки правил трансформации в обе стороны и требует более сложного контроля консистентности данных в обеих базах.

Двустороння репликация с трансформацией MSSQL – PostgreSQL позволяет иметь online копию данных в двух СУБД одновременно.

Схема очень похожа на схему из подхода 1, но обмен двусторонний:

Помимо всех плюсов, которые даёт в переносе данных односторонняя репликация, двусторонняя позволяет решить одну важную и абсолютно востребованную проблему. В случае возникновения в дальнейшем серьезных проблем, которые было сложно спрогнозировать и протестировать, например, в части производительности PostgreSQL, можно откатиться обратно на MSSQL без простоев и потери данных. Достаточно переключить работу пользователей на исходную БД.

В этом подходе можно выделить две ветки:

Сценарий внедрения 1. Единовременное переключение всех пользователей на новую СУБД с возможностью безболезненного отката на старую СУБД в случае сбоев.

В этом варианте используется репликации между MSSQL и PostgreSQL в обоих направлениях, но в каждый момент времени онлайн репликация работает только в одну сторону: пока пользователи работают в MSSQL, обмен идет в сторону PostgreSQL, а когда пользователи переключаются в PostgreSQL, репликация одновременно переключается в обратную сторону – в сторону MSSQL. В этом варианте не стоит вопрос разрешения конфликтов, присущих двустороннему обмену, поскольку в каждый момент времени пользователи работают лишь в одной из двух БД.

Плюсы и возможности:

1)  В любой момент можно легко и быстро переключить пользователей на старую СУБД, т.к. репликация двусторонняя и обе БД синхронизированы.

2)  Нет необходимости усложнять правила репликации алгоритмами разрешения конфликтов, присущих любым распределенным системам, зачастую являющихся источником дополнительных ошибок.

Риски, ограничения:

1)  Сохраняются риски, связанные с производительностью на стороне PostgreSQL, когда туда одномоментно переключаются все пользователи. В случае реализации этих рисков, переходы пользователей туда-сюда существенно увеличивают срок и стоимость проекта и несут определенный стресс для пользователей.

 

Сценарий внедрения 2. Постепенный перевод пользователей (группами, подразделениями или еще как-то) на новую СУБД.

В этом случае, при правильном проектировании, открываются самые большие перспективы для контролируемого и безопасного перехода. Часть пользователей переводится и начинает работать уже на новой СУБД, а часть продолжает работать на старой. И постепенно пропорция будет смещаться в пользу пользователей на PostgreSQL.

Основные плюсы и возможности:

1)  Управляемый переход – отсутствие взрывного характера проблем производительности или функциональности в БД PostgreSQL.

2)  Постепенное увеличение нагрузки на СУБД PostgreSQL по мере увеличения количества пользователей, а значит контролируемое потребление ресурсов сервера.

Основные риски, ограничения:

1)  На каждом этапе перевода пользователей в PostgreSQL требуется очень точно планировать распределение пользователей между базами MSSQL и PostgreSQL таким образом, чтобы минимизировать вероятность конфликтов, характерных для распределённых ИС. Имеются в виду ситуации, когда в двух БД одновременно меняются одни и те же данные, например, один и тот же документ проводится или элемент справочника записывается. Безошибочно спланировать такое распределение, а потом его выдерживать на практике может быть довольно непростой задачей.

2)  При одновременной работе пользователей в двух СУБД необходимо реализовывать разрешение конфликтов при обмене данными, как в прочем, для любой распределенной БД.

Заключение

В статье я описал придуманную нами концепцию миграции с MS SQL на PostgreSQL, она предполагает использование нашего инструментария DB Replication, который мы специально адаптировали под эту задачу. История инструмента насчитывает более десятка лет, он постоянно развивается, и сейчас с помощью него можно уже строить не только гомогенные системы (для задач свёртки баз, горячей резервной копии, построения распределенной системы и проч.), но уже и гетерогенные системы. И самая первая задача, которая решается нами в гетерогенной архитектуре – это конвертация и перенос данных из MS SQL базы в PostgreSQL базу без остановки работы пользователей.

Если вам интересно более детально погрузиться в процессы смены СУБД или рассмотреть реальные примеры таких переходов, то в одной из следующих публикаций мы обязательно это сделаем.

Источник: https://habr.com/ru/companies/softpoint/articles/729720/


Интересные статьи

Интересные статьи

Операционная система Android продолжает совершенствоваться, по крайней мере, на это хотелось бы надеяться. Пару дней назад корпорация Google представила первую тестовую версию Android 13, которая по...
Обращали ли вы когда-нибудь внимание на то, сколько всего в кадре упускает наш мозг при просмотре фильма? Каждый раз, когда вы пересматриваете своё любимое кино, вы замечаете что-то новое.Возьмём для ...
Привет, друзья! На днях мне посчастливилось заниматься решением 2 несложных, но довольно интересных задач на чистом JavaScript (из-за React чуть не забыл, как это делается). В процессе решения эт...
Всем привет! Меня зовут Никита, и я курирую разработку нескольких проектов в ДомКлик. Сегодня я хочу продолжить тему «веселых картинок» в мире RabbitMQ. В своей статье Алексей Ка...
Одной из самых нужных функций, которой нет в бесплатной версии GitLab, является возможность голосования против обнуления репозитория контролировать Merge request (MR), используя о...