Яндекс Субботник | 03.12.2011 #yasubbotnik

В эти выходные я был в Питере на достаточно интересном мероприятии. Компания Яндекс устраивает подобного формата конференции с 2009 года, но в этом году Питерский офис компании впервые (и причем дважды) принял участников субботника, за что им огромное спасибо!

Первые впечатления о формате мероприятия:

1) молодая аудитория, не заметил кого-то старше 30
2) соотношение субъективно полезных докладов к неполезным 50/50
3) есть возможность спросить и узнать как работает Яндекс изнутри

Кратко о докладах (часть из них я пропустил):

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

Серьезный подход в разработке UI, основанный на таргетированной статистике по карте кликов. Каждый слайд презентации на своем месте, ничего лишнего, все последовательно и по шагам.
Вот почему Яндексом так удобно пользоваться, вы теперь знаете, что Анастасия Ларкина следит за тем, куда вы кликаете.

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

Ольга описала механизм работы сервисов типа Amazon Mechanical Turk и то, как Яндекс решает проблему оценки качества поисковой выдачи. Теперь все знают, что степень достоверности пессимистичных оценок намного выше оптимистичных, так что можете доверять негативным отзывам больше.

В стиле Стива Джобса, максимально доступно с перефразированием каждой фразы по 3 раза, но очень интересно.
Мы ждали от Сергея, что он скажет что-то новое, что решит проблемы распределения нагрузки в нагруженном User Generated Content проекте. Нового мы не услышали, зато освежили типичные паттерны масштабирования в данной задачи, а именно:
  - вынести всю работу с данными в модель, так как сервера приложений в отличии от баз данных
    горизонтально масштабируются как горячие пирожки
  - остерегайтесь триггеров и хранимых процедур, так как версионность работы с ними не так проста, как на уровне приложения
  - никаких JOIN-ов, только простые запросы, которые легко загоняются в кэш
  - аггрегировать данные по минимально-возможному ключу
  - инвалидация кэша по колбэку
  - пиши в master, читай со slave, но помни про replication lag
  - кэшировать только часто используемые данные, так как накладные расходы на кэширования "всего подряд" не только высоки, но также польза от них сомнительна, если cache hit будет низким
  - промежуточное кэширования аггрегированных функций, например, счетчиков с последующим 
    периодическим пересчетом, кроме того, с счетчиками лучше работать через методы increment, decrement
  - PubSub - подписка на изменения во френдленте, но годится не всегда и не везде
  - в UGC проектах вместо готового html предпочтительно кэширование промежуточных 
    "сырых данных", которые удобно реиспользовать в разных блоках с разным уровнем доступа
  - на каждый сервер с приложением поставить промежуточный кэширующий бэкенд, чтобы разгрузить базу на чтение, кэшировать можно при первом запросе к базе - прозрачно для приложения.

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

Вот и самое главное, зачем я поехал на #yasubbotnik.
Не могу вспомнить сколько вопросов я задал Екатерине, но на каждый из них получил компетентный ответ.
Тема горизонтального масштабирования хранилища данных нетривиальна и не имеет конкретных паттернов решения задачи, каждый метод (High Availability, High Performance) имеет свои наборы типовых практик, но,
  опять же, здесь все намного сложнее, чем кажется на первый взгляд.

  Одним из моих главный вопросов были:

  - нагрузка, нагрузка и еще нагрузка - справляется ли MySQL с поставленными ему задачами
  - MySQL еще актуален или смотреть в сторону PostgreSQL, либо NoSQL решения
  - как реплицировать и правильно "пилить", то есть шардить/партиционировать базу 
  - как бэкапить без блокировок
  - есть ли какие специфичные конфиги mysql и используют ли Яндекс сборку от Percona

Ответы:

1) master-slave репликации с записью в мастер, чтение со слейвов хорошо показывает себя на работе с огромными объемами данных, таким образом подобные типовые решения ложатся и на такие нагрузки

2) MongoDB используется в продакшне и ведет себя достаточно неплохо, особенно учитывая Replica Sets с автоматической отказоустойчивостью

3) в основном используется MySQL 5.1-5.5, стандартная сборка - достаточно хорошо себя ведет на продашкне с очень-очень большими объемами (надо просто уметь ее готовить)

4) специального тюнинга innodb нет, по большей части стандартные оптимизации, о которых знают все, например больше памяти для innodb кэша

5) из-за больших объемов бэкапы делаются на уровне файловой системы (rsync, tar)

6) шардирование - почти-серебряная-пуля, если знаешь по какому признаку шардить. отказойчивость мета-базы предлагается master-master репликаций и разным offset-ом

Общее впечатление о конференции и компетентности сотрудников Яндекса - 10/10. Планирую посещать субботники настолько часто, насколько это возможно

 

Everything else is secondary

"Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma - which is living with the results of other people's thinking. Don't let the noise of other's opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary." Steve Jobs

Nginx пример отличного конфига, нужен ли очередной?

зачем трогать то, что и без того работает? вопрос логичный, но сподручный стареющему организму/мозгу.

всегда есть то, что то новое почитать, написать, придумать, ну и, наконец, оптимизировать. так уже получилось, что мне сложно представить себе свою работу без постоянного прогресса. это касается обновления, изменения конфигурационных файлов переданных мне на сопровождение 8 серверов помимо основной разработки серверной и клиентской части проекта. одно, что не трогаю - это action script/flex

все работает и не надо ничего менять, но нет... надо, получилось убедить заказчика и все в итоге от этого выиграли. речь пойдет о кратком, но лаконичном конфигурационном файле nginx + passenger. перед тем, как продолжить читать, откройте в отдельном окне сам конфиг - http://twitter.com/amikhailov/status/7091350897950720

  • passenger_pool_idle_time 0; - если у вас один запущенный проект на сервере, либо памяти хватает на все активный проекты, то смело отключайте засыпание passenger при неактивности. имеет смысл, если запуск приложения длиться более нескольких секунд
  • passenger_max_pool_size 15; - опять же, если с памятью все хорошо и нет недостатка, то не жалейте ее, пусть расходуется по назначению
  • gzip on; - сжатие текстового контента уже считается признаком хорошего тона
  • passenger_pre_start https : // 127.0.0.1/; - если ваше приложение запускается более нескольких секунд (речь идет об инициализации всех библиотек + кода) - скажите nginx-у, сделать это автоматически после очередного деплоймента
  • rewrite ^(.*) https://$host$1 permanent; - один из проектов, который я разработываю, не имеет public-контента, соответственно было принято решение приобрести ssl-сертификат и весь функционал спрятать за ним. здесь нет смысла вешать инстансы приложения на 80 порты, делаем редирект на https силами самого сервера. можно забыть про ssl_requirement
  • location ~ \.php$ { deny all; } - обнаружил, что многие боты проверяют наличие phpmyadmin и прочее, нам оно здесь ни к чему, блокируем, пусть рельсам будет проще
  • passenger_min_instances 10; - возвращаясь к первым пунктам, есть достаточно памяти - смело позволяйте запускать столько инстанцов, сколько вам надо
  • location @503 {} - правило хорошего тона, во время деплоймента использовать заглушку - чтобы пользователи были в курсе, почему сервер временно не отвечает. для того, чтобы это использовать - скажите capistrano создавать файл maintenance.html на время деплоймента
  • location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {} - убираем логирование доступа к статике, добавляем заголовки max-expire, 
    SSL контент по умолчанию кэшируется только в памяти, закрывая браузер это кэш обнуляется. поэтому добавим заголовок, чтобы кэшировать статику на жесткий диск - add_header Cache-Control public;

рад, если кому то пригодится

software development

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

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

кратко мысли:

  • ценно только то, что сейчас + небольшая перспектива (не более 2-4 недель)
  • когда разрабатываю делаю немного больше, чем просят - пытаюсь предугадать следующий шаг заказчика
  • все высокие слова и сложные термины надо сразу исключить + постараться игнорировать тех, кто этим увлекается
  • идеальная команда должна быть не более 5-7 человек - для проекта любого масштаба, лучше меньше, но лучше
  • если требуется больше ресурсов - значит код пишется не тот, либо инструменты не те, или же требования надо сокращать, вообщем оставить саму суть

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

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