Русский
Русский
English
Статистика
Реклама

Хранилище данных

Из хлама в NAS и немного темы майнинга

18.06.2021 12:04:53 | Автор: admin

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

Итак мы имеем: ПК 11 летней давности в состоянии трэш.
Если подробнее: у блока питания вздуты все конденсаторы на выходе, у жёсткого диска взорванный полимерный конденсатор на входе питания, видеокарта тоже не стартует. По моим догадкам, по 12в линии явно пошло сильно больше 12в. При этом материнка с процессором остались живы. Чудо!

Порывшись в закоулках нахожу 4 плашки ddr2 пару на 1гб и пару на 2гб.

По характеристикам


Процессор: Celeron E3400
Материнская плата: P5K PRO
Оперативная память: 6 Gb ddr2
Жёсткий диск: 400 Gb IDE
Видеокарта: GeForce 8400 GS
Блок питания: FSP 350W



Ну вот всё что нужно есть, приступаем к оживлению трупа!


Начал с БП. Конденсаторов на большую ёмкость у меня нет (2000-3000мкФ) и пришлось городить этажами, получился вот такой лес:

image

На плате жёсткого диска, припаял конденсатор (старый просто испарился, одни следы только были), так же заодно покрыл припоем контактные площадки, чтобы не коррозировали, и даже не надеялся что он заработает, однако ожил:

image

С видеокартой немного сложнее, питание gpu звонится с малым сопротивлением в обе стороны, явно что то не то. При прозвоне нашёл два подозрительных силовых транзистора, перепаял на те, что были в закромах, заработало это только с помощью черной магии, других объяснений нет!Хотя сильно в нагрузке не тестировал:

image

Обновляю bios, накатываю win 10 и подключаю подготовленные под это дело диски (восстановленные). Я осознал насколько он тормоз в плане быстродействия, так что все планы по установке чего либо в него, я убрал (по крайне мере до того момента как найду, хотя бы четырёхъядерный процессор).

image

Тут больше ничего не оставалась как сделать из него NAS (сетевое хранилище) с возможностью подключения по RDP, к тому же в материнке была рабочая родная гигабитная сетевая карта (кто много возился со старым железом, знает что рабочая сетевуха в материнке это джекпот).
Далее я в прямую сделал доступ к локальным дискам по SMB включая C и разрешил подключение по RDP:

image

Майнинг


Сразу понятно что речь идёт о новой одноимённой монете.
Так как я не дата центр, будем экспериментировать с пулом.
Еще к этому NAS я подключил заплоченные диски, по-другому никак, характеристики вы сами видели.

На главном компьютере запускаю программу добычи, и тут столкнулся с тем, что сетевые диски она не видит, пришлось прописать полный путь до каждого диска:

image

После 24ч теста всё хорошо, ничего не взорвалось. Синхронизация кошелька ест 90% процессора и идёт со скоростью ленивца, который должен преодолеть 50 км ХД.

По итогу, у нас 6 портовый NAS, ещё и с 400Гб памяти на борту. Ради интереса глянул сколько стоит подобные готовые решения и удивился 700$ и это минимум.

Что можно сделать дальше?


Можно отрыть 4 ядерный процессор, подоткнуть usb 3.0 контроллер, настроить мультимедийный DLNA сервер и это только то, что мне пришло на ум.

На момент написания текста статьи, 1Тб приносит 10 рупий рублей в день.

Ни одна деталь не была куплена, всё собиралось из того, что есть.

Финал


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


Подробнее..

Musiphone децентрализованный музыкальный плеер

22.04.2021 16:18:43 | Автор: admin


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


Свой рассказ я бы хотел поделить на две части:


1. Плеер изнутри (musiphone, museria-player)


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


const Node = require('musiphone').Node;(async () => {try {const node = new Node({port: 4000,hostname: 'localhost',musicStorageAddress: 'storage.museria.com:80'});await node.init();}catch(err) {console.error(err.stack);process.exit(1);}})();

