Говорят, что
Instagram использует DBMS PostgreSQL. И не просто
использует, а в хвост и гриву. В связи с
этим очень любопытно ознакомиться с
опытом инженеров Instagram:
Частичные
индексы (Partial Indexes)
Если вы часто
используете в ваших запросах фильтры
по конкретной характеристике, и эта
характеристика представлена в меньшей
части строк вашей базы, частичные индексы
могут вам серьезно помочь.
...
Функциональные
индексы (Functional Indexes)
Для некоторых
из наших таблиц, нам нужно индексировать
строки (например, 64-символьные base64
токены), довольно длинные, для того,
чтобы создавать по ним индекс — это
выльется в дублирование большого
количества информации. В этом случае
очень полезны могут быть функциональные
индексы Postgres'а:
CREATE INDEX
CONCURRENTLY on tokens (substr(token, 0, 8))
...
pg_reorg для
сжатия
По прошествии
какого-то времени, таблицы Postgres могут
быть фрагментированы на диске (из-за
конкурентной модели MVCC Postgres'а, например).
Также, чаще всего, вставка строк
осуществляется не в том порядке, в
котором вы хотите их получать. Например,
если вы часто запрашиваете все лайки,
созданные одним пользователем, было бы
неплохо, если бы эти лайки были записаны
на диске непрерывно, чтобы минимизировать
поиски по диску.
...
WAL-E для
архивации и бекапов WAL
Мы используем
и вносим свой вклад в разработку WAL-E,
набор инструментов платформы Heroku для
непрерывной архивации WAL (Write-Ahead Log)
файлов Postgres.
...
Режим
автокоммита и асинхронный режим в
psycopg2
Через какое-то
время мы начали использовать более
продвинутые возможности psycopg2,
Python-драйвера для Postgres.
Первая — это
режим автокоммита (autocommit mode). В этом
режиме psycopg2 не требует BEGIN/COMMIT ни для
каких запросов, вместо этого каждый
запрос запускается в отдельной транзакции.
Это в особенности полезно для запросов
выборки из базы, для которых использование
транзакций не имеет смысла.
...
Другая
полезная возможность в psycopg2 — это
возможность регистрировать wait_callback для
вызова подпрограмм. Ее использование
позволяет делать параллельные запросы
по нескольким соединениям единовременно,
что полезно для запросов, затрагивающих
множество нод
...
В общем и
целом, мы очень удовлетворены
производительностью и надежностью
Postgres'а.
Не менее
интересная статья, хотя и без перевода:
Чтобы знать,
как мы горизонтально масштабируем
Postgres, смотрите наш пост Sharding
and IDs at Instagram
Этот комментарий был удален администратором блога.
ОтветитьУдалить