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);
- в каталоге обновляется информация о типе хранения;
- закэшированные на координаторе данные распределяются по узлам в соответствии с новой схемой размещения.
Теперь посмотрим как это работает: Кластер состоит из трех узлов данных и одного координатора.
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"
Этот комментарий был удален администратором блога.
ОтветитьУдалить