GREENPLUM DB Особенности и применение в Тинькофф банке Дмитрий немчин Администратор DWH
GREENPLUM DB
Особенности и применение в Тинькофф банке
Дмитрий немчинАдминистратор DWH
2
Содержание
• Особенности• Архитектура• Хранение данных• Загрузка данных в БД• Доступ к данным• Установка• Мониторинг• Проблемы и наши решения
Особенности
• СУБД для суровой аналитики больших объемов данных– Легкая интеграция с 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 («сервер-сегмент») – сервер, на котором работает один или несколько сегментов и/или зеркал.
NOTE: GP поддерживает только 1-to-1 репликацию: для каждого primary может быть только одно зеркало.
Архитектура. Cвязи в кластере
Хранение данных
• 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 – привязывается к filespaceCREATE TABLESPACE fastspace FILESPACE fastdisk;
• Между filespace можно перемещать как табличные пространства, так и временные и транзакционные файлыgpfilespace --movetempfilespace filespace_name gpfilespace --movetransfilespace filespace_name
Хранение данных
• Классическая схема шардирования данных– Каждая таблица -> 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
9
Основные вопросы архитектору
• Data Distribution Выбор ключа распределения
• Data Skew• Чем равномернее разложены данные по сегментам, тем лучше
• Partition or not to Partition• Секционирование позволяет использовать разные виды хранения в одной таблице
• Разные секции одной таблицы можно разложить по разным дискам
• Data Types Лучше использовать максимально компактные типы данных
• Constraints Table Column
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
Задается для корректности данных Подбирается для быстродействия и оптимального хранения
Распределение данных
Count | gp_segment_id1 | 41 | 61 | 151 | 211 | 231 | 251 | 311 | 401 | 421 | 481 | 501 | 521 | 651 | 671 | 731 | 751 | 771 | 901 | 921 | 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;
Распределение данных
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
Выбирайте ключ распределения с уникальными значениями или высокой кардинальностью
Gender = M or F
SegmentInstance CPUDisk I/ONetwork
0
1
2
3
4
5
Если выбрать дату, то данные могут быть распределены
равномерно, но при определенных запросах это вызовет перекос по нагрузке
SegmentInstance CPUDisk I/ONetwork
0
1
2
3
4
5
Выбирайте ключ распределения, который обеспечит распараллеливание запроса
Jan
Feb
Mar
Apr
May
Jun
Распределение данных
Таблицы и распределение данных
• создавать отдельные столбцы только для распределения данных
• Распределять таблицы по полям, которые не используются в джойнах
• Распределять таблицу по Boolean полям• Распределять таблицу по float полям• Использовать DISTRIBUTED RANDOMLY потому, что так проще
Неправильно
• Распределять все таблицы по всем сегментам БД• Определить общую политику распределения данных• Уникальные ключи обеспечивают равномерное
распределение данных• Если ключ не задан – используется первое поле или PK• Random distribution – данные распределяются равномерно,
но быстродействие не идеально
Правильно
Резервирование и надежность. Мастер
В кластере GP используется полное резервирование мастера с помощью механизма репликации транзакционных логов, контролируемого специальным агентом (gpsyncagent). При этом автоматическое переключение роли мастера на резервный инстанс не поддерживается.
Для переключения на резервный мастер необходимо:• Убедиться, что основной мастер остановлен (процесс убит и в рабочей
директории инстанса мастера отсутвует файл postmaster.pid)• На сервере резервного мастера выполнить команду gpactivatestandby -d /master_instance_directory• Переключить виртуальный ip-адрес на сервер нового мастера.
При принятии определённых рисков переключение можно автоматизировать
Резервирование и надежность. Сегменты
Вариант 1: все зеркала сегментов, располагающихся на хосте N, находятся на хосте N+1
17
Резервирование и надежность. Сегменты
Вариант 2: зеркала сегментов сервера N распределены между N+1, N+2, N+3 …
18
Внешние таблицы
/usr/local/greenplum-loaders-4.3.0.0-build-2/bin/gpfdist -d /mnt/ -p 8087 –l /tmp/gpfdist8087.log
/usr/local/greenplum-loaders-4.3.0.0-build-2/bin/gpfdist -d /path2 -p 8108 -l /tmp/gpfdist8108.log
CREATE EXTERNAL WEB TABLE dev_src.src_abm_rate( organisations ,
department , department_id , managment , managment_id)
LOCATION ('http://tcsbank.ru:8086/data/log*.csv') FORMAT 'csv' (delimiter ';' null 'NULL' escape '"' quote '"')
ENCODING 'WIN1251';
19
Внешние таблицы в Hadoop
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_type=RECORD &codec=org.apache.hadoop.io.compress.DefaultCodec') FORMAT 'custom' (formatter='gphdfs_export');
Работа с базой
• pgAdmin III• Aginity WB for
Greenplum• DataGrip• psql
Обслуживание
• Вакуум таблиц каталога• Вакуум всех таблиц• Сбор статистики• Проверка свободного места (!)• Управление Spill-files• Управление WORK-схемами SAS• Периодический Re-partitioning таблиц• Синхронизация с AD (LDAP)
22
Параметры
• Joins– enable_nestloop (off)– enable_hashjoin (on)– enable_mergejoin (off)
• Aggregation:– enable_hashagg (on)– enable_groupagg (on)– gp_enable_multiphaseagg
(on)
• Sequential Scans / Index Scans– enable_seqscan (on)– enable_indexscan (on)– enable_bitmapscan (on)
• Memory– gp_resqueue_memory_policy
( eager_free)– statement_mem ( 128Mb)– max_statement_mem
(2000Mb)– work_mem– gp_vmem_protect_limit
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‘
24
Карта сегментов
#### Shell utility used to connect to remote hosts.TRUSTED_SHELL=sshENCODING=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_gpinitsystemQD_PRIMARY_ARRAY=mdw:5432:/data1/master/gpseg-1:1:-1:0declare -a PRIMARY_ARRAY=(sdw1-1:40000:/data1/primary/gpseg0:2:0:41000sdw1-2:40001:/data1/primary/gpseg1:3:1:41001...sdwN-1:40002:/data2/primary/gpseg94:96:94:41002sdwN-2:40003:/data2/primary/gpseg95:97:95:41003) declare -a MIRROR_ARRAY=(sdw1-2:50000:/data1/mirror/gpseg8:98:8:51000sdw1-1:50001:/data1/mirror/gpseg13:99:13:51001...sdwN-2:50002:/data2/mirror/gpseg86:192:86:51002sdwN-1:50003:/data2/mirror/gpseg91:193:91:51003)
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';
26
Greenplum Command Center
27
Мониторинг. Graphite+Grafana
Нагрузка на железо• CPU• HDD I/O• Ethernet performance
28
Мониторинг. Graphite+Grafana
Репликация CDC• Актуальность
метаданных• Отставание от
источника• Работа Oracle GG
29
Мониторинг. Cabot
30
Мониторинг. Cabot
31
HAWQ. Greenplum на Hadoop