Skip to content
This repository was archived by the owner on May 26, 2022. It is now read-only.

Commit a7292e1

Browse files
committed
Merge branch 'master' into dev
2 parents d02d499 + f0a47c2 commit a7292e1

File tree

10 files changed

+21
-21
lines changed

10 files changed

+21
-21
lines changed

cache/pgmemcache.tex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ \subsection{Проверка}
8181
newval = memcache\_decr(key::TEXT)
8282
&
8383
Если ключ существует и является целым числом, происходит уменьшение
84-
его значения на указаное число (по умолчанию на единицу).
84+
его значения на указанное число (по умолчанию на единицу).
8585
Возвращает целое число после уменьшения.\\
8686

8787
\hline
@@ -126,7 +126,7 @@ \subsection{Проверка}
126126

127127
&
128128
Если ключ существует и является целым числом, происходит увеличение
129-
его значения на указаное число (по умолчанию на единицу).
129+
его значения на указанное число (по умолчанию на единицу).
130130
Возвращает целое число после увеличения.\\
131131

132132
\hline
@@ -149,7 +149,7 @@ \subsection{Проверка}
149149
memcache\_set(key::TEXT, value::TEXT)
150150

151151
&
152-
Создает ключ со значением. Если такой ключ существует~--- заменяет в нем значение на указаное.\\
152+
Создает ключ со значением. Если такой ключ существует~--- заменяет в нем значение на указанное.\\
153153

154154
\hline
155155

@@ -262,7 +262,7 @@ \subsection{Проверка}
262262

263263
Для работы с pgmemcache лучше создать функции и, если требуется, активировать эти функции через триггеры.
264264

265-
Например, приложение кэширует зашифрованые пароли пользователей в memcached (для более быстрого доступа), и нам требуется обновлять информацию в кэше, если она изменяется в СУБД. Создаем функцию:
265+
Например, приложение кэширует зашифрованные пароли пользователей в memcached (для более быстрого доступа), и нам требуется обновлять информацию в кэше, если она изменяется в СУБД. Создаем функцию:
266266

267267
\begin{lstlisting}[language=SQL,label=lst:pgcache11,caption=Функция для обновления данных в кэше]
268268
CREATE OR REPLACE FUNCTION auth_passwd_upd() RETURNS TRIGGER AS $$
@@ -281,7 +281,7 @@ \subsection{Проверка}
281281
CREATE TRIGGER auth_passwd_upd_trg AFTER UPDATE ON passwd FOR EACH ROW EXECUTE PROCEDURE auth_passwd_upd();
282282
\end{lstlisting}
283283

284-
Но данный пример транзакционно не безопасен~--- при отмене транзации кэш не вернется на старое значение. Поэтому лучше очищать старые данные:
284+
Но данный пример транзакционно небезопасен~--- при отмене транзакции кэш не вернется на старое значение. Поэтому лучше очищать старые данные:
285285

286286
\begin{lstlisting}[language=SQL,label=lst:pgcache13,caption=Очистка ключа в кэше]
287287
CREATE OR REPLACE FUNCTION auth_passwd_upd() RETURNS TRIGGER AS $$

clustering/plproxy.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ \section{PL/Proxy}
1212
\begin{itemize}
1313
\item все запросы и вызовы функций вызываются в autocommit-режиме на удаленных серверах;
1414
\item в теле функции разрешен только один \lstinline!SELECT!. При необходимости нужно писать отдельную процедуру;
15-
\item при каждом вызове прокси-сервер стартует новое соединение к бакенд-серверу. В высоконагруженных системах целесообразно использовать менеджер для кеширования соединений к бакенд-серверам (для этой цели идеально подходит PgBouncer);
15+
\item при каждом вызове прокси-сервер стартует новое соединение к бэкенд-серверу. В высоконагруженных системах целесообразно использовать менеджер для кеширования соединений к бэкенд-серверам (для этой цели идеально подходит PgBouncer);
1616
\item изменение конфигурации кластера (например количества партиций) требует перезапуска прокси-сервера;
1717
\end{itemize}
1818

clustering/postgres_x2.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,4 @@ \subsection{Ограничения}
351351

352352
\subsection{Заключение}
353353

354-
Postgres-X2 очень перспективное решение для создание кластера на основе PostgreSQL. И хоть это решение имеет ряд недостатков, нестабильно (очень часты случаи падения координаторов при тяжелых запросах) и еще очень молодое, со временем это решение может стать стандартом для масштабирования систем на PostgreSQL.
354+
Postgres-X2 очень перспективное решение для создания кластера на основе PostgreSQL. И хоть это решение имеет ряд недостатков, нестабильно (очень часты случаи падения координаторов при тяжелых запросах) и еще очень молодое, со временем это решение может стать стандартом для масштабирования систем на PostgreSQL.

extensions/postgis.tex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
\section{PostGIS}
22

3-
\href{http://www.postgis.org/}{PostGIS} добавляет поддержку для географических объектов в PostgreSQL. По сути PostGIS позволяет использовать PostgreSQL в качестве бэкэнда пространственной базы данных для геоинформационных систем (ГИС), так же, как ESRI SDE или пространственного расширения Oracle. PostGIS соответствует OpenGIS <<Простые особенности. Спецификация для SQL>> и был сертифицирован.
3+
\href{http://www.postgis.org/}{PostGIS} добавляет поддержку для географических объектов в PostgreSQL. По сути PostGIS позволяет использовать PostgreSQL в качестве бэкенда пространственной базы данных для геоинформационных систем (ГИС), так же, как ESRI SDE или пространственного расширения Oracle. PostGIS соответствует OpenGIS <<Простые особенности. Спецификация для SQL>> и был сертифицирован.
44

55
\subsection{Установка и использование}
66

@@ -50,7 +50,7 @@ \subsection{Установка и использование}
5050
(3 rows)
5151
\end{lstlisting}
5252

53-
Большинство таких функций начинаются с ST (пространственный тип) и описаны в документации PostGIS. Теперь ответим на практический вопрос: на каком расстоянии в метрах друг от другах находятся три города с названием Лондон, учитывая сферичность земли?
53+
Большинство таких функций начинаются с ST (пространственный тип) и описаны в документации PostGIS. Теперь ответим на практический вопрос: на каком расстоянии в метрах друг от друга находятся три города с названием Лондон, учитывая сферичность земли?
5454

5555
\begin{lstlisting}[language=SQL,label=lst:postgisselectcities3,caption=Расстояние до Лондона]
5656
# SELECT p1.name,p2.name,ST_Distance_Sphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;

partitioning/pg_partman.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ \section{Pg\_partman}
22

33
Поскольку реализация партиционирования реализована неполноценно в PostgreSQL (для управления партициями и данными в них приходится писать функции, тригеры и правила), то существует расширение, которое автоматизирует полностью данный процесс. \href{https://github.com/keithf4/pg\_partman}{PG Partition Manager}, он же pg\_partman, это расширение для создания и управления партициями и партициями партиций (sub-partitoning) в PostgreSQL. Поддерживает партицирование по времени (time-based) или по последованности (serial-based). Для партицирования по диапазону значений (range) существует отдельное расширение \href{https://github.com/moat/range\_partitioning}{Range Partitioning (range\_partitioning)}.
44

5-
Текущая реализация поддерживает только INSERT операции, которые перенаправляют данные в нужную партицию. UPDATE операции, которые будут перемещать данные из одной партиции в другую, не поддерживаются. При попытке вставить данные, на которые нет партиции, pg\_partman перемещает их в <<мастер>> (родительскую) таблицу. Данный вариант предпочтительнее, чем создавать автоматически новые партиции, поскольку это может привести к созданию десятков или сотен ненужных дочерных таблиц из-за ошибки в самих данных. Функция \lstinline!check_parent! позволят проверить попадение подобных данных в родительскую таблицу и решить, что с ними требуется делать (удалить или использовать \lstinline!partition_data_time/partition_data_id! для создания и переноса этих данных в партиции).
5+
Текущая реализация поддерживает только INSERT операции, которые перенаправляют данные в нужную партицию. UPDATE операции, которые будут перемещать данные из одной партиции в другую, не поддерживаются. При попытке вставить данные, на которые нет партиции, pg\_partman перемещает их в <<мастер>> (родительскую) таблицу. Данный вариант предпочтительнее, чем создавать автоматически новые партиции, поскольку это может привести к созданию десятков или сотен ненужных дочерных таблиц из-за ошибки в самих данных. Функция \lstinline!check_parent! позволяет проверить попадение подобных данных в родительскую таблицу и решить, что с ними требуется делать (удалить или использовать \lstinline!partition_data_time/partition_data_id! для создания и переноса этих данных в партиции).
66

77
Данное расширение использует большинство атрибутов родительской таблицы для создания партиций: индексы, внешние ключи (опционально), tablespace, constraints, privileges и ownership. Под такое условие попадают OID и UNLOGGED таблицы.
88

postgresql_clustering.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ \section{Введение}
1010

1111
Рассмотрим пример. Пусть у нас есть приложение с регистрацией пользователей, которое позволяет писать друг другу личные сообщения. Допустим оно очень популярно, и много людей им пользуются ежедневно. Естественно, что таблица с личными сообщениями будет намного больше всех остальных таблиц в базе (скажем, будет занимать 90\% всех ресурсов). Зная это, мы можем подготовить для этой (только одной!) таблицы выделенный сервер помощнее, а остальные оставить на другом (послабее). Теперь мы можем идеально подстроить сервер для работы с одной специфической таблицей, постараться уместить ее в память, возможно, дополнительно партиционировать ее и т.д. Такое распределение называется вертикальным шардингом.
1212

13-
Что делать, если наша таблица с сообщениями стала настолько большой, что даже выделенный сервер под нее одну уже не спасает? Необходимо делать горизонтальный шардинг~--- т.е. разделение одной таблицы по разным ресурсам. Как это выглядит на практике? На разных серверах у нас будет таблица с одинаковой структурой, но разными данными. Для нашего случая с сообщениями, мы можем хранить первые 10 миллионов сообщений на одном сервере, вторые 10 - на втором и т.д. Т.е. необходимо иметь критерий шардинга~--- какой-то параметр, который позволит определять, на каком именно сервере лежат те или иные данные.
13+
Что делать, если наша таблица с сообщениями стала настолько большой, что даже выделенный сервер под нее одну уже не спасает? Необходимо делать горизонтальный шардинг~--- т.е. разделение одной таблицы по разным ресурсам. Как это выглядит на практике? На разных серверах у нас будет таблица с одинаковой структурой, но разными данными. Для нашего случая с сообщениями, мы можем хранить первые 10 миллионов сообщений на одном сервере, вторые 10 - на втором и т.д. Т.е. необходимо иметь критерий шардинга~--- какой-то параметр, который позволит определить, на каком именно сервере лежат те или иные данные.
1414

1515
Обычно, в качестве параметра шардинга выбирают ID пользователя (\lstinline!user_id!)~--- это позволяет делить данные по серверам равномерно и просто. Т.о. при получении личных сообщений пользователей алгоритм работы будет такой:
1616

postgresql_connection_pooling.tex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ \section{PgBouncer}
1717

1818
\begin{itemize}
1919
\item Session Pooling~--- наиболее <<вежливый>> режим. При начале сессии клиенту выделяется соединение с сервером; оно приписано ему в течение всей сессии и возвращается в пул только после отсоединения клиента;
20-
\item Transaction Pooling~--- клиент владеет соединением с бакендом только в течение транзакции. Когда PgBouncer замечает, что транзакция завершилась, он возвращает соединение назад в пул;
21-
\item Statement Pooling~--- наиболее агрессивный режим. Соединение с бакендом возвращается назад в пул сразу после завершения запроса. Транзакции с несколькими запросами в этом режиме не разрешены, так как они гарантировано будут отменены. Также не работают подготовленные выражения (prepared statements) в этом режиме;
20+
\item Transaction Pooling~--- клиент владеет соединением с бэкендом только в течение транзакции. Когда PgBouncer замечает, что транзакция завершилась, он возвращает соединение назад в пул;
21+
\item Statement Pooling~--- наиболее агрессивный режим. Соединение с бэкендом возвращается назад в пул сразу после завершения запроса. Транзакции с несколькими запросами в этом режиме не разрешены, так как они гарантировано будут отменены. Также не работают подготовленные выражения (prepared statements) в этом режиме;
2222
\end{itemize}
2323

2424
К достоинствам PgBouncer относится:

0 commit comments

Comments
 (0)