Структуры данных в разделяемой памяти,
про алгоритмы замещения страниц в буфере и блокировки, которые используются на разных уровнях взаимодействия.
А также средства мониторинга памяти, уже существующие и те, которые ещё только в процессе разработки.
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
Презентация доклада о B-tree индексах для российской конференции по PostgreSQL pgconf.ru. В презентации рассмотрены особенности архитектуры, важные для оптимального использования btree индексов. Кроме того, представлены улучшения функциональности B-tree в PostgreSQL, которые войдут в релиз 9.6. Это компрессия дубликатов и новые возможности использования покрывающих (covering) индексов.
Структуры данных в разделяемой памяти,
про алгоритмы замещения страниц в буфере и блокировки, которые используются на разных уровнях взаимодействия.
А также средства мониторинга памяти, уже существующие и те, которые ещё только в процессе разработки.
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
Презентация доклада о B-tree индексах для российской конференции по PostgreSQL pgconf.ru. В презентации рассмотрены особенности архитектуры, важные для оптимального использования btree индексов. Кроме того, представлены улучшения функциональности B-tree в PostgreSQL, которые войдут в релиз 9.6. Это компрессия дубликатов и новые возможности использования покрывающих (covering) индексов.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
Потоковая репликация, которая появилась в 2010 году, стала одной из прорывных фич постгреса и в настоящее время практически ни одна инсталляция не обходится без использования потоковой репликации. Она надежна, легка в настройке, нетребовательна к ресурсам. Однако при всех своих положительных качествах, при её эксплуатации могут возникать различные проблемы и неприятные ситуации. Для диагностики и решения проблем, связанных с потоковой репликацией, есть множество инструментов, как встроенных в PostgreSQL, так и сторонних.
В этом докладе я сделаю обзор доступных инструментов и расскажу, как с помощью этих средств диагностировать различные типы проблем и как устранять их. Рассматривая методы решения, мы также рассмотрим проблемы, которые возникают при эксплуатации потоковой репликации.
Доклад будет полезен DBA и системным администраторам.
Александр Крашенинников "Hadoop High Availability: опыт Badoo"IT Event
Инфраструктура Hadoop – популярное решение для таких задач, как распределённое хранение данных и вычисления Map/Reduce на кластере. Хорошая масштабируемость и развитая экосистема подкупают и обеспечивают Hadoop’у прочное место в инфраструктуре различных информационных систем. Но чем больше ответственности возлагается на этот компонент, тем важнее обеспечивать его отказоустойчивость и high availability.
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
В дата-центрах нашей компании несколько тысяч серверов, и примерно на половине из них нужно выкладывать PHP-код 2 раза в день. Помимо раскладки на production также не стоит забывать о том, что код нужен на стейджинге, и в стейджинг-кластер у нас входит около 50 машин, код на которых обновляется раз в несколько минут. Также есть «хотфиксы» — небольшие (1-5) наборы файлов, которые выкладываются во внеочередном порядке на все или на выделенную часть серверов, чтобы устранить существующие проблемы на продакшне, не дожидаясь полной выкладки.
В этом докладе я расскажу о том, как мы деплоились в течение 10 лет, о том, какую новую систему для деплоя PHP-кода мы разработали и внедрили в production, а также проведу обзор решений для масштабного деплоя кода на PHP и анализ их производительности.
План доклада:
— Наша старая система деплоя, достоинства и недостатки.
— Существующие решения:
* "svn up" / "git pull".
* rsync.
* phar, hhbc (HHVM-specific), "loop".
* rsync + 2 директории + realpath_root (Rasmus-style).
— Требования для новой системы деплоя.
* быстрый деплой на стейджинг (5-10 секунд на 50 серверов).
* возможность атомарно патчить несколько файлов и быстро их выкладывать (10 секунд на весь кластер).
* совместимость с docker.
* поддержка «долгоиграющих» CLI-скриптов (несколько часов).
* низкое потребление ресурсов на принимающей стороне.
* отсутствие необходимости сбрасывать opcache.
* высокая скорость деплоя на продакшн (1-2 минуты на 1500 серверов).
— MDK — multiversion deployment kit.
— Анализ применимости и производительности способов деплоя.
— Выводы.
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
Довольно часто как адинистраторы, так и разработчики жалуются на низкую производительность приложений, работающих с базой данных, и нередко при этом ищут решения возникших проблем с помощью различных настроек как СУБД, так и операционной системы, пренебрегая при этом самым действенным способом - оптимизацией запросов к собственно БД.
Тому, как понимать, где же узкие места, и как их можно попробовать избежать на примере PostgreSQL и посвящен этот доклад.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
Каждый день на badoo.com пользователи просматривают порядка 100 миллионов профилей других юзеров. Мы храним счетчики и полную историю посещений за последние 90 дней, с некоторой агрегацией - это около 5 миллиардов ивентов. Система обрабатывающая этот поток данных создана давно и пережила несколько инкарнаций, становясь все ближе к базе данных.
В какой-то момент мы решили перестать изобретать велосипед, отказались от демонов на C+sqlite, не стали делать на mysql-ях, редисах и мемкешах, а взяли и запилили на Tarantool.
Рассказываем почему Tarantool, как шардим, реплицируем (все просто) и как плавно это дело внедрили на живой системе без downtime.
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Ontico
RethinkDB - это распределенное документо-ориентированное хранилище данных с открытым исходным кодом. Данная система ориентирована на разработку систем обработки данных реального времени, позволяя клиентскому приложению подписываться на изменение тех или иных данных.
В данном докладе я бы хотел осветить не только вопросы разработки приложений на базе RethinkDB, но и поговорить о том, как все это работает. Мы поговорим о ReQL (язык запросов), “changefeeds”, индексах, шардинге, репликациях, а также затронем вопросы особенностей проектирования баз данных под данную платформу.
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Hacking PostgreSQL. Лекция 1. Вводная лекция для начинающих разработчиков ядра PostgreSQL. Видео и площадка для обсуждения в блоге http://postgres-edu.blogspot.ru/2016/02/20160225.html
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
Потоковая репликация, которая появилась в 2010 году, стала одной из прорывных фич постгреса и в настоящее время практически ни одна инсталляция не обходится без использования потоковой репликации. Она надежна, легка в настройке, нетребовательна к ресурсам. Однако при всех своих положительных качествах, при её эксплуатации могут возникать различные проблемы и неприятные ситуации. Для диагностики и решения проблем, связанных с потоковой репликацией, есть множество инструментов, как встроенных в PostgreSQL, так и сторонних.
В этом докладе я сделаю обзор доступных инструментов и расскажу, как с помощью этих средств диагностировать различные типы проблем и как устранять их. Рассматривая методы решения, мы также рассмотрим проблемы, которые возникают при эксплуатации потоковой репликации.
Доклад будет полезен DBA и системным администраторам.
Александр Крашенинников "Hadoop High Availability: опыт Badoo"IT Event
Инфраструктура Hadoop – популярное решение для таких задач, как распределённое хранение данных и вычисления Map/Reduce на кластере. Хорошая масштабируемость и развитая экосистема подкупают и обеспечивают Hadoop’у прочное место в инфраструктуре различных информационных систем. Но чем больше ответственности возлагается на этот компонент, тем важнее обеспечивать его отказоустойчивость и high availability.
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
В дата-центрах нашей компании несколько тысяч серверов, и примерно на половине из них нужно выкладывать PHP-код 2 раза в день. Помимо раскладки на production также не стоит забывать о том, что код нужен на стейджинге, и в стейджинг-кластер у нас входит около 50 машин, код на которых обновляется раз в несколько минут. Также есть «хотфиксы» — небольшие (1-5) наборы файлов, которые выкладываются во внеочередном порядке на все или на выделенную часть серверов, чтобы устранить существующие проблемы на продакшне, не дожидаясь полной выкладки.
В этом докладе я расскажу о том, как мы деплоились в течение 10 лет, о том, какую новую систему для деплоя PHP-кода мы разработали и внедрили в production, а также проведу обзор решений для масштабного деплоя кода на PHP и анализ их производительности.
План доклада:
— Наша старая система деплоя, достоинства и недостатки.
— Существующие решения:
* "svn up" / "git pull".
* rsync.
* phar, hhbc (HHVM-specific), "loop".
* rsync + 2 директории + realpath_root (Rasmus-style).
— Требования для новой системы деплоя.
* быстрый деплой на стейджинг (5-10 секунд на 50 серверов).
* возможность атомарно патчить несколько файлов и быстро их выкладывать (10 секунд на весь кластер).
* совместимость с docker.
* поддержка «долгоиграющих» CLI-скриптов (несколько часов).
* низкое потребление ресурсов на принимающей стороне.
* отсутствие необходимости сбрасывать opcache.
* высокая скорость деплоя на продакшн (1-2 минуты на 1500 серверов).
— MDK — multiversion deployment kit.
— Анализ применимости и производительности способов деплоя.
— Выводы.
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
Довольно часто как адинистраторы, так и разработчики жалуются на низкую производительность приложений, работающих с базой данных, и нередко при этом ищут решения возникших проблем с помощью различных настроек как СУБД, так и операционной системы, пренебрегая при этом самым действенным способом - оптимизацией запросов к собственно БД.
Тому, как понимать, где же узкие места, и как их можно попробовать избежать на примере PostgreSQL и посвящен этот доклад.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
Каждый день на badoo.com пользователи просматривают порядка 100 миллионов профилей других юзеров. Мы храним счетчики и полную историю посещений за последние 90 дней, с некоторой агрегацией - это около 5 миллиардов ивентов. Система обрабатывающая этот поток данных создана давно и пережила несколько инкарнаций, становясь все ближе к базе данных.
В какой-то момент мы решили перестать изобретать велосипед, отказались от демонов на C+sqlite, не стали делать на mysql-ях, редисах и мемкешах, а взяли и запилили на Tarantool.
Рассказываем почему Tarantool, как шардим, реплицируем (все просто) и как плавно это дело внедрили на живой системе без downtime.
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Ontico
RethinkDB - это распределенное документо-ориентированное хранилище данных с открытым исходным кодом. Данная система ориентирована на разработку систем обработки данных реального времени, позволяя клиентскому приложению подписываться на изменение тех или иных данных.
В данном докладе я бы хотел осветить не только вопросы разработки приложений на базе RethinkDB, но и поговорить о том, как все это работает. Мы поговорим о ReQL (язык запросов), “changefeeds”, индексах, шардинге, репликациях, а также затронем вопросы особенностей проектирования баз данных под данную платформу.
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Hacking PostgreSQL. Лекция 1. Вводная лекция для начинающих разработчиков ядра PostgreSQL. Видео и площадка для обсуждения в блоге http://postgres-edu.blogspot.ru/2016/02/20160225.html
Making Awesome Experiences with BiosensorsSophiKravitz
Talk about some of my art installations using heartbeat sensors, brainwave sensors and skin conductance sensing.
Also includes selected art installations by other artists.
Sphinx считается одним из самых быстрых и гибких поисковых движков на рынке, но не является "коробочным" решением, чем отпугивает многих разработчиков. Я расскажу как быстро поднять полнотекстовый поиск для своего проекта на базе Sphinx, почему он крут и какие существуют интеграционные решения для Python.
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
Extensions allow you to stay in the PostgreSQL ecosystem, use the usual means of backup, monitoring and other things, while getting functionality that is specific to temporal data and time series.
Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
MySQL Test Framework для поддержки клиентов и верификации баговSveta Smirnova
Talk for TestDriven Conf: https://tdconf.ru/2022/abstracts/8763
MySQL Test Framework (MTR) — это фреймворк для регрессионных тестов MySQL. Тесты для него пишут разработчики MySQL и запускаются во время подготовки к новым релизам.
MTR можно использовать и по-другому. Я его использую, чтобы тестировать проблемы, о которых сообщают клиенты, и подтверждать сообщения об ошибках (bug reports) одновременно на нескольких версиях MySQL.
При помощи MTR можно:
* программировать сложные развёртывания;
* тестировать проблему на нескольких версиях MySQL/Percona/MariaDB-серверов при помощи одной команды;
* тестировать несколько одновременных соединений;
* проверять ошибки и возвращаемые значения;
* работать с результатами запросов, хранимыми процедурами и внешними командами.
Тест может быть запущен на любой машине с MySQL-, Percona- или MariaDB-сервером.
Я покажу, как я работаю с MySQL Test Framework, и надеюсь, что вы тоже полюбите этот инструмент.
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Similar to Hacking PostgreSQL. Физическое представление данных (20)
5. 5
OID
src/include/postgres_ext.h
/* Object ID is a fundamental type in Postgres. */
typedef unsigned int Oid;
#define InvalidOid ((Oid) 0)
src/include/access/transam.h
#define FirstBootstrapObjectId 10000
#define FirstNormalObjectId 16384
8. 8
Приведение типов
SELECT oid, relname FROM pg_class LIMIT 1;
oid | relname
------+--------------
2619 | pg_statistic
SELECT * FROM pg_attribute WHERE attrelid = 'pg_statistic'::regclass;
SELECT * FROM pg_attribute WHERE attrelid =
(SELECT oid FROM pg_class WHERE relname = 'pg_statistic');
SELECT 'pg_statistic'::regclass::oid;
oid
------
2619
SELECT 2619::regclass;
regclass
--------------
pg_statistic
9. 9
Вопросы и источники
●
Что происходит при OID wraparond?
●
Сказывается ли это на производительности?
●
Могут ли закончиться OID?
●
В каком случае, и что тогда произойдет?
●
Документация про OID
●
[HACKERS] 32bit OID wrap around conceerns
24. 24
Страница(блок) – единица I/O
src/include/storage/bufpage.h
src/backend/access/nbtree/nbtpage.c
Разные методы доступа
отличаются структурой данных
на странице
34. 34
PageHeaderData
src/include/storage/bufpage.h
typedef struct PageHeaderData
{
/* XXX LSN is member of *any* block, not only page-organized ones */
PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog
* record for last change to this page */
uint16 pd_checksum; /* checksum */
uint16 pd_flags; /* flag bits, see below */
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
} PageHeaderData;
37. 37
Домашнее задание.
●
Простое
●
Регрессионные тесты для pageinspect
●
Перенести функции gevel в pageinspect
●
Контриб, который воспроизводимо ломает данные в
файле таблицы/индекса (чисто в академических
целях). Может быть функция в pageinspect.
●
Сложное
●
Обновление default значений
●
Чтение данных из битых файлов
Прежде, чем говорить о физическом хранении данных в базе, надо сначала понять, какие же собственно объекты могут в ней находиться.
Обратимся к нашему любимому каталогу. В этой лекции самым полезным и интересным будет pg_class. В этом каталоге описываются таблицы и практически всё, что имеет колонки или каким-то образом подобно таблице.
У каждого relation есть уникальный идентификатор OID.
OID или object indentificator, вообще говоря, есть не только у отношений, но у любого объекта PostgreSQL. Объектами являются сами базы данных, отношения, функции, типы данных и так далее. Каждому элементу enum в постгресе тоже присваивается отдельный OID.
Глубоко внутри OID это всего лишь unsigned int, но небольшой набор правил превращает его в фундаментальный тип данных постгреса.
Итак OID со значением 0 обозначает невалидный OID.
Первые 10 тысяч значений зарезервированы для назначения вручну предопределенных OID. Используются они, например, в файлах src/include/catalog
Значения от 10 тысяч до 16383 (совершенно необъяснимое магическое число) зарезервированы для назначения в процессе работы initdb.
Значения OID начиная с 16384 назначаются генератором OID в процессе обычной работы сервера.
Unsigned int содержит много значений, но всё-таки не бесконечно. Поэтому иногда происходит wraparound генератора OID, при этом значения от 0 до FirstNormalObjectId пропускаются.
При создания нового объекта (кроме объектов отношений), нужно сначала сгенерировать для него OID. Функция GetNewOid генерирует OID, уникальный в пределах заданного отношения. Например для создания новой базы нужно вызвать GetNewOid от таблицы каталога pg_database. Уникальность обеспечивается тем, что на всех соответствующих таблицах каталога есть уникальный индекс.
При создании relation, OID, если нужно, назначается функцией GetNewRelFileNode. Про то, что такое relfilenode чуть позже.
Обе эти функции вызывают внутренний генератор GetNewObjectId, который получает значение nextOid из глобального для всего кластера счетчика OID.
Зачем я вам всё это рассказываю? С практической стороны глобальные OID — одно из препятствий, которое нужно преодолеть, для реализации бэкапа отдельной базы.
Если вы создаете новую запись в системном каталоге вручную, например добавляете функцию в pg_proc, нужно выбрать для неё OID и вписать его в строку самостоятельно. Скрипт unused_oids помогает найти свободные для использования OID. Если для некоторых целей вам понадобился целый набор OID, лучше выбрать последовательные значения.
Скрипт duplicate_oids можно использовать для проверки уникальности OID. Например, после merge.
Некоторые таблицы каталога содержат системную скрытую колонку OID, чтобы вывести её, надо явно задать её в select. Select * не выдаст вам oid.
Для удобства есть различные alias для OID. Например regclass.
Помимо regclass есть ещё regproc, regtype и другие типы идентификаторов, которые соответствуют разным таблицам каталога.
Если вы создаете новую запись в системном каталоге вручную, например добавляете функцию в pg_proc, нужно выбрать для неё OID и вписать его в строку самостоятельно. Скрипт unused_oids помогает найти свободные для использования OID. Если для некоторых целей вам понадобился целый набор OID, лучше выбрать последовательные значения.
Скрипт duplicate_oids можно использовать для проверки уникальности OID. Например, после merge.
Postgres работает поверх файловой системы.
Данные, относящиеся к одному инстансу postgres лежат в директории data. Её расположение можно задать переменной окружения $PGDATA.
Эта директория содержит несколько управляющих файлов и поддиректорий, каждая из которых имеет особое назначение. Сегодня мы будем говорить не про все из них, а только про те, которые содержат непосредственно данные пользователя базы или управляют их физической структурой. Файлы журналов, поддержку транзакционности, статистику и много других интересных разделов отложим до следующих занятий, хотя физически все эти данные также по умолчанию лежат в директории PGDATA.
Кстати, недавно найденный баг pg_basebackup в Debian.
Конфиги там лежат отдельно, и большинство утилит постгреса умеют это понимать, а вот pg_basebackup что-то делает неправильно. Опять же, когда он создается с шаблонным файлом postgesql.conf, тот ложится в pgdata (как на других системах), а не к остальным конфигам.
В директории global лежат данные, общие для всех баз данного инстанса. А именно:
pg_control — позиция последнего checkpoint, необходимая для WAL. При запуске восстановления сервер в первую очередь проверяет файл pg_global.
Если кому-то интересно, что конкретно там лежит заглядывайте в файл src/include/catalog/pg_control.h
pg_filenode.map
Для большинства таблиц физическое расположение файла определяется записью в pg_class.relfilenode.
Очевидно, что для самого pg_class это не работает. На самом деле не только для pg_class, но и для некоторых других базовых и глобальных relation. Маппингом для них занимается pg_filenode.map.
src/backend/utils/cache/relmapper.c
pg_internal.init — файл, который используется для ускорения загрузки бэкенда.
Давайте узнаем, что за куча файлов лежит в pg_global. Выберем из pg_class всё, что относится к tablespace global.
Я не буду подробно говорить про все эти файлы. Это таблицы каталога и индексы на них. Отмечу только, что relfilenode у них равен нулю. Это значит, что маппингом этих файлов занимается тот самый pg_filenode.map, про который мы узнали на предыдущем слайде.
Просто продолжение таблички с предыдущего слайда.
Табличные пространства позволяют администратору управлять дисковым пространством для инсталляции PostgreSQL. Это полезно минимум по двум причинам. Во-первых, это нехватка места в разделе, на котором был инициализирован кластер и невозможность его расширения. Табличное пространство можно создать в другом разделе и использовать его до тех пор, пока не появится возможность переконфигурирования системы.
Even though located outside the main PostgreSQL data directory, tablespaces are an integral part of the database cluster and cannot be treated as an autonomous collection of data files. They are dependent on metadata contained in the main data directory, and therefore cannot be attached to a different database cluster or backed up individually. Similarly, if you lose a tablespace (file deletion, disk failure, etc), the database cluster might become unreadable or unable to start. Placing a tablespace on a temporary file system like a RAM disk risks the reliability of the entire cluster.
Давайте наконец вернемся к нашим базам. Они лежат в поддиректории base. Посмотрим её содержимое. Здорово. Но непонятно.
Здесь нам на помощь приходит скрипт oid2name.
...
Стало значительно лучше. Три стандартных базы, которые есть в любом постгресе и ещё одна пользовательская.
Можно развлекаться с oid2name. Можно воспользоваться встроенными функциями для маппинга имени relation в файл.
Здорово. Но непонятно.
Здесь нам на помощь приходит скрипт oid2name.
Рассказать про его работу.
Стало значительно лучше. Три стандартных базы, которые есть в любом постгресе и ещё одна пользовательская.
Здорово. Но непонятно.
Здесь нам на помощь приходит скрипт oid2name.
Рассказать про его работу.
Стало значительно лучше. Три стандартных базы, которые есть в любом постгресе и ещё одна пользовательская.
Здорово. Но непонятно.
Здесь нам на помощь приходит скрипт oid2name.
Рассказать про его работу.
Стало значительно лучше. Три стандартных базы, которые есть в любом постгресе и ещё одна пользовательская.
При выполнении некоторых операций, таких как truncate, cluster, relfilenode меняется, в то время как OID остается прежним.
В коде есть структура relfilenode, которая содержит всё, что нужно для физического доступа к relation. Здесь мы рассматриваем relation как нечто атомарное, хотя как мы увидим дальше и он разделен на много разных файлов.
В Berkley Postgres было реализовано несколько различных storage managers. Они не входили во внешние релизы Postgres. Теперь осталась только одна реализация storage manager - (magnetic disk). Название, впрочем, уже не отражает суть. До сих пор есть возможность написать другой storage manager. Честно говоря, я не очень активно слежу за рассылками, но не слышала, чтобы кто-то этим интересовался.
В berkley каждый relation имел тэг, который связывал его с smgr. Сейчас этого нет. И если когда-нибудь будет реализован новый smgr, наверное лучше связывать их с tablespace.
smgr.c — переключение между различными smgr, управление кэшем SmgrRelation
md.c — реализация слоя между API smgr и API файловой системы.
* each data file (heap or index) is divided into postgres disk blocks
* (which may be thought of as the unit of i/o -- a postgres buffer
* contains exactly one disk block). the blocks are numbered
* sequentially, 0 to 0xFFFFFFFE.
*
* InvalidBlockNumber is the same thing as P_NEW in buf.h.
*
* the access methods, the buffer manager and the storage manager are
* more or less the only pieces of code that should be accessing disk
* blocks directly.
* this is a storage type for BlockNumber. in other words, this type
* is used for on-disk structures (e.g., in HeapTupleData) whereas
* BlockNumber is the type on which calculations are performed (e.g.,
* in access method code).
*
* there doesn't appear to be any reason to have separate types except
* for the fact that BlockIds can be SHORTALIGN'd (and therefore any
* structures that contains them, such as ItemPointerData, can also be
* SHORTALIGN'd). this is an important consideration for reducing the
* space requirements of the line pointer (ItemIdData) array on each
* page and the header of each heap or index tuple, so it doesn't seem
* wise to change this without good reason.
Есть 4 типа форков.
Код для создания и удаления физического хранилища для relation.
Создается только главный форк, остальные создаются только в момент, когда они нужны. Эта функция транзакционна. Если транзакция отменена, storage будет удален.
В то же время, drop table удаляет файлы не сразу, а только после коммита транзакции
Since most code wants to access the main fork, a shortcut version of
ReadBuffer that accesses MAIN_FORKNUM is provided in the buffer manager for
convenience.
FSM обновлена в версии 8.4.
FSM — бинарное дерево. Для каждой страницы хранится количество свободного места с гранулярностью 1/256. То есть freespace деленное на BLCKSZ/256.
Плюсы:
Чтобы узнать, что страницы с таким количеством места нет — достаточно проверить root.
Если кто-то хочет быстрой славы)
Можете поправить выравнивание этого комментария)