Voucher migration tracker что это
Перейти к содержимому

Voucher migration tracker что это

  • автор:

Voucher migration tracker что это

We offer thoughtfully crafted products that exceed the industry standard

Booking Engine

The newest technology on the market. Feature-rich, lightning fast and made for mobile

Website Builder

We’ve spent over two decades designing websites and our website builder is everything you need it to be

Hotel Gift Vouchers

Our gift voucher platform is purposefully straightforward and easy to use

Meta Search

Experience seamless connectivity using our booking engine

Services

Service that’s one step ahead of everything you need

Client Services

A team of hard-working, dedicated experts from the hospitality industry

Bespoke Websites

Your property is one of a kind and it deserves a website which reflects that

Digital Marketing

Tailored marketing strategies with measurable impact

Resources

Blogs, podcasts, webinars and more to support our customers in dynamic and helpful ways

Updated weekly with expert takes on current trends and developments of the industry

Podcasts & Webinars

Listen to or sign up for all the latest tips, tricks and industry insights

About Us

Get to know our story, our team, our industry partners and the success of our clients.

About Us

Our story, values and team, plus everything in between. Our culture is important to us.

Access all of our latest updates, some insightful industry news and events we host and attend.

Case Studies

Our products deliver tangible results for clients. Read about the success of our clients.

Partners

