You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on May 26, 2022. It is now read-only.
Copy file name to clipboardExpand all lines: cache/pgmemcache.tex
+5-5Lines changed: 5 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -81,7 +81,7 @@ \subsection{Проверка}
81
81
newval = memcache\_decr(key::TEXT)
82
82
&
83
83
Если ключ существует и является целым числом, происходит уменьшение
84
-
его значения на указаное число (по умолчанию на единицу).
84
+
его значения на указанное число (по умолчанию на единицу).
85
85
Возвращает целое число после уменьшения.\\
86
86
87
87
\hline
@@ -126,7 +126,7 @@ \subsection{Проверка}
126
126
127
127
&
128
128
Если ключ существует и является целым числом, происходит увеличение
129
-
его значения на указаное число (по умолчанию на единицу).
129
+
его значения на указанное число (по умолчанию на единицу).
130
130
Возвращает целое число после увеличения.\\
131
131
132
132
\hline
@@ -149,7 +149,7 @@ \subsection{Проверка}
149
149
memcache\_set(key::TEXT, value::TEXT)
150
150
151
151
&
152
-
Создает ключ со значением. Если такой ключ существует~--- заменяет в нем значение на указаное.\\
152
+
Создает ключ со значением. Если такой ключ существует~--- заменяет в нем значение на указанное.\\
153
153
154
154
\hline
155
155
@@ -262,7 +262,7 @@ \subsection{Проверка}
262
262
263
263
Для работы с pgmemcache лучше создать функции и, если требуется, активировать эти функции через триггеры.
264
264
265
-
Например, приложение кэширует зашифрованые пароли пользователей в memcached (для более быстрого доступа), и нам требуется обновлять информацию в кэше, если она изменяется в СУБД. Создаем функцию:
265
+
Например, приложение кэширует зашифрованные пароли пользователей в memcached (для более быстрого доступа), и нам требуется обновлять информацию в кэше, если она изменяется в СУБД. Создаем функцию:
266
266
267
267
\begin{lstlisting}[language=SQL,label=lst:pgcache11,caption=Функция для обновления данных в кэше]
268
268
CREATE OR REPLACE FUNCTION auth_passwd_upd() RETURNS TRIGGER AS $$
@@ -281,7 +281,7 @@ \subsection{Проверка}
281
281
CREATE TRIGGER auth_passwd_upd_trg AFTER UPDATE ON passwd FOR EACH ROW EXECUTE PROCEDURE auth_passwd_upd();
282
282
\end{lstlisting}
283
283
284
-
Но данный пример транзакционно не безопасен~--- при отмене транзации кэш не вернется на старое значение. Поэтому лучше очищать старые данные:
284
+
Но данный пример транзакционно небезопасен~--- при отмене транзакции кэш не вернется на старое значение. Поэтому лучше очищать старые данные:
285
285
286
286
\begin{lstlisting}[language=SQL,label=lst:pgcache13,caption=Очистка ключа в кэше]
287
287
CREATE OR REPLACE FUNCTION auth_passwd_upd() RETURNS TRIGGER AS $$
Copy file name to clipboardExpand all lines: clustering/plproxy.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,7 @@ \section{PL/Proxy}
12
12
\begin{itemize}
13
13
\item все запросы и вызовы функций вызываются в autocommit-режиме на удаленных серверах;
14
14
\item в теле функции разрешен только один \lstinline!SELECT!. При необходимости нужно писать отдельную процедуру;
15
-
\item при каждом вызове прокси-сервер стартует новое соединение к бакенд-серверу. В высоконагруженных системах целесообразно использовать менеджер для кеширования соединений к бакенд-серверам (для этой цели идеально подходит PgBouncer);
15
+
\item при каждом вызове прокси-сервер стартует новое соединение к бэкенд-серверу. В высоконагруженных системах целесообразно использовать менеджер для кеширования соединений к бэкенд-серверам (для этой цели идеально подходит PgBouncer);
16
16
\item изменение конфигурации кластера (например количества партиций) требует перезапуска прокси-сервера;
Copy file name to clipboardExpand all lines: clustering/postgres_x2.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -351,4 +351,4 @@ \subsection{Ограничения}
351
351
352
352
\subsection{Заключение}
353
353
354
-
Postgres-X2 очень перспективное решение для создание кластера на основе PostgreSQL. И хоть это решение имеет ряд недостатков, нестабильно (очень часты случаи падения координаторов при тяжелых запросах) и еще очень молодое, со временем это решение может стать стандартом для масштабирования систем на PostgreSQL.
354
+
Postgres-X2 очень перспективное решение для создания кластера на основе PostgreSQL. И хоть это решение имеет ряд недостатков, нестабильно (очень часты случаи падения координаторов при тяжелых запросах) и еще очень молодое, со временем это решение может стать стандартом для масштабирования систем на PostgreSQL.
Copy file name to clipboardExpand all lines: extensions/postgis.tex
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
\section{PostGIS}
2
2
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>> и был сертифицирован.
4
4
5
5
\subsection{Установка и использование}
6
6
@@ -50,7 +50,7 @@ \subsection{Установка и использование}
50
50
(3 rows)
51
51
\end{lstlisting}
52
52
53
-
Большинство таких функций начинаются с ST (пространственный тип) и описаны в документации PostGIS. Теперь ответим на практический вопрос: на каком расстоянии в метрах друг от другах находятся три города с названием Лондон, учитывая сферичность земли?
53
+
Большинство таких функций начинаются с ST (пространственный тип) и описаны в документации PostGIS. Теперь ответим на практический вопрос: на каком расстоянии в метрах друг от друга находятся три города с названием Лондон, учитывая сферичность земли?
54
54
55
55
\begin{lstlisting}[language=SQL,label=lst:postgisselectcities3,caption=Расстояние до Лондона]
56
56
# 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;
Copy file name to clipboardExpand all lines: partitioning/pg_partman.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@ \section{Pg\_partman}
2
2
3
3
Поскольку реализация партиционирования реализована неполноценно в 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)}.
4
4
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! для создания и переноса этих данных в партиции).
6
6
7
7
Данное расширение использует большинство атрибутов родительской таблицы для создания партиций: индексы, внешние ключи (опционально), tablespace, constraints, privileges и ownership. Под такое условие попадают OID и UNLOGGED таблицы.
Copy file name to clipboardExpand all lines: postgresql_clustering.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ \section{Введение}
10
10
11
11
Рассмотрим пример. Пусть у нас есть приложение с регистрацией пользователей, которое позволяет писать друг другу личные сообщения. Допустим оно очень популярно, и много людей им пользуются ежедневно. Естественно, что таблица с личными сообщениями будет намного больше всех остальных таблиц в базе (скажем, будет занимать 90\% всех ресурсов). Зная это, мы можем подготовить для этой (только одной!) таблицы выделенный сервер помощнее, а остальные оставить на другом (послабее). Теперь мы можем идеально подстроить сервер для работы с одной специфической таблицей, постараться уместить ее в память, возможно, дополнительно партиционировать ее и т.д. Такое распределение называется вертикальным шардингом.
12
12
13
-
Что делать, если наша таблица с сообщениями стала настолько большой, что даже выделенный сервер под нее одну уже не спасает? Необходимо делать горизонтальный шардинг~--- т.е. разделение одной таблицы по разным ресурсам. Как это выглядит на практике? На разных серверах у нас будет таблица с одинаковой структурой, но разными данными. Для нашего случая с сообщениями, мы можем хранить первые 10 миллионов сообщений на одном сервере, вторые 10 - на втором и т.д. Т.е. необходимо иметь критерий шардинга~--- какой-то параметр, который позволит определять, на каком именно сервере лежат те или иные данные.
13
+
Что делать, если наша таблица с сообщениями стала настолько большой, что даже выделенный сервер под нее одну уже не спасает? Необходимо делать горизонтальный шардинг~--- т.е. разделение одной таблицы по разным ресурсам. Как это выглядит на практике? На разных серверах у нас будет таблица с одинаковой структурой, но разными данными. Для нашего случая с сообщениями, мы можем хранить первые 10 миллионов сообщений на одном сервере, вторые 10 - на втором и т.д. Т.е. необходимо иметь критерий шардинга~--- какой-то параметр, который позволит определить, на каком именно сервере лежат те или иные данные.
14
14
15
15
Обычно, в качестве параметра шардинга выбирают ID пользователя (\lstinline!user_id!)~--- это позволяет делить данные по серверам равномерно и просто. Т.о. при получении личных сообщений пользователей алгоритм работы будет такой:
Copy file name to clipboardExpand all lines: postgresql_connection_pooling.tex
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -17,8 +17,8 @@ \section{PgBouncer}
17
17
18
18
\begin{itemize}
19
19
\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) в этом режиме;
0 commit comments