Страницы

Сохранить статью у себя в соцсети:

четверг, 14 марта 2013 г.

§ Postgres-XC: Data distribution.

Postgres-XC: Размещение данных.

postgres-xc
Postgres-XC это мульти-мастер кластер c возможностью read/write масштабирования на основе PostgreSQL (постгрес!). Третья часть в которой будет рассмотрено хранение данных в кластере Postgres-XC. Как известно из предыдущих статей, таблица может храниться в реплицированном или в распределенном виде. Если брать во внимание распределенные таблицы, то для этого случая хранения, можно выбрать определенную стратегию распределения (Round-Robin, Hash, Modulo). Для распределения по Hash и Modulo за основу берется определенная колонка таблицы. Это все хорошо, но что если появится необходимость переопределить тип хранения данных? В этом случае Postgres-XC предоставляет возможность переопределить тип хранения в процессе работы кластера без остановки работы.









В общем виде тип хранения задается при создании таблицы (по умолчанию таблица реплицируется на все узлы кластера).
CREATE TABLE table_name (column_name data_type, ...)
[ DISTRIBUTE BY { REPLICATION | ROUND ROBIN | { [HASH | MODULO ] ( column_name ) } } ]
[ TO ( GROUP groupname | NODE nodename [, ... ] ) ]


Одной из важнейших возможностей Postgres-XC является возможность переопределения типа хранения в процессе работы. На момент написания статьи эта возможность поддерживается только в экспериментальном режиме. Полная поддержка этой функции запланирована в релизе 1.1 (Май, 2013). Но сам функционал уже доступен в ночных сборках. Изменение типа хранения задается через ALTER TABLE и в общем виде выглядит так:

ALTER TABLE table_name
DISTRIBUTE BY { REPLICATION | ROUND ROBIN | { [HASH | MODULO ] ( column_name ) } }
TO { GROUP groupname | NODE ( nodename [, ... ] ) }
ADD NODE ( nodename [, ... ] )
DELETE NODE ( nodename [, ... ] )

Таким образом с помощью ALTER TABLE можно не только изменить тип хранения, но и изменить состав узлов на которых будет храниться таблица. Количество узлов на которых размещаются данные может быть как увеличено, так и уменьшено.
Принцип изменения типа распределения достаточно прост и состоит из нескольких шагов:
  • все данные целевой таблицы скачиваются на узел-координатор;
  • из таблицы удаляются все данные (TRUNCATE);
  • в каталоге обновляется информация о типе хранения;
  • закэшированные на координаторе данные распределяются по узлам в соответствии с новой схемой размещения.
Объем временного хранилища для данных, которое расположено на координаторе, может  регулироваться с помощью work_mem. Для переноса данных между узлами используется COPY.

Теперь посмотрим как это работает: Кластер состоит из трех узлов данных и одного координатора.
staging=> SELECT node_name, node_type from pgxc_node;
 node_name | node_type 
-----------+-----------
 coord1    | C
 datanode1 | D
 datanode2 | D
 datanode3 | D
(4 rows)

Cоздадим реплицируемую таблицу и заполним её. Тут есть один нюанс... на момент написания статьи, существовал незакрытый баг. В качестве временного решения следует отключить принудительную обработку запросов стандартным планировщиком, после чего можно заполнить таблицу тестовыми данными:
staging=>  set enable_fast_query_shipping=false;
SET
staging=> CREATE TABLE samples (a int) DISTRIBUTE BY REPLICATION;
CREATE TABLE
staging=> INSERT INTO samples (a) VALUES (generate_series(1,10000));
INSERT 0 10000

Проверяем размещение данных по узлам:
$ psql -qAtX -h datanode1 -U pgdba staging -c 'select count(*) from samples'
10000
$ psql -qAtX -h datanode2 -U pgdba staging -c 'select count(*) from samples'
10000
$ psql -qAtX -h datanode3 -U pgdba staging -c 'select count(*) from samples'
10000

Как видно, данные распределяются по всем узлам в равном объеме. Теперь делаем эту таблицу распределенной:
staging=> ALTER TABLE samples DISTRIBUTE BY HASH(a);
ALTER TABLE

После чего проверяем распределение данных по узлам:
$ psql -qAtX -h datanode1 -U pgdba staging -c 'select count(*) from samples'
3235
$ psql -qAtX -h datanode2 -U pgdba staging -c 'select count(*) from samples'
3375
$ psql -qAtX -h datanode3 -U pgdba staging -c 'select count(*) from samples'
3390

Теперь данные более-менее равномерно разместились на нескольких узлах. 
Теперь удалим одну ноду для этой таблицы, после чего смотрим размещение данных
staging=> ALTER TABLE samples DELETE NODE (datanode3);
ALTER TABLE
$ psql -qAtX -h datanode1 -U pgdba staging -c 'select count(*) from samples'
5039
$ psql -qAtX -h datanode2 -U pgdba staging -c 'select count(*) from samples'
4961
$ psql -qAtX -h datanode3 -U pgdba staging -c 'select count(*) from samples'
0

Теперь данные распределились в соответствии с новой схемой. Данные на двух узлах, при этом на третьем узле данных не осталось.
Вот так вот работает перераспределение данных в кластере Postgres-XC.

На главную "Virtualizing Linux"

1 комментарий:

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика