Демоны в большом проекте –
проблемы и их решения
Александр Чистяков
Младший системный администратор Cezurity
admin@cezurity.com
2013 dev.it-portfolio.net
Кто я?
• Топ-менеджер РАО ЕЭС
• Муж певицы Глюк’оZa
• Подрабатываю в компании Cezurity
системным администратором
dev.it-portfolio.net 2
Кто вы?
• 91.89% - Windows users
• 6.94% - OS X users
• 1.17% - Linux users
• Вы слышали про компьютерные вирусы?
• Если не слышали, вирус – это такая
программа для устаревших операционных
систем, несанкционированно
модифицирующая их работу
dev.it-portfolio.net 3
Отказ от ответственности
• Верите презентациям на слово?
картинка №1 (очень важная)
dev.it-portfolio.net 4
Чем занимается Cezurity?
• Создание облачного антивируса
• Целевая аудитория – те самые 91.89%
• Как мы уже выяснили, Windows в зале ни у
кого нет, поэтому речь пойдет не об
антивирусе, а о
• ВЫСОКИХ НАГРУЗКАХ
dev.it-portfolio.net 5
Что такое высокие нагрузки?
• Как установили ученые (британские), еще
викинги занимались созданием
высоконагруженных сайтов, они просто не
знали, что это – высоконагруженные сайты
• Высокие нагрузки – это когда вам
позвонили среди ночи, сообщить о том, что
все упало
• Где нагрузка выше: VK или Одоклассники?
dev.it-portfolio.net 6
Как викинги делали сайты?
• Методология “Фигак-фигак и в продакшн”
• У веб проекта должна быть архитектура!
• Со времен викингов проще жить не стало
dev.it-portfolio.net 7
А что такое архитектура?
• Веб-проект состоит из квадратиков
• Квадратики можно найти в сети и скачать!
• Если скачивать все найденные в сети
квадратики, к окончанию проекта успеете
• Многообразие квадратиков порождает
комбинаторный взрыв, следовательно
• Нужно знать, какие квадратики скачать!
dev.it-portfolio.net 8
Откуда мы знаем, что скачивать?
• “Берите тот дистрибутив Linux, который
стоит у вашего районного Linux-гуру”
• “Никто не был уволен за покупку Cisco”
• “Вся бытовая техника в доме должна быть
одного производителя”
• …и тому подобная чушь
dev.it-portfolio.net 9
Откуда мы знаем, что скачивать?
• А мы не знаем
• Некоторые квадратики попадают в проект,
потому что у команды есть предыдущий
опыт с ними (или языком/платформой)
• Некоторые квадратики попадают в проект
после сравнения свойств нескольких
кандидатов и выбора наиболее
подходящего
dev.it-portfolio.net 10
Архитектура типичного веб-проекта
• Сервер приложений (неинтересно)
• Reverse-proxy (тривиально)
• СУБД (товарищеский матч MySQL vs
PostgreSQL на стульях и швабрах в
перерыве)
• ORM (расшифровывается как “я не знаю
SQL”)
• Кэш
dev.it-portfolio.net 11
Архитектура нетипичного веб-проекта
• СУБД? (schemaless document-oriented fast
scalable fault-tolerant near-realtime web2.0-
ready modern not-only-SQL storage)
• Очереди
• Шардинг
• BigData
– Аналитика
dev.it-portfolio.net 12
Итого, что нам было нужно
• СУБД?! (SQL or NoSQL? SQL and NoSQL? SQL
xor NoSQL?)
• Очереди
• Шардинг
• Кэш
• BigData
dev.it-portfolio.net 13
Техническая археология
• Проекту больше года, ключевые сервисы
уже на своих местах
• Попытка осмыслить пути выбора
составляющих архитектуры и оценить
достоинства и недостатки
dev.it-portfolio.net 14
SQL and NoSQL
• Необходимость не только писать данные в
базу, но еще и гарантированно читать их
обратно => старый добрый SQL
• Необходимость не просто читать данные,
но делать это быстро => рассмотрение
современных NoSQL решений
• Необходимость хранить данных больше,
чем влезает на один сервер (и на 2, и на 3)
dev.it-portfolio.net 15
Очереди
• Варианты:
– ActiveMQ (мир делится на Java-программистов
и не Java-программистов, среднего нет)
– RabbitMQ (5 баллов за маркетинг)
– ZeroMQ (не сервис, а библиотека)
– Kestrel (слова “a port of Starling from Ruby to
Scala” звучат как приговор)
– Beanstalkd (кто-нибудь в зале слышал?)
• Выбор пал на RabbitMQ
dev.it-portfolio.net 16
Впечатления Java-программиста
• Попытка прочесть и понять спецификацию
AMQP вызывает судороги
• Ни одна клиентская библиотека толком не
реализует поддержку AMQP keepalive
• Большая часть клиентских библиотек
похожа на студенческие курсовые
• Erlang – очень простой язык
• RabbitMQ чаще работает, чем не работает
dev.it-portfolio.net 17
Проблемы
• Написан на Erlang – надо знать Erlang
• Можно попробовать не знать Erlang, но
тогда конфигурация и эксплуатация
RabbitMQ будет вызывать неприятие
• Не можете понять Erlang – картинка №1!
• Очереди в памяти – при падении данные
теряются
• Памяти не хватает – все встает
dev.it-portfolio.net 18
Кто сказал «персистирование»?
• У нас уже есть PgQ (SkyTools)
• PgQ – это очереди поверх PostgreSQL
• Они работают хорошо
• Но дисковая подсистема на машинах, где
они развернуты, начинает работать плохо
• В RabbitMQ - диск лучше? Картинка №1!
• Большая часть наших сообщений живут
миллисекунды – зачем их персистировать?
dev.it-portfolio.net 19
Шардинг
• PL/Proxy – проект, позволяющий
организовать шардинг с использованием
хранимых процедур на PL
• (Как вы уже, наверное, догадались, мы
используем PostgreSQL)
dev.it-portfolio.net 20
Впечатления Java-программиста
• Хранимые процедуры это древнее зло
– Их сложно читать и понимать
– Их сложно отлаживать
– Сложно анализировать slow query log, так как
там не запросы, а вызовы хранимок
• К счастью, шардинг с помощью PL/Proxy
(пока) работает как часы
• (Кстати, PL/Proxy используется в Skype)
dev.it-portfolio.net 21
Кэш
• Варианты:
– memcached (в названии есть слово “cache”)
– Redis (в названии нет слова “cache”)
– MongoDB (“MongoDB is web scale!”)
– Membase/Couchbase (в названии все время
разные слова, И ЭТО НЕСПРОСТА, все мои
попытки внедрить Membase заканчивались
срочной эвакуацией с него)
dev.it-portfolio.net 22
Memcached
• Очевидный выбор
• С точки зрения топ-менеджера РАО ЕЭС
представляет собой slab allocator с lock-free
структурами данных, MVCC и evented I/O
• Просто работает, причем, у многих
• Не поддерживает объединение ключей в
множества (тегирование ключей, списки)
dev.it-portfolio.net 23
Redis
• Второй очевидный выбор
• Поддерживает списки
• Может работать как кэш, а может – как БД
• По умолчанию сохраняет данные на диск
dev.it-portfolio.net 24
MongoDB
• Судя по деталям реализации, была
написана викингами
• У нас отсутствует достаточный запас боевых
мухоморов, чтобы пытаться внедрить
продукт, технические решения в котором
долгое время противоречили здравому
смыслу (no WAL, global lock, random crashes
и другие атрибуты web2.0-ready решения)
dev.it-portfolio.net 25
Неочевидный вариант
• MySQL + HandlerSocket
• Не рассматривался никем, кроме меня –
все-таки, у антивирусной компании потоки
данных совсем не такие, как у типичного
веб-проекта
• Поэтому писать на диск данные из кэша
нам не надо – «горячие» данные все время
разные
dev.it-portfolio.net 26
Итак, Redis
• Сначала мы пытались использовать его еще
и как базу (без вытеснения)
• Два типа данных – с установленным
expiration date и персистентные
• Когда место в памяти заканчивается, Redis
перестает записывать данные
• Почему заканчивается место в памяти?
• Redis ведет slow log (у нас до 400-600 Mb)
dev.it-portfolio.net 27
Redis – итоговые настройки
• Вытеснять все без разбора:
– maxmemory-policy allkeys-lru
• Ничего не сохранять на диск: #save
• (Кстати, Redis долго читает состояние с
диска при рестартах, если оно есть)
• Если сохранение на диск было отключено
не сразу, надо стереть дамп
• slowlog-log-slower-than -10000
dev.it-portfolio.net 28
Redis – после внедрения
• Мы не используем репликацию (нет смысла
в силу особенности бизнеса)
• Мы храним данные в разных базах одного
инстанса и в нескольких разных инстансах
• Активно используем списки
• Мы не сразу нашли, куда расходуется
память, и даже хотели ее профайлить
• В целом, мы довольны
dev.it-portfolio.net 29
BigData
• Антивирусная компания – это очень много
данных, даже когда клиентов мало
• Данные нужно не только записать, но и
прочитать
• И не только прочитать, но и обработать
• Например, если в файле обнаружен новый
вирус, нужно сообщить всем клиентам, у
которых был такой файл
dev.it-portfolio.net 30
BigData
• Нельзя просто взять, и сложить все на одну
машину
• Варианты:
– RIAK, Cassandra, MongoDB, ТЫСЯЧИ ИХ
(eventually consistent == eventually inconsistent)
– HBase (strongly consistent)
– Vertica (стоит денег)
– Greenplum (стоит денег)
dev.it-portfolio.net 31
HBase - развертывание
• Раньше я ничего не говорил про это, так как
развертывание Redis, RabbitMQ,
memcached, etc - тривиально
• HBase развернуть тоже несложно – сначала
нужен ZooKeeper cluster
• Стойте, как я сказал, «несложно»?
• 5 сервисов на мастер-ноде, по 3 на слейвах
• 8 кукбуков в Chef
dev.it-portfolio.net 32
Стоп, а что это все-таки, HBase?
• Это такое key-value хранилище
• В котором ключи сохраняют отношение
порядка
• Потому что используется LSM tree
• Позволяет извлекать данные не только по
конкретным ключам, но и делать range
scans
• На уровне отдельной строки - атомарность
dev.it-portfolio.net 33
HBase – эксплуатация
• Ручки у HBase везде, и крутить их можно в
разные стороны
• Мы пока начинаем, и настраивали только
region size и max KeyValue size в сторону
увеличения
• Клиенты у нас на Python, работают через
Thrift
• Thrift-сервер требует больше памяти, чем
мог бы (Java-программист во мне смеется)
dev.it-portfolio.net 34
Из чего состоит HBase?
• ZooKeeper – координатор
• HDFS – распределенная файловая система
• Сервисы самого HBase поверх HDFS
• Сломаться может везде:
– ZooKeeper может потерять кворум из-за
задержек ответа нод
– Файловая система может потребовать
проверки
– master node может умереть
dev.it-portfolio.net 35
Как обеспечивать устойчивость?
• Подстроить сетевые таймауты
• Поставить рядом второй кластер и делать
репликацию данных на него
• Либо быть готовым к проверке файловой
системы в ручном автоматическом режиме
• Дублировать master node
dev.it-portfolio.net 36
Так в ручном или не в ручном?
• А что может сломаться на файловой
системе, когда вышестоящие сервисы
обеспечивают strong consistency?
• Write-ahead logs
• Что-то потеряли в WALs?
– Картинка №1!
• Автоматическая проверка – хорошо, но
может быть долго
dev.it-portfolio.net 37
Перспективный план
• Научиться ломать HBase
• Научиться чинить HBase
• Научиться редко ломать HBase
• Научиться быстро чинить HBase
• ????????
• В октябре прочитать про это большой
доклад
dev.it-portfolio.net 38
В анонсе было про Node.JS
• Каково назначение Node.JS в
инфраструктуре?
• Генерировать непонятные эксепшны вида
[2013-04-19 22:21:41.987] [FATAL] daemon - !! Unhandled exception !! TypeError: Object [object Object] has no method 'destroy'
at onclose (stream.js:74:10)
at EventEmitter.emit (events.js:115:20)
at RequestStream.destroy (/opt/node-server/lib/http_server.js:220:7)
at IncomingMessage.onclose (stream.js:74:10)
at IncomingMessage.EventEmitter.emit (events.js:115:20)
at abortIncoming (http.js:1649:11)
at CleartextStream.serverSocketCloseListener (http.js:1659:5)
at CleartextStream.EventEmitter.emit (events.js:115:20)
at SecurePair.destroy (tls.js:907:22)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
dev.it-portfolio.net 39
Лист ненависти
• Прочь с моего облака! (с) The Rolling Stones
• Node.JS есть? А если найду?
• Крокфорда читали?
• Node.JS был выбран, «потому что он
быстрый»
• Анекдот про скорость печати в 400
символов в минуту
• Use statically typed languages, Luke!
dev.it-portfolio.net 40
Выводы
• Абсолютное большинство проблем – не в
софте, а в голове
• Надо только вовремя понять, в чьей (в
своей, или в голове разработчика сервиса)
• Если вы берете в проект сервис, вам
придется на нем жениться быть готовым
поддерживать его код
• Очень важно помнить про картинку №1
dev.it-portfolio.net 41
Пора закругляться
• Если погода хорошая – поблагодарить
• Если погода плохая – извиниться за то, что
пришлось ее испортить
• Вопросы?
• Голосуйте за меня на http://devconf.ru/offers
• http://twitter.com/noatbaksap
• http://github.com/alexclear
dev.it-portfolio.net 42

