31
GREENPLUM DB Особенности и применение в Тинькофф банке Дмитрий немчин Администратор DWH

#PostgreSQLRussia в банке Тинькофф, доклад №1

Embed Size (px)

Citation preview

Page 1: #PostgreSQLRussia в банке Тинькофф, доклад №1

GREENPLUM DB

Особенности и применение в Тинькофф банке

Дмитрий немчинАдминистратор DWH

Page 2: #PostgreSQLRussia в банке Тинькофф, доклад №1

2

Содержание

• Особенности• Архитектура• Хранение данных• Загрузка данных в БД• Доступ к данным• Установка• Мониторинг• Проблемы и наши решения

Page 3: #PostgreSQLRussia в банке Тинькофф, доклад №1

Особенности

• СУБД для суровой аналитики больших объемов данных– Легкая интеграция с BI и аналитическим ПО– Быстрая работа с большими объемами данных

• PostgreSQL-based (8.2.15 + back-ported features of 9.0+)– Легкость администрирования и поддержки– Работа почти с любыми клиентами (JDBC, ODBC)– Удобные механизмы загрузки и выгрузки данных– Хорошие механизмы шардирования данных

• Отличная масштабируемость– Архитектура MPP shared-nothing– Производительность растет почти линейно

Page 4: #PostgreSQLRussia в банке Тинькофф, доклад №1

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 может быть только одно зеркало.

Page 5: #PostgreSQLRussia в банке Тинькофф, доклад №1

Архитектура. Cвязи в кластере

Page 6: #PostgreSQLRussia в банке Тинькофф, доклад №1

Хранение данных

• 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

Page 7: #PostgreSQLRussia в банке Тинькофф, доклад №1

Хранение данных

• Классическая схема шардирования данных– Каждая таблица -> N+1 таблиц на всех сегментах кластера– где N – число сегментов. На каждом сегменте хранится 1/N строк таблицы– +1 - это таблица на мастере, данных в ней нет. Только мета

• Distribution key - ключ (поле или набор полей) распределения– Greenplum работает со скоростью самого медленного сегмента, это

означает, что перекос в количестве данных между сегментами ведёт к деградации производительности кластера и к другим проблемам

• Распределение данных поможет оценить служебное поле gp_segment_id, существующее в каждой таблице –номер сегмента, на котором хранится конкретная строка

NOTE: GP не поддерживает UPDATE полей, по которым распределена таблица

Page 8: #PostgreSQLRussia в банке Тинькофф, доклад №1

8

Хранение данных

• Heap tables– Как в PostgreSQL– Row storage. Только строковое хранение– Можно не бояться update– Хорошо для небольших таблиц

• Append-optimized (append-only) tables– Column– Compression. АО-таблицы можно сжимать

zlib/quicklz– Batch-only. Плохо работают в row-by-row

Page 9: #PostgreSQLRussia в банке Тинькофф, доклад №1

9

Основные вопросы архитектору

• Data Distribution Выбор ключа распределения

• Data Skew• Чем равномернее разложены данные по сегментам, тем лучше

• Partition or not to Partition• Секционирование позволяет использовать разные виды хранения в одной таблице

• Разные секции одной таблицы можно разложить по разным дискам

• Data Types Лучше использовать максимально компактные типы данных

• Constraints Table Column

Page 10: #PostgreSQLRussia в банке Тинькофф, доклад №1

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

Задается для корректности данных Подбирается для быстродействия и оптимального хранения

Page 11: #PostgreSQLRussia в банке Тинькофф, доклад №1

Распределение данных

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;

Page 12: #PostgreSQLRussia в банке Тинькофф, доклад №1

Распределение данных

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

Page 13: #PostgreSQLRussia в банке Тинькофф, доклад №1

Выбирайте ключ распределения с уникальными значениями или высокой кардинальностью

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

Распределение данных

Page 14: #PostgreSQLRussia в банке Тинькофф, доклад №1

Таблицы и распределение данных

• создавать отдельные столбцы только для распределения данных

• Распределять таблицы по полям, которые не используются в джойнах

• Распределять таблицу по Boolean полям• Распределять таблицу по float полям• Использовать DISTRIBUTED RANDOMLY потому, что так проще

Неправильно

• Распределять все таблицы по всем сегментам БД• Определить общую политику распределения данных• Уникальные ключи обеспечивают равномерное

распределение данных• Если ключ не задан – используется первое поле или PK• Random distribution – данные распределяются равномерно,

но быстродействие не идеально

Правильно

Page 15: #PostgreSQLRussia в банке Тинькофф, доклад №1

Резервирование и надежность. Мастер

В кластере GP используется полное резервирование мастера с помощью механизма репликации транзакционных логов, контролируемого специальным агентом (gpsyncagent). При этом автоматическое переключение роли мастера на резервный инстанс не поддерживается.

Для переключения на резервный мастер необходимо:• Убедиться, что основной мастер остановлен (процесс убит и в рабочей

директории инстанса мастера отсутвует файл postmaster.pid)• На сервере резервного мастера выполнить команду gpactivatestandby -d /master_instance_directory• Переключить виртуальный ip-адрес на сервер нового мастера.

При принятии определённых рисков переключение можно автоматизировать

Page 16: #PostgreSQLRussia в банке Тинькофф, доклад №1

Резервирование и надежность. Сегменты

Вариант 1: все зеркала сегментов, располагающихся на хосте N, находятся на хосте N+1

Page 17: #PostgreSQLRussia в банке Тинькофф, доклад №1

17

Резервирование и надежность. Сегменты

Вариант 2: зеркала сегментов сервера N распределены между N+1, N+2, N+3 …

Page 18: #PostgreSQLRussia в банке Тинькофф, доклад №1

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';

Page 19: #PostgreSQLRussia в банке Тинькофф, доклад №1

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');

Page 20: #PostgreSQLRussia в банке Тинькофф, доклад №1

Работа с базой

• pgAdmin III• Aginity WB for

Greenplum• DataGrip• psql

Page 21: #PostgreSQLRussia в банке Тинькофф, доклад №1

Обслуживание

• Вакуум таблиц каталога• Вакуум всех таблиц• Сбор статистики• Проверка свободного места (!)• Управление Spill-files• Управление WORK-схемами SAS• Периодический Re-partitioning таблиц• Синхронизация с AD (LDAP)

Page 22: #PostgreSQLRussia в банке Тинькофф, доклад №1

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

Page 23: #PostgreSQLRussia в банке Тинькофф, доклад №1

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‘

Page 24: #PostgreSQLRussia в банке Тинькофф, доклад №1

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)

Page 25: #PostgreSQLRussia в банке Тинькофф, доклад №1

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';

Page 26: #PostgreSQLRussia в банке Тинькофф, доклад №1

26

Greenplum Command Center

Page 27: #PostgreSQLRussia в банке Тинькофф, доклад №1

27

Мониторинг. Graphite+Grafana

Нагрузка на железо• CPU• HDD I/O• Ethernet performance

Page 28: #PostgreSQLRussia в банке Тинькофф, доклад №1

28

Мониторинг. Graphite+Grafana

Репликация CDC• Актуальность

метаданных• Отставание от

источника• Работа Oracle GG

Page 29: #PostgreSQLRussia в банке Тинькофф, доклад №1

29

Мониторинг. Cabot

Page 30: #PostgreSQLRussia в банке Тинькофф, доклад №1

30

Мониторинг. Cabot

Page 31: #PostgreSQLRussia в банке Тинькофф, доклад №1

31

HAWQ. Greenplum на Hadoop