const Client = require('musiphone').Client;(async () => {try {const client = new Client({address: 'localhost:4000'});await client.init();const title = 'Playlist title';const songs = ['Onycs - Eden','Onycs - Shine','Onycs - Timeless'];// Add the playlistconst response = await client.addPlaylist(title, songs);// Get the playlistconst playlist = await client.getPlaylist(response.hash);}catch(err) {console.error(err.stack);process.exit(1);}})();

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


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


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


2. Плеер извне (сайт, android приложение)


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


Интерфейс везде примерно одинаковый, поэтому разберем все на примере сайта.


Создание и сохранение плейлиста в сеть.



Вначале вы попадаете на интерфейс с бобром и неактивной кнопкой "NEW PLAYLIST". Это означает, что сейчас идет создание нового плейлиста. Чтобы добавить песню, нужно найти ее в музыкальном хранилище, используя поле ввода слева. Если нужной песни там нет, то вы можете сами добавить ее, перейдя по ссылке "MUSIC STORAGE" сверху, тем самым вы поможете и себе и другим людям, которые в дальнейшем будут ее искать.


Для примеров будут использоваться рандомные песни, разрешенные для свободного распространения и прослушивания. Давайте поищем "Onycs Eden"



В хранилище нашлось пару вариантов, можно их прослушать и добавить нужный, нажатием на плюсик. Добавим несколько песен.



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


Попробуем сначала сохранить все в сеть. Для этого нажимаем "SAVE TO WEB".



Ввели название и сохраняем.



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


Также мы видим, что исчезло коричневое предупреждение и появилось синее табло, в котором у нас ссылка на плейлист. Вы можете дать эту ссылку любому человеку, перейдя по ней, он увидит тоже самое. Создадим еще один плейлист. Для этого нажимаем "NEW PLAYLIST". Повторяем те же шаги и получаем:



Видим уже два плейлиста, а также сам плеер, который появился после нажатия на блок с песней.


Сохранение плейлистов в файл
Для большей надежности вы можете сохранять плейлисты в файлы. Для этого нажимаем "SAVE TO FILE". Файл будет сохранен в общепринятом формате m3u и может быть загружен и прослушан в любом другом плеере.


Загрузка плейлистов
Чтобы загрузить плейлист, нажимаем "LOAD PlAYLIST".



В модальном окне у нас есть два варианта. Мы либо загружаем по ссылке, либо из файла. В первом случае существует два типа ссылок:


  • Статическая ссылка. Это обычная ссылка с хэшем на плейлист в хранилище: http://player.museria.com:80/musiphone/3deeb6052c5a46c05d6bec2cab5bade9 Напрашивается вопрос, зачем ее грузить через форму, если можно просто по ней перейти. Дело в том, что во-первых это нужно для мобильной версии, а во вторых узлы относительно которых создается ссылка рандомные. Это может быть неудобно когда вы уже настроили свое окружение на каком-то хосте, ведь вся временная информация хранится в localStorage. Поэтому переходы по таким ссылкам удобны, чтобы ознакомится с плейлистами, но чтобы формировать свое пространство нужно работать с интерфейсом какого-то одного узла, например, дефолтного: player.museria.com


  • Динамическая ссылка. Такая ссылка не связана с хранилищем, она должна содержать путь к любому валидному m3u файлу/ответу сервера в интернете. Содержимое будет автоматически трансформировано в плейлист приложения. Каждые 10 секунд будет происходить новый фоновый запрос по этой ссылке, на случай, если вдруг данные изменились и нужно обновить список. Динамическая ссылка проебразуется в следующий вид, для того, чтобы ею можно было также делиться: http://player.museria.com:80/musiphone/external:someUrlHash



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


Конфиги
Все, что вы настраиваете в плеере хранится в localStorage. Чтобы сохранить эту информацию в файл(json), используйте кнопку "SAVE CONFIG", для загрузки "LOAD CONFIG". Вы можете настраивать различные группы плейлистов, уровень громкости плеера и прочее, создавая разные конфиги. Вот, например, вам конфиг из примеров в этой статье.


Вы можете помочь проекту, запустив хотя бы один узел для музыкального хранилища у себя на сервере пространством 50-1000гб, от 2гб оперативки, 2 ядра. Чем больше узлов, тем больше песен будет доступно.


Либо узел для сети плеера: от 300 мб свободного пространства, 1гб оперативки, 1 ядро. Больше узлов дольше живут ссылки.


Группа в телеграм на английском, либо сразу пишите мне в личку ortex

Подробнее..

Дата-центр SafeDC на один день приоткрыл двери для заказчиков

07.09.2020 18:22:46 | Автор: admin
Накануне Дня знаний НИИ СОКБ провел в своем ЦОД SafeDC День открытых дверей для заказчиков, которые своими глазами увидели то, о чем мы расскажем далее под катом.

Дата-центр SafeDC на один день приоткрыл двери для заказчиков картинка

ЦОД SafeDC расположен в Москве на Научном проезде, на подземном этаже бизнес-центра на глубине десяти метров. Общая площадь ЦОД составляет 450 м2, ёмкость 60 стоек.

Электропитание организовано по схеме 2N+1. К каждому шкафу с оборудованием подходят две электромагистрали. Электропитание потребителей может осуществляться от любой из них. Установлены интеллектуальные блоки распределения (PDU) с функциями мониторинга. Инфраструктура электроснабжения позволяет выделить до 7 кВт на стойку.

Инфраструктура электроснабжения позволяет выделить до 7 кВт на стойку картинка

Дизель-генератор контейнерного типа обеспечивает бесперебойную работу до 12 часов от одной заправки. На время переключения на него электропитание обеспечивается комплексом APC InfraStruXure.

Система бесперебойного питания APC InfraStruXure картинка

В машинном зале установлены комплексы, состоящие из шкафов, внутрирядных кондиционеров, а также крыши и дверей, обеспечивающих изоляцию горячих коридоров для размещения высокопроизводительного оборудования. Все стойки и оборудование изоляции от одного вендора АРС/Shneider Electric.

Двери, обеспечивающие изоляцию картика

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

Внутрирядные кондиционеры компании Liebert/Vertiv поддерживают в машинном зале температуру +200С 10С.

Системы кондиционирования построены по схеме 2N. Резервная система автоматически включается при наступлении аварийного события.

Внутрирядные кондиционеры компании Liebert/Vertiv картинка

ЦОД имеет несколько периметров охраны. Двери в машинные залы находятся под управлением системы контроля и управления доступом, в каждом ряду стоек установлены камеры видеонаблюдения. Словом, ни одно постороннее лицо не проникнет и ни одно действие не останется незамеченным.

ЦОД имеет несколько периметров охраны картинка

Сетевая инфраструктура ЦОД в соответствии с классической архитектурой имеет три уровня (ядро, агрегация и доступ). Уровень доступа реализуется путем установки коммутаторов в телеком-стойку (Telecom Rack). Коммутаторы агрегации и ядра зарезервированы по схеме 2N. Используется сетевое оборудование Juniper.

ЦОД соединен с точкой обмена трафиком MSK-IX 40 оптическими волокнами собственной кабельной сети. Волоконно-оптические линии связи имеют разные маршруты прокладки. На девятке имеется собственное оборудование.

Компания НИИ СОКБ является локальным интернет-регистратором, поэтому имеет возможность предоставить заказчикам необходимое количество статических IP-адресов.

Сетевая инфраструктура ЦОД в соответствии с классической архитектурой имеет три уровня картинка

Серверы и системы хранения данных дата-центра от ведущего производителя IBM/Lenovo.
Система мониторинга параметров ЦОД построена с использованием SCADA-системы компании Indusoft. Глубина мониторинга позволяет отследить в режиме реального времени состояние всех параметров инженерной инфраструктуры SafeDC.

Серверы и системы хранения данных дата-центра от ведущего производителя IBM/Lenovo картинка

Информирование дежурного персонала о событиях происходит сразу по нескольким каналам по почте, SMS и каналу Telegram. Это позволяет оперативно реагировать на любые события.

SafeDC аттестован на соответствие 1 классу и 1 уровню защищенности информационных систем, обрабатывающих государственные информационные ресурсы и персональные данные.

В перечне услуг ЦОД входит:
размещение серверов в дата-центре (colocation);
аренда серверов;
аренда виртуальных серверов (VDS/VPS);
аренда виртуальной инфраструктуры;
сервис резервного копирования BaaS (Backup as a Service);
администрирование серверов Заказчика;
облачные сервисы информационной безопасности, в частности MDM/EMM;
сервис аварийного восстановления инфраструктуры Заказчика DraaS (Disaster Recovery as a Service);
услуги резервного ЦОД-а.

Ждем Вас в SafeDC!
Подробнее..

Как выбрать облачную систему хранения данных, чтобы получить лучшую производительность и оптимизировать стоимость

09.03.2021 18:08:33 | Автор: admin

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

Я Хамзет Шогенов, архитектор облачной платформы Mail.ru Cloud Solutions, расскажу о системах хранения данных, доступных на нашей платформе, подробно остановлюсь на их технических характеристиках и оптимальных вариантах использования.

Типы дисков, которые вы можете использовать в облаке

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

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

Особенности облачных (блочных) дисков:

  1. Есть определенная гарантированная производительность в единицу времени на единицу объема хранения данных, выражаемая в операциях на диске в секунду (IOPS, пропускная способность).

  2. Широкий выбор типов дисков. Возможность изменения типа диска на лету.

  3. Возможность создания снапшотов и образов (шаблонов) дисков.

  4. Гибкость управления. При масштабировании диска можно не выключать инстанс, к которому он подключен. Можно создавать и подключать к работающей ВМ новые диски.

  5. Совместимость. Диски можно рассматривать как локально подключенные накопители. Это позволяет разбивать их, форматировать и управлять ими с помощью знакомых инструментов и методов.

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

Отличия облачных (блочных) дисков от других облачных систем хранения данных:

  • Масштабирование производится вручную.

  • Уменьшение размера существующего диска недоступно: потребуется пересоздание.

  • Доступ возможен из любой зоны доступности (AZ), но ресурс локализован в одной AZ. Размещение диска и виртуальной машины в разных ЦОДах не рекомендуется, хотя это и возможно.

  • Непригодны для одновременного доступа при работе как с блочным устройством.

  • Наибольшая стоимость среди всех типов облачных хранилищ, если говорить про наиболее производительные типы дисков.

На нашей платформе поддерживаются несколько типов дисков: HDD, SSD, SSD High IOPS и Low Latency NVMe. Вначале рассмотрим характеристики, которые будут общими для всех дисков, затем остановимся более подробно на каждом из них.

Примечание. Для каждого типа облачных дисков есть ближайший аналог из мира физических устройств. Но это не означает их полного технического соответствия. Также следует учесть, что бюджет на операции ввода-вывода в секунду для облачных дисков всегда определяется на определенный шаг дискового пространства. Я буду приводить значения SLA для 2 Тб пространства. С полным перечнем SLA для различных типов дисков можно ознакомиться здесь.

Общие характеристики для всех типов облачных дисков

  1. Capacity. Рекомендуемый максимальный размер диска 2 Тб.

  2. Масштабирование. Вручную через веб-консоль управления облаком или OpenStack CLI (Command Line Interface). Возможно только увеличение размера диска. Уменьшение недоступно, так как подобная процедура может негативно сказаться на работе файловой системы и целостности данных.

  3. Доступность. Гарантируется SLA, общий для облака, 99,95%.

  4. Бэкапы и восстановление. Для всех дисков поддерживаются снапшоты и резервные копии. Создание снапшотов доступно через консоль управления облаком и OpenStack CLI. Создание бэкапов возможно через встроенный механизм MCS либо с использованием сторонних решений наших партнеров: Acronis и VMware Backup & Replication. Встроенный механизм хорош интеграцией с облачной платформой, сохранением бэкапов в S3, что дешевле, и платой только за хранение данных. Однако в этом случае нет возможности восстановления данных в ту же виртуальную машину и восстановления отдельных файлов.

  5. Границы доступности. Ресурс локализован в рамках одной зоны доступности (AZ, Availability Zone). Чтобы избежать потенциального снижения производительности работы, при создании диска, подключаемого к существующему инстансу, рекомендуется выбирать зону доступности инстанса.

  6. Безопасность. Доступ к данным ограничен механизмами изоляции ресурсов (различные Namespace) проекта.

  7. Механизм расчета стоимости. Цена определяется запрошенным объемом диска. При изменении размера стоимость автоматически пересчитывается.

Диски HDD

Базовые диски, самые недорогие и наименее производительные. В традиционной инфраструктуре этому классу хранения соответствуют обычные диски HDD. Чаще всего используются в качестве загрузочных разделов ОС и файловых хранилищ.

Характеристики, специфичные для HDD

Показатель

Значение

IOPS (количество операций в секунду на 2 Тб пространства)

Показатель SLA для чтения 3002400, для записи 150800. Приложения не всегда могут загрузить диск, это доступно в полной мере только для приложений, которые осуществляют чтение и запись в многопоточном режиме.

Throughput (пропускная способность на 2 Тб пространства при размере блока 1М)

Показатель SLA для чтения 250 Мб/с, для записи 100 Мб/с.

Поведение при выходе физического оборудования из строя

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

Диски SSD

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

Характеристики, специфичные для SSD

Показатель

Значение

IOPS (количество операций в секунду на 2 Тб пространства)

Показатель SLA для чтения 100016 000, для записи 500-8000.

Throughput (пропускная способность на 2 Тб пространства, при размере блока 1М)

Показатель SLA для чтения и записи 400 Мб/с.

Поведение при выходе физического оборудования из строя

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

Диски High IOPS SSD

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

Характеристики, специфичные для High IOPS SSD

Показатель

Значение

IOPS (количество операций в секунду на 2 Тб пространства)

Показатель SLA для чтения 10 00045 000, для записи 500030 000.

Throughput (пропускная способность на 2 Тб пространства, при размере блока 1М)

Показатель SLA для чтения и записи 500 Мб/с.

Поведение при выходе физического оборудования из строя

Может случиться временная недоступность данных, сами данные не теряются. Необходимо дополнительно позаботиться о реализации отказоустойчивости на уровне приложения (application-aware). С лучшими практиками по созданию отказоустойчивых приложений можно ознакомиться по ссылке.

Low Latency NVMe

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

Характеристики, специфичные для Low Latency NVMe

Показатель

Значение

IOPS (количество операций в секунду на 2 Тб пространства)

Показатель SLA для чтения 10 00075 000, для записи 5000-50 000.

Throughput (пропускная способность на 2 Тб пространства, при размере блока 1М)

Показатель SLA для чтения 1200 Мб/с, для записи 900 Мб/с.

Latency (задержка)

SLA максимум 0,5 мс. Устойчивы к отказу сети, виртуальная машина с такими дисками максимально близка к bare metal.

Поведение при выходе физического оборудования из строя

Наступает полная недоступность данных, есть риск потери данных. Необходимо дополнительно позаботиться о реализации отказоустойчивости на уровне приложения (application-aware). С лучшими практиками по созданию отказоустойчивых приложений можно ознакомиться по ссылке.

Объектные хранилища S3 еще один тип хранения данных в облаке

В S3 данные хранятся в виде объектов. Объект это некая совокупность данных с уникальным идентификатором и бесконечным количеством метаданных. Для группировки объектов есть дополнительная сущность бакеты. Это контейнеры для объектов, похожие на папки, но не являющиеся их полным аналогом. В проекте может быть один или несколько бакетов.

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

S3 может выступать в качестве более надежной и дешевой альтернативы дискам HDD для большей части сценариев их использования.

В нашем облаке доступны три класса объектных хранилищ S3, которые различаются по своему назначению и стоимости:

  1. S3 HotBox предназначен для хранения горячих данных с частым доступом. В первую очередь это онлайн-сервисы с повышенной нагрузкой, работа которых требует хранения и раздачи контента: потоковая раздача мультимедиа, хостинг статических сайтов, хранилища для Backend-платформ. Могут также использоваться для анализа данных в Big Data, Data Mining и так далее. В HotBox хранение дороже, а исходящий трафик дешевле, входящий трафик не тарифицируется.

  2. S3 IceBox используют для хранения холодных данных с редким доступом, например несколько раз в месяц. Чаще всего это годовая и месячная отчетность, документы, бэкапы и журналы, к которым периодически нужен быстрый доступ. По сравнению с HotBox в IceBox хранение дешевле, а исходящий трафик дороже, входящий трафик также не тарифицируется.

  3. Glacier подходит для хранения ледяных данных массивных данных (от 100 Тб) с очень редким доступом. Это бэкапы, архивы и логи, к которым доступ может потребоваться несколько раз в год и реже. Из трех типов хранилищ в Glacier самая низкая цена на хранение данных, а весь трафик бесплатный. Такое хранилище подключается по отдельному запросу клиента.

Что хорошего в S3-хранилище:

  • Неограниченный объем хранимых данных (петабайты).

  • Подходит для неструктурированных данных за счет хранения дополнительной информации (метаданных) рядом с объектами.

  • Разграничение доступа за счет ACL и префиксных ключей.

  • Возможность одновременного использования большим количеством приложений.

  • Стабильная скорость раздачи любых объектов независимо от числа одновременных обращений.

  • Автоматическое и виртуально неограниченное масштабирование.

  • Возможность настройки Webhooks для автоматической обработки при создании/удалении объектов (например, автообработка фото и видео).

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

  • У S3 нет понятия зоны доступности: это глобальный сервис. Его доступность обеспечивается из пяти ЦОД MCS.

  • Наименьшая стоимость среди всех типов облачных хранилищ.

Основное отличие S3-хранилища от других облачных (блочных) систем хранения блочные хранилища предназначены для использования виртуальными машинами и представляются как диски, а объектное хранилище доступно только по HTTP.

Основные особенности S3

  1. Capacity. Нет ограничений на общий объем можно хранить петабайты данных. В одном хранилище может быть до 25 бакетов, размер одного бакета произвольный. Число объектов в одном бакете не ограничено свыше 1 млрд. Для конкретных объектов действуют следующие рейт-лимиты: 32 ГБ для обычного файла, 320 ТБ для multipart.

  2. IOPS (количество операций в секунду). Действуют следующие рейт-лимиты: для обычных запросов 500 запросов в секунду, 10 млн запросов в день, для запросов на листинг 15 запросов в секунду, 10 млн запросов в день.

  3. Throughput (пропускная способность). Поддерживается скорость передачи объектов 1 Гбит/с. Для быстрой доставки контента хранилище S3 можно интегрировать с сетью доставки контента (CDN, Content Delivery Network), имеющей более 400 точек присутствия во всем мире и емкость канала 1,5 ТБит/с.

  4. Масштабирование. Размер S3 не ограничен. Масштабирование происходит вверх и вниз автоматически, без дополнительных настроек со стороны пользователя.

  5. Доступность. Гарантируется SLA, общий для облака 99,95%. Надежность хранения при этом составляет 99,99999%.

  6. Поведение при выходе физического оборудования из строя. Происходит без прерывания обслуживания и потери данных.

  7. Бэкапы и восстановление. Обеспечивается георепликация данных. В разработке функциональность версионирования объектов с возвратом к определенному номеру версии.

  8. Границы доступности. Возможен доступ из всех зон доступности региона, а также из любого места в интернете с использованием URL объектов.

  9. Протоколы доступа. S3 API. Главная особенность решения от MCS полная совместимость с API S3.

  10. Безопасность. Обеспечивается за счет списков управления доступом (ACL, Access Control Lists) и префиксных ключей. На уровне каждого бакета можно определять, кто может создавать, удалять и перечислять объекты в нем. При организации внешнего доступа вне облака можно использовать HTTPS.

  11. Механизм расчета стоимости. Оплачивается за фактически использованные ресурсы и рассчитывается посекундно. Тарифный план зависит от типа выбранного хранилища: HotBox, IceBox или Glacier.

Файловые хранилища в облаке

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

Чаще всего файловое хранилище используют в качестве системы хранения документов, общего пользовательского файлового пространства или общего персистентного хранилища данных для узлов кластера Kubernetes.

Преимущества файловых хранилищ:

  • Есть возможность как увеличения, так и уменьшения размера хранилища.

  • Есть возможность создания снапшотов.

  • Оптимальный вариант хранения для Legacy-приложений, требующих протокола SMB/NFS.

  • Поддерживаются большим количеством классических систем.

Недостатки файловых хранилищ:

  • Масштабирование производится вручную.

  • Одновременный доступ ограничен полосой пропускания стандартного сетевого интерфейса.

  • В настоящий момент для файловых хранилищ нет возможности выбрать другой тип диска, кроме HDD, в будущем появится возможность использовать SSD.

Основные характеристики файловых хранилищ

  1. Capacity. Рекомендуемый максимальный размер хранилища 2 Тб. Максимальный размер файла не больше запрошенного размера хранилища.

  2. IOPS (количество операций в секунду на 2 Тб пространства). Так как файловое хранилище базируется на дисках HDD, показатель SLA будет тем же: для чтения 3002400, для записи 150800.

  3. Throughput (пропускная способность на 2 Тб пространства, при размере блока 1М). Аналогично, как для HDD: для чтения 250 Мб/с, для записи 100 Мб/с.

  4. Масштабирование. Проводится вручную через web-консоль управления облаком или OpenStack CLI (Command Line Interface). В отличие от облачных дисков возможно как увеличение, так и уменьшение размера файлового хранилища.

  5. Доступность. Гарантируется SLA, общий для облака, 99,95%.

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

  7. Бэкапы и восстановление. Возможно создание снапшотов, бэкапирование из веб-консоли недоступно. Механизмы те же, что и для облачных дисков.

  8. Границы доступности. Доступ осуществим из сетей, которые имеют возможность маршрутизации IP-пакетов с сетью, где размещено файловое хранилище.

  9. Протоколы доступа. Подключить файловое хранилище к инстансам проекта можно по протоколам CIFS (SMB v3) или NFS.

  10. Безопасность. Доступ к файловым хранилищам осуществляется только из виртуальных машин внутри проекта (Namespace) MCS. При этом дается возможность настроить правила доступа к хранилищу в зависимости от IP клиента.

  11. Механизм расчета стоимости. Цена определяется в зависимости от запрошенного при создании объема хранилища. При изменении размера в дальнейшем стоимость автоматически пересчитывается.

Как выбрать облачную систему хранения с учетом потребностей компании: основные критерии

Преобладающий тип операций (чтение/запись) и их частота. В первую очередь необходимо оценить, каким образом планируется обращаться к хранимым данным.

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

При выборе S3 необходимо дополнительно определить частоту доступа к данным и выбрать соответствующий тип хранилища: HotBox, IceBox или Glacier.

Требуемая производительность: IOPS, Throughput, Latency. Для систем, требующих низкой задержки и одновременно высокой пропускной способности, рекомендуется использовать блочное хранилище, оно же виртуальный диск. В объектных хранилищах модифицируемый объект перезаписывается целиком, в отличие от обычных дисков, где изменение всегда происходит на уровне конкретного блока данных.

В порядке возрастания производительности диски можно расположить следующим образом: HDD, SSD, SSD High IOPS, Low Latency NVMe. Если требуется обеспечить минимальную задержку, Low Latency NVMe будет лучшим выбором, так как для этого типа диска определено SLA на данный показатель 0,5 мс.

Методы доступа к данным, используемые в классических приложениях (в первую очередь протоколы доступа, так как контроль над интерфейсами напрямую заказчику недоступен). Очень часто при переносе Legacy-приложений клиентов в облако требуется обеспечить конкретные, уже используемые ими протоколы. Конечно, обновление систем возможно, но, как правило, требует дополнительных затрат. В таких случаях выбор облачного хранилища полностью зависит от требований переносимого ПО. Например, файловые хранилища чаще всего выбирают, когда необходимы протоколы SMB/NFS. И это стало в свое время основной причиной того, почему у нас появилось файловое хранилище как сервис.

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

Цена. Среди облачных систем хранения данных минимальная стоимость у S3, она может меняться в зависимости от того, какие данные вы будете хранить. Важное преимущество S3 необходимость оплаты только фактически используемых ресурсов.

Для файловых хранилищ и обычных дисков цена определяется запрошенным объемом ресурсов. При этом цена дисков возрастает по мере увеличения их производительности: HDD, SSD, SSD High IOPS, Low Latency NVMe. Рекомендуем выбирать тот тип диска, который при достаточной для вас производительности будет дешевле всего, так как в дальнейшем при необходимости его можно будет изменить на лету.

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

Упрощенная схема выбора облачного хранилища

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

Система хранения данных

Типичные сценарии использования

S3 Glacier

Массивные данные (от 100 Тб) с очень редким доступом: бэкапы, архивы, журналы, системные сообщения, логи.

S3 IceBox

Данные с редким доступом: архивы корпоративных файлов, годовая/месячная отчетность, документы маленьких рабочих групп, бэкапы, системные сообщения, lоg-файлы.

S3 HotBox

Потоковая раздача мультимедиа, хранилища для Backend-платформ, хостинг статических файлов и веб-сайтов, хранение данных для обработки (Big Data, Data Mining).

Файловое хранилище

Файловые хранилища, воссоздание схемы Legacy-приложения, общее персистентное хранилище данных для групп контейнеров.

HDD

Файловые хранилища, загрузочные разделы.

SSD

СУБД, телеметрия, очереди сообщений, загрузочные разделы.

SSD High IOPS

СУБД, аналитика, телеметрия. С большими требованиями к производительности, чем у SSD, но меньшими, чем у Low Latency NVMe.

Low Latency NVMe

Высокопроизводительные СУБД, аналитика, кэш.

Расчет необходимой производительности облачной системы хранения при переносе Legacy-приложений

Один из основных критериев выбора типа облачного хранилища это требуемая производительность для переносимых в облако Legacy-приложений. Как ее правильнее рассчитать?

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

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

  2. Настройте и запустите процесс снятия метрик на исходном сервере:

    • количество потребляемых ядер;

    • потребляемая частота CPU;

    • количество операций ввода/вывода в секунду;

    • задержки чтения/записи на дисках;

    • эффективность использования ОЗУ.

  3. Подготовьте синтетические данные для нагрузочного тестирования.

  4. Создайте тестовый стенд, выделив на нем минимальное достаточное количество ресурсов в соответствии с расчетами. Расчеты стоит осуществлять с учетом фактического потребления ресурсов в часы наиболее высокой нагрузки. Далее, используя показатели из SLA MCS, пересчитать на ресурсы MCS.

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

  6. Если показатели успешности не достигнуты, проведите диагностику для выявления узкого места, исходя из анализа данных, собранных на шаге 5. Добавьте необходимый тип ресурса или пересмотрите архитектуру и вновь приступайте к тестированию.

  7. При успешном тестировании можно производить миграцию и начинать промышленную эксплуатацию.

Как сочетать облачные системы хранения между собой

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

Например, возможна следующая комбинация блочных дисков: для ОС использовать HDD, СУБД построить с использованием SSD High IOPS, а для кэша взять Low Latency NVMe. S3 в такую схему можно подключить для размещения медиаконтента (картинок и видео) с возможностью внешнего доступа или для хранения резервных копий.

Если вы используете Kubernetes, S3 подойдет для хранения образов, а файловые хранилища в качестве персистентного хранилища для групп контейнеров. Хотя здесь также в большинстве случаев с минимальными доработками можно научить ПО в контейнерах работать с более надежным и дешевым хранилищем S3.

Варианты комбинации различных типов облачных хранилищ представлены на рисунках ниже.

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

Вариант комбинации облачных дисков на примере построения инфраструктуры для интернет-магазина с использованием кластера Kubernetes и хранилища S3

Итоговое сравнение облачных систем хранения данных

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

Показатель/Система хранения данных

HDD

SSD

SSD High IOPS

Low Latency NVMe

Файловое хранилище

S3

Тип хранилища

Блочное

Блочное

Блочное

Блочное

Файловое

Объектное

Размер хранилища

Рекомендуемый размер 2 Тб

Рекомендуемый размер 2 Тб

Рекомендуемый размер 2 Тб

Рекомендуемый размер 2 Тб

Рекомендуемый размер 2 Тб

Не ограничен

Максимальный размер файла

Размер диска

Размер диска

Размер диска

Размер диска

Размер хранилища

32 ГБ для обычного файла, 320 ТБ для multipart

IOPS read SLA(на 2 Тб пространства)

300 2400

1 000 16 000

10 000 45 000

10 000 75 000

300 2400

Действуют рейт-лимиты: для обычных запросов 500 запросов/с, 10 000 000 запросов/день для запросов на листинг 15 запросов/с, 10 000 000 запросов/день

IOPS write SLA(на 2 Тб пространства)

150 800

500 8000

5000 30 000

5000 50 000

150 800

Latency SLA

Не предусмотрен SLA

Не предусмотрен SLA

Не предусмотрен SLA

Максимум 0,5 мс

Не предусмотрен SLA

Не предусмотрен SLA

Throughput read SLA(на 2 Тб пространства и размер блока 1 М)

250 Мб/c

400 Мб/c

500 Мб/c

1200 Мб/c

250 Мб/c

Обеспечивается скорость до 1 ГБит/c. При интеграции с CDN: 1,5 ТБит/с

Throughput write SLA(на 2 Тб пространства и размер блока 1 М)

100 Мб/c

400 Мб/c

500 Мб/c

900 Мб/c

100 Мб/c

Масштабирование

Вручную за счет увеличения размера диска

Вручную за счет увеличения размера диска

Вручную за счет увеличения размера диска

Вручную за счет увеличения размера диска

Вручную за счет увеличения/уменьшения размера хранилища

Виртуально не ограничена

Доступность:

  • SLA

  • Поведение при выходе физического оборудования из строя

99,95%

99,95%

99,95%

99,95%

99,95%

99,95%Надежность хранения 99,99999%

Без прерывания обслуживания, данные не теряются (за счет двойных и тройных репликаций)

Без прерывания обслуживания, данные не теряются (за счет двойных и тройных репликаций)

Может возникнуть временная недоступность, данные не теряются (необходимо обеспечить отказоустойчивость на уровне приложения)

Недоступность и риск потери данных (необходимо обеспечить отказоустойчивость на уровне приложения)

Сервис доступен при выходе из строя оборудования, но выход его компонентов из строя ведет к прерыванию сервиса

Без прерывания обслуживания, данные не теряются

Бэкапы и восстановление

Резервные копии, снапшоты

Резервные копии, снапшоты

Резервные копии, снапшоты

Резервные копии, снапшоты

Снапшоты

Георепликация данных, в планах версионность объектов

Границы доступности

Из любой AZ, но ресурс локализован в одной AZ

Из любой AZ, но ресурс локализован в одной AZ

Из любой AZ, но ресурс локализован в одной AZ

Из любой AZ, но ресурс локализован в одной AZ

Из сетей, которые имеют возможность маршрутизации IP-пакетов с сетью, где размещено файловое хранилище

MultiAZ, глобальный

Протоколы доступа

Неприменимо

Неприменимо

Неприменимо

Неприменимо

Ethernet, SMB/NFS

S3 API

Безопасность

Доступ ограничивается namespace проекта

Доступ ограничивается namespace проекта

Доступ ограничивается namespace проекта

Доступ ограничивается namespace проекта

Доступ ограничивается namespace проекта, можно настроить доступ по IP клиента

Возможность ограничения доступа с использованием ACL и префиксных ключей, внешний доступ по HTTPS

Ценообразование

За выделенные ресурсы

За выделенные ресурсы

За выделенные ресурсы

За выделенные ресурсы

За выделенные ресурсы

За фактически использованные ресурсы

Что еще почитать по теме:

  1. Работа с объектным S3-хранилищем Mail.ru Cloud Solutions как с файловой системой.

  2. Принципы организации объектных хранилищ.

  3. Все обновления облачных хранилищ и другие новости наших облачных сервисов в нашем телеграм-канале.

Подробнее..

Экстракция данных из SAP HCM в non-SAP хранилища данных

23.09.2020 16:18:12 | Автор: admin
Как известно, компания SAP предлагает полный спектр программного обеспечения, как для ведения транзакционных данных, так и для обработки этих данных в системах анализа и отчетности. В частности платформа SAP Business Warehouse (SAP BW) представляет собой инструментарий для хранения и анализа данных, обладающий широкими техническими возможностями. При всех своих объективных преимуществах система SAP BW обладает одним значительным недостатком. Это высокая стоимость хранения и обработки данных, особенно заметная при использовании облачной SAP BW on Hana.

А что если в качестве хранилища начать использовать какой-нибудь non-SAP и желательно OpenSource продукт? Мы в Х5 Retail Group остановили свой выбор на GreenPlum. Это конечно решает вопрос стоимости, но при этом сразу появляются вопросы, которые при использовании SAP BW решались практически по умолчанию.



В частности, каким образом забирать данные из систем источников, которые в большинстве своем являются решениями SAP?

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

Экстракция данных


В SAP BW для SAP-систем существуют стандартные экстракторы данных. Эти экстракторы могут автоматически собирать необходимые данные, отслеживать их целостность, определять дельты изменений. Вот, например, стандартный источник данных по атрибутам сотрудника 0EMPLOYEE_ATTR:



Результат экстракции данных из него по одному сотруднику:



При необходимости такой экстрактор может быть модифицирован под собственные требования или может быть создан свой собственный экстрактор.

Первой возникла идея о возможности их переиспользования. К сожалению, это оказалось неосуществимой задачей. Большая часть логики реализована на стороне SAP BW, и безболезненно отделить экстрактор на источнике от SAP BW не получилось.

Стало очевидно, что потребуется разработка собственного механизма извлечения данных из SAP систем.

Структура хранения данных в SAP HCM


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

Большинство данных в SAP HCM хранится в плоских SQL таблицах. На основании этих данных приложения SAP визуализируют пользователю оргструктуры, сотрудников и прочую HR информацию. Например, вот так в SAP HCM выглядит оргструктура:



Физически такое дерево хранится в двух таблицах в hrp1000 объекты и в hrp1001 связи между этими объектами.

Объекты Департамент 1 и Управление 1:



Связь между объектами:



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

Отображение руководителя в SAP:



Хранение в таблице БД:



Данные по сотрудникам хранятся в таблицах pa*. Например, данные о кадровых мероприятиях по сотруднику хранятся в таблице pa0000



Мы приняли решение, что GreenPlum будет забирать сырые данные, т.е. просто копировать их из SAP таблиц. И уже непосредственно в GreenPlum они будут обрабатываться и преобразовываться в физические объекты (например, Отдел или Сотрудник) и метрики (например, среднесписочная численность).

Было определено порядка 70 таблиц, данные из которых необходимо передавать в GreenPlum. После чего мы приступили к проработке способа передачи этих данных.

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

Конечно, в SAP HCM есть механизмы фиксация изменений данных. Например, для последующей передачи в системы получатели существуют указатели изменений(change pointer), которые фиксируют любые изменения и на основании которых формируются Idoc (объект для передачи во внешние системы).

Пример IDoc изменения инфотипа 0302 у сотрудника с табельным номером 1251445:



Или ведение логов изменений данных в таблице DBTABLOG.

Пример лога удаления записи с ключом QK53216375 из таблицы hrp1000:



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

Следующей серьезной проблемой были кластерные таблицы. Данные оценки времени и расчета зарплаты в RDBMS версии SAP HCM хранятся в виде набора логических таблиц по каждому сотруднику за каждый расчет. Эти логические таблицы в виде двоичных данных хранятся в таблице pcl2.

Кластер расчета заработной платы:



Данные из кластерных таблиц невозможно считать SQL командой, а требуется использование макрокоманд SAP HCM или специальных функциональных модулей. Соответственно, скорость считывания таких таблиц будет достаточно низка. С другой стороны, в таких кластерах хранятся данные, которые необходимы только раз в месяц итоговый расчет заработной платы и оценка времени. Так что скорость в этом случае не столь критична.

Оценивая варианты с формированием дельты изменения данных, решили так же рассмотреть вариант с полной выгрузкой. Вариант каждый день передавать гигабайты неизменных данных между системами не может выглядеть красиво. Однако он имеет и ряд преимуществ нет необходимости как реализации дельты на стороне источника, так и реализация встраивания этой дельты на стороне приемника. Соответственно, уменьшается стоимость и сроки реализации, и повышается надежность интеграции. При этом было определено, что практически все изменения в SAP HR происходят в горизонте трех месяцев до текущей даты. Таким образом, было принято решение остановиться на ежедневной полной выгрузке данных из SAP HR за N месяцев до текущей даты и на ежемесячной полной выгрузке. Параметр N зависит от конкретной таблицы
и колеблется от 1 до 15.

Для экстракции данных была предложена следующая схема:



Внешняя система формирует запрос и отправляет его в SAP HCM, там этот запрос проверяется на полноту данных и полномочия на доступ к таблицам. В случае успешной проверки, в SAP HCM отрабатывает программа, собирающая необходимые данные и передающая их в интеграционное решение Fuse. Fuse определяет необходимый топик в Kafka и передает данные туда. Далее данные из Kafka передаются в Stage Area GP.

Нас в данной цепочке интересует вопрос извлечения данных из SAP HCM. Остановимся на нем подробнее.

Схема взаимодействия SAP HCM-FUSE.



Внешняя система определяет время последнего успешного запроса в SAP.
Процесс может быть запущен по таймеру или иному событию, в том числе может быть установлен таймаут ожидания ответа с данными от SAP и инициация повторного запроса. После чего формирует запрос дельты и отправляет его в SAP.

Данные запроса передаются в body в формате json.
Метод http: POST.
Пример запроса:



Сервис SAP выполняет контроль запроса на полноту, соответствие текущей структуре SAP, наличие разрешения доступа к запрошенной таблице.

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

Внешняя система в случае ошибки регистрирует ее в журнале. В случае успешного ответа передает id сессии и имя таблицы по которой был сделан запрос.

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

Фоновое задание SAP формирует курсор по заданным параметрам и пакет данных заданного размера. Размер пакета максимальное количество записей, которые процесс читает из БД. По умолчанию принимается равным 2000. Если в выборке БД больше записей, чем используемый размер пакета после передачи первого пакета формируется следующий блок с соответствующим offset и инкрементированным номером пакета. Номера инкрементируются на 1 и отправляются строго последовательно.

Далее SAP передает пакет на вход web-сервису внешней системы. А она система выполняет контроли входящего пакета. В системе должна быть зарегистрирована сессия с полученным id и она должна находиться в открытом статусе. Если номер пакета > 1 в системе должно быть зарегистрировано успешное получение предыдущего пакета (package_id-1).

В случае успешного контроля внешняя система парсит и сохраняет данные таблицы.

Дополнительно, если в пакете присутствует флаг final и сериализация прошла успешно, происходит уведомление модуля интеграции об успешном завершении обработки сессии и модуль обновляет статус сессии.

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

Так же и в обратном случае, когда внешняя система возвращает ошибку, она логируется и прекращается передача пакетов.

Для запроса данных на стороне SAP HСM был реализован интеграционный сервис. Сервис реализован на фреймворке ICF (SAP Internet Communication Framework help.sap.com/viewer/6da7259a6c4b1014b7d5e759cc76fd22/7.01.22/en-US/488d6e0ea6ed72d5e10000000a42189c.html). Он позволяет производить запрос данных из системы SAP HCM по определенным таблицам. При формировании запроса данных есть возможность задавать перечень конкретных полей и параметры фильтрации с целью получения необходимых данных. При этом реализация сервиса не предполагает какой-либо бизнес-логики. Алгоритмы расчёта дельты, параметров запроса, контроля целостности, и пр. также реализуются на стороне внешней системы.

Данный механизм позволяет собирать и передавать все необходимые данные за несколько часов. Такая скорость находится на грани приемлемой, поэтому это решение рассматривается нами как временное, позволившее закрыть потребность в инструменте экстракции на проекте.
В целевой картине для решения задачи экстракции данных прорабатываются варианты использования CDC систем типа Oracle Golden Gate или ETL инструментов типа SAP DS.
Подробнее..

ZFS архитектура, особенности и отличия от других файловых систем

01.12.2020 12:23:05 | Автор: admin

Frozen cells by arbebuk

Я, Георгий Меликов, являюсь контрибьютором проектов OpenZFS и ZFS on Linux. Также я занимаюсь разработкой IaaS в команде облачной платформы Mail.ru Cloud Solutions. Хотя в продакшене нашего подразделения мы и не используем ZFS, но хозяева подкаста SDCast пригласили меня рассказать именно о нём. Из выпуска и родилась эта статья, а вот тут можно послушать аудиоверсию.

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

ZFS и ее отличия от других решений на примере Linux

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

Любая файловая система это абстракция для удобного хранения данных. Каждая файловая система разрабатывалась под определенные требования: сколько у нее будет дисков, какая система хранения под капотом и так далее. Например, семейство EXT очень простая система, вдохновлённая UFS, XFS система с упором на параллельный доступ, а ZFS стремится быть системой, включающей в себя всё нужное для создания больших локальных хранилищ, в частности это отражается и на удобстве эксплуатации.

В Linux как де-факто стандарт используется менеджер логических томов (Logical Volume Manager, LVM), который также предлагает некоторые абстракции над нижележащим блочным устройством можно создавать абстракции в виде Physical Volume, Logical Volume и так далее. По сути, можно делать то же самое, что с ZFS, но другими методами, добавив ещё кучу слоёв к LVM.

Плюсы ZFS в том, что он знает, что и где лежит, группирует это и дает некоторые другие фишки, в частности безопасное хранение данных эта файловая система сделана с упором на целостность. Сейчас это (на мой скромный взгляд) лучшее из опенсорсных кроссплатформенных предложений на рынке. Конечно, можно собрать хранилище и без ZFS, но это будет хуже по производительности, т. к. для достижения хотя бы отдалённого паритета по функциональности придётся использовать много слоёв (LVM, mdadm, dm-integrity, что-то для дедупликации и компрессии). К сожалению, каждый слой даёт не малое пенальти.

Основы ZFS

ZFS это copy-on-write файловая система, она никогда не перезаписывает данные. Мы всегда оперируем новым блоком, для обеспечения консистентности данных не нужен журнал, как в большинстве других файловых системах.

У баз данных типа MySQL и PostgreSQL есть так называемый WAL-лог. По умолчанию все данные пишутся в виде лога, потом записываются в блок данных на диске, получается двойная запись. При этом надо ждать, когда файловая система подтвердит, что данные на диске.

Copy-on-write дает следующее преимущество: старые данные не меняются, можно не вести журнал и восстановить данные, записанные ранее. Мы не боимся повреждения данных, так как их нельзя повредить, новый вариант блока запишется в новое место, не затирая старый.

Сам copy-on-write процесс не гарантирует консистентность данных, но если рассматривать ZFS, то в основе его работы лежит дерево Меркла, или Хэш-дерево. У ZFS всегда консистентное состояние за счет того, что он использует атомарные транзакции. Есть дерево блоков, для каждого из них с самого нижнего блока подсчитывается хеш-сумма и так доходит до самого верхнего блока. Хеш-сумма верхнего блока (uberblock) позволяет валидировать состояние всей файловой системы на момент транзакции.

Визуализация дерева блоков. Источник: https://ritlug.com/talks/slides/2019-spring-w08-zfs.pdfВизуализация дерева блоков. Источник: https://ritlug.com/talks/slides/2019-spring-w08-zfs.pdf

Однако из-за того, что copy-on-write система никогда не пишет в одно и то же место появляется проблема фрагментации данных. Также надо решать вопрос чтения и его эффективности. С SSD эта проблема по большей части решается, но она ощутима при работе на жестких дисках.

ZFS, как и любой copy-on-write системе, нужно иметь на дисках запас свободного места, чтобы было куда записывать данные, которые всегда пишутся в новое место. К этому добавляется проблема порядка записи, следующие блоки одного файла будут записаны в другое место на диске, то есть в наличии непростая задача по эффективному аллоцированию данных. Однако и в классических файловых системах фрагментации можно избежать, только переалоцировав последовательно отрезок и работая только с ним. По факту мы так возвращаемся к прибиванию сущностей программы к конкретному диску, а это менее удобно (а любая ФС, как мы говорили раньше, стремится облегчить жизнь разработчику).

Преимущества ZFS

Давайте же поговорим о плюсах, зачем вообще стоит выбирать ZFS:

Целостность и консистентность ZFS сделан для максимальной надежности. По умолчанию на все данные подсчитываются контрольные суммы, а для метаданных записывается минимум по две копии в разных местах диска. Есть такой миф, что для ZFS нужна ЕСС-память, на самом деле она нужна для любой файловой системы для исключения записи некорректных данных, просто в ZFS об этом честно говорят.

Сжатие на лету. К примеру, используя алгоритм сжатия LZ4 система без проблем выдает 800 Мбайт в секунду на одно ядро на запись и до 4.5 Гбайт в секунду на чтение. Соответственно, если мы говорим про многопоточную нагрузку, то при наличии свободного процессорного времени его можно эффективно утилизировать. В таком случае можно сэкономить не только место на диске, но и IOPS жесткого диска взамен ресурсов процессора за счет меньшего количества операций к диску. Есть интересные кейсы, к примеру использование MySQL, когда при этом под нами не очень дорогой SSD или простой HDD тогда, включив LZ4, можно хорошо выиграть по многопоточной производительности, немного увеличив latency каждого потока.

Атомарность. В ZFS все атомарно за счет того, что в основе лежит дерево Меркла. Если наша файловая система всегда атомарна, то можно отказаться от WAL-лога в приложениях, потому что целостность блоков гарантируется транзакционностью файловой системы. Тут есть нюансы: нужно уметь говорить с файловой системой на ее языке, манипулировать транзакциями. Отдельный вопрос, что эти логи некоторые базы данных используют для репликации. Но в целом можно так экономить на ресурсах.

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

Бесплатные снапшоты. Создание снапшота в ZFS по времени константно и не накладывает дополнительных расходов на работу с этими данными. Снапшоты удобно передавать, в том числе инкрементально, Те, кто пользуется бэкапами через Rsync или другие инструменты, сталкиваются с такой проблемой нужно проверять, какая часть данных изменилась. А здесь можно отправить снапшот инкрементально, целостность будет проверена и подтверждена на другой стороне.

Снапшот, по сути, тег, то есть ссылка на некую версию, всех данных всех блоков, из которых она состоит, начиная от корневого блока. Это специально помеченный самый верхний корневой блок, с которого начинается дерево. За этот счёт получение инкрементального среза изменённых данных равнозначно получению блоков из транзакции, на которую и указывает снапшот, то есть не требуется проверка какие блоки изменились, у нас уже есть ссылка только на модифицированные. Как пример использования снапшотов можно привести быстрое развертывание разных версий для тестирования дампов баз данных, того же PostgreSQL.

Архитектура ZFS

Посмотрим, как устроена ZFS изнутри. Есть набор дисков, над ним появляется абстракция в виде виртуального устройства (device). В терминологии ZFS это Vdev, сокращение от virtual device. Есть разные реализации Vdev: Mirror (зеркало), который дублирует как есть информацию на два диска, RAID-Z, похожий по логике работы на классические RAID 5, 6 или 7. Также на подходе новый dRAID, о котором поговорим позже.

Составные части пула. Источник: https://forums.lawrencesystems.com/t/freenas-zfs-pools-raidz-raidz2-raidz3-capacity-integrity-and-performance/3569Составные части пула. Источник: https://forums.lawrencesystems.com/t/freenas-zfs-pools-raidz-raidz2-raidz3-capacity-integrity-and-performance/3569

Как конкретно мы храним и резервируем данные с упором на производительность или на объём полезного пространства это ответственность Vdev. Из набора Vdevов мы составляем общий пул. Если перевернуть на классическое понимание того же mdadm, чтобы собрать RAID 10, то есть набор мирроров, нужно сделать несколько Vdev Mirror и объединить их в один пул. Каждый Vdev это, по сути, stripe, то есть отдельная виртуальная единица хранения. В рамках пула каждый уникальный блок данных будет храниться только на одном Vdev.

Логически элементы ZFS делятся на 3 подсистемы:

  1. SPA (Storage Pool Allocator) отвечает непосредственно за нарезку на диски, хранение данных на диске. Этот элемент отвечает за то, куда кладется конкретный блок данных, но с абстракцией от диска. Когда мы к нему обращаемся, то видим единое пространство, вне зависимости от набора конкретных Vdevов.

  2. DMU (Data Management Unit) на этом уровне ZFS представляется обычным объектным хранилищем. Есть реализации, когда ее так и используют с некоторыми модификациями. К примеру, распределённая файловая система Lustre реализует свой слой поверх DMU ZFS.

  3. Следующий уровень DSL (Data and Snapshot Layer) пользуется этим объектным хранилищем. Этот компонент занимается непосредственно файловыми системами, снапшотами, то есть логикой, которая реализует POSIX-совместимую файловую систему (в него входит слой ZPL ZFS POSIX layer).

Сравнение интерфейсов классических ФС и ZFS. Источник: https://slideplayer.com/slide/11350106/ Сравнение интерфейсов классических ФС и ZFS. Источник: https://slideplayer.com/slide/11350106/

Также в ZFS есть другие подсистемы, которые нужны для эффективной совместной работы всех этих слоёв.

ARC (Adaptive Replacement Cache). Его разработали, чтобы решить проблему с чтением. ARC примечателен тем, что делает упор не только на трекинг тех объектов, что были использованы последними (LRU-cache), но и на трекинг частоиспользуемых объектов, которые он и кэширует (MFU-cache).

У классического page cache Linuxа есть проблема вымывания: если прочесть файл, размер которого превышает объем оперативной памяти, то старые данные из кэша вымоются, так как по умолчанию файл будет загружен в page cache.

ARC это умная замена page cache. Когда создавался ZFS, часто использовали жесткие диски, а у них маленькие IOPS. Чтение copy-on-write данных по умолчанию случайная операция, чтобы её ускорить, используют разные ухищрения, например, аккумулируют данные, записывают большим блоком и так далее, но эти оптимизации не всегда срабатывают. На этот случай нужно умное кеширование. Нормально, если при штатном работе 99% запросов чтения попадает в кэш, если меньше, значит, что-то не так, стоит добавить оперативной памяти.

Если ARC не всегда полностью помещается в память, есть варианты вынести кэш на более быстрый отдельный SSD это называется L2ARC (Layer 2 ARC).

ZIL (ZFS intent log). Мы пишем данные в ZFS транзакциями, это набор дорогостоящих операций: подсчет хэш-сумм, построение дерева, запись метаданных, которые пишутся для безопасности несколько раз в разные места дисков. Поэтому мы стараемся набить каждую транзакцию максимальным количеством данных. Тут (сюрприз) появляется определенного вида журнал, без которого не обойтись, если нужна быстрая синхронная запись и критична задержка. Только здесь он вынесен как сущность, что позволяет использовать разные решения для персистентного хранения кусочка синхронной записи. Этот журнал обычно очень маленький, его записью и занимается ZIL (ZFS intent log).

ARC и ZIL хотя это и необязательные с технической стороны компоненты, но они нужны для обеспечения высокой производительности хранилища, без них система будет работать медленнее. ZFS в продакшене чаще применяют для крупных инсталляций хранилища данных. Архитектура подразумевает эффективную утилизацию большого количества HDD, SSD, RAM, CPU.

Паттерны использования ZFS и типовые конфигурации

ZFS это локальное хранилище, когда мы говорим про него, то по умолчанию подразумеваем хранилище в рамках одного хоста. У него огромный спектр применения:

  1. ZFS подходит для домашнего использования, где не самое дорогое оборудование и не самые быстрые диски, можно использовать процессор на дополнительные вычисления (т.к. он обычно простаивает). Плюсы ZFS в том, что это удобный конструктор. Необязательно задействовать отдельные SSD, можно создать пул даже прямо на файлике, что удобно для тестов.

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

  3. Также ZFS можно использовать в качестве крупного хранилища, когда в рамках одного пула более ста дисков, все это должно работать и восстанавливаться, если диски вылетели, а это проблема любого большого хранилища.

Блоки типа ARC, ZIL и так далее это не диски, которые мы можем использовать, это понятия виртуальные, они всегда есть в ZFS. У нас есть возможность вынести их на более быстрые отдельные носители.

ZIL можно вынести на так называемый Slog, которому не нужно быть большим, так как синхронная запись обычно идет мелким блоком и быстро сбрасывается на основное хранилище. То есть важно как можно быстрее записать конкретный блок данных и отрапортовать клиенту об успешной записи, а не записать как можно больше данных (привет, СУБД!). Slog нужен на чтение только при сбое питания.

ARC можно дополнить одним или более SSD и выгружать на него определенный вид данных, например, кэшировать только метаданные или данные, которые последовательно или случайно прочитались с основного хранилища.

Есть много вариаций настройки ZFS. Можно оптимизировать любой профиль нагрузки, начиная от размера блока, которым мы оперируем. Например, когда мы хотим оптимизировать copy-on-write, то можем писать большим блоком, чем в классических файловых системах, для ZFS по умолчанию принят объем в 128 КБайт на блок.

Плюсы и минусы ZFS по сравнению с аппаратными решениями

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

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

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

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

Датасет отдельная файловая система в терминологии ZFS со своими настройками. К примеру, для СУБД можно создать отдельное пространство под основные данные с размером блока 8 Кбайт и отдельный датасет, оптимизированный под WAL-лог с размером блока 16 Кбайт. При этом все будет эффективно работать. Хочется сжимать одни данные отлично, zfs set compression=on. Другие данные читаются очень редко и могут без надобности вымывать ARC без проблем, zfs set primarycache=metadata.

Имея один пул, можно настраивать под конкретную операцию хоть каждый датасет. Мы максимально подстраиваемся под приложения. То есть ZFS очень гибкое софтверное решение.

В случае ZFS все метаданные об ФС пишутся условно в заголовок диска. Если сломался сервер, можно просто вытащить диски и перенести на другой сервер. Если там совместимая версия ZFS, то система их просканирует и снова соберет тот же самый пул.

Любое софтверное решение позволяет так делать, так как рядом с данными хранится информация о строении этого массива. Но ZFS хранит эту информацию на каждом диске даже не надо указывать порядок, достаточно указать, что где-то есть пул, его надо импортировать. Система либо соберет его, либо покажет, что пошло не так. Также состояние пула можно откатить на несколько транзакций назад, если в них была ошибка.

Особенности работы ZFS

Фрагментация данных

В copy-on-write системе постоянно появляются новые блоки, а старые не всегда пригодны к удалению. Часто возникают ситуации, когда старый блок не полностью записан, какие-то блоки не нужны, появились дырки (пустые пространства небольшого размера) и так далее.

В ZFS пространство разрезано на так называемые metaslabs, которые ведут трекинг того, какие сектора свободны, а какие заняты. Это происходит на уровне SPA слоя, который работает с дисками.

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

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

По умолчанию на каждый Vdev создается ~200 meta-slabs. Если что-то изменилось, то надо метаданные по этим 200 meta-slabs записывать каждый раз для каждого Vdev. Сейчас это пишется постоянно на каждый Vdev, но уже перед релизом патч, который записывает информацию об изменениях в meta-slabs в виде лога на один из Vdev, а потом регулярно применяет этот лог. Это чем-то похоже на WAL-лог базы данных. Соответственно, уменьшается нагрузка на запись на диск информации о metaslabs.

Конечно, при заполнении всего места возникает проблема, но на эту ситуацию любая copy-on-write файловая система (да и традиционная тоже) закладывает какой-то процент зарезервированного места для работы, без этого с динамической аллокацией никак.

Запись данных

По умолчанию чтение данных в ZFS практически всегда является случайным, но так как мы пишем каждый раз в новое место, то можем превращать случайную запись в практически последовательную. Если нужна система хранения под запись и редкое чтение, то любая copy-on-write система, в том числе ZFS, будет отличным решением. Данные пишутся группами транзакций (txg, сокращённое от transaction groups), можно агрегировать информацию в рамках этой группы.

Тут есть особенность: существует Write Throttling мы можем использовать неограниченное количество оперативной памяти для подготовки txg-группы и за счет этого переживать резкие скачки записи, буферизируя все в оперативную память. Естественно, речь про асинхронную запись, когда мы можем себе это позволить. Потом можно последовательно и очень эффективно сложить данные на диск.

Если синхронная запись и ее целостность не важна, например, у вас не большая и дорогостоящая PostgreSQL, а сервер на одного пользователя, то синхронную запись можно отключить одной настройкой, она станет равняться асинхронной (zfs set sync=disabled).

Таким образом, собрав пул из HDD, можно ими пользоваться как дешёвыми SSD с точки зрения IOPS. Сколько IOPS даст оперативная память, столько и будет. При этом целостность ZFS обеспечивает в любом случае при потере питания произойдет откат на последнюю целую транзакцию и все будет хорошо. В худшем случае мы теряем последние несколько секунд записи, сколько у нас настроено в параметре txg_timeout, по умолчанию это до 5 секунд, (до т.к. ещё есть задаваемый лимит на размер буфера, при превышении данные запишутся раньше).

Зависимость скорости работы ZFS от количества дисков

Один блок данных всегда приходит на один Vdev. Если мы делим файл на небольшие блоки по 128 KB каждый, то такой блок будет на одном Vdev. Далее мы резервируем данные с помощью Mirror или как-то еще. Набив пул сотней Vdev, мы в один поток будем писать только на один из них.

Если дать многопоточную нагрузку, например в 1 000 клиентов, то они могут использовать сразу много Vdev параллельно, нагрузка распределится. При добавлении дисков мы, конечно, не получим полностью линейного роста, но параллельная нагрузка эффективно размажется по Vdevам.

Обработка запросов на запись

Когда много Vdev и идут запросы на запись, то они распределяются, есть диспетчеризация и приоритезация запросов. Можно посмотреть, на какой Vdev идет нагрузка, каким блоком данных, с какой задержкой. Есть команда zpool iostat, у неё куча ключей для просмотра различной статистики.

ZFS учитывает, какой Vdev был перегружен, где нагрузка меньше, где какая была задержка доступа к носителям. Если какой-то диск начинает умирать, у него высокая задержка, то система в итоге отреагирует на это, например выводом его из использования. Если мы используем Mirror, то ZFS пытается распределять нагрузку и параллельно считывать с обоих Vdev разные блоки.

Как появились OpenZFS и ZFS on Linux и проблемы с версионированием

ZFS изначально создана в Sun Microsystems для проприетарной операционной системы Solaris. Она появилась в качестве замены UFS, которая должна была покрыть любые надобности от файловой системы на долгое время (характерно само название ZFS Zettabyte File System, намёк на недостижимые объёмы). После продукт стал распространяться с открытым кодом под лицензией CDDL и названием OpenSolaris. Затем Oracle купили Sun Microsystems, и проект перевели обратно в разряд проприетарных. До этого FreeBSD успел притянуть к себе код, были наработки у Apple, они даже встроили реализацию в штатную поставку, но отказались от нее, в конечном итоге внедрив свой аналог AFS. Тогда же появился форк, который превратился в OpenZFS. Сначала желающие работали на OpenSolaris, а потом создали OpenZFS, под которым собрали все усилия в рамках Illumos (форк OpenSolaris).

Кстати, сейчас ZFS одна из наиболее кроссплатформенных файловых систем, доступная почти на любой операционной системе (даже ведётся портирование под Windows).

У ZFS on Linux другая история. В Ливерморской национальной лаборатории США в качестве распределённой файловой системы для суперкомпьютеров использовали Lustre FS. Ее особенность в том, что на каждой ноде под ней используется еще одна локальная файловая система Ldiskfs это патченный Ext3, наработки которой послужили основой для Ext4. У Ldiskfs был ряд недостатков, и ZFS должен был заменить эту файловую систему, так и появился проект ZFS on Linux.

В OpenZFS возникла проблема версионирования. Есть ZFS от Oracle и есть OpenZFS, последний не может повторять проприетарную версию, как и банально получать её исходный код. Изначально и у пула и у датасета в ZFS была версия, при обновлении Solaris можно было просто поднимать соответствующую версию. После обновления пул может не импортироваться в старом коде вообще или импортироваться в режиме только для чтения.

На тот момент в проекте OpenZFS уже было много реализаций: FreeBSD, Linux, Solaris, Macos, нужно было связать все наработки. Для этого придумали feature flags, т. н. функциональные флаги. Например, взводишь флажок, что пул поддерживает LZ4 сжатие и в дальнейшем смотришь на него из кода поддерживается/не поддерживается фича (т. е. можно ли импортировать пул).

У каждого флага есть подпись можно ли импортировать пул с ним в режиме только на чтение, так как многие вещи важны только при изменениях данных на носителях. Каждая реализация стала обрастать своими feature flags, и платформы переносили их между друг другом через backports.

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

В Linux для этого есть два механизма:

  1. DKMS динамическая сборка из исходников. К новому ядру автоматически ставим headers, которые нужны для сборки модуля, он приезжает и автоматически собирается с нужными параметрами. В худшем случае, если не проверена совместимость, DKMS ничего не соберет и отрапортует об этом, но риск такого очень мал, к тому же сопровождающие репозитории пакетов конкретных дистрибутивов могут проверять совместимость пакетов с доступными версиями ядра.

  2. KMOD модуль ядра приезжает из репозитория в бинарном виде, конкретная сборка совместима с определённой версией ABI ядра. Отсутствует риск проблем при сборке модуля, характерные для DKMS, но сопровождающие пакета с модулем должны оперативно предоставлять новые версии при появлении свежих ядер.

Разница в том, что приедет из пакета: исходный код как в DKMS или сразу бинарный файл как в KMOD.

Что нового в последних релизах

В версии 0.8 появилось нативное шифрование. Есть американская компания Datto, которая занимается бэкапами данных и базируется на ZFS. Они предложили реализацию нативного шифрования.

Ее плюс в том, что шифруются только данные и то, что связано с ними, а информация о датасетах и большая часть метаданных не шифруются. То есть информация на уровне DSL, о директориях и так далее, шифруется, а то, что ниже DMU и SPA, нет. Что это дает? Можно зашифровать данные на стороне клиента и, не отдавая ключ, отправить их сначала полностью, потом регулярно обновлять инкрементально, принять на стороне сервера также инкрементально без расшифровки и проверить целостность.

Если шифрование идет на низком уровне (к примеру, LUKS) и у нас большие объемы данных, то теряется информация о том, что там есть, нужно передавать все целиком, так как изменение одного байта меняет весь блок. Чтобы проверить целостность данных в этом случае, нужно их расшифровать это дорого и долго.

Еще одно обновление это Special Allocation Class. Предположим, что есть большое количество медленных жестких дисков плюс используется реализация Vdev RAIDZ, особенность которого в том, что он не заточен на большие IOPS. Так обеспечивается целостность, он всегда атомарен (не страшна проблема потери массива при т. н. raid write hole), но у этого есть минусы в части производительности. Читать метаданные и мелкие блоки с RAIDZ дорого.

Special Allocation Class это специальный Vdev, куда пишутся метаданные или блоки данных меньше 4 килобайт (запись данных конфигурируется). Получается, что под большие блоки данных можно использовать медленное, но дешевое HDD-хранилище, а рядом поставить SSD-диски, хранящие его по блоки метаданных и блоки небольших размеров.

Планы по развитию ZFS

ZFS файловая система, которая может работать с большинством операционных систем. Скоро появится полнофункциональная версия даже под MS Windows.

В настоящий момент в планах на развитие идет упор на производительность, к примеру на оптимизацию для NVMe. Они дорогие, хочется выжать из них максимум. ARC в данном случае не даёт сильного выигрыша, так как это дополнительные операции по копированию данных в ОЗУ. Сейчас, если поставить 5 10 NVMe, мы быстро упремся в производительность ОЗУ и ЦПУ. Специально для этого случая ведутся работы по поддержке direct io с целью исключения лишних операций в ARC.

Другие направления больше удобства для конечных пользователей-частных лиц. При использовании ZFS дома есть проблема в том, что объем наращивается либо установкой нового Vdev, либо заменой всех дисков в Vdev на большие (ZFS видит, что диски увеличились и может использовать дополнительное пространство). То есть собрав один RAIDZ, мы не можем добавить к нему на ходу еще один диск. Уже в альфе патч, который позволяет это делать.

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

Проблема в том, что жесткие диски, наращивая объем в 20 ТБ и более, не сильно наращивают производительность с точки зрения пропускной способности. У любого диска есть количество ошибок на каждый терабайт чтения, официально заявленное производителем (URE unrecoverable read error rate). И любой RAID 5 и более с дисками больше 3 ТБ практически гарантированно развалится при пересборке, когда один диск вылетел и мы читаем с оставшихся. Риск ошибки чтения хотя бы одного не того байта с этих 3 ТБ каждого диска просто огромен (для потребительских HDD стандартом является одна ошибка чтения на каждые 1014 бит, т.е. на каждые ~11 ТиБ). Когда мы пересобираем RAIDZ, а это тот же RAID 5, 6 и так далее, есть та же проблема.

Конечно, можно увеличить количество дисков, которое мы можем потерять: поставить RAIDZ 2, RAIDZ 3 сколько копий будет хранится, но мы не решаем вопрос производительности восстановления. Новый диск, который мы меняем, по-прежнему является узким горлышком. Эти 15 20 ТБ будут восстанавливаться в лучшем случае со скоростью 200 МБ/сек (а в реалистичном около 100 МБ/сек, а то и меньше). Несколько суток на восстановление одного диска это очень долго.

Пример расположения блоков на дисках, RAIDZ. Источник: https://itnext.io/backup-storage-for-thousands-of-virtual-machines-using-free-tools-b3909004bef2 Пример расположения блоков на дисках, RAIDZ. Источник: https://itnext.io/backup-storage-for-thousands-of-virtual-machines-using-free-tools-b3909004bef2

dRAID решает проблему одновременного восстановления данных на большом количестве дисков. Вместо того чтобы работать в рамках один диск одна единица, мы как бы нарезаем каждый диск на мелкие сущности по количеству дисков. Так, если в dRAID 50 дисков, то каждый из них будет разделен на ~50 областей. Некоторые из этих областей будут зарезервированы как свободные (spare) области, на которые можно восстановиться.

Пример расположения блоков на дисках, dRAID. Источник: https://itnext.io/backup-storage-for-thousands-of-virtual-machines-using-free-tools-b3909004bef2Пример расположения блоков на дисках, dRAID. Источник: https://itnext.io/backup-storage-for-thousands-of-virtual-machines-using-free-tools-b3909004bef2

По сути, это RAID 5 или RAIDZ, повернутый на 90 градусов. Мы в рамках физических дисков имеем виртуальные сущности. Если вылетает один диск, то на других зарезервировано свободное место, можно восстановить вылетевший диск со скоростью, которая зависит от количества элементов в массиве. То есть когда у нас десять блоков данных, можно восстанавливаться сразу на десять дисков. Такой подход увеличивает скорость восстановления.

Например, мы собрали dRAID, аналогичный RAIDZ2 с одним spare диском, который позволяет вылететь двум дискам, один вылетел, осталось девять. Пока мы не вставили новый диск, размазываем данные на пустое зарезервированное пространство других дисков в группе. И так восстанавливаем ситуацию: дисков по-прежнему девять, но вылететь может уже два, а не один, ведь блоки с вылетевшего диска уже разъехались по уцелевшим оставшимся. Таким образом снимается проблема узкого горлышка в виде производительности spare диска, технически он теперь размазан на другие диски массива.

По этой же причине теперь можно задействовать spare диск, в RAIDZ он бы стоят без дела, а в dRAID он является активным участником, т.к. размазан по всем дискам.

Послесловие

В связи с тем, что ZFS пережил существование в разных компаниях и ОС, идёт активная централизация кода и документаций в проекте OpenZFS. Приглашаю желающих к созданию единой документации по проекту, буду рад вашим PR!

Полезные ссылки:

Также, как я уже говорил, в основном блочном и объектном хранилище Mail.ru Cloud Solutions, которое разрабатывают коллеги в моей команде, хранение устроено по-другому, об объектном хранилище недавно подробно рассказал наш архитектор Монс Андерсон: Архитектура S3. 3 года эволюции Mail.ru Cloud Storage.

Коллеги пишут про хранение данных:

  1. Пример event-driven приложения на основе вебхуков в объектном S3-хранилище Mail.ru Cloud Solutions.

  2. Больше чем Ceph: блочное хранилище облака MCS.

  3. Наш Телеграм-канал с новостями об обновлениях S3-хранилища и других продуктов.

P.S. Наш проект ищет разработчиков на Go в команду Identity Access Management. Из интересного разработка на open source, highload, Kubernetes, распределенные системы. А полный список наших вакансий здесь.

Подробнее..

Сколько данных может обработать Raspberry Pi быстро

02.07.2020 00:11:00 | Автор: admin
Время обработки данных в одном знакомом мне проекте энтерпрайз-хранилища данных с реляционной моделью составляет почти 6 часов. Много это или мало?

Заметка описывает эксперимент по созданию маленькой копии энтерпрайз-хранилища данных с сильно ограниченными техническими условиями. А именно, на базе одноплатного компьютера Raspberry Pi.
Модель и архитектура будут упрощёнными, но похожими на энтерпрайз-хранилище. Результатом является оценка возможности использования Raspberry Pi в области обработки и анализа данных.




1


Роль опытного и сильного игрока будет выполнять машина Exadata Х5 (один юнит) корпорации Оракл.
Процесс обработки данных включает в себя следующие шаги:

  • Чтение из файла 10,3 ГБ 350 миллионов записей за 180 минут.
  • Обработка и очистка данных 2 SQL запроса и 130 минут.
  • Загрузка измерений 10 минут.
  • Загрузка таблиц фактов 20 миллионами новых записей 5 SQL запросов и 35 минут.

Итого, интеграция 350 миллионов записей за 6 часов, что эквивалентно 990 тысячам записей в минуту, или примерно 17 тысячам записей исходных данных в секунду.

2


В роли экспериментального оппонента будет выступать Raspberry Pi 3 Model B+ с 4х-ядерным процессором 1.4 ГГц.
В качестве хранилища используется sqlite3, чтение файлов происходит с помощью PHP.

Модель данных в реляционной базе sqlite3 описана в статье о маленьком хранилище.

Тест первый


Исходный файл access.log 37 МБ с 200 тысячами записей.

  • Прочитать лог и записать в базу данных заняло 340 секунд.
  • Загрузка измерений с 5 тысячами записей длилась 5 секунд.
  • Загрузка таблиц фактов 90 тысячами новых записей 32 секунды.

Итого, интеграция 200 тысяч записей заняла почти 7 минут, что эквивалентно 28 тысячам записей в минуту, или 470 записям исходных данных в секунду. База данных занимает 7,5 МБ; всего 8 SQL запросов для обработки данных.

Тест второй


Файл более активного сайта. Исходный файл access.log 67 МБ с 290 тысячами записей.

  • Прочитать лог и записать в базу данных заняло 670 секунд.
  • Загрузка измерений с 25 тысячами записей длилась 8 секунд.
  • Загрузка таблиц фактов 240 тысячами новых записей 80 секунд.

Итого, интеграция 290 тысяч записей заняла чуть больше 12 минут, что эквивалентно 23 тысячам записей в минуту, или 380 записям исходных данных в секунду. База данных занимает 22,9 МБ

Вывод


Для получения данных в виде модели, которая позволит проводить эффективный анализ, необходимы значительные вычислительные и материальные ресурсы, и время в любом случае.
Например, один юнит Экзадаты обходится более чем в 100К. Один Raspberry Pi стоит 60 единиц.
Линейно их нельзя сравнивать, т.к. с увеличением объёмов данных и требований надёжности возникают сложности.

Однако, если представить себе случай, когда тысяча Raspberry Pi работают параллельно, то, исходя из эксперимента, они обработают около 400 тысяч записей исходных данных в секунду.
И если решение для Экзадаты оптимировать до 40 тысяч записей в секунду, то это ощутимо меньше, чем 400 тысяч. Это подтверждает внутреннее ощущение того, что цены энтерпрайз-решений завышены.

В любом случае, Raspberry Pi отлично справлятся с обработкой данных и реляционными моделями соответствующего масштаба.

Ссылка


Домашний Raspberry Pi был настроен как веб сервер. Эксперимент с его производительностью можно провести самостоятельно по адресу. Модель базы данных (DDL), процедуры загрузки (ETL) и саму базу данных можно там же скачать.
Подробнее..

Кто ответит за качество аналитики QA для Хранилища Данных

02.11.2020 22:09:30 | Автор: admin

Поверь своим глазам и тому что видишь на Дашборде

Мы в Wheely в значительной степени опираемся на данные при принятии операционных и стратегических решений. От выплаты еженедельных бонусов партнерам до экспансии в другие города и страны.

Каждый менеджер или Product Owner досконально знает свою область и любые отклонения могут вызвать вопросы. Поэтому к достоверности дашбордов и метрик предъявляются повышенные требования. А мы в команде Аналитики стремимся идентифицировать и исправить проблемы раньше, чем они попадут в отчетность.

Как известно, легче предотвратить, и поэтому я решил подойти к проблеме системно и проактивно. И, конечно, первым делом создал канал в Slack, в который настроил доставку уведомлений о любых ошибках в наших пайплайнах.

Уверенность в актуальности витрин данных

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

  • К 10 утра каждого дня у нас рассчитаны витрины за полные прошлые сутки

  • Чтение из источников идет в ногу со временем и отставание не превышает 8 часов

  • Все источники продолжают слать лог изменений в DWH

Выходит, задача QA формулируется следующим образом:

  • Покажи мне все витрины данных, в которых время актуальности отстает от ожидаемого

Реализация для Хранилища:

  • В конфигурационном файле .yml добавим параметр freshness:

freshness:   warn_after: {count: 4, period: hour}   error_after: {count: 8, period: hour} loaded_at_field: "__etl_loaded_at"
  • Для каждого теста будет выполнен простой шаблонизированный SQL-запрос:

select max({{ loaded_at_field }}) as max_loaded_at, {{ current_timestamp() }} as snapshotted_atfrom {{ source }}where {{ filter }}
  • Собранные метрики можно визуализировать в сводный отчет:

Мониторинг метрик расчета Витрин Данных

Неминуемо при проектировании сложных витрин, кубов, будут возникать проблемные места:

  • Баги и просчеты в формулах расчета метрик

  • Неожиданные данные (edge cases), которые могут нарушать заложенную логику

  • Бутылочное горлышко (bottleneck) в операциях расчетов

Они могут привести к серьезным последствиям:

  • Ошибки: Таймаут, Out of Memory, Disk Full

  • Замедление всего пайплайна загрузок и расчетов и нарушение SLA

Для контроля можно собирать следующие метрики:

  • Время, затраченное на формирование витрины + его динамика (скачки времени расчета)

  • Потребление ресурсов CPU

  • Потребление ресурсов диска и сети - IO, network

Лидеры этого рейтинга становятся первыми кандидатами на оптимизацию и рефакторинг.

Задача формулируется следующим образом:

  • Покажи мне те витрины, формирование которых требует излишне много ресурсов

Реализация для Хранилища:

  • Снять метрики расчетов витрин

  • Отрисовать дашборд

  • Настроить алерты

+pre-hook: "{{ logging.log_model_start_event() }}"+post-hook: "{{ logging.log_model_end_event() }}"

Валидация схемы данных в основе тестирования

Современные Хранилища предполагают структуру, строгую типизацию, поколоночное хранение и компрессию данных. Структура данных суть схема - набор атрибутов, их типов, ограничений, например, PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE.

Большинство DWH не предполагает валидацию ограничений на этапе записи. Это нужно скорее в рамках подсказок оптимизатору запросов. Т.е. Это всего лишь предположение о данных, а фактическая проверка остается на откуп инженерам и аналитикам.

Какие базовые ожидания можем иметь относительно данных:

  • Есть ли в данных пропуски (NULL) там, где их быть не должно?

  • Какова атомарность моих данных (UNIQUE ID строки)?

  • Как таблицы соотносятся между собой (PRIMARY - FOREIGN KEYS)?

  • Есть ли записи, выходящие из списка допустимых значений(ACCEPTED VALUES)?

Задача QA формулируется следующим образом:

  • Покажи мне те витрины и источники, данные в которых нарушают наши ожидания

Реализация для Хранилища:

  • В конфигурационном файле .yml добавим параметр tests:

- name: dim_cars     description: Wheely partners cars.     columns:         - name: car_id           tests:               - not_null               - unique         - name: status           tests:               - not_null               - accepted_values:                   values: ['deleted', 'unknown', 'active', 'end_of_life', 'pending', 'rejected'                           , 'blocked', 'expired_docs', 'partner_blocked', 'new_partner']   
  • Для каждого теста будет выполнен простой шаблонизированный SQL-запрос

-- NOT NULL testselect count(*) as validation_errorsfrom "wheely"."dbt_test"."dim_cars"where car_id is null -- UNIQUE testselect count(*) as validation_errorsfrom (   select       car_id   from "wheely"."dbt_test"."dim_cars"   where car_id is not null   group by car_id   having count(*) > 1) validation_errors -- ACCEPTED VALUES testwith all_values as (   select distinct       status as value_field   from "wheely"."dbt_test"."dim_cars"),validation_errors as (   select       value_field   from all_values   where value_field not in (       'deleted','unknown','active','end_of_life','pending','rejected','blocked','expired_docs','partner_blocked','new_partner'   ))select count(*) as validation_errorsfrom validation_errors

Бизнес-логика тоже подлежит проверке

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

Несколько простых примеров:

  • Сумма заказа не может быть отрицательной

  • Время подачи машины по заказу строго больше времени бронирования

  • Пользовательская сессия заканчивается только одним заказом, либо прерывается

  • Комиссия не превышает заданного %

Резкие скачки сумм (и вверх и вниз), неправдоподобные графики и значения метрик чаще всего становятся объектом пристального внимания на дашбордах и в отчетах.

Задача QA формулируется следующим образом:

  • Покажи мне те витрины данных, в которых нарушены бизнес-правила.

Реализация для Хранилища:

  • В терминах SQL выразить ту ситуацию, которая описывает нарушение правил

  • Сформировать тест на базе SQL-запроса

  • Тест считается пройденным (PASSED) если запрос возвращает 0 записей, и проваленным (FAILED) если записей >= 1

Continuous Integration на страже мастер-ветки DWH

Хорошо, идём дальше. Над DWH мы работаем совместно всей командой. Это подразумевает скоординированность и согласованность действий. Однако нередки случаи ошибок, просчеты, невнимательности на этапе разработки, которые приводят к ошибкам в PROD-окружении после PR Merge:

  • Доработка в одной части может послужить причиной ошибки в другой части

  • DEV-окружение инженера может отличаться от PROD-окружения

  • Запуск неоптимального кода на всех данных может привести к ошибке (например, Out of Memory)

Решение давно придумано - это использование практик тестирования в рамках Continuous Integration (CI). И его можно и нужно применять к данным!

Задача формулируется следующим образом:

  • Минимизировать вероятность появления ошибок в master-ветке и PROD-окружении DWH после релизов.

Реализация для Хранилища:

  • Подготовить окружение для CI (например, актуальная копия PROD-окружения, содержащая только 7 последних дней)

  • Выполнить полный пересчет всех витрин и метрик без ошибок прежде чем дать возможность влить feature-ветку в master

Кросс-сверка состояния DWH и Источников

От Хранилища Данных мы ожидаем отображение актуального состояния (а также всей истории) источников данных:

  • Наличие в DWH всех записей, которые присутствуют в источнике

  • Точное соответствие значений атрибутов (статус, временные метки, метрики) один-к-одному

Мы хотели бы застраховаться от ситуаций, когда часть данных просто не попадает в Хранилище в силу технических причин, а также от потери изменений состояния записей (например, финализация статуса заказа или корректировка его стоимости).

Задача формулируется следующим образом:

  • Убедиться в том, что Хранилище находится в консистентном (согласованном) с источниками состоянии.

Эта задача имеет одну из самых сложных реализаций и может стать темой отдельной статьи, судите сами:

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

  • Выгрузить все строки из источника, актуальные на текущий момент

  • Загрузить строки в DWH и подготовить логику сверок

  • Настроить визуализацию и уведомления

Визуальное представление с возможностью drill-down до уровня атомарных записей:

Собирая всё в единый пазл

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

  • Регулярный мониторинг, сбор и анализ метрик

  • Continuous Integration and Testing

  • Настройка уведомлений и алертов для команды

  • Проактивная работа над устранением инцидентов и причин ошибок

  • Управление ожиданиями пользователей в случае возникновения проблем (У нас всё под контролем)

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

Обширный набор тем, связанных с обработкой, хранением, тестированием данных изучается в рамках курса Data Engineer в OTUS, запуск которого состоится уже совсем скоро.

Как преподаватель курса я приглашаю вас 4 ноября в 20:00 на День Открытых Дверей курса Data Engineer. Приходите на вебинары в OTUS знакомиться со мной и другими экспертами, будем ждать.

Что почитать еще

Напоследок я оставлю вам несколько ссылок на смежную тематику для дальнейшего изучения:

  1. Data Build Tool или что общего между Хранилищем Данных и Смузи - обзор DBT на русском языке

  2. The farm-to-table testing framework - комплексный подход к тестированию качества данных

  3. Tests - Related reference docs - раздел документации DBT, посвященный тестированию

  4. How to get started with data testing - тред на dbt discourse с обсуждением по теме

  5. Data testing: why you need it - взгляд на преимущества тестирования данных

  6. Manual Work is a Bug - несколько слов о принципах автоматизации и DRY

Подробнее..

Практические кейсы по созданию IT-инфраструктуры на базе дисковых полок Western Digital Ultrastar

22.07.2020 22:18:15 | Автор: admin


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

Ключевые преимущества аппаратной платформы Ultrastar Data


Western Digital предлагает две модели JBOD-массивов, выпускаемых под брендом Ultrastar Data60 и Data102. Указанные модификации полностью идентичны с точки зрения реализованных в них технологий и отличаются друг от друга лишь емкостью, о чем красноречиво говорит числовой индекс в названии: младшая модель способна вместить 60 3.5-дюймовых SAS (12 Гб/с) или SATA (6 Гб/с) накопителей, тогда как флагман до 102 накопителей. Таким образом, одна дисковая полка Ultrastar Data60 позволяет хранить вплоть до 840 RAW-данных, а максимальная емкость Ultrastar Data102 может достигать уже 1.4 петабайта (при использовании жестких дисков Western Digital Ultrastar DC HC 530 емкостью 14 ТБ каждый). При этом 24 из доступных отсеков можно использовать для установки твердотельных накопителей с интерфейсом SAS или SATA, что позволяет достичь оптимального баланса между емкостью и производительностью, задействуя JBOD в сценариях, где на первый план выходит высокая доступность данных.

Проектируя дисковые полки серии Ultrastar Data, мы уделили особое внимание борьбе с негативным воздействием вибрации и высоких температур на функционирование системы. Результатом работы инженеров Western Digital стало появление сразу двух вспомогательных технологий, позволивших значительно улучшить эксплуатационные характеристики JBOD: IsoVibe и ArcticFlow. Рассмотрим каждую из них подробнее.

Технология подавления ротационной вибрации IsoVibe


IsoVibe призвана нивелировать пагубное влияние ротационной вибрации, возникающей при раскрутке шпинделя HDD, на производительность массива. Напомним, что при смещении магнитной головки с трека под действием внешних факторов, микроконтроллер диска вынужден инициировать процедуру позиционирования заново, из-за чего время чтения/записи данных значительно возрастает. Так, например, при воздействии на работающий винчестер ротационной вибрации с угловым ускорением в 50 радиан/сек2 потери производительности могут превысить порог в 70%. В случае с JBOD данная проблема встает еще более остро, так как в силу высокой плотности размещения накопителей в сравнительно компактном корпусе их взаимное влияние друг на друга многократно возрастает.

Технологические решения, реализованные в рамках IsoVibe, направлены на предотвращение распространения вибрации между отсеками дисковой полки, о чем можно догадаться уже по названию самой технологии, которое представляет собой акроним английского словосочетания изолирован от вибрации. Так, в ходе проектирования Ultrastar Data мы полностью отказались от использования винтовых креплений: теперь накопители фиксируются с помощью амортизированных мини-салазок, что не только упрощает процесс установки и замены дисков, но также позволяет значительно снизить эффект резонанса внутри корпуса и локализовать вибрацию в пределах одного отсека.


Амортизированные салазки помогают снизить уровень вибрации

Свою лепту вносят и вибрационно изолированные разъемы, расположенные на задней панели JBOD: здесь минимизировать распространение высокочастотных механических колебаний удалось за счет прорезей в печатной плате бэкплейна.


Прорези в PCB бэкплейна снижают распространение вибрации внутри JBOD

Дополняет картину интеллектуальная прошивка микроконтроллеров жестких дисков Western Digital Ultrastar, которые мы рекомендуем использовать вместе с JBOD-массивами, поддерживающая технологию RVS (Rotational Vibration Safeguard). Специализированный алгоритм отслеживает сигналы, поступающие со встроенных мультиаксиальных акселерометров и в режиме реального времени рассчитывает компенсационные усилия, необходимые для коррекции траектории движения блока магнитных головок.


Принцип работы технологии компенсации ротационной вибрации RVS

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

Система охлаждения ArcticFlow


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

В Ultrastar Data данная проблема решена следующим образом. Дисковая полка разделена на две зоны охлаждения (по 4 ряда в каждой), изолированные друг от друга. Воздушные потоки, обеспечивающие вентиляцию передней зоны, отводятся из корпуса по обводным воздуховодам, огибающим задний отсек по бокам. Что же касается задних рядов, то для их охлаждения предусмотрен отдельный воздуховод, расположенный по центру, воздух из которого поступает непосредственно к задним рядам накопителей, с 5-го по 8-ой. Кроме того отдельный поток холодного воздуха подводится непосредственно к блокам питания и модулям I/O, расположенным позади.


Схема циркуляции воздуха внутри дисковых полок Ultrastar Data

Такая конструкция помогла достичь действительно впечатляющих результатов. ArcticFlow позволила существенно сократить разницу температур между передней и задней зонами: разброс между ними не превышает 10C. При использовании накопителей Ultrastar, созданных на базе платформы HelioSeal четвертого поколения (более подробно о технологиях, применяемых при производстве жестких дисков для ЦОД, вы можете прочитать в материале Ярче звезд), на самом горячем участке, которым является 8-ой ряд, вплотную прилегающий к отсекам блоков питания, максимальная температура HDD не поднимается выше 49C. При этом на охлаждение каждого из них тратится в среднем 1.6 Вт электроэнергии, что в два раза меньше, чем у конкурирующих моделей.



Таким образом, ArcticFlow решает одновременно 3 задачи:

  1. эффективное охлаждение помогает продлить сроки эксплуатации накопителей, установленных в JBOD, а также полностью исключает вероятность их выхода из строя вследствие перегрева;
  2. отпадает потребность в установке мощных, высокоскоростных кулеров, что также помогает снизить общий уровень вибрации, негативно отражающейся как на состоянии аппаратуры, так и на ее производительности;
  3. меньшее энергопотребление позволяет значительно сократить операционные расходы на обслуживание дата-центра, оборудованного JBOD Ultrastar.

Построение облачной инфраструктуры с применением дисковых полок Ultrastar на примере компании Acronis


Кому же подойдут дисковые полки Western Digital Ultrastar? Первое, что приходит в голову облачные сервисы, оперирующие огромными массивами данных. По мере расширения бизнеса такие компании неизбежно сталкиваются с экспоненциальным ростом затрат на масштабирование и поддержку IT-инфраструктуры, которые оказываются тем больше, чем сложнее организована последняя.

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

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


Стремясь увеличить емкость хранилищ данных и при этом оптимизировать затраты на их обслуживание, Acronis столкнулись с рядом существенных трудностей, вызванных отсутствием унифицированной аппаратной платформы. Компания обратилась за помощью к своему давнему технологическому партнеру DIAWAY. Для прогнозирования капитальных и операционных расходов системный интегратор создал доскональную финансовую модель на ближайшие 5 лет. Сравнив предложения, представленные на современном рынке, специалисты DIAWAY пришли к выводу, что наиболее оптимальным вариантом для реализации подобного проекта станут гибридные хранилища Western Digital Ultrastar Data60 и Data102.

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

  • Снижение TCO

Благодаря переходу на гибридные хранилища Ultrastar, Acronis удалось добиться существенного сокращения капитальных и эксплуатационных расходов: стоимость хранения данных в пересчете на терабайт информации снизилась более, чем на 25%.

  • Повышение надежности систем хранения

Передовые технологии охлаждения и виброизоляции, воплощенные в JBOD-массивах Ultrastar, в сочетании с резервируемыми блоками питания и I/O-модулями с возможностью горячей замены, помогли существенно повысить отказоустойчивость как самих дисковых полок, так и всей инфраструктуры хранения данных в целом.

  • Простота обслуживания

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

Примеры развертывания системы резервного копирования на базе Western Digital Ultrastar Data60 и программного обеспечения от Veeam Software


Впрочем, не стоит думать, что дисковые полки Ultrastar ориентированы сугубо на крупные компании и облачных провайдеров: JBOD-массивы способны стать незаменимым инструментом и в арсенале представителей малого и среднего бизнеса. Речь идет, прежде всего, о создании высокоемких и производительных систем резервного копирования, для организации которых мы предлагаем готовую связку в виде Ultrastar Data60/102 и программного обеспечения, разработанного одним из наших стратегических партнеров Veeam Software, специализирующихся на создании комплексных решений в сфере резервного копирования данных.


Девиз компании It just works! говорит сам за себя: Veeam стремится создавать простые, эффективные, а главное, надежные продукты из разряда настроил и забыл, и у них это действительно хорошо получается. Не случайно в 2019 году общее количество клиентов компании превысило 375 тысяч, а ее годовой оборот перевалил за отметку в 1 миллиард долларов США.

В ходе проектирования системы резервного копирования на базе дисковых полок Ultrastar и программного обеспечения Veeam наибольшую эффективность демонстрируют два подхода:

  • on-premises резервные копии создаются и хранятся на базе собственного ЦОД предприятия;
  • гибридная модель on-premises + cloud tier на стороне клиента хранятся только актуальные резервные копии, которые могут понадобиться здесь и сейчас для восстановления работоспособности производственной среды, тогда как более старые бэкапы автоматически переносятся в облако.


Каждый из них обладает своими преимуществами. Комбинация self-hosted и облачных решений позволяет без труда масштабировать IT-инфраструктуру по мере необходимости благодаря подключению объектных хранилищ Amazon S3, Azure Blob Storage, IBM Cloud Object Storage, или любых других S3-совместимых сервисов, и дополнительно экономить на долговременном хранении данных, также оставляя возможность для disaster recovery в случае возникновения аварийных ситуаций. On-premises же гарантирует быстрое восстановление любых когда-либо созданных резервных копий, независимость от внешних факторов, высокий уровень приватности и соответствие местному законодательству в том случае, если деятельность компании так или иначе связана с обработкой персональных данных клиентов.

Проще всего продемонстрировать эффективность связки программного обеспечения Veeam и гибридных хранилищ Western Digital на конкретных примерах. Мы выбрали два наиболее показательных кейса из нашей обширной практики.

Кейс 1


Клиент

В роли заказчика выступил крупный европейский производитель бытовых товаров с годовым оборотом более 500 миллионов евро, офисы и производственные мощности которого расположены в разных странах ЕС и в Китае. Штат компании насчитывает около 1800 постоянных сотрудников, а IT-инфраструктура представлена 8 центрами обработки данных по всему миру.

Проблема

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

Поиск решения

Специалисты IT-отдела заказчика пришли к выводу, что обновление существующей инфраструктуры резервного копирования является нерентабельным, в связи с чем было принято решение о переходе на новую архитектуру, что позволило бы не только сэкономить, но и решить проблему масштабирования в будущем. Для организации системы резервного копирования было выбрано гибридное хранилище Ultrastar Data60 от Western Digital, управляемое программным обеспечением Veeam Backup & Replication 9.5, Veeam Backup для Microsoft Office 365 и Microsoft Windows Storage Spaces (входит в состав Windows Server 2016).

Конфигурация

Итоговая аппаратная конфигурация состояла из сервера HPE Proliant DL360 G9, оснащенного парой контроллеров Broadcom 9480-8i8e MegaRAID, обслуживающих модули ввода-вывода Ultrastar Data60. Каждый RAID-контроллер был подключен к назначенному порту I/O-модуля с помощью 4-канального HD MiniSAS-кабеля (P/N 1EX0329), обеспечивая полосу пропускания до 9,6 ГБ/с на контроллер.


Серверная платформа HPE Proliant DL360 G9

Дисковое хранилище было развернуто с 60-ю 12-терабайтными SAS HDD Ultrastar таким образом, его общая емкость составила 720 ТБ. С помощью зонирования T10, Ultrastar Data60 был логически разделен на две зоны по 30 дисков в каждой, так, чтобы каждый контроллер видел диски, назначенные только для определенных портов. В группах из 30 накопителей команда ИТ-специалистов создала несколько наборов томов с чередованием, которые были сгруппированы в единый общий том с помощью Windows Storage Spaces. Один из таких томов использовался для инкрементного резервного копирования, в то время как другой содержал полный образ резервной копии, который был дополнительно сжат с использованием функции дедупликации Windows Server.

Результаты

Связка 1 сервер + 2 RAID-контроллера + 1 Ultrastar Data60 обошлась заказчику существенно дешевле по сравнению с выделенным устройством резервного копирования, поддерживающим внутреннюю дедупликацию. В будущем данную платформу можно будет без труда масштабировать путем последовательного подключения новых дисковых полок (до четырех штук) без необходимости модернизации серверной платформы.

Кейс 2


Клиент


GreenPower крупное предприятие, специализирующееся на производстве натуральных витаминных комплексов и пищевых добавок. Компании принадлежит торговая марка Dr. Hittich, а ее штаб-квартира находится в Керкраде (Нидерланды).

Проблема

GreenPower нуждались в надежном и эффективном решении для резервного копирования. Изначально для этих целей использовались сервера на 24/36 отсеков, а общее дисковое пространство, отведенное под бэкапы, составляло 108 терабайт. Когда данного объема перестало хватать, перед компанией встала проблема масштабирования IT-инфраструктуры. Серверы хранения данных большей емкости оказались слишком дороги, поэтому от их приобретения пришлось отказаться. В свою очередь, идея с регулярной заменой заполненных дисков на пустые показала свою полную несостоятельность: такой подход не мог обеспечить нужный уровень доступности резервных копий, а ошибки при маркировке изъятых дисков регулярно приводили к сложностям при восстановлении данных и даже к их утрате.

Конфигурация

Было решено реализовать систему резервного копирования на базе двух серверов с программным обеспечением Veeam Backup & Replication 9.5 и двух дисковых полок Ultrastar Data60 от Western Digital. В каждое гибридное хранилище были установлены 60 SAS HDD Ultrastar емкостью 6, 8 и 10 терабайт.


Жесткие диски для ЦОД Ultrastar DC HC330 емкостью 10 терабайт

Жесткие диски были сконфигурированы в несколько наборов RAID-массивов, управляемых Windows Storage Spaces. Для дедупликации данных встроенными средствами программного обеспечения Microsoft было создано несколько виртуальных дисков типа Thin (такой подход позволил обойти ограничение в 64 ТБ). Как и в первом примере, доступное дисковое пространство было разделено на два логических тома, один из которых использовался для создания полных бэкапов, тогда как второй был предназначен для инкрементного резервного копирования.

Результаты

Переход на платформу хранения данных Ultrastar Data60 помог значительно снизить затраты на логистику, а в пересчете на терабайт информации, приобретение дисковых полок оказалось значительно более выгодным решением по сравнению с закупкой полноценных серверов: поскольку за счет использования функции дедупликации данных Microsoft Windows Server 2016 удается экономить около 1250 терабайт на каждые 378 ТБ физического дискового пространства, емкости одной такой полки с учетом текущих потребностей компании, хватит на 6 лет ежедневного создания резервных копий.

Не менее важным преимуществом оказалось и значительное повышение производительности системы резервного копирования: создание и восстановление бэкапов происходит на скорости не менее 1 ГБ/с. Это исключает возникновение ситуаций, когда Windows Server не успевает завершить дедупликацию данных в существующих резервных копиях до создания новых. Ранее подобные коллизии приводили к значительному снижению производительности всей системы, однако новая платформа позволила забыть о них раз и навсегда.
Подробнее..

Мультитул для управления Хранилищем Данных кейс Wheely dbt

30.03.2021 00:12:15 | Автор: admin

Уже более двух лет data build tool активно используется в компании Wheely для управления Хранилищем Данных. За это время накоплен немалый опыт, мы на тернистом пути проб и ошибок к совершенству в Analytics Engineering.

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

Поэтому сегодня я предлагаю вам экскурсию по Хранилищу Данных Wheely. В формат публикации я попытался уложить самые яркие моменты и впечатления от использования dbt, снабдив реальными примерами, практиками и опытом. Добро пожаловать под кат.

Структура превыше всего

Измерять сложность Хранилища Данных в количестве гигабайт сегодня - дурной тон

Налить кучу тяжело интерпретируемых данных без метаинформации (читай мусора) не составит большого труда. Гораздо сложнее из этих данных получить что-то осмысленное. То, на что с уверенностью могут опираться business stakeholders, принимая решения. То, что регулярно измеряется на предмет качества и актуальности. Наконец, то, что соответствует принципам Keep it simple (KISS) и Dont repeat yourself (DRY).

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

Схема слоев Хранилища ДанныхСхема слоев Хранилища Данных

Зеленым цветом слой источников данных sources. Это реплики структур и таблиц из исходных систем, которые поддерживаются ELT-сервисом. Данные синхронизируются 1:1 с источником, без каких-либо преобразований. Опциональный слой flatten позволяет вложенные иерархические структуры (JSON) превратить в плоские таблицы.

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

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

Кульминацией являются data marts или Витрины Данных, которые используются Data Scientists / Business Users / BI tools. Слой, в свою очередь, делится на:

  • dimensions: пользователи, компании, машины, водители, календарь

  • facts: поездки, транзакции, сеансы, продвижения, коммуникации

  • looker: материализованные представления и витрины, оптимизированные под чтение из BI-системы

Число 120 из заголовка публикации относится только к витринам данных:

Running with dbt=0.19.0Found 273 models, 493 tests, 6 snapshots, 4 analyses, 532 macros, 7 operations, 8 seed files, 81 sources, 0 exposures

На текущий момент в проекте:

  • 273 модели во всех перечисленных слоях

  • 493 теста на эти модели, включая not null, unique, foreign key, accepted values

  • 6 снапшотов для ведения истории SCD (slowly changing dimensions)

  • 532 макроса (большая часть из которых импортирована из сторонних модулей)

  • 7 operations включая vacuum + analyze

  • 81 источник данных

Помимо разбиения на логические слои, Хранилище можно нарезать по бизнес-областям. В случае необходимости есть возможность пересчитать или протестировать витрины, относящиеся к вертикалям Marketing / Supply / Growth / B2B. Например, в случае late arriving data или ручных корректировках маппингов/справочников.

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

dbt run -m +tag:marketing

Этот же принцип лежит в основе организации кодой базы. Все скрипты объединены в директории с общей логикой и понятными наименованиями. Сложно потеряться даже при огромном количестве моделей и витрин:

Иерархия проекта dbt
.|____staging| |____webhook| |____receipt_prod| |____core| |____wheely_prod| |____flights_prod| |____online_hours_prod| |____external| |____financial_service|____marts| |____looker| |____dim| |____snapshots| |____facts|____flatten| |____webhook| |____receipt_prod| |____wheely_prod| |____communication_prod|____audit|____sources|____aux| |____dq| | |____marts| | |____external|____intermediate

Оптимизация физической модели

Логическое разделение на слои и области - это замечательно. Но не менее важно и то, как эта логика ложится на конкретную СУБД. В случае Wheely это Amazon Redshift.

Подход с декомпозицией позволит разбить логику на понятные части, которые можно рефакторить по отдельности. Одновременно это помогает оптимизатору запросов подобрать лучший план выполнения. По такому принципу реализована одна из центральных витрин journeys (поездки).

Цепочка зависимостей витрины поездок (journeys)Цепочка зависимостей витрины поездок (journeys)

На этапе обогащения данных важна скорость склейки таблиц (join performance), поэтому данные сегментированы и отсортированы в одинаковом ключе, начиная с sources. Это позволит использовать самый быстрый вид соединения - sort merge join:

Конфигурация для оптимального соединения sort merge join
{{config(materialized='table',unique_key='request_id',dist="request_id",sort="request_id")}}

Витрина же хранится отсортированной по самым популярным колонкам доступа: city, country, completed timestamp, service group. В случае правильного подбора колонок Interleaved key позволяет значительно оптимизировать I/O и ускорить отрисовку графиков в BI-системах.

Конфигурация для быстрого чтения витрины interleaved sortkey
{{config(materialized='table',unique_key='request_id',dist="request_id",sort_type='interleaved',sort=["completed_ts_loc", "city", "country", "service_group", "is_airport", "is_wheely_journey"])}}

При этом часть моделей есть смысл материализовать в виде views (виртуальных таблиц), не занимающих дисковое пространство в СУБД. Так, слой staging, не содержащий сложных преобразований, конфигурируется на создание в виде представлений на уровне проекта:

staging:+materialized: view+schema: staging+tags: ["staging"]

Другой интересный пример результаты проверки качества данных. Выбранный тип материализации ephemeral, т.е. на уровне СУБД не будет создано ни таблицы, ни представления. При каждом обращении к такой модели будет выполнен лишь запрос. Результат такого запроса является слагаемым в суммарной таблице, содержащей метрики всех проверяемых объектов.

В свою очередь большие таблицы фактов имеет смысл наполнять инкрементально. Особенно при условии того, что факт, случившийся однажды, больше не меняет своих характеристик. Таким образом мы процессим только изменения (delta) новые факты, произошедшие после последнего обновления витрины. Обратите внимание на условие where:

Пример инкрементального наполнения витрины
{{config(materialized='incremental',sort='metadata_timestamp',dist='fine_id',unique_key='id')}}with fines as (selectfine_id, city_id, amount, details, metadata_timestamp, created_ts_utc, updated_ts_utc, created_dt_utcfrom {{ ref('stg_fines') }}where true-- filter fines arrived since last processed time{% if is_incremental() -%}and metadata_timestamp > (select max(metadata_timestamp) from {{ this }}){%- endif %}),...

Кстати, о принципах MPP и о том, как выжать максимум из аналитических СУБД я рассказываю на курсах Data Engineer и Data Warehouse Analyst (скоро первый запуск!).

SQL + Jinja = Flexibility

Высокоуровневый декларативный язык SQL прекрасен сам по себе, но вкупе с движком шаблонизации Jinja он способен творить чудеса.

Любой код, который вы используете с dbt проходит этапы compile & run. На этапе компиляции интерпретируются все шаблонизированные выражения и переменные. На этапе запуска код оборачивается в конструкцию CREATE в зависимости от выбранного типа материализации и фишек используемой СУБД: clustered by / distributed by / sorted by. Рассмотрим пример:

Model code:
{{config(materialized='table',dist="fine_id",sort="created_ts_utc")}}with details as (  select{{dbt_utils.star(from=ref('fine_details_flatten'),except=["fine_amount", "metadata_timestamp", "generated_number"])}}from {{ ref('fine_details_flatten') }}where fine_amount > 0)select * from details
Compiled code:
with details as (select  "id","fine_id","city_id","amount","description","created_ts_utc","updated_ts_utc","created_dt_utc"from "wheely"."dbt_test_akozyr"."fine_details_flatten"where fine_amount > 0)select * from details
Run code:
create table"wheely"."dbt_test_akozyr"."f_chauffeurs_fines"diststyle key distkey (fine_id)compound sortkey(created_ts_utc)as (with details as (select"id","fine_id","city_id","amount","description","created_ts_utc","updated_ts_utc","created_dt_utc"from "wheely"."dbt_test_akozyr"."fine_details_flatten"where fine_amount > 0)select * from details);

Ключевым моментом является тот факт, что пишете вы только лаконичный шаблонизированный код, а остальным занимается движок dbt. Написание boilerplate code сведено к минимуму. Фокус инженера или аналитика остается преимущественно на реализуемой логике.

Во-вторых, как происходит выстраивание цепочки связей и очередности создания витрин, продемонстрированные на картинках выше? Внимательный читатель уже заметил, что в рамках написания кода при ссылках на другие модели нет хардкода, но есть конструкция {{ ref('fine_details_flatten') }} ссылка на наименование другой модели. Она и позволяет распарсить весь проект и построить граф связей и зависимостей. Так что это тоже делается абсолютно прозрачным и органичным способом.

С помощью шаблонизации Jinja в проекте Wheely мы гибко управляем схемами данных и разделением сред dev / test / prod. В зависимости от метаданных подключения к СУБД будет выбрана схема и период исторических данных. Продакшн модели создаются в целевых схемах под технической учетной записью. Аналитики же ведут разработку каждый в своей личной песочнице, ограниченной объемом данных в 3-е последних суток. Это реализуется с помощью макроса:

Макрос управления схемами для подключений:
{% macro generate_schema_name_for_env(custom_schema_name, node) -%}{%- set default_schema = target.schema -%}{%- if target.name == 'prod' and custom_schema_name is not none -%}{{ custom_schema_name | trim }}{%- else -%}{{ default_schema }}{%- endif -%}{%- endmacro %}

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

Не повторяйся лучше подготовь макрос

Однотипный код, повторяющиеся обращения и действия, зачастую реализуемые по принципу copy-paste нередко являются причиной ошибок и багов. В Wheely мы придерживаемся принципа Do not repeat yourself и любой сколько-нибудь похожий код шаблонизируем в макрос с параметрами. Писать и поддерживать такой код становится сплошным удовольствием.

Простой пример с конвертацией валют:
-- currency conversion macro{% macro convert_currency(convert_column, currency_code_column) -%}( {{ convert_column }} * aed )::decimal(18,4) as {{ convert_column }}_aed, ( {{ convert_column }} * eur )::decimal(18,4) as {{ convert_column }}_eur, ( {{ convert_column }} * gbp )::decimal(18,4) as {{ convert_column }}_gbp, ( {{ convert_column }} * rub )::decimal(18,4) as {{ convert_column }}_rub, ( {{ convert_column }} * usd )::decimal(18,4) as {{ convert_column }}_usd{%- endmacro %}
Вызов макроса из модели:
select...-- price_details, r.currency, {{ convert_currency('price', 'currency') }}, {{ convert_currency('transfer_min_price', 'currency') }}, {{ convert_currency('discount', 'currency') }}, {{ convert_currency('insurance', 'currency') }}, {{ convert_currency('tips', 'currency') }}, {{ convert_currency('parking', 'currency') }}, {{ convert_currency('toll_road', 'currency') }}, {{ convert_currency('pickup_charge', 'currency') }}, {{ convert_currency('cancel_fee', 'currency') }}, {{ convert_currency('net_bookings', 'currency') }}, {{ convert_currency('gross_revenue', 'currency') }}, {{ convert_currency('service_charge', 'currency') }}...from {{ ref('requests_joined') }} r

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

Сравнить значения двух колонок
-- compare two columns{% macro dq_compare_columns(src_column, trg_column, is_numeric=false) -%}{%- if is_numeric == true -%}{%- set src_column = 'round(' + src_column + ', 2)' -%}{%- set trg_column = 'round(' + trg_column + ', 2)' -%}{%- endif -%}CASEWHEN {{ src_column }} = {{ trg_column }} THEN 'match'WHEN {{ src_column }} IS NULL AND {{ trg_column }} IS NULL THEN 'both null'WHEN {{ src_column }} IS NULL THEN 'missing in source'WHEN {{ trg_column }} IS NULL THEN 'missing in target'WHEN {{ src_column }} <> {{ trg_column }} THEN 'mismatch'ELSE 'unknown'END{%- endmacro %}

В макрос можно запросто записать даже создание UDF-функций:

Создать UDF
-- cast epoch as human-readable timestamp{% macro create_udf() -%}{% set sql %}CREATE OR REPLACE FUNCTION {{ target.schema }}.f_bitwise_to_delimited(bitwise_column BIGINT, bits_in_column INT)RETURNS VARCHAR(512)STABLEAS $$# Convert column to binary, strip "0b" prefix, pad out with zeroesif bitwise_column is not None:b = bin(bitwise_column)[2:].zfill(bits_in_column)[:bits_in_column+1]return belse:None$$ LANGUAGE plpythonu;CREATE OR REPLACE FUNCTION {{ target.schema }}.f_decode_access_flags(access_flags INT, deleted_at TIMESTAMP)RETURNS VARCHAR(128)STABLEAS $$SELECT nvl(DECODE($2, null, null, 'deleted'), DECODE(LEN(analytics.f_bitwise_to_delimited($1, 7))::INT, 7, null, 'unknown'), DECODE(analytics.f_bitwise_to_delimited($1, 7)::INT, 0, 'active', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 1, 1), 1, 'end_of_life', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 7, 1), 1, 'pending', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 6, 1), 1, 'rejected', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 5, 1), 1, 'blocked', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 4, 1), 1, 'expired_docs', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 3, 1), 1, 'partner_blocked', null), DECODE(SUBSTRING(analytics.f_bitwise_to_delimited($1, 7), 2, 1), 1, 'new_partner', null))$$ LANGUAGE SQL;{% endset %}{% set table = run_query(sql) %}{%- endmacro %}

Параметризовать можно и довольно сложные вещи, такие как работа с nested structures (иерархическими структурами) и выгрузка во внешние таблицы (external tables) в S3 в формате parquet. Эти примеры вполне достойны отдельных публикаций.

Не изобретай велосипед импортируй модули

Модуль или package - это набор макросов, моделей, тестов, который можно импортировать в свой проект в виде готовой к использованию библиотеки. На портале dbt hub есть неплохая подборка модулей на любой вкус, и, что самое главное, их список постоянно пополняется.

С помощью модуля логирования и добавления 2 простых hooks на каждый запуск dbt у меня как на ладони появляется статистическая информация о времени, продолжительности, флагах и параметрах развертывания. Я наглядно вижу модели анти-лидеры по потребляемым ресурсам (первые кандидаты на рефакторинг):

models:+pre-hook: "{{ logging.log_model_start_event() }}"+post-hook: "{{ logging.log_model_end_event() }}"
Мониторинг развертывания dbt моделей на кластере RedshiftМониторинг развертывания dbt моделей на кластере Redshift

Измерение календаря собирается в одну строку, при этом набор колонок поражает:

{{ dbt_date.get_date_dimension('2012-01-01', '2025-12-31') }}
Измерение календарь, сгенерированное макросомИзмерение календарь, сгенерированное макросом

С помощью модуля dbt_external_tables я уже выстраиваю полноценный Lakehouse, обращаясь из Хранилища к данным, расположенным в файловом хранилище S3. К примеру, самые свежие курсы валют, получаемые через API Open Exchange Rates в формате JSON:

External data stored in S3 accessed vith Redshift Spectrum
- name: externalschema: spectrumtags: ["spectrum"]description: "External data stored in S3 accessed vith Redshift Spectrum"tables:- name: currencies_oxrdescription: "Currency Exchange Rates fetched from OXR API https://openexchangerates.org"freshness:error_after: {count: 15, period: hour}loaded_at_field: timestamp 'epoch' + "timestamp" * interval '1 second'external:location: "s3://data-analytics.wheely.com/dwh/currencies/"row_format: "serde 'org.openx.data.jsonserde.JsonSerDe'"columns:- name: timestampdata_type: bigint- name: basedata_type: varchar(3)- name: ratesdata_type: struct<aed:float8, eur:float8, gbp:float8, rub:float8, usd:float8>

Ну и, конечно, ночью по расписанию работает VACUUM + ANALYZE, ведь Redshift это форк PostgreSQL. Дефрагментация, сортировка данных в таблицах, сбор статистик. Иначе говоря поддержание кластера в тонусе, пока dba спит.

dbt run-operation redshift_maintenance --args '{include_schemas: ["staging", "flatten", "intermediate", "analytics", "meta", "snapshots", "ad_hoc"]}'
VACUUM + ANALYZEVACUUM + ANALYZE

Running in production: используем dbt Cloud в Wheely

dbt Cloud это платный сервис для управления проектами, основанными на движке dbt. За небольшие деньги команда получает возможность создавать окружения, конфигурировать джобы и таски, устанавливать расписание запусков, и даже полноценную IDE (среду разработки!) в браузере.

Прежде всего речь идет об удобстве использования: приятный и понятный визуальный интерфейс, простота поиска и ориентирования, акцентирование ключевой информации при разборе ошибок и чтении логов:

Во-вторых, это гибкие настройки условий запуска джобов. Начиная от простых условий с выбором дня недели и времени, продолжая кастомными cron-выражениями, и заканчивая триггером запуска через webhook. Например, именно через вебхук мы связываем в цепочку завершение выгрузок для кросс-сверки и начало расчета соответствующих витрин в Хранилище (kicked off from Airflow):

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

Сам dbt является проектом с открытым исходным кодом, и использование продукта dbt Cloud представляется очень удобным, но не обязательным. В качестве альтернативных способов можно выбрать любой другой оркестратор: Airflow, Prefect, Dagster, и даже просто cron. В своем проекте Сквозная Аналитика я организую оркестрацию при помощи Github Actions. Выходит очень занятно.

Вместо заключения

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

Сегодня бизнес и команда активно растут. Доступен ряд интересных позиций:

У тебя есть возможность узнать детали из первых уст и получить прямую рекомендацию.

Также время от времени я провожу вебинары и выступления, на которых подробнее рассказываю о своей работе и проектах. Следить за моими публикациями можно в телеграм-канале Technology Enthusiast https://t.me/enthusiastech

Пишите, задавайте вопросы и, конечно, пробуйте dbt в своих проектах!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru