SlideShare a Scribd company logo
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
Большая база объявлений
Тюрин Михаил
mtyurin@avito.ru
pgconf.ru
2015
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
2
Всем привет!
Михаил Тюрин, Avito.ru
– главный системный архитектор, базы данных
– с PostgreSQL с 2004-ого, с версий 7.4/8.0, региональный web-стартап!
– в Авито с 2009-ого:
● один из четырех первых разработчиков; DBA / sql / plpgsql / php / skytools / linux
● DBA и DB-team lead, развитие смежных компонент
● архитектура, хранение и обработка данных в целом
● работа с базами данных PostgreSQL – основное хранилище:
– директор по разработке и девопс-директор, отдел «аналитиков»
– DB-team: DBA и sql-девелоперы; – 7 человек // есть 2 (две) вакансии
– DevOps/SysAdm – 0.5 человека «на базе» // есть вакансии
– отдельные серверсайд разработчики
– отдельные DWH разработчики («аналитики»)
● отвечаю в том числе за то, чтобы данные «лежали» как надо и где надо
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
3
Avito в цифрах
● Авито – доска N1 в России (Европе)
– «большой» и мобильный сайты; api – приложения и смежные проекты
– топ 10 сайт в России
● 250M просмотров и
● 7M посетителей в сутки
– 25M активных объявлений,
– 700K новых объявлений ежедневно
● ~ 500 человек штат (кто все эти люди?!)
– 80 человек «отдел» разработки
– DB-team: 7 человек, + несколько выделенных серверсайд девелоперов
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
4
Еще цифры
● 200+ серверов на основной платформе
– ~ 100 web app серверов – основные клиенты баз
– ~ 30 серверов с pg
● ~ 10 одновременно под нагрузкой
● 4 – под высокой
● postgres под нагрузкой
– «мастер» база – db, «m1»
● 1.5TB; 3KTPS и 1.5K IUD/sec в среднем
– 8K iops (5–12К) (w/r 2/6К), w/r 25/80 MB/s – 60% utilization SSD raid
– 20-50 active pg connections (intel 20(40ht) CPU, 376GB DDR)
– «стендбай» – db-sb: 600TPS
– «мастер2» – db2, «m2»: HDD raid, 2.5TPS (amd 16CPU, 80GB DDR) // ! uptime: 500d
– «repca» – db-re: 7КTPS, «in-memory» pg (16 CPU)
web
pg1
pg2
pg3
etc
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
5
Как мы к этому шли
● начало: php + memcached и postgres – PostgreSQL
● первые шаги: + pgpool – fail
● postgresql + tsearch – ok
● skype: pgbouncer – OK OK OK !!! *
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
6
Продолжаем идти
● skytools: walmgr – fail
● частичный индекс WHERE ACTIVE – ok
● sphinx – OK
● skytools: php-deamon – OK
● upgrade на 9.0 – bug
https://wiki.postgresql.org/wiki/20110408pg_upgrade_fix
ERROR: could not access status of transaction ######
DETAIL: could not open file "pg_clog/####": No such file or directory=20
● split: m1/m2 – OK *
● mat-view на deffered triggers – OK *
● skytools: londiste – «repca» – PGQ – OK OK !! *
● pitr: pg_basebackup, pg_archivecleanup – OK *
● skytools: plproxy – хранилище «xdb» – OK *
● pgq consumer – «xrpc» – OK *
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
7
PgBouncer
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
8
PgBouncer
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
9
PgBouncer
● pool коннектов
● мультиплексор: transaction pooling
● очередь запросов на одном процессе
– два пула: на клиенте и на сервере
● защита от «съедания» центрального ресурса одним клиентом
● распределение обработки очереди между двумя процессами
● дополнительный удобный прокси уровень
– nice -10 при нагрузке и высоксом la при cpu-bound
– поднятие более одного pgbouncer на сервере базы под высоким трафиком/нагрузкой
● connect query: select x_init()
● proxy
– маршрутизация трафика
– смена юзера: [ app --> pgbouncer ] == > [ pgbouncer – client_usr --> db ]
– смена параметров коннектов: x_init() / x_init('log = on')
● http://pgbouncer.projects.pgfoundry.org/doc/usage.html#_admin_console
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
10
db split
← split start
1) init standby
2.1) promote standby
2.2) switch connections m2
to new host-m2
← split finish
3) drop database:
– m2 on host-m1
– m1 on host-m2
NO tx && NO joins
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
11
«repca»! – londiste: trigger based logical replication
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
12
repca! – londiste: trigger based logical replication
● «матвью» активных айтимов
select item_id as id, get_hstore_pararms(category_id, item_id) as params from items where active
http://www.pgcon.org/2008/schedule/attachments/63_BSDCan2008-MaterializedViews.pdf
http://www.pgcon.org/2008/schedule/attachments/64_BSDCan2008-MaterializedViews-paper.pdf
+ deffered trigger: refresh_function()
● hstore!!! // привет Олегу и Федору
– не правим «матвью» при изменении полей таблиц объявления
● pgq: londiste «матвью» => repca
● repca в шаред буфферах – 7 К TPS
● восстановление:
– резервирование — ! два коснумера на одну очередь (knowhow)
– UNDO log (супер knowhow) и REDO фича londiste
– !!! см. доклад Сергея Бурладяна «Восстановление и другие подходы к авариям»
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
13
Архив
PITR:
pg_basebackup, pg_archivecleanup
!!! см. доклад Сергея Бурладяна
«Восстановление и другие подходы к авариям»
wal
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
14
«XDB» – распределенное хранилище: логическая схема
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
15
«XDB» – физическая схема
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
16
«XDB»: пулы и размер
● pgbouncer.ini_xdb-node_server
;; для внешних клиентов
xcluster = host=localhost user=xuser pool_size=30 datestyle='ISO,DMY'
;; для внутреннего обратного подключения из plproxy
db_01 = host=localhost user=xuser pool_size=10 datestyle='ISO,DMY'
db_02 = host=localhost user=xuser pool_size=10 datestyle='ISO,DMY'
● pgbouncer.ini_xdb-node_client // ROUTER
xdb_01 = host=xdb-node01 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY'
xdb_02 = host=xdb-node01 port=6432 dbname=db_02 pool_size=10 datestyle='ISO,DMY'
xdb_03 = host=xdb-node02 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY'
...
xdb_15 = host=xdb-node08 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY'
xdb_16 = host=xdb-node08 port=6432 dbname=db_02 pool_size=10 datestyle='ISO,DMY'
● CREATE FUNCTION public.xdb_name() RETURNS text LANGUAGE sql AS
$_$ select format('%s %s', current_setting('xdb.server'), current_database()); $_$;
● 7 TB: отправленные письма (7 месяцев по закону), логи, дампы
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
17
«XDB»: архив
ноды резервируют сами себя – отложенный стендбай как архив:
!! см. доклад Сергея Бурладяна «Восстановление и другие подходы к авариям»
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
18
«xrpc»
● «базы» вызывают друг друга асинхронно и получают асинхронный коллбек
● FUNCTION xrpc._call( queue text, _dbconn text, _func text, args hstore ) RETURNS bigint
return pgq.insert_event( queue, -- queue_name
DEFAULT_CALL_TYPE, -- ev_type
'1.1', -- ev_data -- rpc version
_dbconn, -- ev_extra1
_func, -- ev_extra2
args::text, -- ev_extra3
now()::timestamp::text -- ev_extra4
) ; -- call_id: event_id;
● xrpcd – consumer, для каждой базы собирает свои вызовы xrpc.do_call( func, args )
execute 'select "' || replace(func, '.', '"."') || '"( $1 )' using args;
● xrpcd обрабатывает аварии через трекание batch_id // xrpc.set_batch_done
● примеры:
– «геокодер» – где-то по дороге ходит в Яндекс
– асинхронная «транзакционная» обработка больших групп объектов пачками
– очередь модерации
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
19
PGQ
«+»
● ! транзакционность
● минималный оверхед на выборку событий
● отсутствие блокировок
● удобный maintenance очередей
«-»
● нет отложенных событий – by design // отправь письмо через 5 минут
● текстовый формат
● консумер переспрашивает источник по таймауту (1s), нет
подписки на событие на сокете
КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ
БЦ «Белые сады», ул. Лесная, 7, Москва, 125047
Спасибо за внимание!
Михаил Тюрин
mtyurin@avito.ru