More Related Content

PPTX
Daemons In Web on #devrus
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
PDF
Что нового в MySQL 8.0? / Дмитрий Ленев (Oracle)
PDF
MySQL: чек-лист для новичка в highload (Cвета Cмирнова, Aнастасия Распопина ...
PPTX
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
PDF
NoSQL — неспроста ли это "ЖЖЖ"?
PPTX
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
PDF
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
Daemons In Web on #devrus
Всему своё время / Роман Ивлиев (Банки.ру)
Что нового в MySQL 8.0? / Дмитрий Ленев (Oracle)
MySQL: чек-лист для новичка в highload (Cвета Cмирнова, Aнастасия Распопина ...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
NoSQL — неспроста ли это "ЖЖЖ"?
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)

What's hot (20)

PDF
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
PPTX
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
PPTX
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
PPTX
Тестируем производительность распределённых систем, Александр Киров (Parallels)
PPTX
Организация надежного резервного копирования веб-проекта. Практика и подводны...
PDF
Хорошо поддерживаемое приложение
PDF
How to cook a blockchain and not get burned
PPTX
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
PDF
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
PDF
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
PDF
ZFS - файловая система будущего
PPTX
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
PPTX
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
PPTX
Оптимизация производительности нагруженных веб-систем на Java
PDF
My talk on PgDay Russia 2014
PDF
Cоциальный граф "Одноклассников" в myTarget
PDF
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
PDF
RTB DSP на языке Go: укрощение buzzwords
PDF
My talk on administering PostgreSQL
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Тестируем производительность распределённых систем, Александр Киров (Parallels)
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Хорошо поддерживаемое приложение
How to cook a blockchain and not get burned
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
ZFS - файловая система будущего
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Оптимизация производительности нагруженных веб-систем на Java
My talk on PgDay Russia 2014
Cоциальный граф "Одноклассников" в myTarget
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
RTB DSP на языке Go: укрощение buzzwords
My talk on administering PostgreSQL
Ad

Viewers also liked (6)

PPTX
Асинхронная обработка данных: RabbitMQ, Comet
PPTX
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
PPTX
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
PPTX
презентация по очередям
PPTX
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
PDF
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Асинхронная обработка данных: RabbitMQ, Comet
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
презентация по очередям
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Ad

Similar to 20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения (Redis, RabbitMQ, Skytools, Node.JS, HBase)", Александр Чистяков (20)

PPT
Быстрое масштабирование систем
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
PDF
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
PPT
Гайк Закарян Выбор платформ на основе анализа крупных интернет проектов
PDF
High load2007 scaling-web-applications-rus
PDF
Технологии больших веб проектов завтра и послезавтра
PPT
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
PPT
Web20 from zero
PPT
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
PDF
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
PDF
Распространенные ошибки применения баз данных
PDF
PDF
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
PDF
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
PPTX
Little Service in 2h
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PDF
Не все базы данных одинаково полезны
PDF
Не все базы данных одинаково полезны
PDF
Выступление Сергея Аверина, Badoo, на High Performance Conference
Быстрое масштабирование систем
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Гайк Закарян Выбор платформ на основе анализа крупных интернет проектов
High load2007 scaling-web-applications-rus
Технологии больших веб проектов завтра и послезавтра
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Web20 from zero
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Распространенные ошибки применения баз данных
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
Little Service in 2h
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Не все базы данных одинаково полезны
Не все базы данных одинаково полезны
Выступление Сергея Аверина, Badoo, на High Performance Conference

More from IT-Portfolio (11)

PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
PPT
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
PPTX
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
PPT
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...
PPTX
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...
PPT
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...

20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения (Redis, RabbitMQ, Skytools, Node.JS, HBase)", Александр Чистяков

  • 1. Демоны в большом проекте – проблемы и их решения Александр Чистяков Младший системный администратор Cezurity [email protected] 2013 dev.it-portfolio.net
  • 2. Кто я? • Топ-менеджер РАО ЕЭС • Муж певицы Глюк’оZa • Подрабатываю в компании Cezurity системным администратором dev.it-portfolio.net 2
  • 3. Кто вы? • 91.89% - Windows users • 6.94% - OS X users • 1.17% - Linux users • Вы слышали про компьютерные вирусы? • Если не слышали, вирус – это такая программа для устаревших операционных систем, несанкционированно модифицирующая их работу dev.it-portfolio.net 3
  • 4. Отказ от ответственности • Верите презентациям на слово? картинка №1 (очень важная) dev.it-portfolio.net 4
  • 5. Чем занимается Cezurity? • Создание облачного антивируса • Целевая аудитория – те самые 91.89% • Как мы уже выяснили, Windows в зале ни у кого нет, поэтому речь пойдет не об антивирусе, а о • ВЫСОКИХ НАГРУЗКАХ dev.it-portfolio.net 5
  • 6. Что такое высокие нагрузки? • Как установили ученые (британские), еще викинги занимались созданием высоконагруженных сайтов, они просто не знали, что это – высоконагруженные сайты • Высокие нагрузки – это когда вам позвонили среди ночи, сообщить о том, что все упало • Где нагрузка выше: VK или Одоклассники? dev.it-portfolio.net 6
  • 7. Как викинги делали сайты? • Методология “Фигак-фигак и в продакшн” • У веб проекта должна быть архитектура! • Со времен викингов проще жить не стало dev.it-portfolio.net 7
  • 8. А что такое архитектура? • Веб-проект состоит из квадратиков • Квадратики можно найти в сети и скачать! • Если скачивать все найденные в сети квадратики, к окончанию проекта успеете • Многообразие квадратиков порождает комбинаторный взрыв, следовательно • Нужно знать, какие квадратики скачать! dev.it-portfolio.net 8
  • 9. Откуда мы знаем, что скачивать? • “Берите тот дистрибутив Linux, который стоит у вашего районного Linux-гуру” • “Никто не был уволен за покупку Cisco” • “Вся бытовая техника в доме должна быть одного производителя” • …и тому подобная чушь dev.it-portfolio.net 9
  • 10. Откуда мы знаем, что скачивать? • А мы не знаем • Некоторые квадратики попадают в проект, потому что у команды есть предыдущий опыт с ними (или языком/платформой) • Некоторые квадратики попадают в проект после сравнения свойств нескольких кандидатов и выбора наиболее подходящего dev.it-portfolio.net 10
  • 11. Архитектура типичного веб-проекта • Сервер приложений (неинтересно) • Reverse-proxy (тривиально) • СУБД (товарищеский матч MySQL vs PostgreSQL на стульях и швабрах в перерыве) • ORM (расшифровывается как “я не знаю SQL”) • Кэш dev.it-portfolio.net 11
  • 12. Архитектура нетипичного веб-проекта • СУБД? (schemaless document-oriented fast scalable fault-tolerant near-realtime web2.0- ready modern not-only-SQL storage) • Очереди • Шардинг • BigData – Аналитика dev.it-portfolio.net 12
  • 13. Итого, что нам было нужно • СУБД?! (SQL or NoSQL? SQL and NoSQL? SQL xor NoSQL?) • Очереди • Шардинг • Кэш • BigData dev.it-portfolio.net 13
  • 14. Техническая археология • Проекту больше года, ключевые сервисы уже на своих местах • Попытка осмыслить пути выбора составляющих архитектуры и оценить достоинства и недостатки dev.it-portfolio.net 14
  • 15. SQL and NoSQL • Необходимость не только писать данные в базу, но еще и гарантированно читать их обратно => старый добрый SQL • Необходимость не просто читать данные, но делать это быстро => рассмотрение современных NoSQL решений • Необходимость хранить данных больше, чем влезает на один сервер (и на 2, и на 3) dev.it-portfolio.net 15
  • 16. Очереди • Варианты: – ActiveMQ (мир делится на Java-программистов и не Java-программистов, среднего нет) – RabbitMQ (5 баллов за маркетинг) – ZeroMQ (не сервис, а библиотека) – Kestrel (слова “a port of Starling from Ruby to Scala” звучат как приговор) – Beanstalkd (кто-нибудь в зале слышал?) • Выбор пал на RabbitMQ dev.it-portfolio.net 16
  • 17. Впечатления Java-программиста • Попытка прочесть и понять спецификацию AMQP вызывает судороги • Ни одна клиентская библиотека толком не реализует поддержку AMQP keepalive • Большая часть клиентских библиотек похожа на студенческие курсовые • Erlang – очень простой язык • RabbitMQ чаще работает, чем не работает dev.it-portfolio.net 17
  • 18. Проблемы • Написан на Erlang – надо знать Erlang • Можно попробовать не знать Erlang, но тогда конфигурация и эксплуатация RabbitMQ будет вызывать неприятие • Не можете понять Erlang – картинка №1! • Очереди в памяти – при падении данные теряются • Памяти не хватает – все встает dev.it-portfolio.net 18
  • 19. Кто сказал «персистирование»? • У нас уже есть PgQ (SkyTools) • PgQ – это очереди поверх PostgreSQL • Они работают хорошо • Но дисковая подсистема на машинах, где они развернуты, начинает работать плохо • В RabbitMQ - диск лучше? Картинка №1! • Большая часть наших сообщений живут миллисекунды – зачем их персистировать? dev.it-portfolio.net 19
  • 20. Шардинг • PL/Proxy – проект, позволяющий организовать шардинг с использованием хранимых процедур на PL • (Как вы уже, наверное, догадались, мы используем PostgreSQL) dev.it-portfolio.net 20
  • 21. Впечатления Java-программиста • Хранимые процедуры это древнее зло – Их сложно читать и понимать – Их сложно отлаживать – Сложно анализировать slow query log, так как там не запросы, а вызовы хранимок • К счастью, шардинг с помощью PL/Proxy (пока) работает как часы • (Кстати, PL/Proxy используется в Skype) dev.it-portfolio.net 21
  • 22. Кэш • Варианты: – memcached (в названии есть слово “cache”) – Redis (в названии нет слова “cache”) – MongoDB (“MongoDB is web scale!”) – Membase/Couchbase (в названии все время разные слова, И ЭТО НЕСПРОСТА, все мои попытки внедрить Membase заканчивались срочной эвакуацией с него) dev.it-portfolio.net 22
  • 23. Memcached • Очевидный выбор • С точки зрения топ-менеджера РАО ЕЭС представляет собой slab allocator с lock-free структурами данных, MVCC и evented I/O • Просто работает, причем, у многих • Не поддерживает объединение ключей в множества (тегирование ключей, списки) dev.it-portfolio.net 23
  • 24. Redis • Второй очевидный выбор • Поддерживает списки • Может работать как кэш, а может – как БД • По умолчанию сохраняет данные на диск dev.it-portfolio.net 24
  • 25. MongoDB • Судя по деталям реализации, была написана викингами • У нас отсутствует достаточный запас боевых мухоморов, чтобы пытаться внедрить продукт, технические решения в котором долгое время противоречили здравому смыслу (no WAL, global lock, random crashes и другие атрибуты web2.0-ready решения) dev.it-portfolio.net 25
  • 26. Неочевидный вариант • MySQL + HandlerSocket • Не рассматривался никем, кроме меня – все-таки, у антивирусной компании потоки данных совсем не такие, как у типичного веб-проекта • Поэтому писать на диск данные из кэша нам не надо – «горячие» данные все время разные dev.it-portfolio.net 26
  • 27. Итак, Redis • Сначала мы пытались использовать его еще и как базу (без вытеснения) • Два типа данных – с установленным expiration date и персистентные • Когда место в памяти заканчивается, Redis перестает записывать данные • Почему заканчивается место в памяти? • Redis ведет slow log (у нас до 400-600 Mb) dev.it-portfolio.net 27
  • 28. Redis – итоговые настройки • Вытеснять все без разбора: – maxmemory-policy allkeys-lru • Ничего не сохранять на диск: #save • (Кстати, Redis долго читает состояние с диска при рестартах, если оно есть) • Если сохранение на диск было отключено не сразу, надо стереть дамп • slowlog-log-slower-than -10000 dev.it-portfolio.net 28
  • 29. Redis – после внедрения • Мы не используем репликацию (нет смысла в силу особенности бизнеса) • Мы храним данные в разных базах одного инстанса и в нескольких разных инстансах • Активно используем списки • Мы не сразу нашли, куда расходуется память, и даже хотели ее профайлить • В целом, мы довольны dev.it-portfolio.net 29
  • 30. BigData • Антивирусная компания – это очень много данных, даже когда клиентов мало • Данные нужно не только записать, но и прочитать • И не только прочитать, но и обработать • Например, если в файле обнаружен новый вирус, нужно сообщить всем клиентам, у которых был такой файл dev.it-portfolio.net 30
  • 31. BigData • Нельзя просто взять, и сложить все на одну машину • Варианты: – RIAK, Cassandra, MongoDB, ТЫСЯЧИ ИХ (eventually consistent == eventually inconsistent) – HBase (strongly consistent) – Vertica (стоит денег) – Greenplum (стоит денег) dev.it-portfolio.net 31
  • 32. HBase - развертывание • Раньше я ничего не говорил про это, так как развертывание Redis, RabbitMQ, memcached, etc - тривиально • HBase развернуть тоже несложно – сначала нужен ZooKeeper cluster • Стойте, как я сказал, «несложно»? • 5 сервисов на мастер-ноде, по 3 на слейвах • 8 кукбуков в Chef dev.it-portfolio.net 32
  • 33. Стоп, а что это все-таки, HBase? • Это такое key-value хранилище • В котором ключи сохраняют отношение порядка • Потому что используется LSM tree • Позволяет извлекать данные не только по конкретным ключам, но и делать range scans • На уровне отдельной строки - атомарность dev.it-portfolio.net 33
  • 34. HBase – эксплуатация • Ручки у HBase везде, и крутить их можно в разные стороны • Мы пока начинаем, и настраивали только region size и max KeyValue size в сторону увеличения • Клиенты у нас на Python, работают через Thrift • Thrift-сервер требует больше памяти, чем мог бы (Java-программист во мне смеется) dev.it-portfolio.net 34
  • 35. Из чего состоит HBase? • ZooKeeper – координатор • HDFS – распределенная файловая система • Сервисы самого HBase поверх HDFS • Сломаться может везде: – ZooKeeper может потерять кворум из-за задержек ответа нод – Файловая система может потребовать проверки – master node может умереть dev.it-portfolio.net 35
  • 36. Как обеспечивать устойчивость? • Подстроить сетевые таймауты • Поставить рядом второй кластер и делать репликацию данных на него • Либо быть готовым к проверке файловой системы в ручном автоматическом режиме • Дублировать master node dev.it-portfolio.net 36
  • 37. Так в ручном или не в ручном? • А что может сломаться на файловой системе, когда вышестоящие сервисы обеспечивают strong consistency? • Write-ahead logs • Что-то потеряли в WALs? – Картинка №1! • Автоматическая проверка – хорошо, но может быть долго dev.it-portfolio.net 37
  • 38. Перспективный план • Научиться ломать HBase • Научиться чинить HBase • Научиться редко ломать HBase • Научиться быстро чинить HBase • ???????? • В октябре прочитать про это большой доклад dev.it-portfolio.net 38
  • 39. В анонсе было про Node.JS • Каково назначение Node.JS в инфраструктуре? • Генерировать непонятные эксепшны вида [2013-04-19 22:21:41.987] [FATAL] daemon - !! Unhandled exception !! TypeError: Object [object Object] has no method 'destroy' at onclose (stream.js:74:10) at EventEmitter.emit (events.js:115:20) at RequestStream.destroy (/opt/node-server/lib/http_server.js:220:7) at IncomingMessage.onclose (stream.js:74:10) at IncomingMessage.EventEmitter.emit (events.js:115:20) at abortIncoming (http.js:1649:11) at CleartextStream.serverSocketCloseListener (http.js:1659:5) at CleartextStream.EventEmitter.emit (events.js:115:20) at SecurePair.destroy (tls.js:907:22) at process.startup.processNextTick.process._tickCallback (node.js:244:9) dev.it-portfolio.net 39
  • 40. Лист ненависти • Прочь с моего облака! (с) The Rolling Stones • Node.JS есть? А если найду? • Крокфорда читали? • Node.JS был выбран, «потому что он быстрый» • Анекдот про скорость печати в 400 символов в минуту • Use statically typed languages, Luke! dev.it-portfolio.net 40
  • 41. Выводы • Абсолютное большинство проблем – не в софте, а в голове • Надо только вовремя понять, в чьей (в своей, или в голове разработчика сервиса) • Если вы берете в проект сервис, вам придется на нем жениться быть готовым поддерживать его код • Очень важно помнить про картинку №1 dev.it-portfolio.net 41
  • 42. Пора закругляться • Если погода хорошая – поблагодарить • Если погода плохая – извиниться за то, что пришлось ее испортить • Вопросы? • Голосуйте за меня на http://devconf.ru/offers • http://twitter.com/noatbaksap • http://github.com/alexclear dev.it-portfolio.net 42