Uber перенесла все свои данные о платёжных транзакциях из DynamoDB и хранилища BLOB-объектов в новое долгосрочное решение — LedgerStore. Компания стремится сократить расходы на $6 млн ежегодно.
Двухфазная фиксация записи для строго согласованных индексов
Ранее Uber уже сократила использование DynamoDB для хранения «горячих» данных 12-недельной давности. Этот шаг привёл к значительной экономии и упрощению архитектуры хранения.
Uber создала свою платёжную платформу Gulfstream в 2017 году и использовала DynamoDB для хранения данных. Из-за роста затрат на хранение более старые записи переносили в TerraBlob, сервис, похожем на S3, созданный Uber.
Тем временем компания начала работу над специализированным решением для хранения финансовых транзакций с гарантиями целостности данных. Каушик Девараджайя, технический руководитель Uber, объясняет: «LedgerStore — это неизменяемое решение для хранения, которое обеспечивает поддающуюся проверке полноту данных и гарантии правильности для обеспечения их целостности для транзакций. LedgerStore поддерживает надёжные и согласованные индексы. Для строго согласованных индексов хранилище данных использует двухфазную фиксацию. Сначала оно сохраняет отступ в индексе, а затем — запись. Наконец, если запись успешна, намерение асинхронно фиксируется или откатывается в случае сбоя. Во время чтения любые записи с незафиксированными намерениями либо фиксируются (если чтение завершается успешно), либо удаляются (если чтение записи завершается неудачно) асинхронно. LedgerStore реализует в конечном итоге согласованные индексы, используя материализованные представления из собственной базы данных Docstore, распределённой БД, построенной на основе MySQL».
Чтобы выгрузить старые данные реестра в холодное хранилище, LedgerStore использует индексы временного диапазона для поддержки временных запросов. Исходное решение использовало две таблицы в DynamoDB: одну, оптимизированную для записи, а вторую — для чтения. Новый дизайн использует базу данных Docstore с одной таблицей и задействует сканирование префиксов для эффективного чтения.
Заполнение индекса из холодного хранилища
LedgerStore поддерживает управление жизненным циклом индекса, автоматизируя переиндексацию данных в случае изменения его определения. Процесс создает новый индекс, заполняет данные из старого, выполняет соответствующие проверки, меняет индекс и удаляет старый.
Компания столкнулась с уникальными проблемами при переносе петабайт данных финансовых транзакций в LedgerStore. Она использовала теневую и автономную проверку, чтобы гарантировать правильность миграции, а также производительность и масштабируемость LedgerStore в производственной среде. Для теневой проверки компания Gulfstorm дважды записывала данные в DynamoDB и LedgerStore и сравнивала возвращаемые при чтении между двумя хранилищами данных.
Кроме того, Uber реализовала автономную проверку старых данных в сочетании с инкрементным заданием обратного заполнения, выполняемым в Apache Spark. Инженеры использовали несколько мер для контроля процесса и устранения любых проблем, включая динамическое управление скоростью для корректировки скорости обработки в зависимости от производственного трафика, и аварийную остановку в случае серьёзных проблем.
Команда придерживалась консервативного подхода к развёртыванию и разработала резервный вариант получения данных из DynamoDB на случай, если они не будут найдены в LedgerStore. В целом миграция прошла успешно, и в компании не было никаких простоев или сбоев во время и после неё.
Также можно прочитать о том, как в Uber проектировалась система кэширования на основе Redis.
Источник: habr.com