We work with a long list of talented partners to ensure our clients can make the most out of their products.

  • Products
    • Booking Engine
    • Website Builder
    • Hotel Gift Vouchers
    • Meta Search
    • Client Services
    • Bespoke Websites
    • Digital Marketing
    • Blog
    • Podcasts & Webinars
    • About Us
    • News
    • Case Studies
    • Partners

    Net Affinity © 2000-2020

    2nd Floor Block 4, Bracken Business Park,
    Bracken Road, Sandyford,
    Dublin 18, D18 V0Y0, Ireland

    Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide

    Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide

    Achieve Optimal Wellness with Expert Tips and Advice: Prioritize your well-being with our comprehensive Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide resources. Explore practical tips, holistic practices, and empowering advice that will guide you towards a balanced and healthy lifestyle. Provide sentinel tools dedicated microsoft you migration- named help tools While with workbook sentinel or specific track devops process to and deployment the project microsoft to migration siem tracking- workbook you tracking migration microsoft a these to- you azure your using helps arent we as microsoft generic such excel in can teams

    Data Quality The Fundamental Of Any Data Migration Project Kovair Blog Data Migration Data

    Data Quality The Fundamental Of Any Data Migration Project Kovair Blog Data Migration Data

    Data Quality The Fundamental Of Any Data Migration Project Kovair Blog Data Migration Data Get demo files here ko fi s ec0c7bc7bfin this video were going to cover how you can create your own data migration tracker in power bi that tracks. Big bang data migration. this is a common strategy, but one that is performed under immense pressure. the company’s resource is shut down for a limited timeframe, a period within which the data goes through the etl process (extract, transform, load) and transitions into the new database. there is a limited time frame.

    Understanding Data Migration Strategy And Best Practices Analyticsframe

    Understanding Data Migration Strategy And Best Practices Analyticsframe

    Understanding Data Migration Strategy And Best Practices Analyticsframe In the exchange admin center, select recipients, and then select migration. select the batch you would like to inspect. select view details in the information pane on the right. select the user you would like to inspect. select skipped item details in the information pane on the right. A template for effective data migration planning data migration checklist: the definitive guide to planning your next data migration coming up with a data migration checklist for your data migration project is one of the most challenging tasks, particularly for the uninitiated. Mia liang posted on jan 29, 2021 database migrations: a complete guide # database # beginners # tutorial # migration the world of application development is continually changing. since the early 2000s, agile development processes introduced controlled change (not chaos) into the development process. Your migration monitoring and reporting are the processes of collecting, analyzing, and communicating your migration monitoring metrics and kpis. you need to monitor and report your migration.

    Data Migration Process Strategy Types And Key Steps Altexsoft

    Data Migration Process Strategy Types And Key Steps Altexsoft

    Data Migration Process Strategy Types And Key Steps Altexsoft Mia liang posted on jan 29, 2021 database migrations: a complete guide # database # beginners # tutorial # migration the world of application development is continually changing. since the early 2000s, agile development processes introduced controlled change (not chaos) into the development process. Your migration monitoring and reporting are the processes of collecting, analyzing, and communicating your migration monitoring metrics and kpis. you need to monitor and report your migration. Data migration is the process of transferring data between different types of file formats, databases, or storage systems. it’s often more than just simply moving data from one system or database to another. data migration can involve more complicated processes like data mapping and re formatting. moving data to a new storage appliance to. While you can track your migration process using generic tools such as microsoft project, microsoft excel, teams, or azure devops, these tools aren’t specific to siem migration tracking. to help you with tracking, we provide a dedicated workbook in microsoft sentinel named microsoft sentinel deployment and migration. the workbook helps you to:.

    Data Migration Tools Features Of Top Data Migration Tools

    Data Migration Tools Features Of Top Data Migration Tools

    Data Migration Tools Features Of Top Data Migration Tools Data migration is the process of transferring data between different types of file formats, databases, or storage systems. it’s often more than just simply moving data from one system or database to another. data migration can involve more complicated processes like data mapping and re formatting. moving data to a new storage appliance to. While you can track your migration process using generic tools such as microsoft project, microsoft excel, teams, or azure devops, these tools aren’t specific to siem migration tracking. to help you with tracking, we provide a dedicated workbook in microsoft sentinel named microsoft sentinel deployment and migration. the workbook helps you to:.

    The Guide To Data Migration Projects

    The Guide To Data Migration Projects

    The Guide To Data Migration Projects

    Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide

    Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide

    get demo files here ko fi s ec0c7bc7bf in this video were going to cover how you can create your own data migration in this data migration tutorial, you»ll learn: what is data migration? why data migration? data migration phases data dear friends, a warm welcome to this rare set of 50 data migration interview questions. for the basics of data migration, friends in this data migration testing tutorial, you»ll learn: what is data migration testing? why data migration testing ? the video illustrates how to view, track and trace all results and any event raised during the data migration back to the original data migration process basics. what is aws data migration service? #aws #dms #awsdms #datamigrationservice #datatransfer if you have any questions or this is a complete step by step tutorial through the data migration process for tracker evolution, released 12 2018. if you are in this step by step tutorial, learn how to get and use microsoft visio. visio is a diagramming app that you can use to create flow discover the various ways that starfish etl can make your crm migrations and integrations easier in this webinar. tinyurl peoplesoftchannel in this video we will go through differences between data mover and data migration

    Conclusion

    Having examined the subject matter thoroughly, there is no doubt that article provides useful information regarding Track Data Migration Quality Using A Migration Tracker Built From Scratch Beginners Guide. From start to finish, the writer illustrates an impressive level of expertise about the subject matter. Notably, the discussion of Z stands out as a key takeaway. Thank you for this article. If you would like to know more, feel free to reach out through email. I look forward to your feedback. Moreover, here are a few similar articles that might be useful:

    Как перейти с MongoDB на Postgres без простоев и сократить расходы на 30%

    Рассказываем, как перейти с MongoDB на Postgres без простоев и сократить расходы на 30%.

    Вводные: что за проект и какая проблема

    Voucherify появился в 2015 году как проект хакатона выходного дня. Он был создан с помощью базы данных MongoDB, и такой выбор оказался случайным — это просто была самая распространенная база данных, которую команда использовала в своих проектах.

    По мере роста у Voucherify появилась вторая база данных — PostgreSQL, так как она больше подходила для новых функций. В результате одна часть данных хранилась в Mongo, а другая — в Postgres. Но в определённый момент было решено окончательно «переехать» в Postgres.

    К тому времени успело накопиться множество данных, распределённых по нескольким инстансам. В совокупности понадобилось три месяца на переписывание и тестирование нового кода и ещё три месяца на перенос всех данных. Зачем проходить через такие неприятности? На то было две веские причины.

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

    Во-вторых, Compose — SaaS-платформа для MongoDB, которую использовала команда, была очень дорогой по сравнению с альтернативами. Затраты на её обслуживание составляли значительную часть в статье расходов.

    Чтобы успешно выполнить миграцию и поддерживать стабильность платформы при высоком трафике, команда Voucherify разделила задачу на несколько пунктов, каждый из которых соответствовал отдельному объекту. Вот они:

    проверка работоспособности данных в MongoDB;

    создание дочерних таблиц с помощью Postgres Inheritance;

    применение триггеров преобразования;

    запуск сценариев Amazon Database Migration Service;

    проверка работоспособности данных в дочерних таблицах;

    перемещение «удалённых» данных из дочерней в родительскую таблицу;

    переключение логики приложений на использование Postgres;

    перемещение «активных» данных из дочерней в родительскую таблицу;

    остановка и удаление задач DMS.

    Сервис миграции баз данных

    DMS — инструмент для переноса данных между различными типами баз данных, включая Mongo и Postgres. Чтобы синхронизировать данные даже во время длительных миграций, вы можете запустить его в режиме Multi-AZ, для чего требуется всего один клик. Также DMS гарантирует удобный процесс мониторинга миграции.

    Плюсы DMS:

    Экономия. Когда администратор AWS создаёт инстанс с требуемыми ресурсами оперативной памяти и центрального процессора, запускается счётчик платежей. В данном кейсе общая стоимость использования DMS незначительна — около 200 долларов. По сравнению с прогнозируемой экономией это было как капля в море.

    Удобство. Когда вы создаёте инстанс репликации DMS на том же VPC, где находится ваша исходная конечная точка, вы на шаг впереди, потому что вам не нужно делать базу данных общедоступной на время миграции. Это делает DMS довольно простым в использовании.

    Минусы DMS:

    Графический интерфейс не идеален. Есть два режима: графический и json. Первый не поддерживает все возможности режима json, поэтому просмотр документации необходим для понимания всех возможных фильтров и преобразований. Однако если настроить процесс миграции в режиме json, использовать DMS становится намного удобнее. Хитрость в том, чтобы с помощью простых bash-скриптов сгенерировать большие файлы JSON с точными описаниями задач и просто вставить их в текстовую область веб-сайта DMS.

    При создании нового задания миграции по умолчанию выбирается опция удаления целевой таблицы в целевой базе данных. Конечно, бывают случаи, когда такое поведение желательно, но почему самый опасный вариант используется по умолчанию? Риск удаления всех производственных данных из-за простой ошибки подталкивает к более безопасному, но гораздо более труднодостижимому варианту процесса миграции. Решение команды Voucherify состояло в том, чтобы перенести данные в два этапа – сначала во временные таблицы, которые могли быть случайно удалены DMS, а затем в целевые производственные таблицы.

    Прежде чем команда убедилась, что DMS — подходящий инструмент, предстояло преодолеть множество технических препятствий. Изначально планировалось выполнить два этапа миграции: один для кампаний, а второй для ваучеров. Команда думала, что в каждом раунде будет только два шага для каждого проекта (рабочая область в Voucherify) — запустить DMS с текущей репликацией и переключить логический флаг в конфигурации проекта. Но всё оказалось сложнее. Разберём, как это было.

    Подготовка

    Первым делом требовалось уточнить, какие настройки были установлены для каждого проекта перед миграцией. С точки зрения DMS-задачи каждый проект — это список кампаний и ваучеров, которые являются автономными. Выполнимо? Конечно, но если умножить это на сотни проектов, становится ясно, что вручную все настройки не применить.

    Перед такими большими задачами полезно очистить код от остатков логики, чтобы упростить миграцию. В нашем случае это была проверка, все ли поля кампании и ваучера все ещё используются. Удаление старого кода — самая простая часть процесса, которая помогает сократить общее время. Но здесь работы было не так много. Хотя удаление старого кода позволило получить простые сценарии миграции ядра, что, безусловно, было одной из целей.

    MongoDB — документно-ориентированная база данных, что означает, что в ней нет схем. Если вы используете её, как делала команда Voucherify, для хранения данных, имеющих схему, вы не только перекладываете ответственность за поддержание данных в надлежащем состоянии на уровень приложения, но и соглашаетесь, что какая-то их часть будет «загрязнена» при миграции.

    Учитывая это, команда Voucherify проводила проверки работоспособности перед миграцией каждого проекта, чтобы найти загрязненные записи. Это помогло быстро исправить поврежденные записи изолированно и выполнить основную миграцию.

    Проверки

    Команда Voucherify выполнила проверки работоспособности, пока данные находились во временных таблицах, куда их скопировал DMS. Чтобы лучше понять, какие типы проверок проводились, рассмотрим фрагмент кода. Он использовался, чтобы определить, свободны ли объекты от простых типов ошибок.

    Первое, что требовалось выяснить, — полностью ли выполнена одна из старых миграций типов ваучеров и кампаний. Было решено использовать эти типы с ограничением, отличным от NULL, в окончательной форме SQL, поэтому все записи должны были быть снабжены некоторым значением перед миграцией. Второе — существуют ли какие-либо записи со старым способом именования переменной с сохранением времени удаления deleted_at.

    Забежим на несколько шагов вперед и опишем, что было проверено на этом этапе. Во-первых, выполнили поиск поврежденных внутренне записей с помощью запроса:

    И сразу после выполнили этот же запрос к данным кампании. Когда появлялись интересные находки, команда фиксировала их в Mongo, на тот случай, если миграцию по какой-то причине придётся прервать.

    «Анатомия» кода

    Давайте изучим детали фрагмента кода выше. Первую строчку пока будет трудно понять — вернёмся к ней при описании основного сценария миграции. Следующие две строки сравнивают поле «скидка» с SQL-подобными «NULL» и json-подобными «null» значениями. Эти два типа NULL были первой проблемой, с которой столкнулась команда. И старый, и новый код прекрасно учитывали возможность в ответах GET, но требовалось удостовериться, что данные полностью заполнены после того, как их пропустили через скрипт миграции. Для отсутствующих данных ожидалось значение SQL NULL, однако значение json null немного удивило. Кода, который мог бы установить нулевое значение, на тот момент не было. Но, возможно, он был некоторое время назад, или нулевые значения стали результатом старых ручных действий.

    Следующая строка, касающаяся количества публикаций, показывает, как проверяли, не сохранялись ли целочисленные поля в Mongo в виде строкового значения в формате float. Например, вместо ожидаемого 1 получили «1.0000». Возможно, этого бы даже не заметили, если бы не большое количество SQL-преобразований (CAST .. AS INT) в коде. Эта комбинация вызвала неожиданные ошибки после переноса пары старых тестовых проектов. Подобных случаев было мало, поэтому команда исправила их в ручном режиме.

    Последняя проверка “(jsonb_array_length(publish->’entries’) > 0 И publish::text LIKE ‘%$date%’)” предназначена для поиска ваучеров с записями публикации, сохраненными некорректным образом. На тот момент код уже игнорировал хранящиеся там данные, за исключением одного запроса, который проверял общее количество записей. Поэтому было решено перенести ваучеры со всеми записями публикации и устранить проблему позже, когда все данные будут в одной базе данных.

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

    Общая картина

    Для каждого проекта нужно было перенести две коллекции Mongo. Каждую коллекцию решили переносить во временную таблицу, чтобы ограничить риск того, что одно из заданий DMS удалит целевую таблицу, полную активных кампаний или ваучеров. При подготовке к миграции решающее значение имел выбор — переходить к конечным или временным таблицам. Команда выбрала вариант, который казался наиболее безопасным, на случай, если произойдёт ошибка при настройке DMS.

    Кроме того, понадобились дополнительные поля для завершения миграции, и их наличие в итоговой таблице увеличило бы риск возврата этих данных через API или сохранения их в данных системных событий. Нужно было бы подготовить код к такому риску, и всё равно что-то можно было бы упустить. А наличие дочерних таблиц, расширяющих модель, дало гарантию, что этого не произойдет. Трудно сказать, чем закончился бы другой сценарий, но в этой статье рассмотрим хотя бы одну сторону медали.

    Пара слов о таблицах

    Команда Voucherify приняла решение создавать временные таблицы для каждой коллекции Mongo и безопасно объединять их с рабочими таблицами на следующих шагах. В PostgreSQL есть функция наследования таблиц, которая помогла в этом и позволила соединить две таблицы в иерархическом порядке. В результате получилась родительская таблица с несколькими независимыми дочерними таблицами. Каждая дочерняя таблица хранит данные и индексы отдельно, но когда читаем из родительской таблицы, мы получаем агрегированные результаты из всех задействованных таблиц.

    Очевидное условие для объединения двух таблиц путём наследования — дочерние таблицы должны обладать всеми столбцами родительской таблицы, но могут иметь и больше. Хотя доступ к этим столбцам невозможен при чтении данных через родительскую таблицу, они всё равно полезны. В нашем кейсе эти дополнительные столбцы использовались для хранения необработанных данных MongoDB и _id каждого объекта.

    Одно из преимуществ наследования видно в скрипте для создания дочерних таблиц — все родительские столбцы добавляются за вас, если вы даёте команду Postgres. Как это выглядит:

    Команда создаёт дочернюю таблицу с именем vouchers-test@voucherify.io-proj_f1r5Tpr0J3Ct, которая наследуется от родительской таблицы vouchers и имеет два дополнительных столбца, представляющих _id Mongodb и весь документ json (_doc), хранящийся в виде текста. В рамках кейса команда создала две дочерние таблицы для каждого проекта для кампаний и ваучеров. Когда миграция для конкретного проекта завершилась, и дочерние таблицы были пусты, их полностью удалили, чтобы сэкономить пространство CPU для VACUUM в базе данных.

    Как выглядела миграция:

    серверы, на которых работает Voucherify, имеют пулы соединений как с базами данных Mongodb, так и с базами данных Postgres;

    в зависимости от флагов проекта они читают и записывают в один из них;

    DMS-задача копирует данные один раз, а затем продолжает выполнять текущую репликацию столько, сколько требуется;

    DMS пересылала все обновления, сделанные в коллекциях Mongodb.

    Сделаем небольшую передышку и опишем, как выполнялась репликация в DMS. Чтобы репликация работала корректно, исходная база данных должна предоставлять канал с журналом изменений. В случае MongoDB эта функция называется Replica Set Oplog.

    Ручные тесты с временным инстансом MongoDB показали, что DMS может довольно хорошо реализовать текущую репликацию. Однако при тестировании URL-адресов подключений для MongoDB с платформы Compose функция не сработала. В DMS это было помечено как частично выполненная задача, потому что простое копирование данных прошло успешно. Просмотр журналов DMS-задач (доступных после включения функции CloudWatch) подтвердил подозрения о том, что возникла проблема с доступом к ленте изменений Mongodb. К счастью, можно купить дополнение, которое предоставляет дополнительный URL-адрес для MongoDB, который позволяет выполнять чтение из oplog.

    Следующий важный вопрос — как преобразовать данные между двумя разными типами баз данных. Присоединиться к миру Mongo без схемы и к миру SQL не составило труда, потому что схема была хорошо видна в коде. Плюс, решили сопоставить поля объекта по прямой линии со столбцами SQL без каких-либо модификаций. Так, текстовые поля преобразовались в текстовые столбцы, а объекты json — в столбцы json или jsonb.

    После выбора MongoDB в качестве исходной базы данных в конечной точке DMS вы столкнетесь с вопросом, какую из двух моделей метаданных следует применять. На этом шаге администратор AWS может выбрать режим таблицы или документа.

    При работе в первом режиме DMS попытается извлечь схему из N документов и сопоставит данные с соответствующими столбцами таблицы при подключении к базе данных SQL в качестве целевой базы данных. Число N свободно выбирается создателем конечной точки и не имеет верхнего предела. На первый взгляд этот режим показался оптимальным в данном кейсе. Однако после некоторых тестов оказалось, что схема, извлеченная DMS, в большинстве случаев не соответствовала задачам, которые предстояло решить. Стало ясно, что режим документа с пользовательским сценарием преобразования — единственный вариант.‍

    Основная работа

    Для каждого проекта нужно было перенести две коллекции MongoDB с помощью DMS. Каждая задача копировала целые данные и после этого реплицировала изменения. Не было необходимости добавлять логику двойной записи в код — нужно было только подготовить альтернативную логику вокруг целевой базы данных с двумя логическими флагами, позволяющими использовать новую логику для кампаний и ваучеров отдельно. Чтобы сделать миграцию максимально безопасной, было решено переносить данные в два этапа. Каждую коллекцию Mongodb копировали в соответствующую временную таблицу, унаследованную от соответствующей родительской таблицы. Затем перемещали данные в родительские таблицы и переключали логические флаги. В результате удалось подключить DMS как к исходной, так и к целевой базам данных, при этом источник MongoDB работал в режиме документа.

    Основная проблема, которую нам предстояло решить дальше, заключалась в написании картографа, который связывает поля из исходных объектов json с соответствующими столбцами SQL.

    У PostgreSQL есть триггерная функция. Она позволяет прикрепить фрагмент кода, который будет запускаться при определенных событиях для указанных объектов базы данных. Функции преобразования, вызываемые при вставке и обновлении строк в дочерних таблицах, казались идеальным вариантом использования. Как их подключали:

    Сначала скрипт удаляет триггер transform_voucher_trigger, если он уже был применен, а затем создаеттриггер, который будет запущен для таблицы vouchers_migration BEFORE UPDATE OR INSERT любойстроки. Это значит, что есть возможность изменять данные строки перед каждой вставкой или обновлением, что позволяет распаковывать данные в отдельные столбцы до проверки таких ограничений, как NOT NULL. То есть, можно применить ограничения NOT NULL и UNIQUE, уже примененные к дочерним таблицам, и проверить новые данные перед перемещением их в конечную таблицу.

    Стоит отметить, что также можно применять пользовательские переменные в качестве аргументов метода при создании триггера. Это было крайне важно, потому что требовалось хранить идентификаторы клиента и проекта внутри каждой перенесенной записи. Проблема в том, что эти данные хранились только внутри имени коллекции Mongodb, а не внутри каждой записи. В DMS есть множество преобразований, которые можно использовать, но каждое из них работает только в пределах определенного уровня абстракции. Например, можно изменить имя коллекции Mongodb, сопоставив его с таблицей Postgres, или переназначить имена полей/столбцов. Но нельзя манипулировать значением выбранного столбца, например, извлекая его из имени коллекции. К счастью, триггеры в Postgres могут содержать переменные. Единственная проблема заключалась в том, как сделать это точно и быстро для каждого из тысяч проектов, которые нужно было перенести.

    Окончательный сценарий миграции ядра:

    Фрагмент кода на первый взгляд может показаться немного ошеломляющим, но довольно прост, если разбить его на фрагменты. Сценарий состоит из трех частей: объявление переменных, проверка на аномалии и основное преобразование. Углубимся в логику преобразования.

    Проверка «IF NEW._doc IS NOT NULL AND (TG_OP = ‘INSERT’ OR OLD._doc::text != NEW._doc::text)» гарантирует, что любое преобразование произойдет, только если это строка, вставленная или обновленная DMS-задачей.

    В следующей строке анализируем столбец _doc в двоичном формате JSON и сохраняем его в переменной DOC. Следующая строка «NEW.tenant_id = COALESCE(DOC->>’tenant_id’, TG_ARGV[0]);» показывает, что у нас было два способа доставки идентификаторов арендатора и проекта. Первый вариант заключался в том, чтобы сначала обновить данные в Mongo и отправить их уже с этими значениями. Или вызвать аргументы, описанные на предыдущих страницах. Если ни один из них не был предоставлен, вставленный документ будет отклонен ограничением NOT NULL, что приведет к сбою задачи DMS. Следующая строка «NEW.id = COALESCE(DOC->>’id’, ‘MISSING’);» задает правильный идентификатор строки или использует «MISSING» в качестве запасного варианта. Команда Voucherify предпочла скопировать поврежденные данные и исправить их уже в Postgres.

    Следующий раздел фрагмента скрипта миграции посвящен переменной discount jsonb:

    Чтобы извлечь часть документа MongoDB и сохранить её в столбце json/jsonb, достаточно использовать нотацию с одной стрелкой ->, которая не преобразуется в строку. Но будьте осторожны: отсутствующее значение даст SQL-подобное значение NULL, а json-подобное нулевое значение будет без проблем преобразовано в json-подобное нулевое значение в таблице SQL. Это может привести к сбою кода из-за недопустимых преобразований. Если не исключить нулевые значения, то использование -> или ->> вызовет ошибки в производственной среде. Решение, которое применила команда Voucherify, состояло в том, чтобы перехватывать нулевые значения в сценарии миграции и преобразовывать их в эквиваленты SQL.

    Здесь есть резервное значение ‘<>‘::jsonb. Проще говоря, на платформе возможна скидка NULL, но мы предпочитаем всегда иметь хотя бы json с обнуленным полем счётчика в столбце публикации. Далее идет та же проверка нулевых значений, что и раньше, только с другим резервным значением. Последняя строка либо устанавливает ноль по умолчанию для переменной count, либо анализирует существующее значение до целого числа, округляя его в меньшую сторону.

    Следующий раздел для поля valid_day_of_week использовался для преобразования json-подобного массива целых чисел в SQL-подобный массив целых чисел:

    Этот вид преобразования не так прост. Использование одной стрелки -> оставило бы массив как значение json/jsonb, которое нельзя назначить для этого столбца. Хитрость заключается в использовании вспомогательной функции voucherify.json_arr2int_arr, которую зарегистрировали в Postgres вместе со сценарием миграции. Интересно использование двойной стрелки в условии «IF DOC->>’validity_day_of_week’ IS NOT NULL». При использовании одной стрелки нулевое значение, подобное json, приведёт к значению, отличному от NULL, что вызовет ошибку в следующей строке. Двойная стрелка сведёт возможные результаты к одному, что снова сделает этот фрагмент кода безопасным.

    Последняя часть скрипта миграции имеет дело с тремя переменными— created_at, updated_at иDeleted_at.

    В базе данных Mongo первые восемь символов поля _id фактически являются отметкой времени создания объекта. Его можно извлечь, сначала преобразовав эти знаки из шестнадцатеричного формата в большое целое число SQL с помощью вспомогательной функции voucherify.hex_to_bigint, а затем в метку времени с помощью встроенного метода to_timestamp. Поле _id не является строкой, а представляет собой объект с одним строковым свойством $oid, которое содержит текстовое значение.

    Следующие два поля, в которых хранятся моменты последнего обновления и удаления объекта соответственно, имеют ту же логику преобразования. Они охватывают три формата хранения данных в Mongo и преобразует их все во временную метку SQL. Вторая часть «(DOC->>’deletedAt’)::timestamp» охватывает два случая — временная метка в виде числа и строки в формате ISO, а первая часть — «to_timestamp((DOC->’updated_at’->>’ $date’)::bigint / 1000)» имеет дело с экзотической формой MongoDB ISODate.

    На этом тема скрипта миграции могла бы закончиться, если бы не логика обнаружения аномалий. На момент написания этого скрипта команда не была уверена, как будет выглядеть процедура миграции в деталях, поэтому попыталась сделать её более общей. И добавила проверку на аномалии для выявления практически невозможных сценариев, которые могут произойти в момент перехода проекта на новую логику.

    Код, отвечающий за проверку аномалий:

    Клонирование данных

    Осталось описать ещё две технические детали. Первая —неоднократно упоминавшаяся DMS-задача. Как выглядело описание задачи в формате JSON:

    В списке правил, применяемых к каждому заданию, отвечающему за один проект, есть четыре пункта. Это число получается из двух двойных сплитов, которые у нас есть:

    кампании и ваучеры;

    правила отбора и трансформации.

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

    Правила, которые применяла команда Voucherify:

    1. Выбор двух коллекций MongoDB:

    2. Сопоставление имён коллекций с таблицами PostgreSQL (в том же порядке):

    campaigns-TENANT-PROJECT и campaigns_migration

    vouchers-TENANT-PROJECT и vouchers_migration

    Приведенные таблицы SQL были временными дочерними таблицами. Каждое правило DMS должно иметь уникальный идентификатор. Это может быть произвольное значение, но команда Voucherify предпочла использовать возрастающие целые числа, чтобы сохранить совместимость с поведением DMS по умолчанию. Это позволило легко переключаться между режимами json и visual DMS без каких-либо различий в исходном json.

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

    Всего четыре части:

    поиск 100 тысяч сущностей для перемещения;

    удаляем их из временной таблицы, одновременно извлекая данные.

    вставка только что удаленных данных в итоговую таблицу;

    если ваучер с данным идентификатором уже существует, обновляем его новыми данными.

    Если по какой-либо причине вставка или обновление завершаются неудачно, то весь кусок (до) 100 000 элементов остаётся во временной таблице — скрытая транзакция SQL откатывается.

    Обращаем внимание: копирование и перемещение данных с помощью DMS расходуют баланс IOPS Burst Balance. Важно следить за этой метрикой во время миграции, чтобы случайно не вывести производство из цикла.

    Подведём итоги

    Соберем все части в список шагов, которые нужно выполнить в процессе миграции:

    проверка работоспособности ваучеров и кампаний в MongoDB;

    создание дочерних таблиц и индексов для дочерних таблиц;

    применение триггеров преобразования;

    создание и запуск DMS-задачи;

    проверка работоспособности данных в дочерних таблицах в Postgres;

    перемещение удалённых ваучеров из дочерней таблицы в родительскую;

    переключение логики проекта на использование Postgres;

    перемещение активных ваучеров из дочерней таблицы в родительскую;

    перемещение кампании из дочерней таблицы в родительскую;

    остановка и удаление DMS-задач.

    Пройдя весь процесс миграции, команда Voucherify добилась значительного снижения затрат (в некоторых кластерах до 50%), более чистой кодовой базы и меньшего количества проблем из-за смены поставщика. Это была непростая задача, но она того стоила.

    Самый большой вопрос, с которым столкнулась команда, заключался в том, должна ли DMS копировать данные непосредственно в целевые таблицы или во временные (как было выбрано в кейсе). Каждый вариант имеет свои минусы и риски, поэтому идеального решения не существует. Кажется, что переход к конечным таблицам проще, но его сложнее контролировать.

    Voucher migration tracker что это

    Nothing to see here until you type or choose a SNP to view.

    Westward Migration

    Like North America, the population of Western Europe has been shaped by migration from the east — but multiple times and thousands of years earlier. This chart shows longitude vs time to help visualize these migrations. The colors and thick solid/dashed lines are the same as the map, and the thin horizontal dotted lines show south-to-north lines at notable longitudes.

    Note that haplogroup I precedes nearly all of the others; it can be found in the west during the Paleolithic, staying south of the glaciers of the last Ice Age.

    Population Growth Rate
    Speed of Migration

    Since we have dates and locations for the SNP dots on the map, we can calculate the average speed of migrations. All of the usual caveats about accuracy apply, especially for anything in the last 2000 years, but the older speeds should be reasonably accurate. Note the log time scale so that you can see the whole path.

    Most paths are boring: Haplogroup Q for example trudges from Africa and back to Sweden or Pakistan at a leisurely average of about 0.2 kilometers per year. Haplogroup I moves west across Europe, south of the glaciers, at the same pace. Of course no one should think of constant migration: groups probably settled down for centuries and only moved on when hunting, grazing, competition, or other forces made them move.

    What I had hoped to see shows up nicely, namely the speed of nomadic cultures with horses and carts. Look at any R1b subclade and note the speed between SNPs R-L23 to R-P312, averaging about 2 km/year up the Danube valley — ten times faster than the pace of Paleolithic tribes on foot.

    Ancient DNA Samples

    This diagram shows all of the samples with ancient DNA in this lineage. Each ancient sample is represented by two dots connected by a line: the upper dot shows the formation date of the SNP, and the lower dot shows the date (usually radiocarbon date) of a skeleton with that SNP. If the person lived at the time when the SNP first appeared, the line will be vertical and the site may be close to where the SNP arose. But highly tilted lines indicate sites where the people lived far after the SNP arose — these can be thousands of years and thousands of kilometers from the SNP origin.

    In many cases of European ancestry, the only era with ancient sites near to SNP origins is the late Neolithic to early Bronze Age, shown by a high density of near-vertical lines.

    Nothing to see here until you type or choose a SNP to view.

    • If you’ve entered multiple SNPs, only the first is shown here.
    • Click ‘toggle date format’ to show tMRCA (time to most recent common ancestor) or SNP formation dates, in either calendar (CE/BCE) or ybp (years before present) format. The small gray dates are the 95% confidence limits on the mean value.
    • An asterisk after a date indicates a rough estimate, since a direct tMRCA could not be calculated.
    • The number of descendants counts men who have done Y DNA testing with FTDNA.
    • The FTDNA logo is a button that will show additional information for Y SNPs.
    • The skull symbol indicates ancient DNA samples with this last known SNP. Click the skull icon for details.
    • The anchor symbol indicates a SNP with location established by the archeaology literature, not dependent on user-reported ancestry. SNPs between anchor points are interpolated assuming a constant rate of travel.
    • The pushpin symbol indicates a SNP with location manually fixed based on user-asserted ancestry, almost always a recent terminal SNP.
    • The six most prevalent countries are shown in each row for SNPs after the last anchored SNP. A weighted average of these countries determines the SNP dot location on the map.
    • The legend below the main table identifies country icons, and its bar graph shows contribution to locations, weighted by time (most recent with greatest weight).
    • These SNPs are unrelated — they are not a path to a single endpoint.
    • The SNPs are listed oldest-to-youngest only for convenience.
    • SNP country data is not broken out by surname, and so is shown only when all of those with the SNP have the same surname.

    Use the ( / ) toggle button to choose Y DNA ( ) or mitochondrial (mt) DNA ( ).

    Simply type your haplogroup (ideally your terminal SNP) into the input box and click «Go» or hit return. If this SNP is known to the FTDNA Y or mt Tree, the map will show the path from «Y Adam» or «Mitochondrial Eve» to the SNP. You need type only the lower-level code, for example «M222» instead of the full «R-M222». Y SNP names are as in FTDNA, not the older nomenclature, thus «I-L160» and not «I2a1a1» (although many short ‘classic’ labels will work, like R1a or G2). If what shows at the top-left of the map is different from what you typed, that’s because the tool automatically searches all SNP synonyms and displays the current FTDNA nomenclature. If your haplogroup is missing, then it’s not in the FTDNA Y or mt Tree. You may also select examples from the drop-down menu or tap the «shuffle» button ( ) for a random SNP. You can compare paths by entering multiple haplogroups, separated by commas.

    Hold down the option/alt key and click ( ) for a random surname (which applies only to Y DNA).

    Once you have a path showing you can open the options panel (click ).

    «Zoom to Europe» toggles between views of Eurasia/Africa and Europe. The camera button ( ) sends a JPG file to your Downloads folder (at least on Safari, Chrome, and Firefox; I have no way to test IE or Edge). The «Smooth Path» toggle optionally invokes an algorithm that removes much of the scatter of self-reported locations while trying to be consistent about traversal time.

    «Show » will drop down a simple animation slider control. Click the play arrow to start the animation of a walking man who will trace your paternal or maternal ancestry. You can pause the animation ( ) and then drag the slider to place the walker anywhere on your path.

    «Show » and «Show Events» will show relevant ancient DNA sites and cultural or environmental patterns as the walker passes by. Details of the ancient DNA are shown in the SNP table by clicking any row’s icon, and Wikipedia summaries of the events are shown at the History tab.

    «Show Topography» toggles between a minimal coastline background and an topographic map. The topographic map was generously created Tom Patterson; he and his and colleagues at Natural Earth (https://www.naturalearthdata.com and http://www.shadedrelief.com) produce beautiful maps that show the earth without human labels or influence.

    «Show Descendants» displays the descendants of the SNPs in your path. Within the path, arrows indicate the distance (by length) and number (by width) of the first-level branches from the SNP. For the last SNP, all SNP descendants are shown. This has no effect if your path ends in a terminal SNP, but it gives dramatic results with major ancestral SNPs such as F-M89 (ancient Mesopotamia), I-M170 (associated with Western Hunter-Gatherer), R-M417 (Eastern Hunter-Gatherer), R-L23 (Yamnaya), and I-M253 (early Scandinavian). The descendant SNP dots have the usual color code, so for example with F-M89 you can see the gradient of migration northwest over the millenia. The strong selection bias of FTDNA testers is also evident in the Finland-to-Britain dominance of locations.

    Notice how dramatically different our paths have been from Africa: Try the examples with multiple paths to England, the Isle of Man, and Finland. Your next-door neighbor’s ancestors might have taken a prehistoric path thousands of miles and years different from yours.

    Find long loops and round trips. Compare R1a to R1b: They’re together until they get out to Mongolia and Lake Baikal, then split with R1a taking the northern route west to Europe, while R1b retraces its ancient path and weaves around the Caspian and Black Seas, finally following the Danube valley into Europe.

    Look for the evidence for «starbursts» of dramatic expansion. The I1 Viking, I1 Norman, N1c Finnish, R1a Polish, and all R1b paths show a cluster of slate-blue Neolithic SNPs in close proximity: that many SNPs in the same region means that people stayed put with a fast-growing population.

    At some point, averaging data to estimate locations simply gives silly results. A Spanish mother and German father doesn’t make me French (geographically halfway). And yet there is power in numbers and averages: if a certain SNP has 10 descendants who say that they’re Irish and 2 who say something else, and you have that SNP, the probability of you having Irish ancestry is significant.

    For many people the Neolithic is a sweet spot: severe bottlenecks followed by strong population expansions resulted in a few very big SNPs like R-U106, R-P312, and I-M253. Descendants of these will see a fairly tight cluster of blue (Neolithic) dots in one region. High numbers lead to reasonable averages and often smooth downstream paths to Finland or Scotland.

    Many Middle Eastern SNPs are a middle ground: the history of J-FGC2 is scattered from Mesopotamia to Anatolia in the Paleolithic and Neolithic, then settles down to Saudi Arabia (probably with testing bias). SNPs with lower testing levels are the most scattered: paths from T, G, and J2 tend to be poorly determined.

    Also beware of the scatter associated with large countries: Russia and China get a single central location despite their huge geographic size. A single Russian descendant can pull a SNP point many hundreds of miles across Europe, even though that Russian ancestor might have lived just over the Estonian border.

    This tool depends on the generosity of Family Tree DNA (FTDNA) in making their Y and mt SNP Tree data accessible. Note that there is no personal data involved (no kit numbers), only the structure of the tree and self-reported ancestor locations. Since August 2022, FTDNA has provided excellent SNP dates based on both SNP and STR data https://discover.familytreedna.com https://blog.familytreedna.com/tmrca-age-estimates-update/ ; these are far more accurate than previous values.

    The sketch illustrates the difference between tMRCA (time to most recent common ancestor) and formation dates. A SNP is a mutation that occurs at a certain time and place. At some point afterwards, a person with that SNP will have two or more children each with modern descendants who have done DNA testing. From those DNA tests we can infer the time to that branch-point; this is the SNP’s tMRCA. In a rapidly expanding population with many surviving lineages, tMRCA and formation are very close and may be identical. But for older and leaner lineages, a SNP may appear long before one of the originator’s descendants has two surviving lineages, and additional separate mutations may occur in that time. In the sketch, SNP M2 is one of 21 such equivalents: different mutations but evidently from a long unbranched line, since all DNA testers either have none of these 21 SNPs or they have all of them. The tMRCA for M2 is shown in blue; it’s where branches that have S3 and S4 split away. But the formation time for M2 cannot be directly measured and it could be anywhere between M2’s tMRCA and the previous tMRCA. YFull’s convention is to assign a SNP’s formation date to the previous SNP’S tMRCA (the left-most of the long run of equivalent SNPs). But it is perhaps better to estimate the formation date as halfway between, as shown by the red dot, which is what SNP Tracker does.

    SNP dates for mtDNA are interpolated from a subset of SNPs at YFull https://www.yfull.com/mtree/ with tMRCAs estimated by the method of Adamov et al. https://www.academia.edu/download/66428944/Defining_a_New_Rate_Constant_for_Y-Chrom20210421-26793-16hns1i.pdf

    Map locations are intended to show where a given SNP mutation occurred, not where a haplogroup may be most prevalent today. Locations are estimated with a combination of (1) averages of FTDNA testers’ reported ancestry for over 20,000 Y or 5400 mt SNPs, and (2) about 150 specific SNPs that I have anchored based on academic scholarship. These sources are complementary: paleolithic dates are very poorly estimated by modern testers’ history but a small number of academically-located paleolithic SNPs suffice for the most populous branches. On the other hand, averages of modern reported ancestry are often quite good for medieval to modern localization.

    Wikipedia and its references are a major source for academic SNP locations. The Indo-European project https://indo-european.eu/ and Eupedia https://www.eupedia.com/europe/neolithic_europe_map.shtml are also excellent sources with maps, references, and detailed discussion. Most migration maps (for example https://upload.wikimedia.org/wikipedia/commons/8/8c/Migraciones_humanas_en_haplogrupos_de_ADN-Y.PNG , https://natgeoeducationblog.files.wordpress.com/2015/12/world_map_of_y-dna_haplogroups.png ) are too general to be useful in locating specific SNP origins in time and location, though for mtDNA there is not much more (see below).

    Carlos Quiles recently shared his hand-curated list of over 8700 ancient human remains with locations, dates, and Y and/or mtDNA haplogroups. But even with this trove of data and five different approaches, automated methods relying solely on ancient sites are no match for human interpretation. See http://scaledinnovation.com/gg/gg.html?rr=ancientSites for details.

    I hand-curated a few anchored points where the given locations would have required a very unusual rate of migration. It is also worth noting that a number of published ancestral tracks are probably incorrect because they do not fully account for the time-sequence of SNPs. Every path on this map is drawn by traversal of the Y or mt SNP tree and thus always in correct past-to-present order.

    As more men do BigY DNA testing the Y SNP tree has grown to the point where many terminal SNPs now overlap the timescale of paper genealogy; this allows those testers to pinpoint the precise origin of that SNP in time and geography. SNP Tracker identifies these SNPs and fixes those that have a single country location. In addition, I will add more specific data if asked. Use the button below to email me your SNP name, surname, SNP formation date, and origin latitude and longitude in decimal degrees, not degrees/minutes/seconds; west longitude is negative. Note that only European or Asian locations will show on the map, so even if your terminal SNP is actually in North America, give me the last known European location. Only BigY terminal SNPs please: I will not modify any SNP with more than one surname attached, or any earlier than about 1800 CE. I generally do data updates every 4-6 weeks.

    Since November 2019 ancient SNP paths are computed as a whole, taking account of their interdependencies, and recent paths may be optionally anchored to very recent terminal SNPs that cite a single ancestral country. The latter change recognizes the increase in BigY data which means that many customers’ terminal SNPs now extend (in time and geography) into the range of paper genealogy. See the Research Report http://scaledinnovation.com/gg/gg.html?rr=pathFix for details.

    10,000 years, vs one per

    100 years for Y SNPs or Y STRs). mtDNA is much more diverse since maternal lines have not had the purifying effect of major bottlenecks (near-extinctions) like Y DNA, thus mtDNA does not have easily traced «migration superhighways» like Y DNA (i.e. R1b-M269, R1a-M198, I1-M253). As a result, many mtDNA lineages tend to be ancient and found across all of Eurasia. The literature offers less information about founders and splitting, so the mtDNA paths here are largely based on continent-scale general migration maps such as https://en.wikipedia.org/wiki/File:Human_migrations_and_mitochondrial_haplogroups.PNG and to a lesser extent https://www.familytreedna.com/learn/wp-content/uploads/2015/12/mt_Map_12_17_2015.png .

    SNP Tracker can display 14,000 ancient samples with Y and/or mtDNA, but to reduce visual clutter and confusion, only those that apply to a given SNP are shown, and then only when the «walking man» reaches the time period when that ancient person lived. Pause the animation and drag the slider manually to see the skull icons appear and fade under your control.

    The skull icon denoting an ancient site will change appearance as the walking icon moves. The cartoon shows a site with SNP R-M269 and date 3000 years before present, while SNP R-M269 was formed 13,000 ybp and is much farther east. Before the walker gets to R-M269 (1) the skull doesn’t appear — it couldn’t have existed yet. Once the walker passes M269 (2) the skull appears but faintly because of the large time discrepancy. As the walker gets close to the date of the skeleton (3), the skull gets darker, and as the walker proceeds past the time of the skeleton (4) the icon becomes yellow, as if the bones are aging.

    All data are from Carlos Quiles’ compilation spreadsheets which are available at his website https://indo-european.eu/ancient-dna/. Click any skull icon in the SNPs table to give details of individual samples. The Ancient DNA Samples diagram under the Timelines tab shows that many ancient samples are very far in time and space from when and where their last recorded SNP arose; this is one of many reasons why ancient DNA alone is insufficient to determine SNP paths http://scaledinnovation.com/gg/gg.html?rr=ancientSites. One of the major reasons for the time discrepancy is that many ancient remains were tagged by a characteristic SNP (such as R1, I1a, or R-M269) based on a PCR or STR test, rather than by more recently available BigY or other sequencing tests that would determine the true terminal SNP.

    Also note that any ancient skeleton is very unlikely to be a direct ancestor, but rather a person who split from your lineage at the point where the shared SNP arose.

    coreDAO tokens have been deployed

    0xdec4f

    Migration to the new token has launched, you can follow the guide below to complete your migration and receive the new coreDAO tokens.

    Migrate your coreDAO LP Vouchers in 4 simple steps:

    1. Unstake all LP
    2. Go to Migration (New) tab
    3. Approve LP1, LP2, LP3
    4. Migration to CoreDAO

    1. Unstake LP

    To migrate your coreDAO LP Vouchers you have to unstake them from the vault on http://corefinance.eth and hold them in your wallet.

    2. Migration page

    Once you unstaked your LP vouchers, navigate to the new “Migration” tab found in the Wallet.eth window on our website, corefinance.eth.

    Approve each LP for migration.

    After you approved your LP, a “Migrate LP -> CoreDAO” button will appear.

    Confirm the migration and wait for the transaction to be approved.

    A window will pop up displaying the amount of coreDAO tokens that you received from the migration.

    For your wallet to track your coreDAO you can add following ERC20 address:
    0xf66Cd2f8755a21d3c8683a10269F795c0532Dd58

    You have successfully migrated your vouchers to coreDAO tokens!

    Saved searches

    Use saved searches to filter your results more quickly

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

    OCA / OpenUpgrade Public

    Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

    By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

    Already on GitHub? Sign in to your account

    Crash in migration of vouchers to payments — I will try to provide fix #707

    Crash in migration of vouchers to payments — I will try to provide fix #707

    Comments

    Impacted versions: 8.0 to 9.0

    Steps to reproduce:

    Run migration with large dataset containing vouchers. Not yet certain about what data causes crash.

    Voucher migration tracker что это

    Reddit and its partners use cookies and similar technologies to provide you with a better experience.

    By accepting all cookies, you agree to our use of cookies to deliver and maintain our services and site, improve the quality of Reddit, personalize Reddit content and advertising, and measure the effectiveness of advertising.

    By rejecting non-essential cookies, Reddit may still use certain cookies to ensure the proper functionality of our platform.

    For more information, please see our Cookie Notice and our Privacy Policy .

    Get the Reddit app

    Your community-run home for all things PlayStation on Reddit! Console/game discussions, news, support, trophy/media sharing and more!

    a couple days i was informed by playstation that my ps+ payment would go on unless i wanted to put a stop to it. But the thing is i've already clicked on stop ps+. Now i went to look and saw that my ps+ has been stopped indeed. BUT that something called ''t10 voucher migratian tracker'' has turned on on my ps4 and it doesnt have a stop button. does annyone know what it is?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *