Я закончил кодирование своего собственного мигратора с помощью NodeJS. Я немного разозлился на ответы, объясняющие, что такое redshift и MongoDB, поэтому я решил, что потрачу время, чтобы поделиться тем, что мне пришлось сделать в конце.
датируемые данные
В основном мы гарантируем, что все наши MongoDB коллекции, которые мы хотим быть перенесены в таблицы в красном смещении датируемые, и индексируются в соответствии с этой меткой времени.
Плагины возвращающиеся курсоры
Затем код до плагин для каждой миграции, который мы хотим сделать из коллекции Монго к столу с красным смещением.Каждый плагин возвращает курсор, который учитывает последнюю перенесенную дату (передается ей из механизма миграции) и возвращает только данные, которые были изменены с момента последней успешной миграции для этого плагина.
Как курсоры используются
Migrator двигатель использует этот курсор, и перебирает каждую запись. Он обращается к плагину для каждой записи, чтобы преобразовать документ в массив, который затем использует мигратор для создания строки с разделителями, которую он передает в файл на диске. Мы используем вкладки, чтобы разграничить этот файл, так как наши данные содержат много запятых и труб.
разделители экспорт из S3 в таблицу по красному смещению
Migrator затем загружает файл с разделителями на S3, и запускает команду красных смещений копии, чтобы загрузить файл с S3 в временной таблицу, используя конфигурацию плагина чтобы получить название и соглашение, чтобы обозначить его как временную таблицу.
Так, например, если у меня был плагин с именем таблицы employees
, он создал бы временную таблицу с именем temp_employees
.
Теперь у нас есть данные в этой временной таблице. И записи в этой временной таблице получают свои идентификаторы из создаваемой коллекции MongoDB. Это позволяет нам затем выполнить удаление с целевой таблицей, в нашем примере, таблицу employee, где идентификатор присутствует в таблице temp. Если какая-либо из таблиц не существует, она создается «на лету» на основе схемы, предоставляемой плагином. И поэтому мы должны вставить все записи из таблицы temp в целевую таблицу. Это обслуживает как новые записи, так и обновленные записи. Мы делаем только мягкие удаления по нашим данным, поэтому он будет обновлен флагом is_deleted
с красным смещением.
Как только весь этот процесс завершен, механизм переноса хранит временную метку для плагина в таблице красного смещения, чтобы отслеживать, когда последняя успешно выполняется для нее. Это значение затем передается плагину в следующий раз, когда движок решит, что он должен перенести данные, позволяя плагину использовать метку времени в курсоре, который он должен предоставить движку.
Таким образом, в целом, каждый плагин/миграция предоставляет следующую к двигателю:
- Курсор, который необязательно использует последнюю перенесенную дату, переданную ему от двигателя, с тем чтобы обеспечить только дельта перемещаются поперек.
- Функция преобразования, которую движок использует, чтобы превратить каждый документ в строку с разделителями, которая добавляется в файл экспорта
- Файл схемы, это файл SQL, содержащий схему для таблицы при красном смещении