3. Особенности
• СУБД для суровой аналитики больших объемов данных
– Легкая интеграция с BI и аналитическим ПО
– Быстрая работа с большими объемами данных
• PostgreSQL-based (8.2.15 + back-ported features of 9.0+)
– Легкость администрирования и поддержки
– Работа почти с любыми клиентами (JDBC, ODBC)
– Удобные механизмы загрузки и выгрузки данных
– Хорошие механизмы шардирования данных
• Отличная масштабируемость
– Архитектура MPP shared-nothing
– Производительность растет почти линейно
4. Архитектура. Термины
Master instance (он же просто «мастер») – инстанс постгреса, содержащий каталог БД и управляющий
запросами к сегментам
Master host («сервер-мастер») – Сервер, на котором работает Master instance
Secondary master instance - инстанс Postgres, являющийся резервным мастером, включается в работу в
случае недоступности основного мастера (переключение происходит вручную);
Primary segment instance («сегмент») - инстанс Postgres, являющийся одним из сегментов. Именно
сегменты непосредственно хранят данные, выполняют с ними операции и отдают результаты мастеру
(в общем случае). Сегмент – самый обычный инстанс PostgreSQL 8.2.15 с настроенной WAL-
репликацией в своё зеркало на другом сервере:
/app/greenplum/greenplum-db-4.3.5.2/bin/postgres -D /data1/primary/gpseg76 -p 50004 -b 126 -z 96 --silent-mode=true -i -M quiescent -C 76
Mirror segment instance («зеркало») - инстанс Postgres, являющийся зеркалом одного из primary
сегментов, автоматически принимает на себя роль primary в случае падения оного:
/app/greenplum/greenplum-db-4.3.5.2/bin/postgres -D /data1/mirror/gpseg76 -p 51004 -b 186 -z 96 --silent-mode=true -i -M quiescent -C 76
Segment host («сервер-сегмент») – сервер, на котором работает один или несколько сегментов и/или
зеркал.
4
NOTE: GP поддерживает только 1-to-1 репликацию: для каждого primary может быть только
одно зеркало.
6. Хранение данных
• Filespace – набор папок, дисков и т.д. на всех серверах
кластера
gpfilespace -o gpfilespace_config
a name for this filespace> fastdisk
primary location 1> /gpfs1/seg1
primary location 2> /gpfs1/seg2
mirror location 1> /gpfs2/mir1
mirror location 2> /gpfs2/mir2
master location> /gpfs1/master
• Tablespace – привязывается к filespace
CREATE TABLESPACE fastspace FILESPACE fastdisk;
• Между filespace можно перемещать как табличные
пространства, так и временные и транзакционные
файлы
gpfilespace --movetempfilespace filespace_name
gpfilespace --movetransfilespace filespace_name
7. Хранение данных
• Классическая схема шардирования данных
– Каждая таблица -> N+1 таблиц на всех сегментах кластера
– где N – число сегментов. На каждом сегменте хранится 1/N строк
таблицы
– +1 - это таблица на мастере, данных в ней нет. Только мета
• Distribution key - ключ (поле или набор полей) распределения
– Greenplum работает со скоростью самого медленного сегмента,
это означает, что перекос в количестве данных между сегментами
ведёт к деградации производительности кластера и к другим
проблемам
• Распределение данных поможет оценить служебное поле
gp_segment_id, существующее в каждой таблице –номер
сегмента, на котором хранится конкретная строка
NOTE: GP не поддерживает UPDATE полей, по которым распределена таблица
8. Хранение данных
• Heap tables
– Как в PostgreSQL
– Row storage. Только строковое хранение
– Можно не бояться update
– Хорошо для небольших таблиц
• Append-optimized (append-only) tables
– Column
– Compression. АО-таблицы можно сжимать
zlib/quicklz
– Batch-only. Плохо работают в row-by-row
8
9. Основные вопросы архитектору
• Data Distribution
Выбор ключа распределения
• Data Skew
• Чем равномернее разложены данные по сегментам, тем лучше
• Partition or not to Partition
• Секционирование позволяет использовать разные виды хранения в одной таблице
• Разные секции одной таблицы можно разложить по разным дискам
• Data Types
Лучше использовать максимально компактные типы данных
• Constraints
Table
Column
9
10. Ключ распределения
10
Primary key Distribution key
Логическое ограничение Физическое хранение данных
Не обязателен Обязателен для GP
(если не задан – используется первый столбец)
db_dev=# create table tttttt (id serial, tt text);
NOTICE: CREATE TABLE will create implicit sequence
"tttttt_id_seq" for serial column "tttttt.id"
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using
column named 'id' as the Greenplum Database data distribution
key for this table.
Нет ограничения на количество полей Есть ограничения
Определяется в модели данных Задается при создании таблицы
Уникальные значения Любые значения
Однозначно определяет строку Может и не определять строку однозначно
Значение нельзя изменить Значение нельзя изменить
Не может быть NULL Может быть NULL
Не зависит от СУБД Актуален только для GP
Задается для корректности данных Подбирается для быстродействия и оптимального
хранения
11. Распределение данных
Count | gp_segment_id
1 | 4
1 | 6
1 | 15
1 | 21
1 | 23
1 | 25
1 | 31
1 | 40
1 | 42
1 | 48
1 | 50
1 | 52
1 | 65
1 | 67
1 | 73
1 | 75
1 | 77
1 | 90
1 | 92
1 | 94
--Создаем таблицу
create table distrib_test_table as
select generate_series(1,20)
as num_field
distributed by (num_field);
--Проверим распределение данных
select count(1),gp_segment_id
from distrib_test_table
group by gp_segment_id
order by gp_segment_id;
12. Распределение данных
truncate table distrib_test_table;
insert into distrib_test_table
values (1), (1), (1),
(1), (1), (1),
(1), (1), (1),
(1), (1), (1),
(1), (1), (1),
(1), (1), (1),
(1), (1);
INSERT 0 20
select count(1),gp_segment_id
from distrib_test_table
group by gp_segment_id
order by gp_segment_id;
count | gp_segment_id
-------+---------------
20 | 42
13. Выбирайте ключ распределения с уникальными
значениями или высокой кардинальностью
Gender = M or F
Segment
Instance CPUDisk I/ONetwork
0
1
2
3
4
5
Если выбрать дату, то данные
могут быть распределены
равномерно, но при
определенных запросах это
вызовет перекос по нагрузке
Segment
Instance CPUDisk I/ONetwork
0
1
2
3
4
5
Выбирайте ключ распределения, который
обеспечит распараллеливание запроса
JanFebMarAprMayJun
Распределение данных
14. Таблицы и распределение данных
• создавать отдельные столбцы только для распределения
данных
• Распределять таблицы по полям, которые не используются в
джойнах
• Распределять таблицу по Boolean полям
• Распределять таблицу по float полям
• Использовать DISTRIBUTED RANDOMLY потому, что так проще
Неправильно
• Распределять все таблицы по всем сегментам БД
• Определить общую политику распределения данных
• Уникальные ключи обеспечивают равномерное
распределение данных
• Если ключ не задан – используется первое поле или PK
• Random distribution – данные распределяются равномерно,
но быстродействие не идеально
Правильно
15. Резервирование и надежность. Мастер
В кластере GP используется полное резервирование мастера с помощью
механизма репликации транзакционных логов, контролируемого
специальным агентом (gpsyncagent). При этом автоматическое
переключение роли мастера на резервный инстанс не поддерживается.
Для переключения на резервный мастер необходимо:
• Убедиться, что основной мастер остановлен (процесс убит и в рабочей
директории инстанса мастера отсутвует файл postmaster.pid)
• На сервере резервного мастера выполнить команду
gpactivatestandby -d /master_instance_directory
• Переключить виртуальный ip-адрес на сервер нового мастера.
При принятии определённых рисков переключение можно
автоматизировать
16. Резервирование и надежность. Сегменты
Вариант 1: все зеркала сегментов, располагающихся на хосте N, находятся на хосте N+1
17. Резервирование и надежность. Сегменты
17
Вариант 2: зеркала сегментов сервера N распределены между N+1, N+2, N+3 …
19. Внешние таблицы в Hadoop
19
gpconfig -c gp_hadoop_target_version -v "'gphd-2.0'"
gpconfig -c gp_hadoop_home -v "'/usr/lib/gphd'
gpstop -u
GRANT SELECT ON PROTOCOL gphdfs TO gpadmin;
GRANT INSERT ON PROTOCOL gphdfs TO gpadmin;
CREATE EXTERNAL TABLE dev_src.Hadoop_table( id ,
text )
LOCATION
('gphdfs://hdfs_host[:port]/path/filename.txt')
CREATE WRITABLE EXTERNAL TABLE
ext_expenses LOCATION ('gphdfs://hdfshost-
1:8081/data/ ?compress=true&compression_typ
e=RECORD &codec=org.apache.hadoop.io.compre
ss.DefaultCodec') FORMAT 'custom'
(formatter='gphdfs_export');
20. Работа с базой
• pgAdmin III
• Aginity WB for
Greenplum
• DataGrip
• psql
21. Обслуживание
• Вакуум таблиц каталога
• Вакуум всех таблиц
• Сбор статистики
• Проверка свободного места (!)
• Управление Spill-files
• Управление WORK-схемами SAS
• Периодический Re-partitioning таблиц
• Синхронизация с AD (LDAP)
23. Установка. Подготовка
• Форматирование XFS
• Монтирование XFS
• Настройка ядра Linux
• Установка pssh
• chmod 777 /user/local
• Поставить из-под gpadmin ГП в /usr/local/greenplum-db-4.3.x.x
• Создать файл с перечислением всех интерфейсов всех серверов
(hostfile_exkeys)
• Создать карту сегментов (если требуется кастомное распределение
primary/mirrors
• gpssh-exkeys -f hostfile_exkeys
• gpseginstall -f hostfile_exkeys
• source /usr/local/greenplum-db/greenplum_path.sh
• alias run_allsegments='gpssh -f /u0/projects/tf_gp/hostfiles/greenplum_allsegments.txt‘
23
24. Карта сегментов
#### Shell utility used to connect to remote hosts.
TRUSTED_SHELL=ssh
ENCODING=WIN1251
#### Specify the location of the host address file here instead of
#### with the the -h option of gpinitsystem.
#MACHINE_LIST_FILE=/home/gpadmin/gpconfigs/hostfile_gpinitsystem
QD_PRIMARY_ARRAY=mdw:5432:/data1/master/gpseg-1:1:-1:0
declare -a PRIMARY_ARRAY=(
sdw1-1:40000:/data1/primary/gpseg0:2:0:41000
sdw1-2:40001:/data1/primary/gpseg1:3:1:41001
...
sdwN-1:40002:/data2/primary/gpseg94:96:94:41002
sdwN-2:40003:/data2/primary/gpseg95:97:95:41003
)
declare -a MIRROR_ARRAY=(
sdw1-2:50000:/data1/mirror/gpseg8:98:8:51000
sdw1-1:50001:/data1/mirror/gpseg13:99:13:51001
...
sdwN-2:50002:/data2/mirror/gpseg86:192:86:51002
sdwN-1:50003:/data2/mirror/gpseg91:193:91:51003
)
24
25. Создаем БД
CREATE DATABASE db_prod
WITH OWNER = gpadmin
ENCODING = 'WIN1251'
CONNECTION LIMIT = -1;
GRANT CONNECT, TEMPORARY ON DATABASE db_prod TO public;
GRANT ALL ON DATABASE db_prod TO gpadmin;
set allow_system_table_mods=dml;
update pg_proc set proname =
'gp_update_ao_master_stats_rnm' where proname =
'gp_update_ao_master_stats' and prosrc =
'gp_update_ao_master_stats_name';
25