SlideShare a Scribd company logo
1 of 42
Download to read offline
Нетрадиционный (not gay)
PostgreSQL: хранение
бинарных данных в БД
Хорошие, плохие и ужасные стороны
и борьба за эффективность
Александр Чистяков,
главный инженер Git in Sky,
2014
Давайте познакомимся
§ Меня зовут Саша
§ Я работаю главным инженером в Git in Sky
§ Когда программа заболевает, ее приносят ко мне
§ Я пытаюсь поставить диагноз и назначить
лечение до того, как программа умрет
§ Чаще всего это удается
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Теперь ваша очередь
§ Как ваше здоровье?
§ Принимаете PostgreSQL?
§ Злоупотребляете веб-разработкой?
§ Пишете на PHP?
§ Какие другие вредные привычки имеете?
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Больной, задержите дыхание!
§ http://slideshare.net/profyclub_ru/08-6
§ ^ карточка пациента (передана из детской
поликлиники)
§ Жалобы на головную боль у специалистов
отдела эксплуатации
§ То есть, у нас, а мы не любим, когда болит
голова
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Итак, что нам известно?
§ Заказчик — конструктор сайтов,
http://www.setup.ru
§ Пользовательский контент хранится в базе
данных (угадайте, какая СУБД?)
§ Для работы с большими файлами
используется large objects API
§ Приложение на Perl под Apache + mod_perl
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
История болезни
§ Количество файлов: было 6 млн, стало 207
млн (85, если не учитывать версионность)
§ Размер индексов: был 2Gb, стал десятки Gb
§ Скорость синхронизации упала с 100
файлов/сек до примерно 30 файлов/сек
§ Объем базы данных на дисках на момент
начала лечения: 6Tb (сейчас уже 7Tb)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Может, просто переписать это всё?
§ Исходно у нас не было достаточно знаний о
том, как работает текущая реализация
§ Но было бизнес-требование обеспечить
атомарную публикацию групп файлов
§ Где транзакции — там и СУБД
§ Или другое транзакционное хранилище
§ Много вы знаете NoSQL хранилищ с
поддержкой транзакций на несколько строк?
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Объекты предметной области (и таблицы)
§ Таблица domains — имена доменов
§ Таблица content — метаинформация о файле (время
последнего изменения и путь)
§ Таблица stat — сами бинарные данные и их sha-1 хэш для
дедупликации
§ Таблица deleted — признак того, что файл удален
§ Все четыре таблицы связаны между собой
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Пользовательские сценарии
§ Публикация и синхронизация файлов:
§ Сайт публикуется всегда на одну и ту же ноду
§ Кастомный синхронизатор медленно
обновляет все остальные ноды
§ Отдача статического контента:
§ Отдаем а) последнюю, б) неудаленную
версию
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
На что жалуетесь, больной?
§ Файлы отдаются недостаточно быстро (50
миллисекунд в лучшем случае)
§ Публикация, а, особенно, синхронизация
работают медленно
§ Железо справляется недостаточно хорошо,
судя по графикам основных параметров
§ Да, все это происходит в Hetzner
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Солидный хостинг для солидных господ
§ Было: RAID0 из 2*3Tb SATA, 16Gb RAM, 128Gb SSD — для pg_temp
и nginx, сортировка в PostgreSQL и буферизация в nginx
работают быстро
§ Стало: RAID10 из 4*4Tb SATA, 48Gb RAM, SSD не дают ни за какие
деньги, хотя место в корпусе физически еще есть (добро
пожаловать в Hetzner!)
§ С точки зрения производительности стало хуже, чем было, но
надо как-то жить с этим, на 6Tb база уже не поместится
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Как поставить диагноз?
§ Как это делается обычно:
§ slow queries log
§ pgFouine или pgBadger, генерация отчетов
раз в период
§ Анализ отчетов, анализ планов долгих
запросов
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Если подумать, все еще проще
§ pgFouine и pgBadger все равно не справятся с
логом — запросов слишком много
§ Количество разных запросов ограничено, так
как система очень проста, два самых
популярных при отдаче и синхронизации -
“найти неудаленный файл” и “найти, что
синхронизировать”
§ Используют views, тормозят, их и нужно лечить
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
План запроса отдачи файла
§
§
§
§
§
§
§ Не так плохо, как обычно бывает, но и не так хорошо, как может быть
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Как будем лечить?
§ Традиционный способ — материализация view
§ У нас PostgreSQL 9.2, там нет materialized views
§ Но их можно эмулировать с помощью триггеров!
§ Глава из книги “Enterprise Rails” с примером
находится на второй странице в Google по
запросу “postgresql materialized views triggers”
§ Так и сделаем!
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Применять по рецепту врача
§ “Поверх” обычного view делается таблица с такими же
полями, как у view
§ Она работает как кэш — записи в ней заводятся по запросу
§ Сначала ищем в ней, потом в исходном view, если не нашлось
в ней (и не забываем найденное класть в нее)
§ Записи в таблице-кэше инвалидируются триггерами на всех
таблицах-участниках исходного view
§ Вместо инвалидации можно делать сразу апдейт кэша
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Нужен хороший термометр
§ pgFouine и pgBadger не подходят — ресурсоемки,
медленны, долго ждать результат, в лог
медленных запросов могут попасть не все
нужные запросы
§ Расширение pg_stat_statements
§ Позволяет накапливать и анализировать
статистику в реальном времени
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Как пользоваться pg_stat_statements?
§ CREATE EXTENSION pg_stat_statements;
§ SELECT
(total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time,
calls, query
FROM pg_stat_statements
ORDER BY total_minutes/average_time desc;
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Что будет видно на приборах?
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Стало ли нам хорошо?
§ Принцип работает — таблица кэширует
§ Процент непопаданий слишком высок — 30-40%
§ После суток ожидания он не изменился — где-то
должна быть ошибка!
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Знание — сила!
§ Шаблон “посмотреть в кэширующей таблице, а
потом во view” не очень хорошо работает для
веба
§ Если запрашиваемого контента нет вообще
(404), то кэш для таких запросов работать не
будет — мы нагружаем view лишней работой
§ Надо быстро определять, есть ли у нас вообще
запрашиваемый файл
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Стало ли лучше теперь?
§ Ночью — 15 мс на SQL в среднем
§ Днем — 40-50 мс на SQL в среднем
§ Железо, несмотря на улучшения, все равно
работает на грани возможного
§ Проблема еще в том, что логику приложения я
меняю ночью, а результат надо смотреть
днем
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Термометра мало, нужна МРТ-установка
§ Нас интересует время отдачи контента, а не
просто время SQL-запроса
§ Его нужно измерять на эппсервере
§ Варианты: Zabbix, Graphite/StatsD
§ http://goo.gl/x6If1S
§ ^ Ansible playbook для установки Graphite и
StatsD
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Zabbix убивает!
§ Никогда не используйте Zabbix!
§ Нет времени объяснять, просто не делайте
этого
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Как устроен Graphite/StatsD стек
§ Dashboard (сначала я пользовался
стандартным от Graphite)
§ Веб-сервис отдачи графиков (на
Python/Django)
§ Коллектор с RRD-like хранилищем, которое
называется Whisper (тоже на Python)
§ Агрегатор/препроцессор с UDP-
интерфейсом (собственно, StatsD)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Имплементации StatsD-сервера
§ Исходно — Node.JS
§ Есть на C, Perl, Ruby, Python, Go, ...
§ Сначала я взял Python
§ Потом был Perl, сейчас я перехожу на Go (меньше памяти, быстрее)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Вернемся к нашему пациенту
§ 70-120 миллисекунд в среднем и 150+
миллисекунд — upper 90%
§ Как быть?
§ Мы же про СУБД говорим, давайте построим
индексы!
§ Как мы это будем делать?
§ “Один запрос — один индекс на таблицу”
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Скальпель, спирт, огурец!
§ Для самого частого запроса был построен
индекс на все три столбца, на которые
наложены условия в WHERE
§ После этого пациент чуть не умер! :)
§ Вскрытие показало, что размер нового
индекса — 18Gb, и он просто не
помещается в память в нужном для
нормальной работы объеме
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Дефибриллятор!
§ Одно из полей в индексе - varchar
§ Превращаем varchar в int:
§ http://stackoverflow.com/a/9812029/601572
§ Да, у меня однажды был клиент, который не
любил хранимые процедуры и триггеры
§ Его бизнес успешно умер, отчасти, именно
поэтому
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Принимать по рецепту врача
§ Вот что было по ссылке:
§ create function h_int(text) returns int as $$
select ('x'||substr(md5($1),1,8))::bit(32)::int;
$$ language sql;
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Читаем план запроса
§ SET enable_bitmapscan=false; <= старые добрые nested loops
SELECT something
FROM stat s JOIN domains d ON d.id = s.domain JOIN content c ON c.id = s.content
LEFT JOIN deleted e ON e.id = s.id
WHERE d.name = domname
AND h_int(s.name) = h_int(filename) <= работает новый маленький индекс
AND s.name = filename
AND date_part('epoch'::text, s.ptime) = filerev
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Здоров ли пациент?
§ Размер индекса: 18Gb => 8Gb
§ Среднее время выполнения SQL запроса:
стало 20-25 мс
§ Среднее время отдачи контента — 40-50
мс
§ Upper 90% - стало 100 мс
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Температура больного (Graphite)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Температура больного (Zabbix)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Переходим к ужасному
§ PL/pgSQL — это ужасно, особенно, в
моем исполнении
§ Процедура отдачи файла занимала две
трети экрана, после всех оптимизаций
стала занимать два экрана
§ Естественно, я допустил в ней ошибку
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Разрезать и зашить заново
§ При проверке существования файла я
получал id файла и решил ускорить бы
обращение ко view (по PK)
§ Оказалось, мне возвращался целый
массив ключей
§ Поэтому после оптимизации клиенты
стали видеть старый контент
§ Исправил это — убрал нагрузку с машин!
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Еще немного про PL/pgSQL
§ Я так и не смог найти, как сконструировать
программно множество из нуля строк
(всегда получалось из одной почему-то),
поэтому для получения такого множества
просто завел специальную пустую таблицу с
нужным списком полей
§ Кстати, из PL/Perl я мог бы слать метрики в
StatsD, но Perl я тоже что-то не очень...
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Новые болезни
§ Как я уже говорил, база растет, а максимум
доступного нам места — чуть меньше 8Tb,
поэтому нужен был выход
§ Теперь я уже знал логику приложения, и
обнаружил, что large objects никогда не
переписываются, а всегда записываются
заново с новым id
§ Это же object storage!
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
Как не надо читать большую таблицу
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
§ Осталось просто переложить большие объекты в другое место, но...
Как надо читать большую таблицу
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
§ MVCC хранилище не знает, делая index scan, какие из строк живы,
поэтому очень болезненно относится к большим значениям
OFFSET — лучше накладывайте условия на значения самого ключа,
а не на порядковый номер записи
Выводы:
§ Вылечить программу гораздо проще, чем
человека (я рассказал об очень простых
вещах, правда ведь?)
§ PostgreSQL лучше, чем MySQL
§ Чем лучше? Чем MySQL!
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
С вами был Александр Чистяков,
главный инженер Git in Sky
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!

More Related Content

What's hot

My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017Alex Chistyakov
 
Benchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSDBenchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSDAlex Chistyakov
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Anton Baranov
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016Alex Chistyakov
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)Ontico
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераDaniel Podolsky
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Николай Лавлинский
 
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...Ontico
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Ontico
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Ontico
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Ontico
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsDaniel Podolsky
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеAlexandr Krasheninnikov
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Ontico
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Ontico
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013Roman Pavlushko
 

What's hot (20)

My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
 
Benchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSDBenchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSD
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного Хецнера
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 

Viewers also liked

My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14
My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14
My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14Alex Chistyakov
 
My talk on Hadoop stack operations engineering at OSPCon
My talk on Hadoop stack operations engineering at OSPConMy talk on Hadoop stack operations engineering at OSPCon
My talk on Hadoop stack operations engineering at OSPConAlex Chistyakov
 
Управление рисками при эксплуатации ИТ-инфраструктуры
Управление рисками при эксплуатации ИТ-инфраструктурыУправление рисками при эксплуатации ИТ-инфраструктуры
Управление рисками при эксплуатации ИТ-инфраструктурыSerguei Gitinsky
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25Alex Chistyakov
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) АксеновAlex Chistyakov
 
Ansible in the enterprise
Ansible in the enterpriseAnsible in the enterprise
Ansible in the enterpriseAlex Chistyakov
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014Alex Chistyakov
 
My talk on Piter Py 2016
My talk on Piter Py 2016My talk on Piter Py 2016
My talk on Piter Py 2016Alex Chistyakov
 
My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016Alex Chistyakov
 
My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015Alex Chistyakov
 
My talk on monitoring systems at RootConf 2016
My talk on monitoring systems at RootConf 2016My talk on monitoring systems at RootConf 2016
My talk on monitoring systems at RootConf 2016Alex Chistyakov
 
NoSQL — неспроста ли это "ЖЖЖ"?
NoSQL — неспроста ли это "ЖЖЖ"?NoSQL — неспроста ли это "ЖЖЖ"?
NoSQL — неспроста ли это "ЖЖЖ"?Daniel Podolsky
 
My talk at Linux Piter 2015
My talk at Linux Piter 2015My talk at Linux Piter 2015
My talk at Linux Piter 2015Alex Chistyakov
 
План на февраль 2016
План на февраль 2016План на февраль 2016
План на февраль 2016supportfranco
 
PHP performance 101: so you need to use a database
PHP performance 101: so you need to use a databasePHP performance 101: so you need to use a database
PHP performance 101: so you need to use a databaseLeon Fayer
 
Building a DevOps Team that isn't Evil
Building a DevOps Team that isn't EvilBuilding a DevOps Team that isn't Evil
Building a DevOps Team that isn't EvilIBM UrbanCode Products
 
No you are not a DevOps engineer
No you are not a DevOps engineerNo you are not a DevOps engineer
No you are not a DevOps engineerMike Kavis
 

Viewers also liked (20)

My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14
My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14
My talk on using LVM thin provisioning from SPbLUG/DevOps-40 meetup 25.06.14
 
Using Ansible
Using AnsibleUsing Ansible
Using Ansible
 
My talk on Hadoop stack operations engineering at OSPCon
My talk on Hadoop stack operations engineering at OSPConMy talk on Hadoop stack operations engineering at OSPCon
My talk on Hadoop stack operations engineering at OSPCon
 
Управление рисками при эксплуатации ИТ-инфраструктуры
Управление рисками при эксплуатации ИТ-инфраструктурыУправление рисками при эксплуатации ИТ-инфраструктуры
Управление рисками при эксплуатации ИТ-инфраструктуры
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
 
Ansible in the enterprise
Ansible in the enterpriseAnsible in the enterprise
Ansible in the enterprise
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014
 
On Docker
On DockerOn Docker
On Docker
 
My talk on Piter Py 2016
My talk on Piter Py 2016My talk on Piter Py 2016
My talk on Piter Py 2016
 
My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016
 
My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015
 
My talk on monitoring systems at RootConf 2016
My talk on monitoring systems at RootConf 2016My talk on monitoring systems at RootConf 2016
My talk on monitoring systems at RootConf 2016
 
NoSQL — неспроста ли это "ЖЖЖ"?
NoSQL — неспроста ли это "ЖЖЖ"?NoSQL — неспроста ли это "ЖЖЖ"?
NoSQL — неспроста ли это "ЖЖЖ"?
 
My talk at Linux Piter 2015
My talk at Linux Piter 2015My talk at Linux Piter 2015
My talk at Linux Piter 2015
 
План на февраль 2016
План на февраль 2016План на февраль 2016
План на февраль 2016
 
PHP performance 101: so you need to use a database
PHP performance 101: so you need to use a databasePHP performance 101: so you need to use a database
PHP performance 101: so you need to use a database
 
Building a DevOps Team that isn't Evil
Building a DevOps Team that isn't EvilBuilding a DevOps Team that isn't Evil
Building a DevOps Team that isn't Evil
 
No you are not a DevOps engineer
No you are not a DevOps engineerNo you are not a DevOps engineer
No you are not a DevOps engineer
 
DevOps Unicorns
DevOps UnicornsDevOps Unicorns
DevOps Unicorns
 

Similar to My talk on PgDay Russia 2014

HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...Alexey Zinoviev
 
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...HappyDev
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Yandex
 
Диагностика postgresql для системного администратора
Диагностика postgresql для системного администратораДиагностика postgresql для системного администратора
Диагностика postgresql для системного администратораNikolay Sivko
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезныSergey Xek
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
Выступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceВыступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceEYevseyeva
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезныSergey Xek
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхSergey Xek
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Badoo Development
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхSergey Xek
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Ontico
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comOntico
 
Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014Alex Chistyakov
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014Alex Chistyakov
 
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFSHappyDev
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusVladd Ev
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Ontico
 

Similar to My talk on PgDay Russia 2014 (20)

HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...
 
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
 
Диагностика postgresql для системного администратора
Диагностика postgresql для системного администратораДиагностика postgresql для системного администратора
Диагностика postgresql для системного администратора
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
Pgconfru 2015 kosmodemiansky
Pgconfru 2015 kosmodemianskyPgconfru 2015 kosmodemiansky
Pgconfru 2015 kosmodemiansky
 
Выступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceВыступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance Conference
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данных
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данных
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.com
 
Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014
 
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rus
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
 

More from Alex Chistyakov

My slides from DevOpsDays 2019
My slides from DevOpsDays 2019My slides from DevOpsDays 2019
My slides from DevOpsDays 2019Alex Chistyakov
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019My slides from BMM №3 May 2019
My slides from BMM №3 May 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 Alex Chistyakov
 
My slides from SECR'2018
My slides from SECR'2018My slides from SECR'2018
My slides from SECR'2018Alex Chistyakov
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtMy slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtAlex Chistyakov
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019Alex Chistyakov
 
Configuration management and Kubernetes
Configuration management and KubernetesConfiguration management and Kubernetes
Configuration management and KubernetesAlex Chistyakov
 
Python performance engineering in 2017
Python performance engineering in 2017Python performance engineering in 2017
Python performance engineering in 2017Alex Chistyakov
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMMy talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMAlex Chistyakov
 
My talk on GitHub open data at ITGM #10
 My talk on GitHub open data at ITGM #10 My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10Alex Chistyakov
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017Alex Chistyakov
 
My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017Alex Chistyakov
 

More from Alex Chistyakov (20)

My slides from DevOpsDays 2019
My slides from DevOpsDays 2019My slides from DevOpsDays 2019
My slides from DevOpsDays 2019
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019My slides from BMM №3 May 2019
My slides from BMM №3 May 2019
 
My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019
 
My slides from SECR'2018
My slides from SECR'2018My slides from SECR'2018
My slides from SECR'2018
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtMy slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArt
 
My slides from CC'2019
My slides from CC'2019My slides from CC'2019
My slides from CC'2019
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019
 
Configuration management and Kubernetes
Configuration management and KubernetesConfiguration management and Kubernetes
Configuration management and Kubernetes
 
Ansible and other stuff
Ansible and other stuffAnsible and other stuff
Ansible and other stuff
 
Python performance engineering in 2017
Python performance engineering in 2017Python performance engineering in 2017
Python performance engineering in 2017
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMMy talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGM
 
My talk at SECR 2017
My talk at SECR 2017My talk at SECR 2017
My talk at SECR 2017
 
On scaling teams
On scaling teamsOn scaling teams
On scaling teams
 
MariaDB workshop
MariaDB workshopMariaDB workshop
MariaDB workshop
 
Docker for JS people
Docker for JS peopleDocker for JS people
Docker for JS people
 
My talk on GitHub open data at ITGM #10
 My talk on GitHub open data at ITGM #10 My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017
 
My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017
 

My talk on PgDay Russia 2014

  • 1. Нетрадиционный (not gay) PostgreSQL: хранение бинарных данных в БД Хорошие, плохие и ужасные стороны и борьба за эффективность Александр Чистяков, главный инженер Git in Sky, 2014
  • 2. Давайте познакомимся § Меня зовут Саша § Я работаю главным инженером в Git in Sky § Когда программа заболевает, ее приносят ко мне § Я пытаюсь поставить диагноз и назначить лечение до того, как программа умрет § Чаще всего это удается Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 3. Теперь ваша очередь § Как ваше здоровье? § Принимаете PostgreSQL? § Злоупотребляете веб-разработкой? § Пишете на PHP? § Какие другие вредные привычки имеете? Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 4. Больной, задержите дыхание! § http://slideshare.net/profyclub_ru/08-6 § ^ карточка пациента (передана из детской поликлиники) § Жалобы на головную боль у специалистов отдела эксплуатации § То есть, у нас, а мы не любим, когда болит голова Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 5. Итак, что нам известно? § Заказчик — конструктор сайтов, http://www.setup.ru § Пользовательский контент хранится в базе данных (угадайте, какая СУБД?) § Для работы с большими файлами используется large objects API § Приложение на Perl под Apache + mod_perl Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 6. История болезни § Количество файлов: было 6 млн, стало 207 млн (85, если не учитывать версионность) § Размер индексов: был 2Gb, стал десятки Gb § Скорость синхронизации упала с 100 файлов/сек до примерно 30 файлов/сек § Объем базы данных на дисках на момент начала лечения: 6Tb (сейчас уже 7Tb) Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 7. Может, просто переписать это всё? § Исходно у нас не было достаточно знаний о том, как работает текущая реализация § Но было бизнес-требование обеспечить атомарную публикацию групп файлов § Где транзакции — там и СУБД § Или другое транзакционное хранилище § Много вы знаете NoSQL хранилищ с поддержкой транзакций на несколько строк? Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 8. Объекты предметной области (и таблицы) § Таблица domains — имена доменов § Таблица content — метаинформация о файле (время последнего изменения и путь) § Таблица stat — сами бинарные данные и их sha-1 хэш для дедупликации § Таблица deleted — признак того, что файл удален § Все четыре таблицы связаны между собой Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 9. Пользовательские сценарии § Публикация и синхронизация файлов: § Сайт публикуется всегда на одну и ту же ноду § Кастомный синхронизатор медленно обновляет все остальные ноды § Отдача статического контента: § Отдаем а) последнюю, б) неудаленную версию Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 10. На что жалуетесь, больной? § Файлы отдаются недостаточно быстро (50 миллисекунд в лучшем случае) § Публикация, а, особенно, синхронизация работают медленно § Железо справляется недостаточно хорошо, судя по графикам основных параметров § Да, все это происходит в Hetzner Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 11. Солидный хостинг для солидных господ § Было: RAID0 из 2*3Tb SATA, 16Gb RAM, 128Gb SSD — для pg_temp и nginx, сортировка в PostgreSQL и буферизация в nginx работают быстро § Стало: RAID10 из 4*4Tb SATA, 48Gb RAM, SSD не дают ни за какие деньги, хотя место в корпусе физически еще есть (добро пожаловать в Hetzner!) § С точки зрения производительности стало хуже, чем было, но надо как-то жить с этим, на 6Tb база уже не поместится Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 12. Как поставить диагноз? § Как это делается обычно: § slow queries log § pgFouine или pgBadger, генерация отчетов раз в период § Анализ отчетов, анализ планов долгих запросов Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 13. Если подумать, все еще проще § pgFouine и pgBadger все равно не справятся с логом — запросов слишком много § Количество разных запросов ограничено, так как система очень проста, два самых популярных при отдаче и синхронизации - “найти неудаленный файл” и “найти, что синхронизировать” § Используют views, тормозят, их и нужно лечить Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 14. План запроса отдачи файла § § § § § § § Не так плохо, как обычно бывает, но и не так хорошо, как может быть Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 15. Как будем лечить? § Традиционный способ — материализация view § У нас PostgreSQL 9.2, там нет materialized views § Но их можно эмулировать с помощью триггеров! § Глава из книги “Enterprise Rails” с примером находится на второй странице в Google по запросу “postgresql materialized views triggers” § Так и сделаем! Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 16. Применять по рецепту врача § “Поверх” обычного view делается таблица с такими же полями, как у view § Она работает как кэш — записи в ней заводятся по запросу § Сначала ищем в ней, потом в исходном view, если не нашлось в ней (и не забываем найденное класть в нее) § Записи в таблице-кэше инвалидируются триггерами на всех таблицах-участниках исходного view § Вместо инвалидации можно делать сразу апдейт кэша Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 17. Нужен хороший термометр § pgFouine и pgBadger не подходят — ресурсоемки, медленны, долго ждать результат, в лог медленных запросов могут попасть не все нужные запросы § Расширение pg_stat_statements § Позволяет накапливать и анализировать статистику в реальном времени Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 18. Как пользоваться pg_stat_statements? § CREATE EXTENSION pg_stat_statements; § SELECT (total_time / 1000 / 60) as total_minutes, (total_time/calls) as average_time, calls, query FROM pg_stat_statements ORDER BY total_minutes/average_time desc; Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 19. Что будет видно на приборах? Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 20. Стало ли нам хорошо? § Принцип работает — таблица кэширует § Процент непопаданий слишком высок — 30-40% § После суток ожидания он не изменился — где-то должна быть ошибка! Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 21. Знание — сила! § Шаблон “посмотреть в кэширующей таблице, а потом во view” не очень хорошо работает для веба § Если запрашиваемого контента нет вообще (404), то кэш для таких запросов работать не будет — мы нагружаем view лишней работой § Надо быстро определять, есть ли у нас вообще запрашиваемый файл Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 22. Стало ли лучше теперь? § Ночью — 15 мс на SQL в среднем § Днем — 40-50 мс на SQL в среднем § Железо, несмотря на улучшения, все равно работает на грани возможного § Проблема еще в том, что логику приложения я меняю ночью, а результат надо смотреть днем Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 23. Термометра мало, нужна МРТ-установка § Нас интересует время отдачи контента, а не просто время SQL-запроса § Его нужно измерять на эппсервере § Варианты: Zabbix, Graphite/StatsD § http://goo.gl/x6If1S § ^ Ansible playbook для установки Graphite и StatsD Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 24. Zabbix убивает! § Никогда не используйте Zabbix! § Нет времени объяснять, просто не делайте этого Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 25. Как устроен Graphite/StatsD стек § Dashboard (сначала я пользовался стандартным от Graphite) § Веб-сервис отдачи графиков (на Python/Django) § Коллектор с RRD-like хранилищем, которое называется Whisper (тоже на Python) § Агрегатор/препроцессор с UDP- интерфейсом (собственно, StatsD) Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 26. Имплементации StatsD-сервера § Исходно — Node.JS § Есть на C, Perl, Ruby, Python, Go, ... § Сначала я взял Python § Потом был Perl, сейчас я перехожу на Go (меньше памяти, быстрее) Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 27. Вернемся к нашему пациенту § 70-120 миллисекунд в среднем и 150+ миллисекунд — upper 90% § Как быть? § Мы же про СУБД говорим, давайте построим индексы! § Как мы это будем делать? § “Один запрос — один индекс на таблицу” Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 28. Скальпель, спирт, огурец! § Для самого частого запроса был построен индекс на все три столбца, на которые наложены условия в WHERE § После этого пациент чуть не умер! :) § Вскрытие показало, что размер нового индекса — 18Gb, и он просто не помещается в память в нужном для нормальной работы объеме Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 29. Дефибриллятор! § Одно из полей в индексе - varchar § Превращаем varchar в int: § http://stackoverflow.com/a/9812029/601572 § Да, у меня однажды был клиент, который не любил хранимые процедуры и триггеры § Его бизнес успешно умер, отчасти, именно поэтому Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 30. Принимать по рецепту врача § Вот что было по ссылке: § create function h_int(text) returns int as $$ select ('x'||substr(md5($1),1,8))::bit(32)::int; $$ language sql; Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 31. Читаем план запроса § SET enable_bitmapscan=false; <= старые добрые nested loops SELECT something FROM stat s JOIN domains d ON d.id = s.domain JOIN content c ON c.id = s.content LEFT JOIN deleted e ON e.id = s.id WHERE d.name = domname AND h_int(s.name) = h_int(filename) <= работает новый маленький индекс AND s.name = filename AND date_part('epoch'::text, s.ptime) = filerev Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 32. Здоров ли пациент? § Размер индекса: 18Gb => 8Gb § Среднее время выполнения SQL запроса: стало 20-25 мс § Среднее время отдачи контента — 40-50 мс § Upper 90% - стало 100 мс Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 33. Температура больного (Graphite) Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 34. Температура больного (Zabbix) Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 35. Переходим к ужасному § PL/pgSQL — это ужасно, особенно, в моем исполнении § Процедура отдачи файла занимала две трети экрана, после всех оптимизаций стала занимать два экрана § Естественно, я допустил в ней ошибку Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 36. Разрезать и зашить заново § При проверке существования файла я получал id файла и решил ускорить бы обращение ко view (по PK) § Оказалось, мне возвращался целый массив ключей § Поэтому после оптимизации клиенты стали видеть старый контент § Исправил это — убрал нагрузку с машин! Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 37. Еще немного про PL/pgSQL § Я так и не смог найти, как сконструировать программно множество из нуля строк (всегда получалось из одной почему-то), поэтому для получения такого множества просто завел специальную пустую таблицу с нужным списком полей § Кстати, из PL/Perl я мог бы слать метрики в StatsD, но Perl я тоже что-то не очень... Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 38. Новые болезни § Как я уже говорил, база растет, а максимум доступного нам места — чуть меньше 8Tb, поэтому нужен был выход § Теперь я уже знал логику приложения, и обнаружил, что large objects никогда не переписываются, а всегда записываются заново с новым id § Это же object storage! Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 39. Как не надо читать большую таблицу Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014 § Осталось просто переложить большие объекты в другое место, но...
  • 40. Как надо читать большую таблицу Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014 § MVCC хранилище не знает, делая index scan, какие из строк живы, поэтому очень болезненно относится к большим значениям OFFSET — лучше накладывайте условия на значения самого ключа, а не на порядковый номер записи
  • 41. Выводы: § Вылечить программу гораздо проще, чем человека (я рассказал об очень простых вещах, правда ведь?) § PostgreSQL лучше, чем MySQL § Чем лучше? Чем MySQL! Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
  • 42. С вами был Александр Чистяков, главный инженер Git in Sky alex@gitinsky.com http://gitinsky.com http://meetup.com/DevOps-40 Пожалуйста, ваши вопросы. Спасибо за внимание!