SlideShare ist ein Scribd-Unternehmen logo
1 von 123
Downloaden Sie, um offline zu lesen
Использование PostgreSQL
    в веб-приложениях
  Проблемы повышения производительности,
 масштабирования, надёжности веб-приложений




                            Николай Самохвалов
                                 Иван Золотухин
                            компания Postgresmen




           13 июня 2007, Москва, РИТ-2007
План действий


1000   Начало
1100   Перерыв (10 мин)
1200   Перерыв (10 мин)
1300   Обед (1 час)
1530   Кофе-брейк (30 мин)
1645   Перерыв (10 мин)
1800   Завершение программы
План работ


1.    Вводная часть
2.    Диагностика. Тестирование производительности. Мониторинг
3.    Тюнинг (postgresql.conf, параметры OC)
4.    Проблемы проектирования БД
5.    Как найти медленные запросы?
6.    Оптимизация запросов. EXPLAIN & EXPLAIN ANALYZE
7.    Индексы. Специальные типы данных
8.    Кэширование и СУБД
9.    Отказоустойчивость и HA
10.   Балансировка нагрузки. Масштабирование
11.   Выбор железа
Что такое PostgreSQL?


PostgreSQL – свободно распространяемая
 объектно-реляционная система управления
 базами данных (ORDBMS), наиболее
 развитая из открытых СУБД в мире и
 являющаяся реальной альтернативой
 коммерческим базам данных.
PostgreSQL сегодня



Текущая версия – 8.2 (8.2.4)

8.3 ожидается в сентябре-октябре 2007 :-)
PostgreSQL сегодня
    Надежность



    ACID, MVCC, WAL, PITR, Slony

    Безопасность данных



    root, SSL, pg_hba.conf, ROLE

    Производительность



    B-tree, hash, R-tree, GiST, Gin; geqo; partitioning; Slony, pgpool


    Расширяемость


    pg_catalog, наследование, GiST, Gin, contribs
PostgreSQL сегодня

    ISO/ANSI SQL (SQL:200x)


    схемы, представления, триггеры, rules, 2PC...

    Типы данных


    varlena, массивы, GIS, композитные, GiST

    Интерфейсы


    C, C++, C#, python, perl, ruby, php, Lisp и т.д.

    Процедурные языки


    PL/pgSQL, pl/Tcl, Pl/Perl и pl/Python; PHP, Java, Ruby, R, shell
Кто использует


  Sony Entertainment (EnterpriseDB)



  Skype



  Cisco



  Fujitsu



  NTT



  Apple



  SUN Microsystems (Solaris, 24x7 support)



  hi5.com



  UNISYS

Кто использует



  SourceForge



  LAMP: Linux/Apache/Middleware(Perl,PHP,Python,Ruby)/PostgreSQL



  New Zealand's Electoral Enrolment Centre



  .ORG, .INFO domain registry



  Многотерабайтные архивы астрономических данных

Кто использует: Россия
  Рамблер



  1С:Предприятие (наряду с MS SQL)



  irr.ru («Из рук в руки»)



  rabota.ru («Работа для вас»)



  price.ru



  moikrug.ru (Яндекс)



  webalta.ru



  РБК



  Beeline



  Мастерхост



  neznakomka.ru

Кто использует: Россия




    udaff.com

Аспекты производительности


            Транзакц
                Приложение
 Запросы
               ии

 Драйвер    Соедине
                Middleware Кэш
    а         ния

                PostgreSQL
 Схема       Конфиг

  Файл.    Операционная система
              Ядро
 система

             RAM/CP
                  Железо
  Диски                      Сеть
               U
Аспекты производительности


            Транзакц
                Приложение
 Запросы
               ии

 Драйвер    Соедине
                Middleware Кэш
    а         ния

                PostgreSQL
 Схема       Конфиг

  Файл.    Операционная система
              Ядро
 система

             RAM/CP
                  Железо
  Диски                      Сеть
               U
Правила оптимизации
    Большинство проблем PostgreSQL на самом



    деле не являются проблемами PostgreSQL


    10% проблем порождают 90% ухудшения



    производительности (the hockey stick)


    Как правило, при оптимизации видна только



    крупнейшая проблема
The Hockey Stick
Влияние на производительность




                                   Количество проблем
Устройство PostgreSQL

    ACID





    MVCC





    WAL





    Shared Memory

Устройство PostgreSQL
    ACID-совместимая база данных



    −   atomicity (атомарность)
    −   consistency (непротиворечивость)
    −   isolation (изоляция)
    −   durability (надежность)
Устройство PostgreSQL
    ACID-совместимая база данных





уровни изоляции транзакций:
    −   Read Uncommited
    −   Read Commited (разумный компромисс)
    −   Repeatable read
    −   Serializable (надежно, но медленно)


    Вывод: забудьте про SET TRANSACTION, если вы
     не в банке
Устройство PostgreSQL
    MVCC: Multiversion Concurrency Control



    −   xid – transaction id
    −   каждая запись имеет xid_start и xid_end
    −   каждая транзакция видит версию базы в момент
        xid_start
    −   записи не удаляются, а просто помечаются
        xid_end
Устройство PostgreSQL
    MVCC – накапливаются старые версии



    данных
    требует пылесоса – VACUUM




    VACUUM: re-use мертвых данных




    VACUUM FULL: физическое удаление



    мертвых данных и дефрагментация базы
    Autovacuum – ваш друг

Устройство PostgreSQL
WAL – Write Ahead Log
    механизм протоколирования всех



    транзакций
    позволяет восстановить систему после



    возможных сбоев
    все изменения данных записываются на



    диск только после их гарантированного
    журналирования в WAL
    PITR – Point In Time Recovery

Устройство PostgreSQL
Устройство PostgreSQL
Диагностика проблем
    Средства операционной системы





    Тесты производительности (benchmarks)





    Средства PostgreSQL: логи, статистика





    Системы внешнего мониторинга

Средства операционной системы
    ps



    Возможность увидеть PostgreSQL-процессы
    −   Понимание конкуретной работы с CPU и RAM
    −   Возможность заметить долгие запросы
Средства операционной системы
    mpstat



    Просмотр активности каждого CPU
    −   Используются ли все процессоры?
    −   Является ли CPU узким местом?
    −   Диагностика context switches
Средства операционной системы
    vmstat, free



    Просмотр использования памяти
    −   Оценка размеров дискового кэша
    −   Хватает ли серверу PostgreSQL памяти?
    −   Не происходит ли swapping-а?
Средства операционной системы
    iostat



    Просмотр дисковой активности
    −   Сервер достиг предела по I/O?
    −   Все ли диски выдают ожидаемый I/O?
    −   Мониторинг checkpoint-ов
Тесты производительности
              (benchmarks)
    bonnie++



    Тест дисковой подсистемы
    −   Измерьте производительность дисков
    −   Знайте скорость Sequential/Random Read/Write и
        Random Seek своих дисков
Тесты производительности
              (benchmarks)
    contrib/pgbench



    Простейший тест базы данных
    −   Тестирует I/O и скорость соединений
    −   Не тестирует: блокировки, вычислительные
        задачи, планирование запросов
    −   Удобен для обнаружения больших HW+OS
        проблем, мало пригоден для тонкой настройки
    Тестируйте систему, подобную вашей
    −   База в shared_buffers
    −   База в дисковом кэше
    −   База не помещается в RAM
Тесты производительности
            (benchmarks)
    contrib/pgbench





                           Автор: Грег Смит
Средства PostgreSQL
    pg_stat_database,



    pg_database_size()
Вы должны знать общие параметры БД:
      Количество соединений
    


      Количество транзакций
    


      Количество commit-ов и rollback-ов
    


      Количество hit-ов (попаданий в буфер)
    


      Размер базы данных (помещается в RAM?)
    
Средства PostgreSQL
    pg_tables, pg_relation_size()



Вы должны знать общие параметры таблиц:
      Количество таблиц
    


      Размеры таблиц
    


      Размеры индексов
    


      Количество триггеров
    


      «Вздутие» таблиц (bloating)
    
Средства PostgreSQL
    pg_stat_activity, pg_locks



Детали конкурентного доступа к таблицам
      Оценка количества idle-соединений
    


      Runtime-оценка долгих запросов
    


      Лучше, чем ps – больше деталей
    


      Все ли нормально с блокировками? Нет ли WAITING-
    


      бакендов?
Средства PostgreSQL
    pg_stat[io]_user_tables,



    pg_stat[io]_user_indexes
Статистика доступа к таблицам
      Количество SELECT/INSERT/UPDATE/DELETE
    


      Количество seqscan vs. indexscan
    


      Есть ли неиспользуемые индексы? Drop it!
    


      Есть seqscan-ы по большим таблицам? CREATE
    


      INDEX
Средства PostgreSQL
    pg_stat_bgwriter



−   Можно видеть, как bgwriter чистит кэш
−   Помогает при затруднении проходимости
    checkpoint-ов
Системы внешнего мониторинга
    PgFouine (анализ логов)




    Zabbix



−   Легко расширяется
    Nagios



−   Готовое расширение для PostgreSQL
    pgsnmpd – SNMP-агент для PostgreSQL

Системы внешнего мониторинга
Примеры запросов для мониторинга:
select datname,now()-query_start as duration,current_query from
  pg_stat_activity;
select datname, case when blks_read = 0 then 0 else blks_hit /
  blks_read end as ratio from pg_stat_database;
select relname,seq_scan,idx_scan, case when idx_scan = 0 then 100
  else seq_scan / idx_scan end as ratio from pg_stat_user_tables
  order by ratio desc;
select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables
  order by n_tup_upd desc;
select indexrelname,idx_tup_read,idx_tup_fetch,case when
  idx_tup_fetch = 0 then 100 else idx_tup_read / idx_tup_fetch end as
  ratio from pg_stat_user_indexes order by ratio desc;
select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables
  order by n_tup_upd desc;
select l.mode,d.datname,c.relname,l.granted,l.transactionid from
  pg_locks as l left join pg_database as d on l.database= d.oid left
  join pg_class as c on l.relation = c.oid;
postgresql.conf
    shared_buffers = 25 ÷ 35% RAM



    Размер разделяемой памяти
    work_mem = free / max_nconn * 1 ÷ 3



    Неразделяемая память для сортировок,
     аггрегирования, вычисления хэш-функций.
     malloc до нескольких раз за соединение
    effective_cache_size = 2/3 * RAM



    Средний размер дискового кеша
    checkpoint_timeout = 600 ÷ 900 sec



    Макс. время между WAL chekpoint-ами
Устройство PostgreSQL
postgresql.conf
    checkpoint_segments = 3 ÷ 10



    Макс. время между WAL checkpoint-ами, в WAL-
     сегментах размером 16MB
    commit_delay, commit_siblings



    Задержка и сброс нескольких активных
     транзакций в WAL одним вызовом fsync
    maintenance_work_mem = 75% от



    pg_relation_size('the_biggest_table')
    Размер памяти для VACUUM, ANALYZE, CREATE
     INDEX
postgresql.conf
    max_fsm_pages = (n измененных рядов)



    Количество дисковых страниц, используемых для
     Free Space Map. Правильная настройка может
     отменить необходимость в VACUUM FULL и
     REINDEX.
    random_page_cost = 2.0 ÷ 4.0



    Оценка времени случайного доступа (пробег по
     индексу). 2.0 в случае быстрых дисков, 4.0 в
     случае, если БД не помещается в RAM
    wal_buffers = default



    Размер буфера WAL в разделяемой памяти,
     важен для больших транзакций. Забудьте это.
postgresql.conf
    log_destination = 'syslog'




    redirect_stderr = off




    silent_mode = on




    log_min_duration_statement = 500




    log_duration = off




    log_statement = 'none'




Настройки для логгирования через syslog
 запросов, медленнее 500ms (pgFouine)
postgresql.conf
    stats_command_string = on




    update_process_title = on




    stats_start_collector = on




    stats_block_level = on




    stats_row_level = on




Настройки для сбора row-level статистики.
 Ухудшают производительность на ~5%, но
 дают возможность работы с
 вышеуказанными сиcтемными
 представлениями и необходимы для
 autovacuum
postgresql.conf
    autovacuum = on



    Автовакуум
    autovacuum_naptime = 1 ÷ 10 min



    Время между последовательными
     автоматическими запусками автовакуума
    autovacuum_vacuum_threshold,



    autovacuum_analyze_threshold = 250 ÷
    1000
    Пороги по количеству измененных рядов для
     запуска VACUUM или ANALYZE на конкретную
     таблицу
postgresql.conf
    vacuum_cost_delay = 50 ÷ 250 ms



    Откладывание VACUUM на данное время
    vacuum_cost_limit = 100 ÷ 200



    Откладывание VACUUM при достижении данной
     стоимости операций
    vacuum_page_hit = 1 ÷ 10



    Условная стоимость одной из основных операций
     VACUUM
Bgwriter & shared buffers
    flags (BM_DIRTY)




    refcount (is pinned?)




    usage_count (BM_MAX_USAGE_COUNT)





    LRU – Least Recently Used




    Round

Bgwriter & shared buffers
    bgwriter_delay = 50 ÷ 200 ms



    Пауза между циклами bgwriter-а
    bgwriter_lru_percent = 1.0 ÷ 5.0



    Предел на сканирование LRU-буферов / цикл
    bgwriter_all_percent = 0.3 ÷ 1.0



    Предел на сканирование всех буферов / цикл
    bgwriter_lru_maxpages = 5 ÷ 20



    Количество LRU-буферов, записанное на диск /
     цикл
    bgwriter_all_maxpages = 5 ÷ 20

Производительность PostgreSQL
    Диски > RAM > CPU




    Чем больше дисков, тем лучше




    Отделяйте pg_xlog от данных




    RAID 1+0 / 0+1 > RAID 5




    Не ставьте на сервер другие приложения

Проектирование БД
    Разумная денормализация




    «Медленный» count()




    Логическое секционирование




    Физическое секционирование




    Суррогатные ключи




    NULLs

Денормализация
    Производные атрибуты




    Одна «широкая» таблица лучше нескольких «узких»




    Как правило, TOAST (varlena types) работает хорошо




    Теперь есть не только GiST, но и GIN!




    Медленный count(): хранение «счётчиков»




    Процесс денормализации – компромисс между производительностью и



    гибкостью
                                                   message
           person                   message_id
                                    SERIAL
person_id          SERIAL           message_subject
person_name                         VARCHAR(32)
VARCHAR(64)                         message_body
person_email VARCHAR(255)           VARCHAR(2000)
                                ?
person_age         INT2             message_from_person_id         INT4
                                    message_to_person_id           INT4
                                    message_from_person_name VARCHAR(64)
                                    message_to_person_name
                                    VARCHAR(64)
Медленный count()
    Хранение «счётчиков» (дополнительные



    поля, триггеры)
    Оценочные методы



    CREATE FUNCTION count_estimate(query text) RETURNS integer AS $$
    DECLARE
         rec   record;
         rows integer;
    BEGIN
         FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
             rows := substring(rec.quot;QUERY PLANquot; FROM ' rows=([[:digit:]]+)');
             EXIT WHEN rows IS NOT NULL;
         END LOOP;
         RETURN rows;
    END;
    $$ LANGUAGE plpgsql VOLATILE STRICT;


    SELECT count_estimate('SELECT * FROM foo WHERE r < 0.1');

                                                            Автор: Michael Fuhr
Логическое секционирование
    Вертикальное



    −   Разделение данных по таблицам, схемам, базам (хостам)
    Горизонтальное



          Наследование, constraint exclusion:
          CREATE TABLE obj (
              obj_id INTEGER,
              obj_created TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
          );

          CREATE TABLE person(
              obj_id INTEGER PRIMARY KEY,
              person_name VARCHAR(32) NOT NULL,
              CHECK(obj_id >= 1000000000 AND obj_id < 2000000000)
          ) INHERITS(obj);

          CREATE TABLE car(
              obj_id INTEGER PRIMARY KEY,
              obj_type_id INT2 NOT NULL DEFAULT 2,
              car_model VARCHAR(16) NOT NULL,
              CHECK(obj_id >= 2000000000 AND obj_id < 3000000000)
          ) INHERITS(obj);

          SET constraint_exclusion TO on;
Физическое секционирование
    Вертикальное



    −   Разделение по дискам
           symlinks
         


           tablespaces
         


           партицирование таблиц + tablespaces
         


    −   Разделение по хостам
             после логического секционирования (напр., Logging DB)
         


             contrib/dblink
         
Физическое секционирование
    Горизонтальное



    −   По дискам: партицирование таблиц + tablespaces
        CREATE TABLE obj ...

        CREATE TABLE obj_a(
            obj_id INTEGER PRIMARY KEY,
            obj_type_id INT2 NOT NULL DEFAULT 2,
            CHECK(obj_id >= 2000000000 AND obj_id < 3000000000)
        ) INHERITS(obj) TABLESPACE space1;

        CREATE RULE ...
        ON INSERT TO obj WHERE ...
        DO INSTEAD INSERT INTO obj_a ...;

        SET constraint_exclusion TO on;

    −   По хостам (по базам): pl/proxy
Средства PostgreSQL
pgFouine: анализ логов
Средства PostgreSQL
pgFouine: анализ логов
Оптимизация запросов
    Минимизация количества запросов (один «большой» SQL-



    запрос лучше серии «маленьких») – выигрыш до 80%
    −   2-6 мс на каждый запрос => несколько «лишних» секунд для
        1000 строк!
    Объединение запросов в одну транзакцию – выигрыш до 50%



    −   не всегда лучший выбор для web-приложений!
    Минимизация объёмов данных (включая промежуточные)



    −   минимизация проекции (перечисление столбцов)
    −   минимизация выборки (WHERE)
    −   учёт мощности множеств (кардинальность и
        селективность каждой из таблиц)
