SlideShare a Scribd company logo
Оптимизация
производительности большой
унаследованной PostgreSQL
базы
Электропрохладительный
кислотный тест
Александр Чистяков,
главный инженер Git in Sky,
2014
Кто я?
§ Меня зовут Саша
§ Я инженер, главный инженер
§ В компании Git in Sky
§ Я люблю оптимизировать производительность
§ Потому что это как волшебная сказка!
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Где я? Кто вы?
§ Любите волшебные сказки?
§ Пришли послушать про базу данных?
§ Пришли послушать про оптимизацию производительности?
§ Разрабатываете проекты для веб?
§ Поддерживаете проекты в веб?
§ У вас уже есть PostgreSQL?
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
О чем речь?
§ Доклад в жанре “field report”
§ Если угодно - “trip report” (см. подназвание доклада)
§ Предыстория: http://www.slideshare.net/profyclub_ru/08-6
§ Однажды ко мне в дверь постучал
добрый волшебник
§ И все заверте...
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Краткое содержание предыдущих серий
§ Заказчик — конструктор сайтов http://setup.ru
§ Пользовательский статический контент (файлы) хранится в
базе данных (PostgreSQL)
§ Для больших файлов используются large objects
§ Приложение на Perl, работает под Apache + mod_perl
§ Переходим из 2012-го года в 2014-й, и...
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Наше время
§ Было 6 миллионов файлов в базе — стало 207 миллионов (с
версиями)/85 миллионов (без версий)
§ Времена, когда индексы были 2Gb, давно прошли
§ Синхронизация тоже не 100 файлов в секунду, а в лучшем
случае 80, обычно — от 20 до 50
§ База данных занимает на дисках ~6Tb
§ И объем будет только расти
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Почему не ...?
§ Россия — страна советов! (Каждый суслик — агроном!)
§ “Работает — не трогай” (на самом деле, нет, но)
§ У решений могут быть бизнес-причины
§ TIMTOWTDI! (Кстати, Perl же!)
§ Один из путей — “долго и дорого”
(“никогда и дорого”?)
§ Вывод очевиден?
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Все же, почему не ...?
§ OpenStack Swif
§ Elliptics
§ Ceph, MogileFS, MooseFS, whatever
§ Слово “кислотный” из подзаголовка (Atomicity, Consistency, etc)
§ Либо делать групповую транзакцию в бизнес-логике
(переписать всё приложение)
§ Либо транзакции берет на себя хранилище
^ Много ли мы знаем таких хранилищ?
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Объекты предметной области и базы
§ Таблица domains — содержит имена доменов, пример —
setup.ru
§ Таблица content — содержит метаинформацию о файле (время
последнего изменения, на основании которого принимается
решение об актуальности бинарных данных)
§ Таблица stat — содержит собственно сами бинарные данные и
их sha1-хэш (дедупликация!)
§ Таблица deleted — содержит признак того, что файл был удален
§ Итого, у нас есть четыре связанных между собой таблицы
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Пользовательские сценарии
§ Публикация и синхронизация файлов:
§ Публикуем изменения всегда на одну и ту же ноду
§ Иначе пользователь будет видеть старый контент
§ Кастомный синхронизатор не очень быстро
распространяет изменения на все узлы
§ Отдача статического контента:
§ Нужно отдавать а) последнюю, б) неудаленную версию
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Что не очень хорошо?
§ Отдача работает не очень быстро
§ Публикация и синхронизация работают не очень быстро
§ Существующее железо справляется не очень хорошо
§ Пара слов о железе:
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Полный Хетцнер!
§ Исходно — RAID0 на 2*3Tb SATA диска, 16G RAM, RAID1 на 2
SSD для pg_temp и временных файлов nginx — сортировка
и объединение таблиц в PostgreSQL и буферизация в nginx
работают быстро
§ Переезд на RAID10 4*4Tb SATA диска (стало не хватать места),
48G RAM
§ Несмотря на наличие технической возможности, поставить
SSD под кэш или временные файлы больше нельзя —
добро пожаловать в Хетцнер!
§ ^ Надо как-то жить с этим
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Есть ли у вас план, мистер Фикс?
§ Как это делается обычно:
§ slow queries log
§ pgFouine или pgBadger
§ Раз в сутки (или даже чаще) — красивый рейтинг «плохих»
запросов статистика с победителями
§ Смотрим план (опять это слово!) запроса
§ Кто знает, что такое “план запроса”?
§ Кто не знает — тот тоже оптимизатор
(но поисковый)
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
За спичками
§ Дело не выглядит сложным, кстати:
§ “Найти неудаленный файл” при отдаче - это запрос к
view
§ “Найти данные для синхронизации” - это тоже запрос к
view
§ Это самые распространенные запросы
§ Их планы и надо смотреть и оптимизировать
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
And the Oscar goes to...
§ А вот и план, о котором мы так долго говорили:
§
§
§
§
§
§ Что-то он какой-то большой
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Чрезвычайные и срочные меры
§ Материализовать нематериализованный view!
§ PostgreSQL 9.2 — нет “родной” поддержки materialized view
§ ^ не беда
§ В книге “Enterprise Rails” отлично описано, как эмулировать
materialized view при помощи триггеров
§ BTW WTF is “Enterprise Rails”?
§ У нас опять есть план — чего же мы ждем?
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Кстати, как это работает?
§ Буквально в двух словах (explain to me like I'm five years old):
§ “Поверх” нематериализованного view делается таблица
с такими же полями
§ Она работает как кэш — записи в ней создаются по
запросу
§ Сначала идем в эту таблицу, потом во view, если там не
нашлось
§ Записи инвалидируется при помощи триггеров на всех
таблицах-участниках исходного view
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Все сделал как в книге!
§ Надо как-то проверить, что все удалось?
§ Честно скажу, pgBadger и pgFouine я не трогал вообще
§ Потому что slow log нерепрезентативен и не отражает динамику
§ Расширение pg_stat_statements
§ ^ должно быть включено у всех без исключения
на планете Земля
§ Позволяет смотреть статистику в реальном времени
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
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
pg_stat_statements
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Вскрытие показало
§ Кэширующая таблица действительно работает
§ Примерно 30-40% запросов не попадает в кэш
§ ^ Хорошо, надо подождать
§ На второй день ожидания ситуация не изменилась
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Знай и люби бизнес-логику!
§ Алгоритм:
§ Посмотреть в таблице
§ Посмотреть в исходном view (долго)
§ А что, если такого файла вообще нет?
§ 30-40 процентов запросов — к файлам, которых вообще
нет
§ Зачем ходить во view за ними?
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Наступило утро, проснулся комиссар
§ Ночью — 15 миллисекунд в среднем
§ Днем — 40-50 миллисекунд в среднем
§ Вносить изменения лучше ночью
§ Но результат будет известен только в середине дня!
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Наступило утро, проснулся комиссар
§ Ночью — 15 миллисекунд в среднем
§ Днем — 40-50 миллисекунд в среднем
§ Вносить изменения лучше ночью
§ Но результат будет известен только в середине дня!
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Возвращение целесообразности
§ Наша главная метрика — время отдачи контента
пользователю!
§ При чем тут pg_stat_statements?
§ Zabbix
§ Graphite/StatsD
§ https://github.com/alexclear/ansible-graphite-playbook
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Мониторинг/графики
Мониторинг нормального человека Мониторинг курильщика
Zabbix Cacti, Munin+NAGIOS
StatsD/Graphite Riemann+Collectd
NAGIOS passive checks
Мониторинг алкоголика Мониторинг наркомана
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Мониторинг/графики
Мониторинг нормального человека Мониторинг курильщика
Zabbix Cacti, Munin+NAGIOS
StatsD/Graphite Riemann+Collectd
NAGIOS passive checks
Мониторинг алкоголика Мониторинг наркомана
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Еще пара слов про Zabbix
§ Ворон
Каркнул:
НИКОГДА!
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Ogres have layers
§ Graphite/StatsD stack:
§ Dashboard (тысячи их, я просто взял стандартный, он
плох)
§ Веб-интерфейс отдачи графиков (на Django)
§ Collector w/RRD-like storage (Carbon)
§ Aggregator/preprocessor w/UDP interface (StatsD)
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
StatsD implementation
§ На Go, Node.JS, Python, Perl, C, ... (тысячи их)
§ Сначала я взял Python:
§ ^ Автобус не придет
§ Старый добрый Perl!
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Покой нам только снится
§ Снится не покой, а те самые 40-50 миллисекунд, которые не
хотят уменьшаться
§ Что делать?
§ Как обычно, построить более подходящие индексы
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Момент истины
§ Для самого частого запроса построен хороший индекс на три
столбца (до того был — на два столбца, а исходно был на
один столбец)
§ В этот момент все стало еще хуже :)
§ Размер индекса — 18 гигабайт
§ Все предыдущие докладчики, наверняка, говорили, что
маленький индекс лучше, чем большой
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
One size does not fit all
§ Один из столбцов, по которому построен индекс — varchar
§ Превращаем varchar в int:
§ http://stackoverflow.com/a/9812029/601572
§ 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
Начинаем спать по ночам
§ Индекс занимал 18 гигабайт, стал занимать 8 гигабайт
§ Среднее время выполнения запроса днем в моменты
пиковой нагрузки было 40-50 миллисекунд, стало 20-25
миллисекунд
§ 90% запросов обслуживаются за 100 миллисекунд (время от
момента начала обработки запроса Perl-приложением до
момента конца обработки, включает все SQL-запросы)
§ В среднем запрос обслуживается приложением за 50 мс
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Мы строили-строили, и, наконец...
§ ...и, наконец:
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Zabbix strikes back
§ ...и, наконец:
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
Выводы:
§ «Теория малых дел», внезапно, работает
^ несмотря на свой почтенный возраст
§ Ломать — не строить!
§ Знание — сила!
§ Учение Маркса всесильно, потому что оно
верно!
§ Кажется, я не туда пишу...
§ В планах — шардинг, да
Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
С вами был Александр Чистяков,
главный инженер Git in Sky
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за понимание!

More Related Content

What's hot (20)

Пряморукий DNS: делаем правильно / Лев Николаев (Макснет)
Пряморукий DNS: делаем правильно / Лев Николаев (Макснет)
Ontico
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014
Alex Chistyakov
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Anton Baranov
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
Переосмысливая подход к инфраструктурному коду / Евгений Пивень (IPONWEB)
Переосмысливая подход к инфраструктурному коду / Евгений Пивень (IPONWEB)
Ontico
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Fwdays
 
Continuousdelivery
Continuousdelivery
Ivan Evtukhovich
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload
Yehor Herasymchuk
 
SaltStack vs Chef, HappyDev 2013
SaltStack vs Chef, HappyDev 2013
Alex Chistyakov
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Ontico
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
Ontico
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
Alex Chistyakov
 
Sivko
Sivko
kuchinskaya
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Пряморукий DNS: делаем правильно / Лев Николаев (Макснет)
Пряморукий DNS: делаем правильно / Лев Николаев (Макснет)
Ontico
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Chef, Puppet, Salt, Ansible on SECON 2014
Chef, Puppet, Salt, Ansible on SECON 2014
Alex Chistyakov
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Anton Baranov
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
Переосмысливая подход к инфраструктурному коду / Евгений Пивень (IPONWEB)
Переосмысливая подход к инфраструктурному коду / Евгений Пивень (IPONWEB)
Ontico
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Fwdays
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload
Yehor Herasymchuk
 
SaltStack vs Chef, HappyDev 2013
SaltStack vs Chef, HappyDev 2013
Alex Chistyakov
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Ontico
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
Ontico
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
Alex Chistyakov
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 

Viewers also liked (20)

Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...
Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...
Tanya Denisyuk
 
Выступление в DataArt на тему "Кто такие DevOps?"
Выступление в DataArt на тему "Кто такие DevOps?"
Alex Chistyakov
 
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в Минске
Alex Chistyakov
 
Мой modern Perl (весенняя встреча Piter United)
Мой modern Perl (весенняя встреча Piter United)
Alex Chistyakov
 
Диалог с воображаемым слушателем, а также поток сознания, вне контекста НЕ ИН...
Диалог с воображаемым слушателем, а также поток сознания, вне контекста НЕ ИН...
Alex Chistyakov
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014
Alex Chistyakov
 
DevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFo
Alex Chistyakov
 
My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017
Alex Chistyakov
 
HBase on HappyDev 2013
HBase on HappyDev 2013
Alex Chistyakov
 
My talk at CEE-SECR 2016
My talk at CEE-SECR 2016
Alex Chistyakov
 
Harry Potter and the Daemons of Berkeley
Harry Potter and the Daemons of Berkeley
Alex Chistyakov
 
My talk at LVEE 2016
My talk at LVEE 2016
Alex Chistyakov
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016
Alex Chistyakov
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
Alex Chistyakov
 
HBase on Dev{Highload}
HBase on Dev{Highload}
Alex Chistyakov
 
My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014
Alex Chistyakov
 
My talk on Piter Py 2016
My talk on Piter Py 2016
Alex Chistyakov
 
My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016
Alex Chistyakov
 
On Docker
On Docker
Alex Chistyakov
 
Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...
Максим Барышников, Что такое типовые проблемы нагруженных проектов и как их р...
Tanya Denisyuk
 
Выступление в DataArt на тему "Кто такие DevOps?"
Выступление в DataArt на тему "Кто такие DevOps?"
Alex Chistyakov
 
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в Минске
Alex Chistyakov
 
Мой modern Perl (весенняя встреча Piter United)
Мой modern Perl (весенняя встреча Piter United)
Alex Chistyakov
 
Диалог с воображаемым слушателем, а также поток сознания, вне контекста НЕ ИН...
Диалог с воображаемым слушателем, а также поток сознания, вне контекста НЕ ИН...
Alex Chistyakov
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014
Alex Chistyakov
 
DevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFo
Alex Chistyakov
 
My talk on programming languages at SPbLUG Mar 2017
My talk on programming languages at SPbLUG Mar 2017
Alex Chistyakov
 
My talk at CEE-SECR 2016
My talk at CEE-SECR 2016
Alex Chistyakov
 
Harry Potter and the Daemons of Berkeley
Harry Potter and the Daemons of Berkeley
Alex Chistyakov
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016
Alex Chistyakov
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
Alex Chistyakov
 
My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014
Alex Chistyakov
 
My talk on Piter Py 2016
My talk on Piter Py 2016
Alex Chistyakov
 
My talk from PgConf.Russia 2016
My talk from PgConf.Russia 2016
Alex Chistyakov
 
Ad

Similar to Optimization of a big PostgreSQL database (20)

"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Alex Chistyakov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
pgdayrussia
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
Ontico
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
pgdayrussia
 
PostgreSQL performance recipes
PostgreSQL performance recipes
Alexey Ermakov
 
Postgresql v509
Postgresql v509
luis perez
 
История небольшого успеха с PostgreSQL – Владимир Бородин
История небольшого успеха с PostgreSQL – Владимир Бородин
Yandex
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Nikolay Samokhvalov
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
CodeFest
 
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
it-people
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Ontico
 
Where is the space, Postgres?
Where is the space, Postgres?
Alexey Ermakov
 
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON
 
Hacking PostgreSQL. Обзор архитектуры.
Hacking PostgreSQL. Обзор архитектуры.
Anastasia Lubennikova
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Ontico
 
PostgreSQL on sas/ssd/nvme/nvdimm
PostgreSQL on sas/ssd/nvme/nvdimm
Дмитрий Васильев
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
Nikolay Samokhvalov
 
Postgres
Postgres
Виктор Тыщенко
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Alex Chistyakov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
pgdayrussia
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
Ontico
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
pgdayrussia
 
PostgreSQL performance recipes
PostgreSQL performance recipes
Alexey Ermakov
 
Postgresql v509
Postgresql v509
luis perez
 
История небольшого успеха с PostgreSQL – Владимир Бородин
История небольшого успеха с PostgreSQL – Владимир Бородин
Yandex
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Nikolay Samokhvalov
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
CodeFest
 
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
it-people
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Ontico
 
Where is the space, Postgres?
Where is the space, Postgres?
Alexey Ermakov
 
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON
 
Hacking PostgreSQL. Обзор архитектуры.
Hacking PostgreSQL. Обзор архитектуры.
Anastasia Lubennikova
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Ontico
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
Nikolay Samokhvalov
 
Ad

More from Alex Chistyakov (20)

My slides from DevOpsDays 2019
My slides from DevOpsDays 2019
Alex Chistyakov
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019
Alex Chistyakov
 
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'2018
Alex Chistyakov
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArt
Alex Chistyakov
 
My slides from CC'2019
My slides from CC'2019
Alex Chistyakov
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019
Alex Chistyakov
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019
Alex Chistyakov
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019
Alex Chistyakov
 
Configuration management and Kubernetes
Configuration management and Kubernetes
Alex Chistyakov
 
Ansible and other stuff
Ansible and other stuff
Alex Chistyakov
 
Python performance engineering in 2017
Python performance engineering in 2017
Alex Chistyakov
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGM
Alex Chistyakov
 
My talk at SECR 2017
My talk at SECR 2017
Alex Chistyakov
 
On scaling teams
On scaling teams
Alex Chistyakov
 
MariaDB workshop
MariaDB workshop
Alex Chistyakov
 
Docker for JS people
Docker for JS people
Alex Chistyakov
 
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 2017
Alex Chistyakov
 
My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10
Alex Chistyakov
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017
Alex Chistyakov
 
My slides from DevOpsDays 2019
My slides from DevOpsDays 2019
Alex Chistyakov
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019
Alex Chistyakov
 
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'2018
Alex Chistyakov
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArt
Alex Chistyakov
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019
Alex Chistyakov
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019
Alex Chistyakov
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019
Alex Chistyakov
 
Configuration management and Kubernetes
Configuration management and Kubernetes
Alex Chistyakov
 
Python performance engineering in 2017
Python performance engineering in 2017
Alex Chistyakov
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGM
Alex Chistyakov
 
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 2017
Alex Chistyakov
 
My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10
Alex Chistyakov
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017
Alex Chistyakov
 

Optimization of a big PostgreSQL database

  • 2. Кто я? § Меня зовут Саша § Я инженер, главный инженер § В компании Git in Sky § Я люблю оптимизировать производительность § Потому что это как волшебная сказка! Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 3. Где я? Кто вы? § Любите волшебные сказки? § Пришли послушать про базу данных? § Пришли послушать про оптимизацию производительности? § Разрабатываете проекты для веб? § Поддерживаете проекты в веб? § У вас уже есть PostgreSQL? Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 4. О чем речь? § Доклад в жанре “field report” § Если угодно - “trip report” (см. подназвание доклада) § Предыстория: http://www.slideshare.net/profyclub_ru/08-6 § Однажды ко мне в дверь постучал добрый волшебник § И все заверте... Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 5. Краткое содержание предыдущих серий § Заказчик — конструктор сайтов http://setup.ru § Пользовательский статический контент (файлы) хранится в базе данных (PostgreSQL) § Для больших файлов используются large objects § Приложение на Perl, работает под Apache + mod_perl § Переходим из 2012-го года в 2014-й, и... Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 6. Наше время § Было 6 миллионов файлов в базе — стало 207 миллионов (с версиями)/85 миллионов (без версий) § Времена, когда индексы были 2Gb, давно прошли § Синхронизация тоже не 100 файлов в секунду, а в лучшем случае 80, обычно — от 20 до 50 § База данных занимает на дисках ~6Tb § И объем будет только расти Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 7. Почему не ...? § Россия — страна советов! (Каждый суслик — агроном!) § “Работает — не трогай” (на самом деле, нет, но) § У решений могут быть бизнес-причины § TIMTOWTDI! (Кстати, Perl же!) § Один из путей — “долго и дорого” (“никогда и дорого”?) § Вывод очевиден? Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 8. Все же, почему не ...? § OpenStack Swif § Elliptics § Ceph, MogileFS, MooseFS, whatever § Слово “кислотный” из подзаголовка (Atomicity, Consistency, etc) § Либо делать групповую транзакцию в бизнес-логике (переписать всё приложение) § Либо транзакции берет на себя хранилище ^ Много ли мы знаем таких хранилищ? Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 9. Объекты предметной области и базы § Таблица domains — содержит имена доменов, пример — setup.ru § Таблица content — содержит метаинформацию о файле (время последнего изменения, на основании которого принимается решение об актуальности бинарных данных) § Таблица stat — содержит собственно сами бинарные данные и их sha1-хэш (дедупликация!) § Таблица deleted — содержит признак того, что файл был удален § Итого, у нас есть четыре связанных между собой таблицы Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 10. Пользовательские сценарии § Публикация и синхронизация файлов: § Публикуем изменения всегда на одну и ту же ноду § Иначе пользователь будет видеть старый контент § Кастомный синхронизатор не очень быстро распространяет изменения на все узлы § Отдача статического контента: § Нужно отдавать а) последнюю, б) неудаленную версию Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 11. Что не очень хорошо? § Отдача работает не очень быстро § Публикация и синхронизация работают не очень быстро § Существующее железо справляется не очень хорошо § Пара слов о железе: Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 12. Полный Хетцнер! § Исходно — RAID0 на 2*3Tb SATA диска, 16G RAM, RAID1 на 2 SSD для pg_temp и временных файлов nginx — сортировка и объединение таблиц в PostgreSQL и буферизация в nginx работают быстро § Переезд на RAID10 4*4Tb SATA диска (стало не хватать места), 48G RAM § Несмотря на наличие технической возможности, поставить SSD под кэш или временные файлы больше нельзя — добро пожаловать в Хетцнер! § ^ Надо как-то жить с этим Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 13. Есть ли у вас план, мистер Фикс? § Как это делается обычно: § slow queries log § pgFouine или pgBadger § Раз в сутки (или даже чаще) — красивый рейтинг «плохих» запросов статистика с победителями § Смотрим план (опять это слово!) запроса § Кто знает, что такое “план запроса”? § Кто не знает — тот тоже оптимизатор (но поисковый) Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 14. За спичками § Дело не выглядит сложным, кстати: § “Найти неудаленный файл” при отдаче - это запрос к view § “Найти данные для синхронизации” - это тоже запрос к view § Это самые распространенные запросы § Их планы и надо смотреть и оптимизировать Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 15. And the Oscar goes to... § А вот и план, о котором мы так долго говорили: § § § § § § Что-то он какой-то большой Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 16. Чрезвычайные и срочные меры § Материализовать нематериализованный view! § PostgreSQL 9.2 — нет “родной” поддержки materialized view § ^ не беда § В книге “Enterprise Rails” отлично описано, как эмулировать materialized view при помощи триггеров § BTW WTF is “Enterprise Rails”? § У нас опять есть план — чего же мы ждем? Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 17. Кстати, как это работает? § Буквально в двух словах (explain to me like I'm five years old): § “Поверх” нематериализованного view делается таблица с такими же полями § Она работает как кэш — записи в ней создаются по запросу § Сначала идем в эту таблицу, потом во view, если там не нашлось § Записи инвалидируется при помощи триггеров на всех таблицах-участниках исходного view Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 18. Все сделал как в книге! § Надо как-то проверить, что все удалось? § Честно скажу, pgBadger и pgFouine я не трогал вообще § Потому что slow log нерепрезентативен и не отражает динамику § Расширение pg_stat_statements § ^ должно быть включено у всех без исключения на планете Земля § Позволяет смотреть статистику в реальном времени Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 19. 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
  • 21. Вскрытие показало § Кэширующая таблица действительно работает § Примерно 30-40% запросов не попадает в кэш § ^ Хорошо, надо подождать § На второй день ожидания ситуация не изменилась Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 22. Знай и люби бизнес-логику! § Алгоритм: § Посмотреть в таблице § Посмотреть в исходном view (долго) § А что, если такого файла вообще нет? § 30-40 процентов запросов — к файлам, которых вообще нет § Зачем ходить во view за ними? Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 23. Наступило утро, проснулся комиссар § Ночью — 15 миллисекунд в среднем § Днем — 40-50 миллисекунд в среднем § Вносить изменения лучше ночью § Но результат будет известен только в середине дня! Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 24. Наступило утро, проснулся комиссар § Ночью — 15 миллисекунд в среднем § Днем — 40-50 миллисекунд в среднем § Вносить изменения лучше ночью § Но результат будет известен только в середине дня! Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 25. Возвращение целесообразности § Наша главная метрика — время отдачи контента пользователю! § При чем тут pg_stat_statements? § Zabbix § Graphite/StatsD § https://github.com/alexclear/ansible-graphite-playbook Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 26. Мониторинг/графики Мониторинг нормального человека Мониторинг курильщика Zabbix Cacti, Munin+NAGIOS StatsD/Graphite Riemann+Collectd NAGIOS passive checks Мониторинг алкоголика Мониторинг наркомана Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 27. Мониторинг/графики Мониторинг нормального человека Мониторинг курильщика Zabbix Cacti, Munin+NAGIOS StatsD/Graphite Riemann+Collectd NAGIOS passive checks Мониторинг алкоголика Мониторинг наркомана Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 28. Еще пара слов про Zabbix § Ворон Каркнул: НИКОГДА! Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 29. Ogres have layers § Graphite/StatsD stack: § Dashboard (тысячи их, я просто взял стандартный, он плох) § Веб-интерфейс отдачи графиков (на Django) § Collector w/RRD-like storage (Carbon) § Aggregator/preprocessor w/UDP interface (StatsD) Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 30. StatsD implementation § На Go, Node.JS, Python, Perl, C, ... (тысячи их) § Сначала я взял Python: § ^ Автобус не придет § Старый добрый Perl! Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 31. Покой нам только снится § Снится не покой, а те самые 40-50 миллисекунд, которые не хотят уменьшаться § Что делать? § Как обычно, построить более подходящие индексы Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 32. Момент истины § Для самого частого запроса построен хороший индекс на три столбца (до того был — на два столбца, а исходно был на один столбец) § В этот момент все стало еще хуже :) § Размер индекса — 18 гигабайт § Все предыдущие докладчики, наверняка, говорили, что маленький индекс лучше, чем большой Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 33. One size does not fit all § Один из столбцов, по которому построен индекс — varchar § Превращаем varchar в int: § http://stackoverflow.com/a/9812029/601572 § create function h_int(text) returns int as $$ select ('x'||substr(md5($1),1,8))::bit(32)::int; $$ language sql; § Забыл сказать — я не боюсь хранимых процедур и триггеров Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 34. После шлифовки отполировать § 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
  • 35. Начинаем спать по ночам § Индекс занимал 18 гигабайт, стал занимать 8 гигабайт § Среднее время выполнения запроса днем в моменты пиковой нагрузки было 40-50 миллисекунд, стало 20-25 миллисекунд § 90% запросов обслуживаются за 100 миллисекунд (время от момента начала обработки запроса Perl-приложением до момента конца обработки, включает все SQL-запросы) § В среднем запрос обслуживается приложением за 50 мс Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 36. Мы строили-строили, и, наконец... § ...и, наконец: Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 37. Zabbix strikes back § ...и, наконец: Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 38. Выводы: § «Теория малых дел», внезапно, работает ^ несмотря на свой почтенный возраст § Ломать — не строить! § Знание — сила! § Учение Маркса всесильно, потому что оно верно! § Кажется, я не туда пишу... § В планах — шардинг, да Оптимизация производительности большой унаследованной PostgreSQL базы. 2014
  • 39. С вами был Александр Чистяков, главный инженер Git in Sky [email protected] http://gitinsky.com http://meetup.com/DevOps-40 Пожалуйста, ваши вопросы. Спасибо за понимание!