More Related Content

PDF
AVITO. Решардинг Redis без даунтайма. DevConf 2012
PDF
pgconf.ru 2015.avito postgresql recovery
PDF
SphinxSearch Meetup - Tips&tricks
PDF
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
PDF
Avito Stachka 2012
PDF
Барнаул15
PDF
Нагруженный поиск на Sphinx
AVITO. Решардинг Redis без даунтайма. DevConf 2012
pgconf.ru 2015.avito postgresql recovery
SphinxSearch Meetup - Tips&tricks
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
Avito Stachka 2012
Барнаул15
Нагруженный поиск на Sphinx

What's hot (19)

PDF
Где живут Ваши объявления / Тюрин Михаил (Avito)
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
PPTX
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
PDF
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
PPTX
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
PDF
Near-realtime аналитика событий в высоконагруженном проекте
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
PDF
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PDF
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PPTX
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
PDF
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Современная операционная система: что надо знать разработчику / Александр Кри...
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Near-realtime аналитика событий в высоконагруженном проекте
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ad

Viewers also liked (20)

PDF
Архитектура поиска в Avito / Андрей Смирнов (Avito)
PDF
Golang в avito
PDF
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
PDF
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
PDF
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
PDF
Расширенное кеширование в Doctrine2
PDF
Илья Космодемьянский, PostgreSQL-Consulting.com. «Pragma autonomous transaction»
PDF
Идеальный питч
PDF
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
PPTX
Платежная система за год / Филипп Дельгядо (Информационные технологии и системы)
PDF
Виктор Яковлев, "Yandex": "О дивный новый-старый мир контекстной рекламы"
PDF
Инструменты разные нужны, инструменты разные важны
PDF
Аналитика приложений конкурентов
PDF
Онлайн-взаимодействие: вовлечение, исследование и обучение сотрудников
PDF
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
PPTX
Олеся Кащеева, Ostrovok.ru
PPTX
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
PDF
«Как перейти от веб-аналитики к аналитике мобильных приложений» Д. Школьник...
PDF
Yandex market shops overview
Архитектура поиска в Avito / Андрей Смирнов (Avito)
Golang в avito
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Расширенное кеширование в Doctrine2
Илья Космодемьянский, PostgreSQL-Consulting.com. «Pragma autonomous transaction»
Идеальный питч
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Платежная система за год / Филипп Дельгядо (Информационные технологии и системы)
Виктор Яковлев, "Yandex": "О дивный новый-старый мир контекстной рекламы"
Инструменты разные нужны, инструменты разные важны
Аналитика приложений конкурентов
Онлайн-взаимодействие: вовлечение, исследование и обучение сотрудников
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Олеся Кащеева, Ostrovok.ru
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
«Как перейти от веб-аналитики к аналитике мобильных приложений» Д. Школьник...
Yandex market shops overview
Ad

Similar to pgconf.ru 2015 avito postgresql (20)

PDF
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PDF
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PDF
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
PDF
Postgresql v509
PDF
История небольшого успеха с PostgreSQL – Владимир Бородин
PPTX
Hosting for forbes.ru_
PPTX
Open source субд глазами обычного программиста
PDF
Hacking PostgreSQL. Обзор исходного кода
PPTX
PostgreSQL. Стильно. Модно. Молодёжно
PDF
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
PDF
Перевод новостного приложения на БД PostgreSQL
PDF
Владимир Бородин - PostgreSQL
PDF
Облако в Badoo год спустя
PDF
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
PDF
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
PPTX
pgconf.ru 2017
ODP
SECON'2016. Сигаев Федор, Pg в кластере. Скандалы, интриги, расследования
PDF
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PDF
PostgreSQL performance recipes
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
Postgresql v509
История небольшого успеха с PostgreSQL – Владимир Бородин
Hosting for forbes.ru_
Open source субд глазами обычного программиста
Hacking PostgreSQL. Обзор исходного кода
PostgreSQL. Стильно. Модно. Молодёжно
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Перевод новостного приложения на БД PostgreSQL
Владимир Бородин - PostgreSQL
Облако в Badoo год спустя
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
pgconf.ru 2017
SECON'2016. Сигаев Федор, Pg в кластере. Скандалы, интриги, расследования
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PostgreSQL performance recipes

