PostgreSQL в высоконагруженных проектах
Васильев Алексей Юрьевич
leopard.in.ua
Ноябрь 2010
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Что такое PostgreSQL?
Введение
PostgreSQL — свободная объектно-реляционная система
управления базами данных (СУБД).
Почему PostgreSQL?
Надежность;
Поддержка БД практически неограниченного размера;
Мощные и надёжные механизмы транзакций и репликации;
Наследование;
Легкая расширяемость;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Введение
Производительность в PostgreSQL
Не используйте настройки
по умолчанию
Используйте актуальную
версию сервера
Тесты производительности
служат для продвижения
конкретных продуктов
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Настройка сервера
Производительность в PostgreSQL
Используемая память:
shared_buffers, work_mem,
maintenance_work_mem
Журнал транзакций и
контрольные точки:
checkpoint_segments, fsync
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Настройка сервера
Производительность в PostgreSQL
Планировщик запросов:
default_statistics_target,
effective_cache_size,
random_page_cost
Сбор статистики:
track_counts,
track_functions,
track_activities
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Выбор оптимальных настроек
Производительность в PostgreSQL
Метод сравнительного
тестирования
pgtune — настройки по
«железу»
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Диски и файловые системы
Производительность в PostgreSQL
Диски: перенос журнала
транзакций, RAID
Файловые системы: Ext3,
Ext4, ReiserFS, XFS
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Оптимизация БД и приложения
Производительность в PostgreSQL
Граммотное
проектирование базы
Наличие быстрых путей
доступа к данным —
индексов
Обход известных проблем
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Что такое масштабирование?
Масштабирование PostgreSQL
Масштабирование — это
процесс обеспечения роста
системы, т.е.
масштабируемости. В свою
очередь,
масштабируемость — это
свойство системы, сохраняя
пропускную способность,
справляться с увеличением
нагрузки при увеличении
определенных ресурсов
системы.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Проблемы
Масштабирование PostgreSQL
Ограничение пропускной
способности чтения
данных
Ограничение пропускной
способности записи данных
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Подходы
Масштабирование PostgreSQL
Вертикальное
масштабирование
Горизонтальное
масштабирование
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Методы
Масштабирование PostgreSQL
Партиционирование (секционирование) таблиц
Репликация
Шардинг
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Партиционирование (секционирование) таблиц
Масштабирование PostgreSQL
Партиционирование (секционирование) — это разбиение
больших структур баз данных (таблицы, индексы) на меньшие
кусочки. PostgreSQL поддерживает два критерия для создания
партиций:
Партиционирование по диапазону значений (range)
Партиционирование по списку значений (list)
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Методы деления данных на партиции
Масштабирование PostgreSQL
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Партиционирование в PostgreSQL
Масштабирование PostgreSQL
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Ошибка партиционирования
Масштабирование PostgreSQL
CHECK ( outletID BETWEEN 100 AND 200 )
CHECK ( outletID BETWEEN 200 AND 300 )
Какой партиции принадлежит число 200?
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Репликация
Масштабирование PostgreSQL
Репликация —механизм
синхронизации содержимого
нескольких копий объекта
(например, содержимого базы
данных). Утилиты для
создания репликации в
PostgreSQL:
Slony-I
pgpool-I/II
Bucardo
Londiste
RubyRep
Потоковая репликация
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Slony-I
Масштабирование PostgreSQL
Особенности:
Мастер/слейв репликация
Работа через триггеры
Возможность потабличной
репликации
Поддержка каскадной
репликации
Поддержка
отказоустойчивости
Недостатки:
Сложная настройка
Добавление узла —
трудоемкая операция
Таблицы должны иметь
primary key
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Londiste
Масштабирование PostgreSQL
Особенности:
Мастер/слейв репликация
Работа через триггеры
Возможность потабличной
репликации
Возможность
двухстороннего сравнения
таблиц
Простота установки и
настройки
Недостатки:
Отсутствие каскадной
репликации
Отсутствие
отказоустойчивости
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Bucardo
Масштабирование PostgreSQL
Особенности:
Мастер/мастер или
Мастер/слейв репликация
Работа через триггеры
Возможность потабличной
репликации
Поддержка каскадной
репликации
Недостатки:
Perl, требуется Pl/PgSQL и
Pl/PerlU
Отсутствие
отказоустойчивости
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
RubyRep
Масштабирование PostgreSQL
Особенности:
Мастер/мастер или
Мастер/слейв репликация
Работа через триггеры
Возможность потабличной
репликации
Простота установки и
настройки
Недостатки:
Ruby, «поедает» память и
процессор при больших
объемах данных
Отсутствие
отказоустойчивости
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Streaming Replication (Потоковая репликация)
Масштабирование PostgreSQL
Особенности:
Из коробки начиная с 9
версии PostgreSQL
Мастер/слейв репликация
Работа через WAL логи
Реплицируется инстанс
PostgreSQL, а не отдельная
база данных (создается
точная копия инстанса
СУБД)
Недостатки:
Отдельно базу данных
реплицировать нельзя
Отсутствие
отказоустойчивости
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
PgPool-II
Масштабирование PostgreSQL
PgPool-II это прослойка,
работающая между серверами
PostgreSQL и клиентами СУБД
PostgreSQL. Она предоставляет
следующие функции:
Объединение соединений
Репликация
Балансировка нагрузки
Ограничение лишних
соединений
Параллельные запросы
Кеширование запросов
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
PgPool-II репликация
Масштабирование PostgreSQL
Минус — падение производительности (синхронная репликация,
блокировка таблицы)
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Пример решения проблемы чтения данных
Масштабирование PostgreSQL
Создание кластера PostgreSQL для решения проблемы чтения
данных:
PgPool-II 3 + PostgreSQL 9
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Взаимодействие PgPool-II 3 с PostgreSQL 9
PgPool-II 3 и PostgreSQL 9
Недостатки потоковой репликации в PostgreSQL 9:
Отсутствие отказоустойчивости
Нет пулов соединений
Нет балансировки нагрузки
Нужно учитывать, какие запросы не принимают слейвы
(INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE и
т.д.)
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Взаимодействие PgPool-II 3 с PostgreSQL 9
PgPool-II 3 и PostgreSQL 9
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Плюсы и минусы
PgPool-II 3 и PostgreSQL 9
Плюсы:
Производительность записи падает незначительно
Отказоустойчивость
Пулы соединений
Балансировка нагрузки — увеличение производительности
на чтение
Минусы:
Асинхронная репликация — хоть и задержка репликации
относительно низкая, могут возникать проблемы при
балансировке
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Новые возможности в pgpool-II 3
PgPool-II 3 и PostgreSQL 9
Новый параметр «sub_mode» для потоковой репликации
Отправка на мастер запросов на запись
Интеллектуальная балансировка нагрузки: проверка
задержки репликации между мастером и слейвом.
Добавление слейвов без остановки pgpool-II
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Обнаружение задержки репликации
PgPool-II 3 и PostgreSQL 9
Обнаружение задержки репликации: как это работает?
(SELECT pg_current_xlog_location())
-
(SELECT pg_last_xlog_receive_location())
=
если результат превышает «delay_threshold» — запрос
отправляется на мастер.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Логирование задержки репликации
PgPool-II 3 и PostgreSQL 9
Параметр «log_standby_delay» может быть:
none: не логировать задержку
if_over_threshold: логировать, если результат превысил
delay_threshold
always: всегда логировать задержку
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Итог
PgPool-II 3 и PostgreSQL 9
Простота в настройке и
обслуживании
Мы можем добавлять
слейв сервера без потери
производительности на
запись
Больше слейв серверов —
больше
производительность на
чтение
Низкая задержка
репликации между
мастером и слейвом
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Шардинг
Масштабирование PostgreSQL
Шардинг — разделение
данных на уровне ресурсов.
Концепция шардинга
заключается в логическом
разделении данных по
различным ресурсам исходя из
требований к нагрузке.
Утилиты для создания
шардинга в PostgreSQL:
PL/Proxy
Sequoia
GridSQL for EnterpriseDB
Advanced Server
Greenplum Database
HadoopDB
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Пулы соединений
Узкие места в PostgreSQL
Мультиплексоры соединений
(программы для создания
пула коннектов) — позволяют
уменьшить накладные расходы
на базу данных, в случае, когда
огромное количество
физических соединений ведет к
падению производительности
PostgreSQL.
PgBouncer
Pgpool
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
PgBouncer
Пулы соединений
Это мультиплексор соединений для PostgreSQL от компании
Skype. Существуют три режима управления:
Session Pooling. Наиболее «вежливый» режим. При
начале сессии клиенту выделяется соединение с сервером
и приписано ему в течение всей сессии.
Transaction Pooling. Клиент владеет соединением с
бакендом только в течение транзакции.
Statement Pooling. Наиболее агрессивный режим.
Соединение с бакендом возвращается назад в пул сразу
после завершения запроса.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Кэширование в PostgreSQL
Узкие места в PostgreSQL
Из коробки данный фукционал не доступен (теряем
транзакционную чистоту происходящего в базе). Но есть такие
средства как:
pgmemcache
pgpool-II (query cache)
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Pgmemcache
Кэширование в PostgreSQL
Pgmemcache — это
PostgreSQL API библиотека на
основе libmemcached для
взаимодействия с memcached.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Анализирование SQL запросов
EXPLAIN [ANALYZE]
pgFouine — это анализатор
log-файлов для PostgreSQL
COPY vs INSERT на
больших объемах данных
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
EXPLAIN ME!
Анализирование SQL запросов
Использование полного просмотра таблицы (seq scan)
Использование наиболее примитивного способа
объединения таблиц (nested loop)
EXPLAIN ANALYZE: нет ли больших отличий в
предполагаемом количестве записей и реально выбранном?
Запрет оптимизатору использовать определённые планы
выполнения для более точного анализа (SET
enable_seqscan=false)
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
PgFouine
Анализирование SQL запросов
ТОП SQL
запросов по
времени
выполнения
ТОП SQL
запросов по
частоте
выполнения
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
B-деревья
Оптимизация структуры БД
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Функциональные индексы
Оптимизация структуры БД
Индекс:
CREATE INDEX foo_name_first_idx ON foo
((lower(substr(foo_name, 1, 1))));
будет использоваться запросами вида:
SELECT * FROM foo WHERE lower(substr(foo_name, 1, 1)) =
’д’;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Частичные индексы (partial indexes)
Оптимизация структуры БД
Индекс:
CREATE INDEX access_log_client_ip_ix ON access_log
(client_ip) WHERE NOT (client_ip > inet ’192.168.100.0’ AND
client_ip < inet ’192.168.100.255’);
будет использоваться запросами вида:
SELECT * FROM access_log WHERE url = ’/index.html’ AND
client_ip = inet ’212.78.10.32’;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Проблема
SELECT count(*) FROM <огромная таблица>
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Проблема
SELECT count(*) FROM <огромная таблица>
Как решить проблему?
Простого решения проблемы, к сожалению, нет :(
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Решение номер один: приблизительное количество
CREATE FUNCTION count_estimate ( query t e x t )
RETURNS integer AS $$
DECLARE
r e c r e c o r d ;
rows integer ;
BEGIN
FOR r e c IN EXECUTE ’EXPLAIN ’ | | query LOOP
rows := substring ( r e c . "QUERY PLAN" FROM ’
rows = ( [ [ : d i g i t : ] ] + ) ’ ) ;
EXIT WHEN rows IS NOT NULL;
END LOOP;
RETURN rows ;
END;
$$ LANGUAGE p l p g s q l VOLATILE STRICT ;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Простой count. Время выполнения - 6,29 сек
psql_platform=# Select count (∗) from s u b s c r i b e r _ e m a i l s ;
count
−−
−−−−−−−−
24449994
(1 row )
Приблизительный count. Время выполнения - 0,08 сек(!!!)
psql_platform=# SELECT count_estimate ( ’ S e l e c t ∗
from s u b s c r i b e r _ e m a i l s ’ ) ;
count_estimate
−−
−−−−−−−−−−−−−−
24450000
(1 row )
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Вариант без создания функции
psql_platform=# SELECT ( r e l t u p l e s ) : : integer FROM pg_class r
WHERE r e l k i n d = ’ r ’ AND relname = ’ s u b s c r i b e r _ e m a i l s ’ ;
count_estimate
−−
−−−−−−−−−−−−−−
24450000
(1 row )
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Вариант номер два
Завести вспомогательную таблицу, хранящую число записей в
огромной таблице. На огромную таблицу повесить триггер,
который будет уменьшать это число в случае удаления записи
и увеличивать в случае вставки.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный count
Оптимизация SQL запросов
Вариант номер два
Завести вспомогательную таблицу, хранящую число записей в
огромной таблице. На огромную таблицу повесить триггер,
который будет уменьшать это число в случае удаления записи
и увеличивать в случае вставки.
Вариант номер три
Повторяем вариант номер два, но данные во вспомогательной
таблице обновляются через определённые промежутки времени
(cron), а не через триггер.
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный DISTINCT
Оптимизация SQL запросов
Проблема. Время выполнения - 12,34 сек
psql_platform=# Select DISTINCT( campaign_id ) from s u b s c r i b e r s
ORDER BY campaign_id ;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Медленный DISTINCT
Оптимизация SQL запросов
Проблема. Время выполнения - 12,34 сек
psql_platform=# Select DISTINCT( campaign_id ) from s u b s c r i b e r s
ORDER BY campaign_id ;
Решение. Время выполнения - 4,04 сек
psql_platform=# Select campaign_id from s u b s c r i b e r s
ORDER BY campaign_id GROUP BY campaign_id ;
Васильев О.Ю. PostgreSQL в высоконагруженных проектах
Вопросы и Ответы
Спасибо за внимание!
Васильев О.Ю. PostgreSQL в высоконагруженных проектах

PostgreSQL в высоконагруженных проектах

  • 1.
    PostgreSQL в высоконагруженныхпроектах Васильев Алексей Юрьевич leopard.in.ua Ноябрь 2010 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 2.
    Что такое PostgreSQL? Введение PostgreSQL— свободная объектно-реляционная система управления базами данных (СУБД). Почему PostgreSQL? Надежность; Поддержка БД практически неограниченного размера; Мощные и надёжные механизмы транзакций и репликации; Наследование; Легкая расширяемость; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 3.
    Введение Производительность в PostgreSQL Неиспользуйте настройки по умолчанию Используйте актуальную версию сервера Тесты производительности служат для продвижения конкретных продуктов Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 4.
    Настройка сервера Производительность вPostgreSQL Используемая память: shared_buffers, work_mem, maintenance_work_mem Журнал транзакций и контрольные точки: checkpoint_segments, fsync Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 5.
    Настройка сервера Производительность вPostgreSQL Планировщик запросов: default_statistics_target, effective_cache_size, random_page_cost Сбор статистики: track_counts, track_functions, track_activities Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 6.
    Выбор оптимальных настроек Производительностьв PostgreSQL Метод сравнительного тестирования pgtune — настройки по «железу» Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 7.
    Диски и файловыесистемы Производительность в PostgreSQL Диски: перенос журнала транзакций, RAID Файловые системы: Ext3, Ext4, ReiserFS, XFS Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 8.
    Оптимизация БД иприложения Производительность в PostgreSQL Граммотное проектирование базы Наличие быстрых путей доступа к данным — индексов Обход известных проблем Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 9.
    Что такое масштабирование? МасштабированиеPostgreSQL Масштабирование — это процесс обеспечения роста системы, т.е. масштабируемости. В свою очередь, масштабируемость — это свойство системы, сохраняя пропускную способность, справляться с увеличением нагрузки при увеличении определенных ресурсов системы. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 10.
    Проблемы Масштабирование PostgreSQL Ограничение пропускной способностичтения данных Ограничение пропускной способности записи данных Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 11.
  • 12.
    Методы Масштабирование PostgreSQL Партиционирование (секционирование)таблиц Репликация Шардинг Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 13.
    Партиционирование (секционирование) таблиц МасштабированиеPostgreSQL Партиционирование (секционирование) — это разбиение больших структур баз данных (таблицы, индексы) на меньшие кусочки. PostgreSQL поддерживает два критерия для создания партиций: Партиционирование по диапазону значений (range) Партиционирование по списку значений (list) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 14.
    Методы деления данныхна партиции Масштабирование PostgreSQL Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 15.
    Партиционирование в PostgreSQL МасштабированиеPostgreSQL Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 16.
    Ошибка партиционирования Масштабирование PostgreSQL CHECK( outletID BETWEEN 100 AND 200 ) CHECK ( outletID BETWEEN 200 AND 300 ) Какой партиции принадлежит число 200? Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 17.
    Репликация Масштабирование PostgreSQL Репликация —механизм синхронизациисодержимого нескольких копий объекта (например, содержимого базы данных). Утилиты для создания репликации в PostgreSQL: Slony-I pgpool-I/II Bucardo Londiste RubyRep Потоковая репликация Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 18.
    Slony-I Масштабирование PostgreSQL Особенности: Мастер/слейв репликация Работачерез триггеры Возможность потабличной репликации Поддержка каскадной репликации Поддержка отказоустойчивости Недостатки: Сложная настройка Добавление узла — трудоемкая операция Таблицы должны иметь primary key Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 19.
    Londiste Масштабирование PostgreSQL Особенности: Мастер/слейв репликация Работачерез триггеры Возможность потабличной репликации Возможность двухстороннего сравнения таблиц Простота установки и настройки Недостатки: Отсутствие каскадной репликации Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 20.
    Bucardo Масштабирование PostgreSQL Особенности: Мастер/мастер или Мастер/слейврепликация Работа через триггеры Возможность потабличной репликации Поддержка каскадной репликации Недостатки: Perl, требуется Pl/PgSQL и Pl/PerlU Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 21.
    RubyRep Масштабирование PostgreSQL Особенности: Мастер/мастер или Мастер/слейврепликация Работа через триггеры Возможность потабличной репликации Простота установки и настройки Недостатки: Ruby, «поедает» память и процессор при больших объемах данных Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 22.
    Streaming Replication (Потоковаярепликация) Масштабирование PostgreSQL Особенности: Из коробки начиная с 9 версии PostgreSQL Мастер/слейв репликация Работа через WAL логи Реплицируется инстанс PostgreSQL, а не отдельная база данных (создается точная копия инстанса СУБД) Недостатки: Отдельно базу данных реплицировать нельзя Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 23.
    PgPool-II Масштабирование PostgreSQL PgPool-II этопрослойка, работающая между серверами PostgreSQL и клиентами СУБД PostgreSQL. Она предоставляет следующие функции: Объединение соединений Репликация Балансировка нагрузки Ограничение лишних соединений Параллельные запросы Кеширование запросов Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 24.
    PgPool-II репликация Масштабирование PostgreSQL Минус— падение производительности (синхронная репликация, блокировка таблицы) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 25.
    Пример решения проблемычтения данных Масштабирование PostgreSQL Создание кластера PostgreSQL для решения проблемы чтения данных: PgPool-II 3 + PostgreSQL 9 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 26.
    Взаимодействие PgPool-II 3с PostgreSQL 9 PgPool-II 3 и PostgreSQL 9 Недостатки потоковой репликации в PostgreSQL 9: Отсутствие отказоустойчивости Нет пулов соединений Нет балансировки нагрузки Нужно учитывать, какие запросы не принимают слейвы (INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE и т.д.) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 27.
    Взаимодействие PgPool-II 3с PostgreSQL 9 PgPool-II 3 и PostgreSQL 9 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 28.
    Плюсы и минусы PgPool-II3 и PostgreSQL 9 Плюсы: Производительность записи падает незначительно Отказоустойчивость Пулы соединений Балансировка нагрузки — увеличение производительности на чтение Минусы: Асинхронная репликация — хоть и задержка репликации относительно низкая, могут возникать проблемы при балансировке Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 29.
    Новые возможности вpgpool-II 3 PgPool-II 3 и PostgreSQL 9 Новый параметр «sub_mode» для потоковой репликации Отправка на мастер запросов на запись Интеллектуальная балансировка нагрузки: проверка задержки репликации между мастером и слейвом. Добавление слейвов без остановки pgpool-II Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 30.
    Обнаружение задержки репликации PgPool-II3 и PostgreSQL 9 Обнаружение задержки репликации: как это работает? (SELECT pg_current_xlog_location()) - (SELECT pg_last_xlog_receive_location()) = если результат превышает «delay_threshold» — запрос отправляется на мастер. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 31.
    Логирование задержки репликации PgPool-II3 и PostgreSQL 9 Параметр «log_standby_delay» может быть: none: не логировать задержку if_over_threshold: логировать, если результат превысил delay_threshold always: всегда логировать задержку Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 32.
    Итог PgPool-II 3 иPostgreSQL 9 Простота в настройке и обслуживании Мы можем добавлять слейв сервера без потери производительности на запись Больше слейв серверов — больше производительность на чтение Низкая задержка репликации между мастером и слейвом Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 33.
    Шардинг Масштабирование PostgreSQL Шардинг —разделение данных на уровне ресурсов. Концепция шардинга заключается в логическом разделении данных по различным ресурсам исходя из требований к нагрузке. Утилиты для создания шардинга в PostgreSQL: PL/Proxy Sequoia GridSQL for EnterpriseDB Advanced Server Greenplum Database HadoopDB Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 34.
    Пулы соединений Узкие местав PostgreSQL Мультиплексоры соединений (программы для создания пула коннектов) — позволяют уменьшить накладные расходы на базу данных, в случае, когда огромное количество физических соединений ведет к падению производительности PostgreSQL. PgBouncer Pgpool Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 35.
    PgBouncer Пулы соединений Это мультиплексорсоединений для PostgreSQL от компании Skype. Существуют три режима управления: Session Pooling. Наиболее «вежливый» режим. При начале сессии клиенту выделяется соединение с сервером и приписано ему в течение всей сессии. Transaction Pooling. Клиент владеет соединением с бакендом только в течение транзакции. Statement Pooling. Наиболее агрессивный режим. Соединение с бакендом возвращается назад в пул сразу после завершения запроса. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 36.
    Кэширование в PostgreSQL Узкиеместа в PostgreSQL Из коробки данный фукционал не доступен (теряем транзакционную чистоту происходящего в базе). Но есть такие средства как: pgmemcache pgpool-II (query cache) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 37.
    Pgmemcache Кэширование в PostgreSQL Pgmemcache— это PostgreSQL API библиотека на основе libmemcached для взаимодействия с memcached. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 38.
    Анализирование SQL запросов EXPLAIN[ANALYZE] pgFouine — это анализатор log-файлов для PostgreSQL COPY vs INSERT на больших объемах данных Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 39.
    EXPLAIN ME! Анализирование SQLзапросов Использование полного просмотра таблицы (seq scan) Использование наиболее примитивного способа объединения таблиц (nested loop) EXPLAIN ANALYZE: нет ли больших отличий в предполагаемом количестве записей и реально выбранном? Запрет оптимизатору использовать определённые планы выполнения для более точного анализа (SET enable_seqscan=false) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 40.
    PgFouine Анализирование SQL запросов ТОПSQL запросов по времени выполнения ТОП SQL запросов по частоте выполнения Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 41.
    B-деревья Оптимизация структуры БД ВасильевО.Ю. PostgreSQL в высоконагруженных проектах
  • 42.
    Функциональные индексы Оптимизация структурыБД Индекс: CREATE INDEX foo_name_first_idx ON foo ((lower(substr(foo_name, 1, 1)))); будет использоваться запросами вида: SELECT * FROM foo WHERE lower(substr(foo_name, 1, 1)) = ’д’; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 43.
    Частичные индексы (partialindexes) Оптимизация структуры БД Индекс: CREATE INDEX access_log_client_ip_ix ON access_log (client_ip) WHERE NOT (client_ip > inet ’192.168.100.0’ AND client_ip < inet ’192.168.100.255’); будет использоваться запросами вида: SELECT * FROM access_log WHERE url = ’/index.html’ AND client_ip = inet ’212.78.10.32’; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 44.
    Медленный count Оптимизация SQLзапросов Проблема SELECT count(*) FROM <огромная таблица> Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 45.
    Медленный count Оптимизация SQLзапросов Проблема SELECT count(*) FROM <огромная таблица> Как решить проблему? Простого решения проблемы, к сожалению, нет :( Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 46.
    Медленный count Оптимизация SQLзапросов Решение номер один: приблизительное количество CREATE FUNCTION count_estimate ( query t e x t ) RETURNS integer AS $$ DECLARE r e c r e c o r d ; rows integer ; BEGIN FOR r e c IN EXECUTE ’EXPLAIN ’ | | query LOOP rows := substring ( r e c . "QUERY PLAN" FROM ’ rows = ( [ [ : d i g i t : ] ] + ) ’ ) ; EXIT WHEN rows IS NOT NULL; END LOOP; RETURN rows ; END; $$ LANGUAGE p l p g s q l VOLATILE STRICT ; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 47.
    Медленный count Оптимизация SQLзапросов Простой count. Время выполнения - 6,29 сек psql_platform=# Select count (∗) from s u b s c r i b e r _ e m a i l s ; count −− −−−−−−−− 24449994 (1 row ) Приблизительный count. Время выполнения - 0,08 сек(!!!) psql_platform=# SELECT count_estimate ( ’ S e l e c t ∗ from s u b s c r i b e r _ e m a i l s ’ ) ; count_estimate −− −−−−−−−−−−−−−− 24450000 (1 row ) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 48.
    Медленный count Оптимизация SQLзапросов Вариант без создания функции psql_platform=# SELECT ( r e l t u p l e s ) : : integer FROM pg_class r WHERE r e l k i n d = ’ r ’ AND relname = ’ s u b s c r i b e r _ e m a i l s ’ ; count_estimate −− −−−−−−−−−−−−−− 24450000 (1 row ) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 49.
    Медленный count Оптимизация SQLзапросов Вариант номер два Завести вспомогательную таблицу, хранящую число записей в огромной таблице. На огромную таблицу повесить триггер, который будет уменьшать это число в случае удаления записи и увеличивать в случае вставки. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 50.
    Медленный count Оптимизация SQLзапросов Вариант номер два Завести вспомогательную таблицу, хранящую число записей в огромной таблице. На огромную таблицу повесить триггер, который будет уменьшать это число в случае удаления записи и увеличивать в случае вставки. Вариант номер три Повторяем вариант номер два, но данные во вспомогательной таблице обновляются через определённые промежутки времени (cron), а не через триггер. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 51.
    Медленный DISTINCT Оптимизация SQLзапросов Проблема. Время выполнения - 12,34 сек psql_platform=# Select DISTINCT( campaign_id ) from s u b s c r i b e r s ORDER BY campaign_id ; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 52.
    Медленный DISTINCT Оптимизация SQLзапросов Проблема. Время выполнения - 12,34 сек psql_platform=# Select DISTINCT( campaign_id ) from s u b s c r i b e r s ORDER BY campaign_id ; Решение. Время выполнения - 4,04 сек psql_platform=# Select campaign_id from s u b s c r i b e r s ORDER BY campaign_id GROUP BY campaign_id ; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  • 53.
    Вопросы и Ответы Спасибоза внимание! Васильев О.Ю. PostgreSQL в высоконагруженных проектах