Чем PL/Proxy может быть полезен? Он существенно упрощает горизонтальное масштабирование системы. Становится удобным разделять таблицу с пользователями, например, по первой латинской букве имени на 26 узлов. При этом приложение, которое работает непосредственно с прокси-базой, ничего не будет замечать: запрос на авторизацию, например, сам будет направлен прокси-сервером на нужный узел. То есть администратор баз данных может проводить масштабирование
обеспечивают точку подключения для клиента (приложения). Они несут ответственность за разбор и выполнение запросов от клиентов и возвращение результатов (при необходимости). Они не хранят пользовательские данные, а собирают их из обработчиков данных (datanodes) с помощью запросов SQL через PostgreSQL интерфейс. Координаторы также обрабатывают данные, если требуется, и даже управляют двухфазной фиксацией. Координаторы используются также для разбора запросов, составления планов запросов, поиска данных и т.д.
Обработчики данных (datanodes) обеспечивают сохранение пользовательских данных. Datanodes выполняют запросы от координаторов и возвращают им полученный результат.
Установка
Установить Postgres-XC можно из исходников или же из пакетов системы. Например в Ubuntu 14.04 можно установить postgres-xc так:
$ sudo apt-get install postgres-xc postgres-xc-client postgres-xc-contrib postgres-xc-server-dev
По умолчанию он создаст один координатор и два обработчика данных.
Распределение данных и масштабируемость
Postgres-XC предусматривает два способа хранения данных в таблицах:
[fig:postgres-xc2]
[fig:postgres-xc3]
Распределенные таблицы (distributed tables, рис. [fig:postgres-xc2]): данные по таблице распределяются на указанный набор обработчиков данных с использованием указанной стратегии (hash, round-robin, modulo). Каждая запись в таблице находится только на одном обработчике данных. Параллельно могут быть записаны или прочитаны данные с различных обработчиков данных. За счет этого значительно улучшена производительность на запись и чтение;
Реплицированные таблицы (replicated tables, рис. [fig:postgres-xc3]): данные по таблице реплицируется (клонируются) на указанный набор обработчиков данных. Каждая запись в таблице находится на всех обработчиках данных (которые были указаны) и любые изменения дублируются на все обработчики данных. Так как все данные доступны на любом обработчике данных, координатор может собрать все данные из одного узла, что позволяет направить различные запросы на различные обработчики данных. Таким образом создается балансировка нагрузки и увеличения пропускной способности на чтение.
Таблицы и запросы к ним
После установки работа с Postgres-XC ведется как с обыкновенным PostgreSQL. Подключаться для работы с данными нужно только к координаторам (по умолчанию координатор работает на порту 5432). Для начала создадим распределенные таблицы.
CREATE TABLE users_with_hash (id SERIAL, type INT, ...) DISTRIBUTE by HASH(id) TO NODE dn1, dn2; CREATE TABLE users_with_modulo (id SERIAL, type INT, ...) DISTRIBUTE by MODULO(id) TO NODE dn1, dn2; CREATE TABLE users_with_rrobin (id SERIAL, type INT, ...) DISTRIBUTE by ROUND ROBIN TO NODE dn1, dn2;
На листинге [lst:postgres-xc2] создано 3 распределенные таблицы:
Таблица users_with_hash распределяется по хешу значения из указанного поля в таблице (тут указано поле id) по обработчикам данных. Вот как распределились первые 15 значений:# координатор $ psql # SELECT id, type from users_with_hash ORDER BY id; id | type -------+------- 1 | 946 2 | 153 3 | 484 4 | 422 5 | 785 6 | 906 7 | 973 8 | 699 9 | 434 10 | 986 11 | 135 12 | 1012 13 | 395 14 | 667 15 | 324 # первый обработчик данных $ psql -p15432 # SELECT id, type from users_with_hash ORDER BY id; id | type ------+------- 1 | 946 2 | 153 5 | 785 6 | 906 8 | 699 9 | 434 12 | 1012 13 | 395 15 | 324 # второй обработчик данных $ psql -p15433 # SELECT id, type from users_with_hash ORDER BY id; id | type -------+------- 3 | 484 4 | 422 7 | 973 10 | 986 11 | 135 14 | 667
Таблица users_with_modulo распределяется по модулю значения из указанного поля в таблице (тут указано поле id) по обработчикам данных. Вот как распределились первые 15 значений:# координатор $ psql # SELECT id, type from users_with_modulo ORDER BY id; id | type -------+------- 1 | 883 2 | 719 3 | 29 4 | 638 5 | 363 6 | 946 7 | 440 8 | 331 9 | 884 10 | 199 11 | 78 12 | 791 13 | 345 14 | 476 15 | 860 # первый обработчик данных $ psql -p15432 # SELECT id, type from users_with_modulo ORDER BY id; id | type -------+------- 2 | 719 4 | 638 6 | 946 8 | 331 10 | 199 12 | 791 14 | 476 # второй обработчик данных $ psql -p15433 # SELECT id, type from users_with_modulo ORDER BY id; id | type ------+------- 1 | 883 3 | 29 5 | 363 7 | 440 9 | 884 11 | 78 13 | 345 15 | 860
Таблица users_with_rrobin распределяется циклическим способом(round-robin)
по обработчикам данных. Вот как распределились первые 15 значений:# координатор $ psql # SELECT id, type from users_with_rrobin ORDER BY id; id | type -------+------- 1 | 890 2 | 198 3 | 815 4 | 446 5 | 61 6 | 337 7 | 948 8 | 446 9 | 796 10 | 422 11 | 242 12 | 795 13 | 314 14 | 240 15 | 733 # первый обработчик данных $ psql -p15432 # SELECT id, type from users_with_rrobin ORDER BY id; id | type -------+------- 2 | 198 4 | 446 6 | 337 8 | 446 10 | 422 12 | 795 14 | 240 # второй обработчик данных $ psql -p15433 # SELECT id, type from users_with_rrobin ORDER BY id; id | type ------+------- 1 | 890 3 | 815 5 | 61 7 | 948 9 | 796 11 | 242 13 | 314 15 | 733