Всем привет!
На сегодняшний день данные и всё связанное с ними (ML, AI, DataMining, etc) это самый хайповый тренд в IT-индустрии. Все - от ритейлеров до компаний Илона Маска - работают (или пытаются работать) с данными. Нас в Леруа Мерлен эта волна не обошла стороной - data-driven подход к принятию решений является одним из основных в компании. Следуя ему, мы создали свою платформу данных, которой на данный момент пользуется около 2 тыс.человек, а в минуту обрабатывается примерно 1800 запросов. В этой статье мы (Data-команда Леруа Мерлен Россия) расскажем, как за 2 года построили платформу данных в компании с большим количеством оффлайн-процессов, про ее архитектуру и опыт, который мы получили в процессе создания.
С чего все начиналось
В 2016 году, задолго до появления платформы, был нужен инструмент, чтобы строить отчеты, проводить аналитику и рисовать графики. Тогда решили просто связать DB-link’ами все основные базы данных компании. Решение оказалось не масштабируемым, при этом потребность в аналитических отчетах росла, как и требования к ним, при этом влияли они на все бизнес-процессы компании.
В 2017 мы решили пойти к большому вендору: купить у него один или два шкафа железа, точно также залить туда свои данные и продолжать строить отчеты. Но это оказалось тоже проблемно с точки зрения масштабируемости, так как место заканчивается, и нужно снова идти к вендору, покупать новый шкаф и платить за него кучу денег. Прежде чем отдавать эти деньги, хотелось посмотреть, а что вообще в мире делают большие data-driven компании, которые не только принимают основанные на данных решения, но и занимаются предсказанием. Посмотрев на них, компания приняла решение о создании своей платформы данных.
Первые шаги к своей платформе
Чтобы это сделать, нужно было сначала собрать все данные в единое хранилище и пустить в него дата-инженеров, дата-аналитиков и дата-сайентистов, чтобы они смогли построить в нем свои модели, обучить их, нарисовать витрины, построить и написать сервисы для работы с данными. Короче говоря, извлечь пользу для наших пользователей (= сотрудников компании).
Мы ожидали, что это будет стоить очень дорого. Чтобы избежать очередной покупки нового железа, нам нужно было разработать стратегию наших действий и понять, как мы будем двигаться дальше.
Прежде всего мы выработали 3 основных принципа работы над нашей будущей платформой:
Экспертиза внутри компании. Все знания, полученные при создании платформы, должны консолидироваться у команды Леруа Мерлен;
Использование opensource. По максимуму использовать наработки сообщества и развивать их, а не тратиться на проприетарные продукты;
Cloud native & cloud agnostic. Мы должны строить платформу, которую можно разворачивать в облаках, но не завязываться на конкретное облачное решение.
Тут можно долго дискутировать и обсуждать тезисы из каждого пункта, но мы – технари, а бизнес нам дал руль и позволил полностью управлять процессом создания платформы. И нам, как техническим специалистам, было ясно, что, придерживаясь этих правил, мы можем сами создавать и развивать платформу с той скоростью, которая нам необходима:
Мы не завязаны на вендорах - если нам что-то нужно, мы можем сами это написать и законтрибьютить.
Мы не завязаны на подрядчиков – мы сами знаем, что, как и где писать.
Мы не завязаны на инфраструктуру – не нужно заказывать оборудование и ждать по полгода, пока его привезут и установят.
Платформа данных за 2 года
Так в 2019 году мы начали работать над созданием платформы данных.
Для начала нужно было определиться с хранилищем. Если вы еще на этапе выбора хранилища, можем вам посоветовать посмотреть доклад от Максима Стаценко из Я.Go (Обзор технологий хранения больших данных).
У нас тут выбора было не так много – Hadoop Stack (Kudu, Druid, Hive, etc), Clickhouse или Greenplum. Остальные решения (Vertica, Teradata, Exasol) не подходили из-за своей проприетарности и требованиям к железной инфраструктуре. В итоге мы остановились на GP – из-за его возможностей работать с ANSI-sql и прозрачности для пользователей – для них это просто большой Postgres, в котором все их отчеты, построенные на прежних решениях, работали сразу из коробки, а для CH и Hive пришлось бы всё переписывать.
На первом этапе нам необходимо было проинтегрировать реляционки в платформу, чтобы дать пользователям возможность строить их отчеты не на базах источников, а у нас. Мы посчитали их и поняли, что в нашей компании более 350 реляционных баз данных. На базах-источников настроили механизм CDC и с помощью Debezium начали сгружать эти данные в Kafka, которую мы разгребали ETL-инструментом NiFi и грузили все в raw-слой GreenPlum.
MVP мы проводили на виртуалках в облаке.
Так как MVP показал хорошие результаты, мы нащупали вектор движения. У нас оставалось ощущение, что на облака мы потратим очень много денег из-за того, что у нас огромное количество обрабатываемых данных, и оно растет каждый день. Поэтому мы закупили железные серваки и поехали в onprem.
Железные конфигурации
Какие там были конфигурации?
Там было 24 сервера HP DL380, мы воткнули в каждый сервер по 12 винтов в 2 ТБ, собрали кластер на 220 ТБ (получилось уложить в него 110 ТБ полезных данных), у него было 800 ядер CPU и больше 5 ТБ оперативки:
HPE DL380 Gen10 5115 Xeon-G (Intel(R) Xeon(R) Gold 5115 CPU @ 2.40GHz)
256GB Memory (HPE 32GB 2Rx4 PC4-2666V-R)
10TB RAID10 software array (HPE 1.8TB SAS 10K SFF SC 512e)
4x10GB bonded network interfaces
Но, прежде чем запускаться, мы решили сравнить виртуалки в облаке с тем, что мы можем выжать на железе.
Мы прогнали на 3 разных компонентах 3 теста. GreenPlum мы прогоняли тестом TPC-DS, для Kafka мы прогнали бенчмарки consumer/produser-perf-test, а Object Storage мы тестировали с помощью Warp.
Про Object Storage
По оси X – количество потоков (сколько мы запускали тест на запись и на прочтение). По оси Y – итоговая скорость. Максимальная производительность достигается на 40 потоках при размере объектов больше 32 МБ.
Для тестов GreenPlum по итогу мы получили около 20% прироста производительности на железе (при одинаковых конфигурациях). Также проверяли различные версии GP (6.х против 5.х), и тестировали различные системные конфигурации.
Про Greenplum
Подробнее с методикой теста и расчетом итогового score можно ознакомиться в спецификации: http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-ds_v2.11.0.pdf
Выводы из тестов Greenplum мы сделали следующие:
Основное влияние на производительность GP оказывает скорость дисковой подсистемы, в первую очередь - IOPS
При установке GP в облаке нужно закладывать 20% дополнительных ресурсов (CPU, memory)
На виртуалках нужно ставить меньший vm.overcommit_memory (90, вместо 95), т.к. высокое потребление CPU на облачной инфре оказывает негативное влияние на сеть между сегмент-нодами (теряются пакеты, затормаживаются ответы), что может вести к выпадению сегментов из кластера
Производительность кластера в облаке с большим количеством маленьких виртуалок выше, чем с малым количеством больших – лучше взять 18 виртуалок по 5 сегментов на каждой, чем 5 виртуалок по 18 сегментов.
Про Kafka
По Kafka мы замеряли скорость чтения/записи и получили 350 МБ на записи и 400 МБ на чтение на обычных HDD дисках. Особенность кафки – последовательная запись и чтение с диска позволяет ей работать очень быстро на бюджетном железе. Для большинства задач этих скоростей хватает за глаза.
В прод на ламбе – ожидание и реальность
После наших тестов мы радостно взяли все и побежали на железный кластер. Мы подумали, что все будет быстро и просто. Но тут начались проблемы.
Оказалось, что нельзя просто так взять и переехать на железо. Начались проблемы: диски вылетали из крутых брендированных серверов (хотя вендор их быстро менял, все равно производительность и отказоустойчивость деградировали). Также мы испытывали проблемы со специфичными настройками сети для GreenPlum. Столкнулись с багами в bios у HP, ноды рандомно перезагружались – пришлось обновлять bios. Также мы заметили, что HP по умолчанию включает зеленый режим у CPU, и при большой нагрузке наш кластер троттллился, и производительность не была максимальной.
А в параллели с этим, пока команда занималась стабилизацией прода, наш бэклог рос, и, вместо того чтобы развивать сам продукт, мы тратили много времени на сами железки. При этом бизнес требовал SLA и хотел, чтобы их запросы выполнялись всегда быстро.
Двойной ETL
Тогда мы задумались, как обеспечить продолжительность бизнеса, даже если на наш дата центр упадет метеорит.
Единственным решением в данном случае было иметь dual ETL – двойная инфраструктура, двойные данные, два раза проливать. Встал вопрос о покупке еще одного шкафа железа. И тогда мы поняли, что нужно идти обратно в облака.
Надо отметить, что пока мы занимались развитием железа, в вопросе облаков мы тоже не стояли на месте, разворачивали большое количество виртуальных машин для наших тестовых и стейджевых окружений, для инкубационных окружений.
Мы развернули кучу managed-сервисов в облаке. Все это мы делали с помощью швейцарского ножа devops’а – Terraform (IaC), Ansible, Jenkins. Также мы выработали системный подход к работе с инфраструктурой (железной / облачной / виртуальной) – мы используем ELK для сбора логов, Consul как сервис дискавери, в Prometheus собираем метрики, в Grafana их отображаем.
Итого
Мы начали трансформацию всей нашей компании в data-driven. На данный момент мы еще на самом старте, но уже сейчас мы видим, что продукты, основанные на данных, приносят немалую прибыль
Мы построили нашу платформу полностью на open-source решениях
Облачные провайдеры помогают в осуществлении быстрого старта для новых продуктов. Но необходимо иметь ввиду, что нельзя бездумно пользоваться всеми облачными сервисами, особенно managed, особенно специфическими и которых нет в других облаках, т.к. есть вероятность получить cloud lock. Проще говоря, нужно быть cloud-agnostic
Гибридные облака - это современный тренд, который позволяет компаниям выбирать облако в зависимости от задач и критериев (цена, доступность, удобство, безопасность). А использование IaC (Infrastructure as Code) упрощает эту задачу
В следующей статье мы расскажем подробнее о текущей архитектуре нашей платформы, ее компонентах и open source продуктах, которыми мы пользуемся - опыте с GreenPlum, Airflow, Apache Superset, Flink и многими другими.