pgconf.ru 2015 avito postgresql

  • 2. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 2 Всем привет! Михаил Тюрин, Avito.ru – главный системный архитектор, базы данных – с PostgreSQL с 2004-ого, с версий 7.4/8.0, региональный web-стартап! – в Авито с 2009-ого: ● один из четырех первых разработчиков; DBA / sql / plpgsql / php / skytools / linux ● DBA и DB-team lead, развитие смежных компонент ● архитектура, хранение и обработка данных в целом ● работа с базами данных PostgreSQL – основное хранилище: – директор по разработке и девопс-директор, отдел «аналитиков» – DB-team: DBA и sql-девелоперы; – 7 человек // есть 2 (две) вакансии – DevOps/SysAdm – 0.5 человека «на базе» // есть вакансии – отдельные серверсайд разработчики – отдельные DWH разработчики («аналитики») ● отвечаю в том числе за то, чтобы данные «лежали» как надо и где надо
  • 3. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 3 Avito в цифрах ● Авито – доска N1 в России (Европе) – «большой» и мобильный сайты; api – приложения и смежные проекты – топ 10 сайт в России ● 250M просмотров и ● 7M посетителей в сутки – 25M активных объявлений, – 700K новых объявлений ежедневно ● ~ 500 человек штат (кто все эти люди?!) – 80 человек «отдел» разработки – DB-team: 7 человек, + несколько выделенных серверсайд девелоперов
  • 4. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 4 Еще цифры ● 200+ серверов на основной платформе – ~ 100 web app серверов – основные клиенты баз – ~ 30 серверов с pg ● ~ 10 одновременно под нагрузкой ● 4 – под высокой ● postgres под нагрузкой – «мастер» база – db, «m1» ● 1.5TB; 3KTPS и 1.5K IUD/sec в среднем – 8K iops (5–12К) (w/r 2/6К), w/r 25/80 MB/s – 60% utilization SSD raid – 20-50 active pg connections (intel 20(40ht) CPU, 376GB DDR) – «стендбай» – db-sb: 600TPS – «мастер2» – db2, «m2»: HDD raid, 2.5TPS (amd 16CPU, 80GB DDR) // ! uptime: 500d – «repca» – db-re: 7КTPS, «in-memory» pg (16 CPU) web pg1 pg2 pg3 etc
  • 5. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 5 Как мы к этому шли ● начало: php + memcached и postgres – PostgreSQL ● первые шаги: + pgpool – fail ● postgresql + tsearch – ok ● skype: pgbouncer – OK OK OK !!! *
  • 6. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 6 Продолжаем идти ● skytools: walmgr – fail ● частичный индекс WHERE ACTIVE – ok ● sphinx – OK ● skytools: php-deamon – OK ● upgrade на 9.0 – bug https://wiki.postgresql.org/wiki/20110408pg_upgrade_fix ERROR: could not access status of transaction ###### DETAIL: could not open file "pg_clog/####": No such file or directory=20 ● split: m1/m2 – OK * ● mat-view на deffered triggers – OK * ● skytools: londiste – «repca» – PGQ – OK OK !! * ● pitr: pg_basebackup, pg_archivecleanup – OK * ● skytools: plproxy – хранилище «xdb» – OK * ● pgq consumer – «xrpc» – OK *
  • 9. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 9 PgBouncer ● pool коннектов ● мультиплексор: transaction pooling ● очередь запросов на одном процессе – два пула: на клиенте и на сервере ● защита от «съедания» центрального ресурса одним клиентом ● распределение обработки очереди между двумя процессами ● дополнительный удобный прокси уровень – nice -10 при нагрузке и высоксом la при cpu-bound – поднятие более одного pgbouncer на сервере базы под высоким трафиком/нагрузкой ● connect query: select x_init() ● proxy – маршрутизация трафика – смена юзера: [ app --> pgbouncer ] == > [ pgbouncer – client_usr --> db ] – смена параметров коннектов: x_init() / x_init('log = on') ● http://pgbouncer.projects.pgfoundry.org/doc/usage.html#_admin_console
  • 10. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 10 db split ← split start 1) init standby 2.1) promote standby 2.2) switch connections m2 to new host-m2 ← split finish 3) drop database: – m2 on host-m1 – m1 on host-m2 NO tx && NO joins
  • 12. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 12 repca! – londiste: trigger based logical replication ● «матвью» активных айтимов select item_id as id, get_hstore_pararms(category_id, item_id) as params from items where active http://www.pgcon.org/2008/schedule/attachments/63_BSDCan2008-MaterializedViews.pdf http://www.pgcon.org/2008/schedule/attachments/64_BSDCan2008-MaterializedViews-paper.pdf + deffered trigger: refresh_function() ● hstore!!! // привет Олегу и Федору – не правим «матвью» при изменении полей таблиц объявления ● pgq: londiste «матвью» => repca ● repca в шаред буфферах – 7 К TPS ● восстановление: – резервирование — ! два коснумера на одну очередь (knowhow) – UNDO log (супер knowhow) и REDO фича londiste – !!! см. доклад Сергея Бурладяна «Восстановление и другие подходы к авариям»
  • 13. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 13 Архив PITR: pg_basebackup, pg_archivecleanup !!! см. доклад Сергея Бурладяна «Восстановление и другие подходы к авариям» wal
  • 16. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 16 «XDB»: пулы и размер ● pgbouncer.ini_xdb-node_server ;; для внешних клиентов xcluster = host=localhost user=xuser pool_size=30 datestyle='ISO,DMY' ;; для внутреннего обратного подключения из plproxy db_01 = host=localhost user=xuser pool_size=10 datestyle='ISO,DMY' db_02 = host=localhost user=xuser pool_size=10 datestyle='ISO,DMY' ● pgbouncer.ini_xdb-node_client // ROUTER xdb_01 = host=xdb-node01 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY' xdb_02 = host=xdb-node01 port=6432 dbname=db_02 pool_size=10 datestyle='ISO,DMY' xdb_03 = host=xdb-node02 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY' ... xdb_15 = host=xdb-node08 port=6432 dbname=db_01 pool_size=10 datestyle='ISO,DMY' xdb_16 = host=xdb-node08 port=6432 dbname=db_02 pool_size=10 datestyle='ISO,DMY' ● CREATE FUNCTION public.xdb_name() RETURNS text LANGUAGE sql AS $_$ select format('%s %s', current_setting('xdb.server'), current_database()); $_$; ● 7 TB: отправленные письма (7 месяцев по закону), логи, дампы
  • 17. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 17 «XDB»: архив ноды резервируют сами себя – отложенный стендбай как архив: !! см. доклад Сергея Бурладяна «Восстановление и другие подходы к авариям»
  • 18. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 18 «xrpc» ● «базы» вызывают друг друга асинхронно и получают асинхронный коллбек ● FUNCTION xrpc._call( queue text, _dbconn text, _func text, args hstore ) RETURNS bigint return pgq.insert_event( queue, -- queue_name DEFAULT_CALL_TYPE, -- ev_type '1.1', -- ev_data -- rpc version _dbconn, -- ev_extra1 _func, -- ev_extra2 args::text, -- ev_extra3 now()::timestamp::text -- ev_extra4 ) ; -- call_id: event_id; ● xrpcd – consumer, для каждой базы собирает свои вызовы xrpc.do_call( func, args ) execute 'select "' || replace(func, '.', '"."') || '"( $1 )' using args; ● xrpcd обрабатывает аварии через трекание batch_id // xrpc.set_batch_done ● примеры: – «геокодер» – где-то по дороге ходит в Яндекс – асинхронная «транзакционная» обработка больших групп объектов пачками – очередь модерации
  • 19. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ 19 PGQ «+» ● ! транзакционность ● минималный оверхед на выборку событий ● отсутствие блокировок ● удобный maintenance очередей «-» ● нет отложенных событий – by design // отправь письмо через 5 минут ● текстовый формат ● консумер переспрашивает источник по таймауту (1s), нет подписки на событие на сокете
  • 20. КОЛОНТИТУЛ:ТЕМАПРЕЗЕНТАЦИИ БЦ «Белые сады», ул. Лесная, 7, Москва, 125047 Спасибо за внимание! Михаил Тюрин mtyurin@avito.ru