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

17,734 views

Published on

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

0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
17,734
On SlideShare
0
From Embeds
0
Number of Embeds
694
Actions
Shares
0
Downloads
194
Comments
0
Likes
20
Embeds 0
No embeds

No notes for slide

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

  1. 1. PostgreSQL в высоконагруженных проектах Васильев Алексей Юрьевич leopard.in.ua Ноябрь 2010 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  2. 2. Что такое PostgreSQL? Введение PostgreSQL — свободная объектно-реляционная система управления базами данных (СУБД). Почему PostgreSQL? Надежность; Поддержка БД практически неограниченного размера; Мощные и надёжные механизмы транзакций и репликации; Наследование; Легкая расширяемость; Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  3. 3. Введение Производительность в PostgreSQL Не используйте настройки по умолчанию Используйте актуальную версию сервера Тесты производительности служат для продвижения конкретных продуктов Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  4. 4. Настройка сервера Производительность в PostgreSQL Используемая память: shared_buffers, work_mem, maintenance_work_mem Журнал транзакций и контрольные точки: checkpoint_segments, fsync Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  5. 5. Настройка сервера Производительность в PostgreSQL Планировщик запросов: default_statistics_target, effective_cache_size, random_page_cost Сбор статистики: track_counts, track_functions, track_activities Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  6. 6. Выбор оптимальных настроек Производительность в PostgreSQL Метод сравнительного тестирования pgtune — настройки по «железу» Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  7. 7. Диски и файловые системы Производительность в PostgreSQL Диски: перенос журнала транзакций, RAID Файловые системы: Ext3, Ext4, ReiserFS, XFS Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  8. 8. Оптимизация БД и приложения Производительность в PostgreSQL Граммотное проектирование базы Наличие быстрых путей доступа к данным — индексов Обход известных проблем Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  9. 9. Что такое масштабирование? Масштабирование PostgreSQL Масштабирование — это процесс обеспечения роста системы, т.е. масштабируемости. В свою очередь, масштабируемость — это свойство системы, сохраняя пропускную способность, справляться с увеличением нагрузки при увеличении определенных ресурсов системы. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  10. 10. Проблемы Масштабирование PostgreSQL Ограничение пропускной способности чтения данных Ограничение пропускной способности записи данных Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  11. 11. Подходы Масштабирование PostgreSQL Вертикальное масштабирование Горизонтальное масштабирование Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  12. 12. Методы Масштабирование PostgreSQL Партиционирование (секционирование) таблиц Репликация Шардинг Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  13. 13. Партиционирование (секционирование) таблиц Масштабирование PostgreSQL Партиционирование (секционирование) — это разбиение больших структур баз данных (таблицы, индексы) на меньшие кусочки. PostgreSQL поддерживает два критерия для создания партиций: Партиционирование по диапазону значений (range) Партиционирование по списку значений (list) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  14. 14. Методы деления данных на партиции Масштабирование PostgreSQL Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  15. 15. Партиционирование в PostgreSQL Масштабирование PostgreSQL Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  16. 16. Ошибка партиционирования Масштабирование PostgreSQL CHECK ( outletID BETWEEN 100 AND 200 ) CHECK ( outletID BETWEEN 200 AND 300 ) Какой партиции принадлежит число 200? Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  17. 17. Репликация Масштабирование PostgreSQL Репликация —механизм синхронизации содержимого нескольких копий объекта (например, содержимого базы данных). Утилиты для создания репликации в PostgreSQL: Slony-I pgpool-I/II Bucardo Londiste RubyRep Потоковая репликация Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  18. 18. Slony-I Масштабирование PostgreSQL Особенности: Мастер/слейв репликация Работа через триггеры Возможность потабличной репликации Поддержка каскадной репликации Поддержка отказоустойчивости Недостатки: Сложная настройка Добавление узла — трудоемкая операция Таблицы должны иметь primary key Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  19. 19. Londiste Масштабирование PostgreSQL Особенности: Мастер/слейв репликация Работа через триггеры Возможность потабличной репликации Возможность двухстороннего сравнения таблиц Простота установки и настройки Недостатки: Отсутствие каскадной репликации Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  20. 20. Bucardo Масштабирование PostgreSQL Особенности: Мастер/мастер или Мастер/слейв репликация Работа через триггеры Возможность потабличной репликации Поддержка каскадной репликации Недостатки: Perl, требуется Pl/PgSQL и Pl/PerlU Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  21. 21. RubyRep Масштабирование PostgreSQL Особенности: Мастер/мастер или Мастер/слейв репликация Работа через триггеры Возможность потабличной репликации Простота установки и настройки Недостатки: Ruby, «поедает» память и процессор при больших объемах данных Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  22. 22. Streaming Replication (Потоковая репликация) Масштабирование PostgreSQL Особенности: Из коробки начиная с 9 версии PostgreSQL Мастер/слейв репликация Работа через WAL логи Реплицируется инстанс PostgreSQL, а не отдельная база данных (создается точная копия инстанса СУБД) Недостатки: Отдельно базу данных реплицировать нельзя Отсутствие отказоустойчивости Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  23. 23. PgPool-II Масштабирование PostgreSQL PgPool-II это прослойка, работающая между серверами PostgreSQL и клиентами СУБД PostgreSQL. Она предоставляет следующие функции: Объединение соединений Репликация Балансировка нагрузки Ограничение лишних соединений Параллельные запросы Кеширование запросов Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  24. 24. PgPool-II репликация Масштабирование PostgreSQL Минус — падение производительности (синхронная репликация, блокировка таблицы) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  25. 25. Пример решения проблемы чтения данных Масштабирование PostgreSQL Создание кластера PostgreSQL для решения проблемы чтения данных: PgPool-II 3 + PostgreSQL 9 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  26. 26. Взаимодействие PgPool-II 3 с PostgreSQL 9 PgPool-II 3 и PostgreSQL 9 Недостатки потоковой репликации в PostgreSQL 9: Отсутствие отказоустойчивости Нет пулов соединений Нет балансировки нагрузки Нужно учитывать, какие запросы не принимают слейвы (INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE и т.д.) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  27. 27. Взаимодействие PgPool-II 3 с PostgreSQL 9 PgPool-II 3 и PostgreSQL 9 Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  28. 28. Плюсы и минусы PgPool-II 3 и PostgreSQL 9 Плюсы: Производительность записи падает незначительно Отказоустойчивость Пулы соединений Балансировка нагрузки — увеличение производительности на чтение Минусы: Асинхронная репликация — хоть и задержка репликации относительно низкая, могут возникать проблемы при балансировке Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  29. 29. Новые возможности в pgpool-II 3 PgPool-II 3 и PostgreSQL 9 Новый параметр «sub_mode» для потоковой репликации Отправка на мастер запросов на запись Интеллектуальная балансировка нагрузки: проверка задержки репликации между мастером и слейвом. Добавление слейвов без остановки pgpool-II Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  30. 30. Обнаружение задержки репликации PgPool-II 3 и PostgreSQL 9 Обнаружение задержки репликации: как это работает? (SELECT pg_current_xlog_location()) - (SELECT pg_last_xlog_receive_location()) = если результат превышает «delay_threshold» — запрос отправляется на мастер. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  31. 31. Логирование задержки репликации PgPool-II 3 и PostgreSQL 9 Параметр «log_standby_delay» может быть: none: не логировать задержку if_over_threshold: логировать, если результат превысил delay_threshold always: всегда логировать задержку Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  32. 32. Итог PgPool-II 3 и PostgreSQL 9 Простота в настройке и обслуживании Мы можем добавлять слейв сервера без потери производительности на запись Больше слейв серверов — больше производительность на чтение Низкая задержка репликации между мастером и слейвом Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  33. 33. Шардинг Масштабирование PostgreSQL Шардинг — разделение данных на уровне ресурсов. Концепция шардинга заключается в логическом разделении данных по различным ресурсам исходя из требований к нагрузке. Утилиты для создания шардинга в PostgreSQL: PL/Proxy Sequoia GridSQL for EnterpriseDB Advanced Server Greenplum Database HadoopDB Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  34. 34. Пулы соединений Узкие места в PostgreSQL Мультиплексоры соединений (программы для создания пула коннектов) — позволяют уменьшить накладные расходы на базу данных, в случае, когда огромное количество физических соединений ведет к падению производительности PostgreSQL. PgBouncer Pgpool Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  35. 35. PgBouncer Пулы соединений Это мультиплексор соединений для PostgreSQL от компании Skype. Существуют три режима управления: Session Pooling. Наиболее «вежливый» режим. При начале сессии клиенту выделяется соединение с сервером и приписано ему в течение всей сессии. Transaction Pooling. Клиент владеет соединением с бакендом только в течение транзакции. Statement Pooling. Наиболее агрессивный режим. Соединение с бакендом возвращается назад в пул сразу после завершения запроса. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  36. 36. Кэширование в PostgreSQL Узкие места в PostgreSQL Из коробки данный фукционал не доступен (теряем транзакционную чистоту происходящего в базе). Но есть такие средства как: pgmemcache pgpool-II (query cache) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  37. 37. Pgmemcache Кэширование в PostgreSQL Pgmemcache — это PostgreSQL API библиотека на основе libmemcached для взаимодействия с memcached. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  38. 38. Анализирование SQL запросов EXPLAIN [ANALYZE] pgFouine — это анализатор log-файлов для PostgreSQL COPY vs INSERT на больших объемах данных Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  39. 39. EXPLAIN ME! Анализирование SQL запросов Использование полного просмотра таблицы (seq scan) Использование наиболее примитивного способа объединения таблиц (nested loop) EXPLAIN ANALYZE: нет ли больших отличий в предполагаемом количестве записей и реально выбранном? Запрет оптимизатору использовать определённые планы выполнения для более точного анализа (SET enable_seqscan=false) Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  40. 40. PgFouine Анализирование SQL запросов ТОП SQL запросов по времени выполнения ТОП SQL запросов по частоте выполнения Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  41. 41. B-деревья Оптимизация структуры БД Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  42. 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. 43. Частичные индексы (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 в высоконагруженных проектах
  44. 44. Медленный count Оптимизация SQL запросов Проблема SELECT count(*) FROM <огромная таблица> Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  45. 45. Медленный count Оптимизация SQL запросов Проблема SELECT count(*) FROM <огромная таблица> Как решить проблему? Простого решения проблемы, к сожалению, нет :( Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  46. 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. 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. 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. 49. Медленный count Оптимизация SQL запросов Вариант номер два Завести вспомогательную таблицу, хранящую число записей в огромной таблице. На огромную таблицу повесить триггер, который будет уменьшать это число в случае удаления записи и увеличивать в случае вставки. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  50. 50. Медленный count Оптимизация SQL запросов Вариант номер два Завести вспомогательную таблицу, хранящую число записей в огромной таблице. На огромную таблицу повесить триггер, который будет уменьшать это число в случае удаления записи и увеличивать в случае вставки. Вариант номер три Повторяем вариант номер два, но данные во вспомогательной таблице обновляются через определённые промежутки времени (cron), а не через триггер. Васильев О.Ю. PostgreSQL в высоконагруженных проектах
  51. 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. 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. 53. Вопросы и Ответы Спасибо за внимание! Васильев О.Ю. PostgreSQL в высоконагруженных проектах

×