Чемпионат #PGHACK. Платформа

в 14:41, , рубрики: open source, pghack, postgres, postgresql, Блог компании Avito, Программирование, соревнование

Уже в эту субботу в московском офисе Avito пройдёт чемпионат по PostgreSQL. Это соревнование по управлению базами данных с практическими задачами. Мы реализовали его на платформе, полностью собранной из опенсорс-компонентов. Протестировали уже на двух внутренних соревнованиях (получилось интересно), и теперь готовимся к тому, чтобы провести #PGHACK для всех желающих постгресменов (мы ещё принимаем заявки на участие, ссылка в конце текста). В этом посте я расскажу о том, как мы готовили платформу для чемпионата.
Чемпионат #PGHACK. Платформа - 1

Коротко об игре

Подробно я рассказывал об игре в этом посте. Если говорить коротко, это как CTF, только про Postgres.

Как это работает?

Платформа собрана из опенсорсных компонентов, проверенных временем. Всё это я собирал и отлаживал сам, кроме настройки OpenVPN. Расскажу о составляющих подробнее.

Чемпионат #PGHACK. Платформа - 2

Игровая сеть VPN

Для построения игровой сети используется Open VPN — решение довольно стандартное для таких задач. Никакого дополнительного ПО на ноутбуках игроков не требуется, так как к сети они будут подключаться с виртуальных машин с предустановленным VPN. Ключ от игровой сети (и все следующие задания) участники возьмут в таск трекере. Выполнение задач проверит чекер.

Таск-трекер

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

Чекер

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

Виртуальные машины

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

Подготовка заданий

Часть заданий была придумана сразу, часть изменилась во время обсуждения и тестовых прогонов. Мы завели в Confluence табличку, в которую можно было добавить свою задачу и описать её решение. Было важно придумать задания с однозначными решениями. Проверка должна быть быстрой, простой и автоматической: иначе параллельно проверить 50-60 участников (на такое количество игроков рассчитывалась система) было бы проблематично. Какие-то задачи даже упрощали. В некоторых — отказывались от малораспространенных решений в пользу стандартных методов работы.
Изначально планировали, что заложим времени столько же, сколько на нормальный честный CTF — около 8 часов. Но поняли, что этого довольно много. В итоге #PGHACK будет длиться около 4 часов, не считая время на настройку окружения. Как показала практика, postgres-гроссмейстер может решить все задачи за 2 часа.

Подготовка игрового приложения

Первая версия сайта мини-Avito была сделана во время новогодних каникул на Flask. Она не имеет ничего общего с технологиями, которые используются на реальном сайте, но пытается быть на него похожей — это тоже доска объявлений.

Чемпионат #PGHACK. Платформа - 3

В процессе работы из приложения был полностью выпилен ORM, и оно стало вызывать функции базы данных. Игровой dataset мы взяли у коллег-аналитиков, которые пару месяцев назад проводили свой конкурс. Это “живые” объявления с полностью убранными персональными данными. Весит около 4 Гб, поэтому мы не можем выполнять большие сложные запросы на виртуальных машинах. Проверки решений задач сделаны лёгкими и быстрыми.

Допущенные ошибки

На первом этапе подготовки мы планировали быть в тренде: собрать платформу из микросервисов на разных языках — Go, Python, PHP. Но мы от этого отказались: для участников разбираться в большом количестве непонятных микросервисов было бы сложно, и игра превратилась бы не в починку Postgres, а в ковыряние микросервисов — кто куда ходит, что делает.

Была еще одна трендовая мысль — использовать Docker. Отказались, т.к. поняли, что большинство DBA не готовы к его применению: они работают с другими системами и в других плоскостях. Пришли к классической виртуалке, как и в большинстве CTF.

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

Список open-source компонентов платформы PGHACK

Packer — https://www.packer.io
Ansible — https://www.ansible.com
VirtualBox — https://www.virtualbox.org
OpenVPN — https://openvpn.net
Fabric — http://www.fabfile.org
Flask — http://flask.pocoo.org

и, конечно же, PostgreSQL — https://www.postgresql.org!

Что потом

Мы не планируем останавливаться только лишь на проведении одного чемпионата #PGHACK. Хочется, чтобы это стало регулярным мероприятием для postgres-комьюнити. Поэтому подробного разбора задач не будет.
После мероприятия появится фотоотчет на нашей странице в FB. Кстати, регистрация на чемпионат ещё открыта: заполняйте заявку до вечера 31 августа и участвуйте в #PGHACK!

Автор: pkorobeinikov

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js