Оптимизация запросов
    Минимизация медленных count()




    Минимизация количества операций DELETE



    −   UPDATE
    −   TRUNCATE TABLE
    Массивные (bulk) операции вместо группы row-level



    операций
    −   один UPDATE вместо цикла UPDATE-ов
    −   COPY вместо группы INSERT-ов
    Для массивных операций:



    −   ALTER TABLE ... DISABLE TRIGGER ALL
    −   DROP INDEX ... / ... / CREATE INDEX ...
    Подготовленные запросы (PREPARE ...)

Обработка запроса в PostgreSQL
 Parser (синтаксический анализатор)
 Planner (выбор оптимального пути)
 Executor (непосредственное выполнение)


SQL – декларативный язык. СУБД решает, как
 именно будет выполняться запрос.
EXPLAIN
    План запроса – дерево




    Узлы – действия



    −   соединения (join)
    −   сортировка
    −   просмотр таблицы
    Выполнение происходит от листьев к корню




    Оценка «ширины» данных, количества строк



    и стоимости
    Это только оценка, реальную стоимость



    покажет EXPLAIN ANALYZE
Пример EXPLAIN

test=# explain select * from pg_proc order by proname;
                            QUERY PLAN
-------------------------------------------------------------
 Sort (cost=191.67..197.08 rows=2166 width=299)
   Sort Key: proname
   -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166
width=299)
(3 rows)
EXPLAIN: width
test=# explain select * from pg_proc order by proname;
                            QUERY PLAN
-------------------------------------------------------------
 Sort (cost=191.67..197.08 rows=2166 width=299)
   Sort Key: proname
   -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166
width=299)
(3 rows)

                                     «Ширины» типов данных
Показывает примерное
среднее количество байт             int2                      2
                                    int4                      4
в одной строке                      int8                      8
результата                          boolean                   1
                                    varchar(n) / char(n)      n+4
                                    timestamp / timestamptz   8
EXPLAIN: rows
test=# explain select * from pg_proc order by proname;
                            QUERY PLAN
-------------------------------------------------------------
 Sort (cost=191.67..197.08 rows=2166 width=299)
   Sort Key: proname
   -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166
width=299)
(3 rows)

   Показывает примерное количество строк результата (в
 


   т.ч., промежуточного)
   Большое отклонение от реальности => необходим
 


   VACUUM & ANALYZE!
   Можно использовать для вывода примерного
 


   количества строк результата конечному пользователю
EXPLAIN: cost
test=# explain select * from pg_proc order by proname;
                            QUERY PLAN
-------------------------------------------------------------
 Sort (cost=191.67..197.08 rows=2166 width=299)
   Sort Key: proname
   -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166
width=299)
(3 rows)

   Абстрактная величина (ввода-вывода, CPU)
 


   Именно это даёт возможность планнеру выбрать один
 


   план из нескольких
   2 значения: startup & total
 


   Это всего лишь оценка!
 
EXPLAIN ANALYZE
test=# explain analyze select * from pg_proc order by
proname;
                            QUERY PLAN
-------------------------------------------------------------
 Sort (cost=191.67..197.08 rows=2166 width=299) (actual
time=30.161..34.990 rows=2166 loops=1)
   Sort Key: proname
   Sort Method: quicksort Memory: 639kB
   -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166
width=299) (actual time=2.094..20.232 rows=2166 loops=1)
 Total runtime: 40.192 ms
(5 rows)

   Фактическая информация
 


   Время в миллисекундах
 


   Добавляется общее время запроса
 


   loops – количество «проходов» (необходимо умножить
 


   время на loops, чтобы получить общее время)
EXPLAIN ANALYZE
    Способы просмотра таблицы



    −   Seq Scan
    −   Index Scan
    Способы подготовки данных



    −   Sort
    −   Hash
    Способы соединения (join)



    −   Nested Loop
    −   Merge Join
    −   Hash Join
Общие рекомендации
    Сбор статистики, мониторинг, анализ логов (pgFouine)




    Итерационное выявление медленных запросов




    Иногда стоит перестроить запрос, а не создать N



    новых индексов
    Следить за кардинальностью и селективностью



    промежуточных результатов (SELECT * FROM a, b)
    Потенциальные источники проблем: LEFT JOIN,



    count(), UNION вместо UNION ALL, DISTINCT, WHERE
    ... IN (...), соединение 100 таблиц, неожиданное
    «выпрямление» запросов с подзапросами
    Не забывать об ANALYZE после массивных



    изменений!
Общие рекомендации
    Ещё раз: при решении проблемы, убедитесь в том, что



    вам не нужны VACUUM & ANALYZE
    Запускайте EXPLAIN ANALYZE не менее двух раз (не



    забываем про кэш)
    Читайте план снизу вверх, ищите, где начинаются



    замедления и/или ошибки планнера
    При возможности, используйте реальные данные в



    тестировании (Slony?) и оборудование, приближенное
    к production
    Обращайтесь за помощью: pgsql-performance, IRC,



    sql.ru, коммерческая поддержка
Управление планнером
    enable_seqscan




    enable_indexscan




    enable_sort




    enable_nestloop




    enable_hashjoin




    enable_mergejoin




    enable_hashagg





    Как правило, помогает при разработке, но вредит на
    «боевых» серверах (другие объёмы данных => другая
    статистика)
Индексы в PostgreSQL
    B-tree




    Hash




    R-tree




    GiST (обобщенное поисковое дерево)




    GIN (обратный индекс)

Индексы в PostgreSQL
    B-tree




    Hash




    R-tree – теперь тоже GiST




    GiST (обобщенное поисковое дерево)




    GIN (обратный индекс)


                                Фёдор Сигаев, Олег Бартунов
Индексы в PostgreSQL
    Не забываем о таких «приятных» вещах как:



    −   Частичные индексы (CREATE         INDEX ... WHERE ...)
    −   Функциональные индексы (CREATE            INDEX ... USING
        btree(myfunc(a)))
           уникальные функциональные индексы
         


           индексирование данных экзотических типов (XML, array, ...)
         


    −   Многоколоночные индексы
           следим за правильным порядком столбцов
         


           избегаем ненужных одноколоночных индексов
         


    −   GIN-индексы для массивов
    −   CLUSTER table USING indexname
Индексы в PostgreSQL
    Настройка и обслуживание



    −   CREATE INDEX ... FILLFACTOR
    −   CREATE INDEX ... CONCURRENT
    −   Необходимость в перестроении индексов (read/fetch ratio):
         select
          indexrelname,idx_tup_read,idx_tup_fetch,case
          when idx_tup_fetch = 0 then 100 else
          idx_tup_read / idx_tup_fetch end as ratio from
          pg_stat_user_indexes order by ratio desc;
Специализированные типы данных

    intarray




    hstore




    ltree




    tsvector, tsquery




    pg_trgm




    GIS: point/box/..., PostGIS, pgSphere, Q3C




    XML

Специализированные типы данных

    intarray                     GiST!




    hstore




    ltree




    tsvector, tsquery




    pg_trgm




    GIS: point/box/..., PostGIS, pgSphere, Q3C




    XML

GiST или GIN?
                               GiST
    GIN
Создание (bulk)            +              -
 (3x)
Поиск по индексу           -
 + (0.3х)
Обновление индекса   +++              - (10х)
Размер индекса             +              -
 (2-3х)
Масштабирование            -
 +++
intarray, hstore (а в будущем и XML) –
             когда использовать?




Каталог разнородных данных: 1-й способ реализации («широкая таблица»)
intarray, hstore (а в будущем и XML) –
          когда использовать?




  Каталог разнородных данных: 2-й способ реализации
              (Entity-Attribute-Value, EAV)
intarray, hstore (а в будущем и XML) –
          когда использовать?




Каталог разнородных данных: 3-й способ реализации (hstore)
Каталог разнородных данных:
           сравнение трёх способов
 на примере данных http://domnakarte.ru, 700 тыс. объектов недвижимости;
 ноутбук Pentium-M 1.86GHz, 1GB;
 shared_buffers = 250MB
 work_mem = 20MB



                                                      «широкая таблица»
      EAV           hstore (GiST)
Общий размер таблиц, MB                        337                        1488
             907
Общий размер индексов, MB                             160+                1255
             48
Простая выборка по условию       , мс            120 / 30000*       690 / ~70000*
      410 / ~40000*




*) Что делать? Рецепт для web-приложений: «Поднимаем» файлы в файловый кэш ОС:
                                           dd ... of=/dev/null
Типы данных для GIS
    Встроенные, R-tree (GiST)




    PostGIS (GiST)




    pgSphere (GiST)




    Q3C (btree)





       Q3C segmentation
                                R-tree
Кэширование и СУБД
    Кэширование на уровне СУБД (и ОС):




     −   файловый кэш ОС (!)
     −   shared_buffers
     −   кэширование планов запросов
              не забываем указывать признак IMMUTABLE/STABLE/VOLATILE у
          


              функций
              минимизация количества динамического SQL
          



    Кэширование на уровне приложения:




     −   кэширование результатов запросов (файлы, memcached, shared memory)
              основные справочники
          



              объекты
          



              метаданные базы данных
          


     −   кэширование страниц
              на сервере (memcached, proxy-server)
          



              на стороне клиента (правильные HTTP-заголовки)
          
Репликация
    Отказоустойчивость




    Балансировка нагрузки




    Масштабирование

Отказоустойчивость (failover)
Балансировка нагрузки



            Load balancer
Масштабирование
(scale-out, а не scale-up)
Репликация
    Master/Slave – synchronous




    Master/Slave – asynchronous




    Multi-Master – synchronous




    Multi-Master – asynchronous

Репликация
Master/Slave – synchronous




           sync
Репликация
Master/Slave – asynchronous




           async
Репликация
Multi-Master – synchronous




           sync
Репликация
Multi-Master – asynchronous




                 async




       With conflicts resolution!
Pgpool-II



                   pgpool

INSERT,
                            SELECT на один
UPDATE,
                            узел
DELETE
на все узлы
Pgpool-II
    Менеджер соединений (connection pooling +



    кеш)


    Failover (обнаружение отказа и



    переключение на резервный сервер)


    Репликация (синхронная, мульти-мастер)

Pgpool-II
    Балансировка нагрузки




    Master/Slave режим -- работа вместе с другой



    системой репликации: Slony-I, WAL, ...
    Параллельное выполнение запросов




    Нет ограничений на число узлов кластера



    (как было в pgpool-I)
    Кэш запросов




    GUI




    Линейная масштабируемость на «dblink»-



    запросах
Pgpool-II
Slony-I
    Master to multiple slaves





 Самая известная репликация для



PostgreSQL

    Асинхронная система





    Десятки слейвов





    Каскады реплицируемых серверов

Slony-I
PgCluster
    Синхронный мультимастер





    Балансировка нагрузки





    Высокодоступная (HA) система





    Cluster DBs, Load Balancer, Replicator





 Для ленивых: решение от Cybertec,



Austria
WAL shipping

    Асинхронная система





    Встроена в PostgreSQL





    Hot backup





    Нельзя читать со слейвов





    walmgr.py





    Скоро read queries!

Skype

    PL/Proxy: проксирование запросов





 PgBouncer: легкий менеджер



соединений

    SkyTools: управление кластером

Skype
Skype
Skype
Правильный выбор железа
    Диски





    RAID-контроллер





    Схема RAID





    CPU

Правильный выбор железа
    Диски



    −   SCSI лучше, чем SATA
    −   Чем больше дисков, тем лучше: 12 SATA лучше
        4 SCSI
    −   Чем быстрее диски, тем лучше: 15K RPM = 250
        оборотов в сек = 250 TPS
Правильный выбор железа
    RAID контроллер



    −   Очень важный элемент
    −   Только не Adaptec!
    −   Уж лучше software RAID
    −   Хорошие отзывы о MegaRAID, 3ware
    −   Включайте write cache только если есть BBC
    −   Чем больше памяти на контроллере, тем лучше
Правильный выбор железа


      RAID 0
  



      RAID 1
  




                 ?
      RAID 5
  



      RAID 6
  



      RAID 0+1
  



      RAID 1+0
  
Правильный выбор железа

    RAID 0



    −   Stripe
    −   2 диска минимум
    −   Нет отказоустойчивости
    −   Отличный I/O
    −   Простое устройство и
        обслуживание
Правильный выбор железа

    RAID 1



    −   Mirror
    −   2 диска минимум
    −   Отказоустойчивость
    (1 диск)
    −   Выигрыш в скорости
        чтения, небольшая
        деградация в скорости
        записи
Правильный выбор железа

    RAID 5



    −   Striped set with
        distributed parity
    −   3 диска минимум
    −   Отказоустойчивость
    (1 диск)
    −   Медленная запись
    −   Чтение чуть медленнее
        RAID 0
Правильный выбор железа

    RAID 6



    −   Striped set with Dual
        distributed parity
    −   4 диска минимум
    −   Отказоустойчивость
        (2 диска)
    −   Медленная запись
    −   Чтение чуть медленнее
        RAID 0 на том же
        количестве дисков
Правильный выбор железа

    RAID 0+1





    −   Отказоустойчивость
        (выдерживает отказ
        только 1 диска)
    −   Требует полного
        rebuild-а при отказе
        диска
Правильный выбор железа

    RAID 1+0





    −   Отказоустойчивость
        (n*RAID1 дисков
        может отказать)
    −   При отказе диска –
        только rebuild его
        зеркала
    −   Оптимальная
        конфигурация для 4
        дисков
Правильный выбор железа


    RAID 0




    RAID 1





                ?
    RAID 5




    RAID 6




    RAID 0+1




    RAID 1+0

Правильный выбор железа


    RAID 0 (2 диска)




    RAID 1 (2 диска)





                          ?
    RAID 5 (>=6 дисков)




    RAID 6




    RAID 0+1




    RAID 1+0 (4 диска)

Правильный выбор железа
    Всегда тестируйте дисковую подсистему



    −   time quot;dd if=/dev/zero of=bigfile bs=8k
        count=RAM*2 && syncquot;
    −   time dd if=bigfile of=/dev/null bs=8k
    −   bonnie++ (de-facto стандарт дисковых тестов)


    Обычный 7200 RPM диск:
    −   56MB/s чтение
    −   42MB/s запись
    −   Линейный рост по числу дисков в RAID 0
Настройки файловой системы
    Ext3 & AnyOtherJournalingFS



    −   noatime: не обновлять last access timestamp
    −   writeback на диске с WAL: только целостность
        метаданных, нет коммита самих данных в
        журнал
    OtherFS



    −   Журналируйте в разумных масштабах
    −   Компрессия rocks!
    −   ZFS rocks!
Правильный выбор железа
    CPU



    −   Чем больше ядер,
        тем лучше (Linux)
    −   Opteron-ы считаются
        лучше Xeon-ов
Правильный выбор железа
    CPU

Правильный выбор железа
    CPU

Credits
    Josh Berkus




    Robert Treat




    Greg Smith




    Wikipedia




    Tweakers.net

Спасибо за внимание!

Weitere ähnliche Inhalte

Was ist angesagt?

Minsk Jazz 190509 Templ
Minsk Jazz 190509 TemplMinsk Jazz 190509 Templ
Minsk Jazz 190509 Templ
sef2009
 
Linux Commands
Linux CommandsLinux Commands
Linux Commands
iwata
 
Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎
mayperl
 

Was ist angesagt? (20)

俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 1482
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 1482俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 1482
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 1482
 
Что такое ASP.NET MVC?
Что такое ASP.NET MVC?Что такое ASP.NET MVC?
Что такое ASP.NET MVC?
 
Jazz – открытая платформа разработки ПО
Jazz – открытая платформа разработки ПОJazz – открытая платформа разработки ПО
Jazz – открытая платформа разработки ПО
 
Обеспечение безопасности web приложений
Обеспечение безопасности web приложенийОбеспечение безопасности web приложений
Обеспечение безопасности web приложений
 
Minsk Jazz 190509 Templ
Minsk Jazz 190509 TemplMinsk Jazz 190509 Templ
Minsk Jazz 190509 Templ
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2672
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2672俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2672
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2672
 
俄罗斯Gost标准,进出口购买商品目录№RG 3771
俄罗斯Gost标准,进出口购买商品目录№RG 3771俄罗斯Gost标准,进出口购买商品目录№RG 3771
俄罗斯Gost标准,进出口购买商品目录№RG 3771
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2689
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2689俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2689
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2689
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3717
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3717俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3717
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3717
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4421
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4421俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4421
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 4421
 
俄罗斯Gost标准,进出口购买商品目录№RG 2279
俄罗斯Gost标准,进出口购买商品目录№RG 2279俄罗斯Gost标准,进出口购买商品目录№RG 2279
俄罗斯Gost标准,进出口购买商品目录№RG 2279
 
俄罗斯Gost标准,进出口购买商品目录№RG 2267
俄罗斯Gost标准,进出口购买商品目录№RG 2267俄罗斯Gost标准,进出口购买商品目录№RG 2267
俄罗斯Gost标准,进出口购买商品目录№RG 2267
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2676
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2676俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2676
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 2676
 
俄罗斯Gost标准,进出口购买商品目录№RG 3757
俄罗斯Gost标准,进出口购买商品目录№RG 3757俄罗斯Gost标准,进出口购买商品目录№RG 3757
俄罗斯Gost标准,进出口购买商品目录№RG 3757
 
俄罗斯Gost标准,进出口购买商品目录№RG 2286
俄罗斯Gost标准,进出口购买商品目录№RG 2286俄罗斯Gost标准,进出口购买商品目录№RG 2286
俄罗斯Gost标准,进出口购买商品目录№RG 2286
 
Linux Commands
Linux CommandsLinux Commands
Linux Commands
 
Hasql in practice (Russian)
Hasql in practice (Russian)Hasql in practice (Russian)
Hasql in practice (Russian)
 
Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎
 
Bynet2.3 Microsoft. Mediacontent delivery using IIS7 and Silverlight3
Bynet2.3 Microsoft. Mediacontent delivery using IIS7 and Silverlight3Bynet2.3 Microsoft. Mediacontent delivery using IIS7 and Silverlight3
Bynet2.3 Microsoft. Mediacontent delivery using IIS7 and Silverlight3
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 714
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 714俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 714
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 714
 

Andere mochten auch

20071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.320071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.3
Nikolay Samokhvalov
 
20080415 Rit2008 Postgresql8.3 Zolotukhin
20080415 Rit2008 Postgresql8.3 Zolotukhin20080415 Rit2008 Postgresql8.3 Zolotukhin
20080415 Rit2008 Postgresql8.3 Zolotukhin
Nikolay Samokhvalov
 
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
Nikolay Samokhvalov
 
20080214 Rupg Meeting1 Whatisnewpostgresql8.3
20080214 Rupg Meeting1 Whatisnewpostgresql8.320080214 Rupg Meeting1 Whatisnewpostgresql8.3
20080214 Rupg Meeting1 Whatisnewpostgresql8.3
Nikolay Samokhvalov
 
20070925 Highload2007 Momjian Features
20070925 Highload2007 Momjian Features20070925 Highload2007 Momjian Features
20070925 Highload2007 Momjian Features
Nikolay Samokhvalov
 
20071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.320071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.3
Nikolay Samokhvalov
 
Windows Server 2008 伺服器虛擬化解決方案
Windows Server 2008 伺服器虛擬化解決方案Windows Server 2008 伺服器虛擬化解決方案
Windows Server 2008 伺服器虛擬化解決方案
Timothy Chen
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
zazhong
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
zazhong
 

Andere mochten auch (20)

20071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.320071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.3
 
20080415 Rit2008 Postgresql8.3 Zolotukhin
20080415 Rit2008 Postgresql8.3 Zolotukhin20080415 Rit2008 Postgresql8.3 Zolotukhin
20080415 Rit2008 Postgresql8.3 Zolotukhin
 
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
20080330 Postgresqlconference2008 Pg In Web2.0 Samokhvalov
 
20080214 Rupg Meeting1 Whatisnewpostgresql8.3
20080214 Rupg Meeting1 Whatisnewpostgresql8.320080214 Rupg Meeting1 Whatisnewpostgresql8.3
20080214 Rupg Meeting1 Whatisnewpostgresql8.3
 
20070925 Highload2007 Momjian Features
20070925 Highload2007 Momjian Features20070925 Highload2007 Momjian Features
20070925 Highload2007 Momjian Features
 
20071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.320071002 Samag2007 Whats New In Postgresql8.3
20071002 Samag2007 Whats New In Postgresql8.3
 
Natureza
NaturezaNatureza
Natureza
 
Windows Server 2008 伺服器虛擬化解決方案
Windows Server 2008 伺服器虛擬化解決方案Windows Server 2008 伺服器虛擬化解決方案
Windows Server 2008 伺服器虛擬化解決方案
 
Uu 09 1980
Uu 09 1980Uu 09 1980
Uu 09 1980
 
Uu 04 1999
Uu 04 1999Uu 04 1999
Uu 04 1999
 
Perpu 01 1992
Perpu 01 1992Perpu 01 1992
Perpu 01 1992
 
Uu 21 1992
Uu 21 1992Uu 21 1992
Uu 21 1992
 
Manga_e_barroco
Manga_e_barrocoManga_e_barroco
Manga_e_barroco
 
Uu 08 1985
Uu 08 1985Uu 08 1985
Uu 08 1985
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Uu 02 1981
Uu 02 1981Uu 02 1981
Uu 02 1981
 
Presentaciones En El Blog
Presentaciones En El BlogPresentaciones En El Blog
Presentaciones En El Blog
 
Uu 05 1984
Uu 05 1984Uu 05 1984
Uu 05 1984
 
Uu 07 1989
Uu 07 1989Uu 07 1989
Uu 07 1989
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 

Ähnlich wie 20070613 Rit2007 Training

Java For Digitally Signing Documents In Web Book - Svetlin Nakov
Java For Digitally Signing Documents In Web Book - Svetlin NakovJava For Digitally Signing Documents In Web Book - Svetlin Nakov
Java For Digitally Signing Documents In Web Book - Svetlin Nakov
Svetlin Nakov
 

Ähnlich wie 20070613 Rit2007 Training (20)

俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3712
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3409
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3409俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3409
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3409
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3701
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3403
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 7647
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2806
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2806俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2806
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2806
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3455
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3455俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3455
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3455
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3426
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3705
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3705俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3705
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3705
 
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 3204
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 3204俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 3204
俄罗斯进出口标准,技术规格,法律,法规,中英文,目录编号RG 3204
 
Delivery of media content of IIS Media Services
Delivery of media content of  IIS Media ServicesDelivery of media content of  IIS Media Services
Delivery of media content of IIS Media Services
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3456
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3456俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3456
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3456
 
Java For Digitally Signing Documents In Web Book - Svetlin Nakov
Java For Digitally Signing Documents In Web Book - Svetlin NakovJava For Digitally Signing Documents In Web Book - Svetlin Nakov
Java For Digitally Signing Documents In Web Book - Svetlin Nakov
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3443
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3443俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3443
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3443
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3411
 
俄罗斯Gost标准,进出口购买商品目录№RG 3753
俄罗斯Gost标准,进出口购买商品目录№RG 3753俄罗斯Gost标准,进出口购买商品目录№RG 3753
俄罗斯Gost标准,进出口购买商品目录№RG 3753
 
Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on Rails
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4116
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4116俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4116
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 4116
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2826
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2826俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2826
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 2826
 
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716
俄语GOST标准,技术规范,法律,法规,中文英语,目录编号RG 3716
 

Mehr von Nikolay Samokhvalov

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
Nikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
Nikolay Samokhvalov
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Nikolay Samokhvalov
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
Nikolay Samokhvalov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 

Mehr von Nikolay Samokhvalov (20)

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database Experiments
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 

Kürzlich hochgeladen

Kürzlich hochgeladen (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

20070613 Rit2007 Training

  • 1. Использование PostgreSQL в веб-приложениях Проблемы повышения производительности, масштабирования, надёжности веб-приложений Николай Самохвалов Иван Золотухин компания Postgresmen 13 июня 2007, Москва, РИТ-2007
  • 2. План действий 1000 Начало 1100 Перерыв (10 мин) 1200 Перерыв (10 мин) 1300 Обед (1 час) 1530 Кофе-брейк (30 мин) 1645 Перерыв (10 мин) 1800 Завершение программы
  • 3. План работ 1. Вводная часть 2. Диагностика. Тестирование производительности. Мониторинг 3. Тюнинг (postgresql.conf, параметры OC) 4. Проблемы проектирования БД 5. Как найти медленные запросы? 6. Оптимизация запросов. EXPLAIN & EXPLAIN ANALYZE 7. Индексы. Специальные типы данных 8. Кэширование и СУБД 9. Отказоустойчивость и HA 10. Балансировка нагрузки. Масштабирование 11. Выбор железа
  • 4. Что такое PostgreSQL? PostgreSQL – свободно распространяемая объектно-реляционная система управления базами данных (ORDBMS), наиболее развитая из открытых СУБД в мире и являющаяся реальной альтернативой коммерческим базам данных.
  • 5. PostgreSQL сегодня Текущая версия – 8.2 (8.2.4) 8.3 ожидается в сентябре-октябре 2007 :-)
  • 6. PostgreSQL сегодня Надежность  ACID, MVCC, WAL, PITR, Slony Безопасность данных  root, SSL, pg_hba.conf, ROLE Производительность  B-tree, hash, R-tree, GiST, Gin; geqo; partitioning; Slony, pgpool Расширяемость  pg_catalog, наследование, GiST, Gin, contribs
  • 7. PostgreSQL сегодня ISO/ANSI SQL (SQL:200x)  схемы, представления, триггеры, rules, 2PC... Типы данных  varlena, массивы, GIS, композитные, GiST Интерфейсы  C, C++, C#, python, perl, ruby, php, Lisp и т.д. Процедурные языки  PL/pgSQL, pl/Tcl, Pl/Perl и pl/Python; PHP, Java, Ruby, R, shell
  • 8. Кто использует Sony Entertainment (EnterpriseDB)  Skype  Cisco  Fujitsu  NTT  Apple  SUN Microsystems (Solaris, 24x7 support)  hi5.com  UNISYS 
  • 9. Кто использует SourceForge  LAMP: Linux/Apache/Middleware(Perl,PHP,Python,Ruby)/PostgreSQL  New Zealand's Electoral Enrolment Centre  .ORG, .INFO domain registry  Многотерабайтные архивы астрономических данных 
  • 10. Кто использует: Россия Рамблер  1С:Предприятие (наряду с MS SQL)  irr.ru («Из рук в руки»)  rabota.ru («Работа для вас»)  price.ru  moikrug.ru (Яндекс)  webalta.ru  РБК  Beeline  Мастерхост  neznakomka.ru 
  • 12. Аспекты производительности Транзакц Приложение Запросы ии Драйвер Соедине Middleware Кэш а ния PostgreSQL Схема Конфиг Файл. Операционная система Ядро система RAM/CP Железо Диски Сеть U
  • 13. Аспекты производительности Транзакц Приложение Запросы ии Драйвер Соедине Middleware Кэш а ния PostgreSQL Схема Конфиг Файл. Операционная система Ядро система RAM/CP Железо Диски Сеть U
  • 14. Правила оптимизации Большинство проблем PostgreSQL на самом  деле не являются проблемами PostgreSQL 10% проблем порождают 90% ухудшения  производительности (the hockey stick) Как правило, при оптимизации видна только  крупнейшая проблема
  • 15. The Hockey Stick Влияние на производительность Количество проблем
  • 16. Устройство PostgreSQL ACID  MVCC  WAL  Shared Memory 
  • 17. Устройство PostgreSQL ACID-совместимая база данных  − atomicity (атомарность) − consistency (непротиворечивость) − isolation (изоляция) − durability (надежность)
  • 18. Устройство PostgreSQL ACID-совместимая база данных  уровни изоляции транзакций: − Read Uncommited − Read Commited (разумный компромисс) − Repeatable read − Serializable (надежно, но медленно) Вывод: забудьте про SET TRANSACTION, если вы не в банке
  • 19. Устройство PostgreSQL MVCC: Multiversion Concurrency Control  − xid – transaction id − каждая запись имеет xid_start и xid_end − каждая транзакция видит версию базы в момент xid_start − записи не удаляются, а просто помечаются xid_end
  • 20. Устройство PostgreSQL MVCC – накапливаются старые версии  данных требует пылесоса – VACUUM  VACUUM: re-use мертвых данных  VACUUM FULL: физическое удаление  мертвых данных и дефрагментация базы Autovacuum – ваш друг 
  • 21. Устройство PostgreSQL WAL – Write Ahead Log механизм протоколирования всех  транзакций позволяет восстановить систему после  возможных сбоев все изменения данных записываются на  диск только после их гарантированного журналирования в WAL PITR – Point In Time Recovery 
  • 24. Диагностика проблем Средства операционной системы  Тесты производительности (benchmarks)  Средства PostgreSQL: логи, статистика  Системы внешнего мониторинга 
  • 25. Средства операционной системы ps  Возможность увидеть PostgreSQL-процессы − Понимание конкуретной работы с CPU и RAM − Возможность заметить долгие запросы
  • 26. Средства операционной системы mpstat  Просмотр активности каждого CPU − Используются ли все процессоры? − Является ли CPU узким местом? − Диагностика context switches
  • 27. Средства операционной системы vmstat, free  Просмотр использования памяти − Оценка размеров дискового кэша − Хватает ли серверу PostgreSQL памяти? − Не происходит ли swapping-а?
  • 28. Средства операционной системы iostat  Просмотр дисковой активности − Сервер достиг предела по I/O? − Все ли диски выдают ожидаемый I/O? − Мониторинг checkpoint-ов
  • 29. Тесты производительности (benchmarks) bonnie++  Тест дисковой подсистемы − Измерьте производительность дисков − Знайте скорость Sequential/Random Read/Write и Random Seek своих дисков
  • 30. Тесты производительности (benchmarks) contrib/pgbench  Простейший тест базы данных − Тестирует I/O и скорость соединений − Не тестирует: блокировки, вычислительные задачи, планирование запросов − Удобен для обнаружения больших HW+OS проблем, мало пригоден для тонкой настройки Тестируйте систему, подобную вашей − База в shared_buffers − База в дисковом кэше − База не помещается в RAM
  • 31. Тесты производительности (benchmarks) contrib/pgbench  Автор: Грег Смит
  • 32. Средства PostgreSQL pg_stat_database,  pg_database_size() Вы должны знать общие параметры БД: Количество соединений  Количество транзакций  Количество commit-ов и rollback-ов  Количество hit-ов (попаданий в буфер)  Размер базы данных (помещается в RAM?) 
  • 33. Средства PostgreSQL pg_tables, pg_relation_size()  Вы должны знать общие параметры таблиц: Количество таблиц  Размеры таблиц  Размеры индексов  Количество триггеров  «Вздутие» таблиц (bloating) 
  • 34. Средства PostgreSQL pg_stat_activity, pg_locks  Детали конкурентного доступа к таблицам Оценка количества idle-соединений  Runtime-оценка долгих запросов  Лучше, чем ps – больше деталей  Все ли нормально с блокировками? Нет ли WAITING-  бакендов?
  • 35. Средства PostgreSQL pg_stat[io]_user_tables,  pg_stat[io]_user_indexes Статистика доступа к таблицам Количество SELECT/INSERT/UPDATE/DELETE  Количество seqscan vs. indexscan  Есть ли неиспользуемые индексы? Drop it!  Есть seqscan-ы по большим таблицам? CREATE  INDEX
  • 36. Средства PostgreSQL pg_stat_bgwriter  − Можно видеть, как bgwriter чистит кэш − Помогает при затруднении проходимости checkpoint-ов
  • 37. Системы внешнего мониторинга PgFouine (анализ логов)  Zabbix  − Легко расширяется Nagios  − Готовое расширение для PostgreSQL pgsnmpd – SNMP-агент для PostgreSQL 
  • 38. Системы внешнего мониторинга Примеры запросов для мониторинга: select datname,now()-query_start as duration,current_query from pg_stat_activity; select datname, case when blks_read = 0 then 0 else blks_hit / blks_read end as ratio from pg_stat_database; select relname,seq_scan,idx_scan, case when idx_scan = 0 then 100 else seq_scan / idx_scan end as ratio from pg_stat_user_tables order by ratio desc; select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables order by n_tup_upd desc; select indexrelname,idx_tup_read,idx_tup_fetch,case when idx_tup_fetch = 0 then 100 else idx_tup_read / idx_tup_fetch end as ratio from pg_stat_user_indexes order by ratio desc; select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables order by n_tup_upd desc; select l.mode,d.datname,c.relname,l.granted,l.transactionid from pg_locks as l left join pg_database as d on l.database= d.oid left join pg_class as c on l.relation = c.oid;
  • 39. postgresql.conf shared_buffers = 25 ÷ 35% RAM  Размер разделяемой памяти work_mem = free / max_nconn * 1 ÷ 3  Неразделяемая память для сортировок, аггрегирования, вычисления хэш-функций. malloc до нескольких раз за соединение effective_cache_size = 2/3 * RAM  Средний размер дискового кеша checkpoint_timeout = 600 ÷ 900 sec  Макс. время между WAL chekpoint-ами
  • 41. postgresql.conf checkpoint_segments = 3 ÷ 10  Макс. время между WAL checkpoint-ами, в WAL- сегментах размером 16MB commit_delay, commit_siblings  Задержка и сброс нескольких активных транзакций в WAL одним вызовом fsync maintenance_work_mem = 75% от  pg_relation_size('the_biggest_table') Размер памяти для VACUUM, ANALYZE, CREATE INDEX
  • 42. postgresql.conf max_fsm_pages = (n измененных рядов)  Количество дисковых страниц, используемых для Free Space Map. Правильная настройка может отменить необходимость в VACUUM FULL и REINDEX. random_page_cost = 2.0 ÷ 4.0  Оценка времени случайного доступа (пробег по индексу). 2.0 в случае быстрых дисков, 4.0 в случае, если БД не помещается в RAM wal_buffers = default  Размер буфера WAL в разделяемой памяти, важен для больших транзакций. Забудьте это.
  • 43. postgresql.conf log_destination = 'syslog'  redirect_stderr = off  silent_mode = on  log_min_duration_statement = 500  log_duration = off  log_statement = 'none'  Настройки для логгирования через syslog запросов, медленнее 500ms (pgFouine)
  • 44. postgresql.conf stats_command_string = on  update_process_title = on  stats_start_collector = on  stats_block_level = on  stats_row_level = on  Настройки для сбора row-level статистики. Ухудшают производительность на ~5%, но дают возможность работы с вышеуказанными сиcтемными представлениями и необходимы для autovacuum
  • 45. postgresql.conf autovacuum = on  Автовакуум autovacuum_naptime = 1 ÷ 10 min  Время между последовательными автоматическими запусками автовакуума autovacuum_vacuum_threshold,  autovacuum_analyze_threshold = 250 ÷ 1000 Пороги по количеству измененных рядов для запуска VACUUM или ANALYZE на конкретную таблицу
  • 46. postgresql.conf vacuum_cost_delay = 50 ÷ 250 ms  Откладывание VACUUM на данное время vacuum_cost_limit = 100 ÷ 200  Откладывание VACUUM при достижении данной стоимости операций vacuum_page_hit = 1 ÷ 10  Условная стоимость одной из основных операций VACUUM
  • 47. Bgwriter & shared buffers flags (BM_DIRTY)  refcount (is pinned?)  usage_count (BM_MAX_USAGE_COUNT)  LRU – Least Recently Used  Round 
  • 48. Bgwriter & shared buffers bgwriter_delay = 50 ÷ 200 ms  Пауза между циклами bgwriter-а bgwriter_lru_percent = 1.0 ÷ 5.0  Предел на сканирование LRU-буферов / цикл bgwriter_all_percent = 0.3 ÷ 1.0  Предел на сканирование всех буферов / цикл bgwriter_lru_maxpages = 5 ÷ 20  Количество LRU-буферов, записанное на диск / цикл bgwriter_all_maxpages = 5 ÷ 20 
  • 49. Производительность PostgreSQL Диски > RAM > CPU  Чем больше дисков, тем лучше  Отделяйте pg_xlog от данных  RAID 1+0 / 0+1 > RAID 5  Не ставьте на сервер другие приложения 
  • 50. Проектирование БД Разумная денормализация  «Медленный» count()  Логическое секционирование  Физическое секционирование  Суррогатные ключи  NULLs 
  • 51. Денормализация Производные атрибуты  Одна «широкая» таблица лучше нескольких «узких»  Как правило, TOAST (varlena types) работает хорошо  Теперь есть не только GiST, но и GIN!  Медленный count(): хранение «счётчиков»  Процесс денормализации – компромисс между производительностью и  гибкостью message person message_id SERIAL person_id SERIAL message_subject person_name VARCHAR(32) VARCHAR(64) message_body person_email VARCHAR(255) VARCHAR(2000) ? person_age INT2 message_from_person_id INT4 message_to_person_id INT4 message_from_person_name VARCHAR(64) message_to_person_name VARCHAR(64)
  • 52. Медленный count() Хранение «счётчиков» (дополнительные  поля, триггеры) Оценочные методы  CREATE FUNCTION count_estimate(query text) RETURNS integer AS $$ DECLARE rec record; rows integer; BEGIN FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP rows := substring(rec.quot;QUERY PLANquot; FROM ' rows=([[:digit:]]+)'); EXIT WHEN rows IS NOT NULL; END LOOP; RETURN rows; END; $$ LANGUAGE plpgsql VOLATILE STRICT; SELECT count_estimate('SELECT * FROM foo WHERE r < 0.1'); Автор: Michael Fuhr
  • 53. Логическое секционирование Вертикальное  − Разделение данных по таблицам, схемам, базам (хостам) Горизонтальное  Наследование, constraint exclusion: CREATE TABLE obj ( obj_id INTEGER, obj_created TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE person( obj_id INTEGER PRIMARY KEY, person_name VARCHAR(32) NOT NULL, CHECK(obj_id >= 1000000000 AND obj_id < 2000000000) ) INHERITS(obj); CREATE TABLE car( obj_id INTEGER PRIMARY KEY, obj_type_id INT2 NOT NULL DEFAULT 2, car_model VARCHAR(16) NOT NULL, CHECK(obj_id >= 2000000000 AND obj_id < 3000000000) ) INHERITS(obj); SET constraint_exclusion TO on;
  • 54. Физическое секционирование Вертикальное  − Разделение по дискам symlinks  tablespaces  партицирование таблиц + tablespaces  − Разделение по хостам после логического секционирования (напр., Logging DB)  contrib/dblink 
  • 55. Физическое секционирование Горизонтальное  − По дискам: партицирование таблиц + tablespaces CREATE TABLE obj ... CREATE TABLE obj_a( obj_id INTEGER PRIMARY KEY, obj_type_id INT2 NOT NULL DEFAULT 2, CHECK(obj_id >= 2000000000 AND obj_id < 3000000000) ) INHERITS(obj) TABLESPACE space1; CREATE RULE ... ON INSERT TO obj WHERE ... DO INSTEAD INSERT INTO obj_a ...; SET constraint_exclusion TO on; − По хостам (по базам): pl/proxy
  • 58. Оптимизация запросов Минимизация количества запросов (один «большой» SQL-  запрос лучше серии «маленьких») – выигрыш до 80% − 2-6 мс на каждый запрос => несколько «лишних» секунд для 1000 строк! Объединение запросов в одну транзакцию – выигрыш до 50%  − не всегда лучший выбор для web-приложений! Минимизация объёмов данных (включая промежуточные)  − минимизация проекции (перечисление столбцов) − минимизация выборки (WHERE) − учёт мощности множеств (кардинальность и селективность каждой из таблиц)
  • 59. Оптимизация запросов Минимизация медленных count()  Минимизация количества операций DELETE  − UPDATE − TRUNCATE TABLE Массивные (bulk) операции вместо группы row-level  операций − один UPDATE вместо цикла UPDATE-ов − COPY вместо группы INSERT-ов Для массивных операций:  − ALTER TABLE ... DISABLE TRIGGER ALL − DROP INDEX ... / ... / CREATE INDEX ... Подготовленные запросы (PREPARE ...) 
  • 60. Обработка запроса в PostgreSQL  Parser (синтаксический анализатор)  Planner (выбор оптимального пути)  Executor (непосредственное выполнение) SQL – декларативный язык. СУБД решает, как именно будет выполняться запрос.
  • 61. EXPLAIN План запроса – дерево  Узлы – действия  − соединения (join) − сортировка − просмотр таблицы Выполнение происходит от листьев к корню  Оценка «ширины» данных, количества строк  и стоимости Это только оценка, реальную стоимость  покажет EXPLAIN ANALYZE
  • 62. Пример EXPLAIN test=# explain select * from pg_proc order by proname; QUERY PLAN ------------------------------------------------------------- Sort (cost=191.67..197.08 rows=2166 width=299) Sort Key: proname -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166 width=299) (3 rows)
  • 63. EXPLAIN: width test=# explain select * from pg_proc order by proname; QUERY PLAN ------------------------------------------------------------- Sort (cost=191.67..197.08 rows=2166 width=299) Sort Key: proname -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166 width=299) (3 rows) «Ширины» типов данных Показывает примерное среднее количество байт int2 2 int4 4 в одной строке int8 8 результата boolean 1 varchar(n) / char(n) n+4 timestamp / timestamptz 8
  • 64. EXPLAIN: rows test=# explain select * from pg_proc order by proname; QUERY PLAN ------------------------------------------------------------- Sort (cost=191.67..197.08 rows=2166 width=299) Sort Key: proname -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166 width=299) (3 rows) Показывает примерное количество строк результата (в  т.ч., промежуточного) Большое отклонение от реальности => необходим  VACUUM & ANALYZE! Можно использовать для вывода примерного  количества строк результата конечному пользователю
  • 65. EXPLAIN: cost test=# explain select * from pg_proc order by proname; QUERY PLAN ------------------------------------------------------------- Sort (cost=191.67..197.08 rows=2166 width=299) Sort Key: proname -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166 width=299) (3 rows) Абстрактная величина (ввода-вывода, CPU)  Именно это даёт возможность планнеру выбрать один  план из нескольких 2 значения: startup & total  Это всего лишь оценка! 
  • 66. EXPLAIN ANALYZE test=# explain analyze select * from pg_proc order by proname; QUERY PLAN ------------------------------------------------------------- Sort (cost=191.67..197.08 rows=2166 width=299) (actual time=30.161..34.990 rows=2166 loops=1) Sort Key: proname Sort Method: quicksort Memory: 639kB -> Seq Scan on pg_proc (cost=0.00..71.66 rows=2166 width=299) (actual time=2.094..20.232 rows=2166 loops=1) Total runtime: 40.192 ms (5 rows) Фактическая информация  Время в миллисекундах  Добавляется общее время запроса  loops – количество «проходов» (необходимо умножить  время на loops, чтобы получить общее время)
  • 67. EXPLAIN ANALYZE Способы просмотра таблицы  − Seq Scan − Index Scan Способы подготовки данных  − Sort − Hash Способы соединения (join)  − Nested Loop − Merge Join − Hash Join
  • 68. Общие рекомендации Сбор статистики, мониторинг, анализ логов (pgFouine)  Итерационное выявление медленных запросов  Иногда стоит перестроить запрос, а не создать N  новых индексов Следить за кардинальностью и селективностью  промежуточных результатов (SELECT * FROM a, b) Потенциальные источники проблем: LEFT JOIN,  count(), UNION вместо UNION ALL, DISTINCT, WHERE ... IN (...), соединение 100 таблиц, неожиданное «выпрямление» запросов с подзапросами Не забывать об ANALYZE после массивных  изменений!
  • 69. Общие рекомендации Ещё раз: при решении проблемы, убедитесь в том, что  вам не нужны VACUUM & ANALYZE Запускайте EXPLAIN ANALYZE не менее двух раз (не  забываем про кэш) Читайте план снизу вверх, ищите, где начинаются  замедления и/или ошибки планнера При возможности, используйте реальные данные в  тестировании (Slony?) и оборудование, приближенное к production Обращайтесь за помощью: pgsql-performance, IRC,  sql.ru, коммерческая поддержка
  • 70. Управление планнером enable_seqscan  enable_indexscan  enable_sort  enable_nestloop  enable_hashjoin  enable_mergejoin  enable_hashagg  Как правило, помогает при разработке, но вредит на «боевых» серверах (другие объёмы данных => другая статистика)
  • 71. Индексы в PostgreSQL B-tree  Hash  R-tree  GiST (обобщенное поисковое дерево)  GIN (обратный индекс) 
  • 72. Индексы в PostgreSQL B-tree  Hash  R-tree – теперь тоже GiST  GiST (обобщенное поисковое дерево)  GIN (обратный индекс)  Фёдор Сигаев, Олег Бартунов
  • 73. Индексы в PostgreSQL Не забываем о таких «приятных» вещах как:  − Частичные индексы (CREATE INDEX ... WHERE ...) − Функциональные индексы (CREATE INDEX ... USING btree(myfunc(a))) уникальные функциональные индексы  индексирование данных экзотических типов (XML, array, ...)  − Многоколоночные индексы следим за правильным порядком столбцов  избегаем ненужных одноколоночных индексов  − GIN-индексы для массивов − CLUSTER table USING indexname
  • 74. Индексы в PostgreSQL Настройка и обслуживание  − CREATE INDEX ... FILLFACTOR − CREATE INDEX ... CONCURRENT − Необходимость в перестроении индексов (read/fetch ratio): select indexrelname,idx_tup_read,idx_tup_fetch,case when idx_tup_fetch = 0 then 100 else idx_tup_read / idx_tup_fetch end as ratio from pg_stat_user_indexes order by ratio desc;
  • 75. Специализированные типы данных intarray  hstore  ltree  tsvector, tsquery  pg_trgm  GIS: point/box/..., PostGIS, pgSphere, Q3C  XML 
  • 76. Специализированные типы данных intarray GiST!  hstore  ltree  tsvector, tsquery  pg_trgm  GIS: point/box/..., PostGIS, pgSphere, Q3C  XML 
  • 77. GiST или GIN? GiST GIN Создание (bulk) + - (3x) Поиск по индексу - + (0.3х) Обновление индекса +++ - (10х) Размер индекса + - (2-3х) Масштабирование - +++
  • 78. intarray, hstore (а в будущем и XML) – когда использовать? Каталог разнородных данных: 1-й способ реализации («широкая таблица»)
  • 79. intarray, hstore (а в будущем и XML) – когда использовать? Каталог разнородных данных: 2-й способ реализации (Entity-Attribute-Value, EAV)
  • 80. intarray, hstore (а в будущем и XML) – когда использовать? Каталог разнородных данных: 3-й способ реализации (hstore)
  • 81. Каталог разнородных данных: сравнение трёх способов на примере данных http://domnakarte.ru, 700 тыс. объектов недвижимости; ноутбук Pentium-M 1.86GHz, 1GB; shared_buffers = 250MB work_mem = 20MB «широкая таблица» EAV hstore (GiST) Общий размер таблиц, MB 337 1488 907 Общий размер индексов, MB 160+ 1255 48 Простая выборка по условию , мс 120 / 30000* 690 / ~70000* 410 / ~40000* *) Что делать? Рецепт для web-приложений: «Поднимаем» файлы в файловый кэш ОС: dd ... of=/dev/null
  • 82. Типы данных для GIS Встроенные, R-tree (GiST)  PostGIS (GiST)  pgSphere (GiST)  Q3C (btree)  Q3C segmentation R-tree
  • 83. Кэширование и СУБД Кэширование на уровне СУБД (и ОС):  − файловый кэш ОС (!) − shared_buffers − кэширование планов запросов не забываем указывать признак IMMUTABLE/STABLE/VOLATILE у  функций минимизация количества динамического SQL  Кэширование на уровне приложения:  − кэширование результатов запросов (файлы, memcached, shared memory) основные справочники  объекты  метаданные базы данных  − кэширование страниц на сервере (memcached, proxy-server)  на стороне клиента (правильные HTTP-заголовки) 
  • 84. Репликация Отказоустойчивость  Балансировка нагрузки  Масштабирование 
  • 88. Репликация Master/Slave – synchronous  Master/Slave – asynchronous  Multi-Master – synchronous  Multi-Master – asynchronous 
  • 92. Репликация Multi-Master – asynchronous async With conflicts resolution!
  • 93. Pgpool-II pgpool INSERT, SELECT на один UPDATE, узел DELETE на все узлы
  • 94. Pgpool-II Менеджер соединений (connection pooling +  кеш) Failover (обнаружение отказа и  переключение на резервный сервер) Репликация (синхронная, мульти-мастер) 
  • 95. Pgpool-II Балансировка нагрузки  Master/Slave режим -- работа вместе с другой  системой репликации: Slony-I, WAL, ... Параллельное выполнение запросов  Нет ограничений на число узлов кластера  (как было в pgpool-I) Кэш запросов  GUI  Линейная масштабируемость на «dblink»-  запросах
  • 97. Slony-I Master to multiple slaves  Самая известная репликация для  PostgreSQL Асинхронная система  Десятки слейвов  Каскады реплицируемых серверов 
  • 99. PgCluster Синхронный мультимастер  Балансировка нагрузки  Высокодоступная (HA) система  Cluster DBs, Load Balancer, Replicator  Для ленивых: решение от Cybertec,  Austria
  • 100. WAL shipping Асинхронная система  Встроена в PostgreSQL  Hot backup  Нельзя читать со слейвов  walmgr.py  Скоро read queries! 
  • 101. Skype PL/Proxy: проксирование запросов  PgBouncer: легкий менеджер  соединений SkyTools: управление кластером 
  • 102. Skype
  • 103. Skype
  • 104. Skype
  • 105. Правильный выбор железа Диски  RAID-контроллер  Схема RAID  CPU 
  • 106. Правильный выбор железа Диски  − SCSI лучше, чем SATA − Чем больше дисков, тем лучше: 12 SATA лучше 4 SCSI − Чем быстрее диски, тем лучше: 15K RPM = 250 оборотов в сек = 250 TPS
  • 107. Правильный выбор железа RAID контроллер  − Очень важный элемент − Только не Adaptec! − Уж лучше software RAID − Хорошие отзывы о MegaRAID, 3ware − Включайте write cache только если есть BBC − Чем больше памяти на контроллере, тем лучше
  • 108. Правильный выбор железа RAID 0  RAID 1  ? RAID 5  RAID 6  RAID 0+1  RAID 1+0 
  • 109. Правильный выбор железа RAID 0  − Stripe − 2 диска минимум − Нет отказоустойчивости − Отличный I/O − Простое устройство и обслуживание
  • 110. Правильный выбор железа RAID 1  − Mirror − 2 диска минимум − Отказоустойчивость (1 диск) − Выигрыш в скорости чтения, небольшая деградация в скорости записи
  • 111. Правильный выбор железа RAID 5  − Striped set with distributed parity − 3 диска минимум − Отказоустойчивость (1 диск) − Медленная запись − Чтение чуть медленнее RAID 0
  • 112. Правильный выбор железа RAID 6  − Striped set with Dual distributed parity − 4 диска минимум − Отказоустойчивость (2 диска) − Медленная запись − Чтение чуть медленнее RAID 0 на том же количестве дисков
  • 113. Правильный выбор железа RAID 0+1  − Отказоустойчивость (выдерживает отказ только 1 диска) − Требует полного rebuild-а при отказе диска
  • 114. Правильный выбор железа RAID 1+0  − Отказоустойчивость (n*RAID1 дисков может отказать) − При отказе диска – только rebuild его зеркала − Оптимальная конфигурация для 4 дисков
  • 115. Правильный выбор железа RAID 0  RAID 1  ? RAID 5  RAID 6  RAID 0+1  RAID 1+0 
  • 116. Правильный выбор железа RAID 0 (2 диска)  RAID 1 (2 диска)  ? RAID 5 (>=6 дисков)  RAID 6  RAID 0+1  RAID 1+0 (4 диска) 
  • 117. Правильный выбор железа Всегда тестируйте дисковую подсистему  − time quot;dd if=/dev/zero of=bigfile bs=8k count=RAM*2 && syncquot; − time dd if=bigfile of=/dev/null bs=8k − bonnie++ (de-facto стандарт дисковых тестов) Обычный 7200 RPM диск: − 56MB/s чтение − 42MB/s запись − Линейный рост по числу дисков в RAID 0
  • 118. Настройки файловой системы Ext3 & AnyOtherJournalingFS  − noatime: не обновлять last access timestamp − writeback на диске с WAL: только целостность метаданных, нет коммита самих данных в журнал OtherFS  − Журналируйте в разумных масштабах − Компрессия rocks! − ZFS rocks!
  • 119. Правильный выбор железа CPU  − Чем больше ядер, тем лучше (Linux) − Opteron-ы считаются лучше Xeon-ов
  • 122. Credits Josh Berkus  Robert Treat  Greg Smith  Wikipedia  Tweakers.net 