ping 10.4

February 27, 2017

Случайной опечаткой выяснил, что ping 10.0.04 это тоже самое, что ping 10.0.0.4 (повторяется на маке и на убунту). Немного поиграв, нашел, что ping 10.4 то же самое! Наверняка где-то в спецификациях есть объяснение этому факту, но я не знаю.

Это просто забавная штука, а есть вещи еще менее очевидные, которые можно, либо получить от опытных товарищей, либо набить шишку самому: например, не давать для VPN-подсетей адреса а-ля 192.168.1.*, распространенные в бытовых раутерах, чтобы не получить лишних проблем.

Няшно

February 22, 2017

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

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

Например, я очень люблю терраформ + ансибл (когда роли чистые). Мы храним инфраструктуры изолированно, поэтому в каждом проекте есть небольшой линейный списочек боксов. Можно переименовать файл dev01.tf => dev01.tf.b, terraform apply - сервер удалится, dev01.tf.b => dev01.tf, terraform apply, ansible-playbook dev.yml - сервер создастся и запровизится. Когда все токены настроены, то такой процесс отладки новой роли, не сложный в целом, удивительно приятный, чистый IT-дзен.

Учи.ру - Руби он Рейлс разработчик

February 21, 2017

Note: реклама, за пост сказано щедрое спасибо.

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

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

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

Итак, что у нас есть:

  • Актуальные версии рейлс, руби, постгрес, эластик на сервере.
  • Бутстрап, реакт, вебпак и прочее в разнообразных комбинациях, приправленные jQuery на клиенте.
  • Потрясающие дизайнеры и иллюстраторы, профессиональные верстальщики и фронты (верстать самому можно, только если вы сами очень сильно захотите).
  • Приличные нагрузки в 500-800 запросов в секунду на продакшенах, то есть сверхтонкие оптимизации проводить нам пока еще не нужно, но мощь трафика и размеры баз будете ощущать очень хорошо.
  • Работа в компактных, самодостаточных командах, где вы сами выбираете уровень вовлеченности в процесс. Можно настроить продакшен самостоятельно с помощью терраформа и ансибла или же сконцентрироваться только на коде и задачах бизнеса. В рамках наших открытых уроков и мероприятий очень рекомендую сходить в школу и посмотреть, как работает продукт в реальных условиях и кто наши пользователи.
  • Мы продуктовая компания, у нас нет разработки "в стол" или для галочки, каждую вашу фичу увидят сотни и тысячи детей, учителей, родителей, причем очень быстро. Гитхаб флоу великолепен! Ветка, автоматически выкатывается шот, тестирование, ревью, апрув от бизнеса, мерж и продакшен!

Присылайте свои резюме, комментарии и вопросы Евгении Христолюбской christolubskaya@uchi.ru. Буду рад новым коллегам :cat: :cat: :cat:.

Количество запросов

February 21, 2017

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

1) тюним формат NGINX-логов:

- role: nginx
  nginx_http_params:
    - log_format combined_plus '$host $remote_addr - $remote_user [$time_local] '
       '"$request" $status $body_bytes_sent $request_time '
       '"$http_referer" "$http_user_agent" "$content_type"'
    - access_log "/var/log/nginx/access.log" combined_plus
    # ...

2) запускаем nginx-exporter (можно взять вот этот ndiazg/nginx-prometheus-exporter за основу):

- name: nginx_prometheus_exporter
  docker_container:
    name: nginx-prometheus-exporter
    state: started
    image: nginx-prometheus-exporter
    restart_policy: unless-stopped
    command: /var/log/nginx/access.log
    volumes:
      - /var/log/nginx:/var/log/nginx:ro
    ports:
      - 3093:3093

3) Добавляем метрику (с помощью магического скрипта):

sum(rate(http_requests_total{job="nginx",vhost="uchi.ru"}[1m])) by (instance)

4) PROFIT:

Консул

February 20, 2017

Архитектура консула мне очень сильно напоминает организацию современной IT-компании. В каждом датацентре (продукте), есть 3 сервера (например техлид, главный дизайнер и пиэм), задача которых входить в кворум (договариваться друг с другом) и держать каталог (быть источником правды). Cервера разных ДЦ общаются между собой, реализуя сермяжную правду, ценность и миссию организации.

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

Ансибл потек

February 17, 2017

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

- docker_container:
    image: consul
    command: agent -server
    # ...
    env: 
      CONSUL_LOCAL_CONFIG: '{"skip_leave_on_interrupt":true,...}'

Это хорошо работает, но если передать в конфиг переменную CONSUL_LOCAL_CONFIG: '{"bind":"{{ip}}",...}', то ансибл в окружение контейнера передает строку с одинарными кавычками вместо двойных и естественно консул не запускается, так-как {'bind':'... - это уже не JSON. Что-то где-то там внутри замыкает.

Rails + PostgreSQL = крутота

February 16, 2017

Дисклеймер: напоминаю, что говоря Рейлс, я обычно всегда подразумеваю любой современный веб-фреймворк, который вы знаете. Как известно лучший дистрибутив линукса - это тот, который установлен у вашего друга-гуру, просто так получилось, что мой линукс - это Рейлс.

Так вот, недавно, объясняя одному js-коллеге почему нужно сразу начать работать на Rails + PostgreSQL и не тратить время на Rails + SQLite, понял одну вещь. Мои тестовые задание по C++ очень сильно не походили на то, что я увидел на работе. Мой C++ был как в книжках, а реальный C++ оказался совсем, полностью не книжным.

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

Пластиковый код

February 15, 2017

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

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

Классические архитектурные паттерны на руби, пхп, питоне для разработки очередного веб-проекта - это монеты эпохи Николая 2, сделанные в девяносто пятом.

DevOpsDays Moscow

February 14, 2017

Собрался тут выступить на DevOpsDays Moscow, буду рассказывать, как Учи.ру выросла с одного маленького рейлс приложения до весьма развесистого сервиса на 1М+ пользователей.

По ТТХ у нас рабочая нагрузка 600-800 запросов в секунду на главных продакшенах, 100+ серверов (суммарно для всех проектов), база гигов на 200. То есть размах относительно умеренный для индустрии, но достаточный для того чтобы столкнутся с большим количеством разнообразных проблем.

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

Порт 5000

February 13, 2017

Запустил тут рейлс сервер в форемане и удивился, что сервер запускается на порту 5000 вместо привычного 3000. Довольно быстро, понял, что фореман выдает порты своим приложениям, переопределяя переменную окружения PORT. То есть такой прокфайл:

# Procfile
web: rails s

запустит приложение на порту 5000, а такой:

web: PORT=3000 rails s

вернет сервер на привычные 3000.

В этой всей истории меня смутило, почему я раньше эту штуку не видел. Поковырявшишь в истории комитов, нашел нужный 306c14c4113, поддержка PORT была добавлена только в рейлс 5, поэтому и не видел. Душевное равновесие восстановлено.

PS. Переменная PORT стандартная для хероку, но пока рейлс не обращал внимания на эту переменную, вопрос решался магией билдпаков rails4.rb.