3.2. Хранилища #
Хранилища — это физические расположения Parquet-файлов и общих каталогов. Postgres Pro AXE поддерживает следующие типы хранилищ:
Локальные хранилища: массивы дисков, поддерживающих протокол NVME (энергонезависимая память Express), на серверах с установленным Postgres Pro AXE.
Сетевые хранилища: сетевые файловые системы (Network File Systems, NFS).
S3-хранилища.
Чтобы определиться с типом хранилища, используйте информацию из таблицы ниже.
Локальное хранилище | Сетевое хранилище | S3-хранилище | |
|---|---|---|---|
Пропускная способность | Высокая. Определяется количеством NVME-дисков в массиве. | Средняя. Ограничена возможностями сетевого интерфейса сервера, сетевой нагрузкой и скоростью сетевого хранилища. | Средняя. Ограничена возможностями сетевого интерфейса сервера, сетевой нагрузкой и скоростью S3-хранилища. |
Масштабируемость данных | Средняя. Определяется количеством NVME-дисков и их объёмом. | Высокая. | Высокая. |
Распределение данных по серверам | Не поддерживается. | Поддерживается в рамках сети организации. | Глобальный. |
Поставщик отказоустойчивости | Администратор сервера Postgres Pro AXE. | Администратор NFS. | Поставщик услуг S3-хранилища. |
Стоимость за терабайт и за одно обращение к хранилищу | Низкая. | Средняя. | Зависит от поставщика услуг S3-хранилища. |
Метаданные хранилищ хранятся в таблице метаданных pga_storage.
Для хранения OLAP-данных можно использовать любую структуру каталогов, например:
В локальном или сетевом хранилище:
корневой_путь/имя_бд/имя_схемы/имя_таблицы
В S3-хранилище:
s3://корзина/имя_бд/имя_схемы/имя_таблицы
pgpro_axe позволяет автоматически экспортировать OLAP-данные в несколько Parquet-файлов и добавлять уникальный номер к имени каждого файла. OLAP-данные проще хранить в виде нескольких Parquet-файлов одинакового размера.
Для организации OLAP-данных по ключам секционирования в иерархии каталогов можно также использовать hive-секционирование:
table_name
├── year=2024
│ ├── month=1
│ │ ├── file1.parquet
│ │ └── file2.parquet
│ └── month=2
│ └── file3.parquet
└── year=2025
├── month=11
│ ├── file4.parquet
│ └── file5.parquet
└── month=12
└── file6.parquetЭтот тип иерархии может быть полезен для больших исторических таблиц, когда для выполнения аналитических запросов требуются данные, связанные с определённым подмножеством ключей секционирования.
Перенос фильтров на уровень пути также поддерживается. Благодаря этому в процессе чтения можно пропустить пути, которые не содержат необходимых OLAP-данных.
Для работы с S3-хранилищами используются сторонние серверы Postgres Pro. Благодаря этому параметры подключения и учётные данные пользователей надёжно хранятся в Postgres Pro без их указания в функциях. В настоящее время можно создать только одно S3-хранилище.
3.2.1. Предварительная настройка S3-хранилища #
Перед созданием S3-хранилища его необходимо предварительно настроить.
Чтобы предварительно настроить S3-хранилище:
Создайте S3-сервер:
CREATE SERVER simple_s3_secret TYPE 's3' FOREIGN DATA WRAPPER duckdb OPTIONS ( endpoint 'адрес_IP_и_номер_порта', region 'имя_региона', use_ssl 'true'или'false', url_style 'vhost'или'path', url_compatibility_mode 'true'или'false' );Где:
endpoint: IP-адрес и номер порта S3-сервера.region: регион, в котором расположен S3-сервер.use_ssl: указывает, использует ли S3-сервер HTTPS.Возможные значения:
true
false
url_style: стиль URL сервера.Возможные значения:
vhostpath
url_compatibility_mode: помогает, когда в URL сервера содержатся проблемные символы.Возможные значения:
true
false
Важно
Имя сервера должно быть
simple_s3_secret, так как pgpro_metastore использует параметры подключения и учётные данные, зарегистрированные в postgres_fdw под этим именем хоста.Если указать другое имя хоста, при создании хранилища параметры подключения и учётные данные не будут обнаружены.
Создайте сопоставление пользователя для pgpro_metastore:
CREATE USER MAPPING FOR metastore_admin SERVER simple_s3_secret OPTIONS ( key_id 'ключ_доступа', secret 'секретный_ключ' );Где:
key_id: ключ доступа (логин) для S3-хранилища.secret: секретный ключ для S3-хранилища.
Важно
У пользователя, для которого создаётся сопоставление, должна быть роль
duckdb.postgres_role.
3.2.2. Создание хранилища #
Перед созданием S3-хранилища предварительно настройте его.
Чтобы создать хранилище, выполните следующий запрос:
SELECT metastore.add_storage('имя_хранилища', 'URI_корневого_каталога', 'URI_временного_каталога');Где:
имя_хранилища: уникальное имя хранилища.URI_корневого_каталога: URI корневого каталога хранилища.URI_временного_каталога: URI каталога хранилища для временных файлов.
У локальных хранилищ URI простой, например, file:///home/j.doe/workspace/axe/.
S3-хранилища отличаются более сложной структурой URI и логикой разбора, например, s3://premdb/team01.csv?versionId=w_B5qT8s5MkiT09.IRHay0lW.PycsHTS. Эти URI генерируются с помощью сторонних библиотек.
Пример 3.7.
SELECT metastore.add_storage('example_storage', 'file:///tmp/example_storage_dir/', 'file:///tmp/example_storage_dir/tmp_dir/');После выполнения этого запроса pgpro_metastore выполняет следующие действия:
Проверяет права пользователей.
Проверяет, что для хранилища достаточно дискового пространства, по умолчанию требуется 10 ГБ.
Проверяет, что указанные каталоги существуют.
Создаёт новое хранилище в таблице метаданных
pga_storage.
3.2.3. Особенности работы с локальным хранилищем #
Локальное хранилище по умолчанию отключено, поэтому пользователям запрещено экспортировать или читать из него файлы:
Пример 3.8.
postgres=> show duckdb.disabled_filesystems;
duckdb.disabled_filesystems
-----------------------------
LocalFileSystem
(1 row)
postgres=> COPY test TO 'out.parquet';
ERROR: (PGDuckDB/DuckdbUtilityHook_Cpp) Permission Error: File system LocalFileSystem has been disabled by configuration
postgres=> SELECT * FROM read_parquet('test.parquet');
ERROR: (PGDuckDB/CreatePlan) Prepared query returned an error: 'Permission Error: File system LocalFileSystem has been disabled by configurationinput>Если локальное хранилище включено, члены роли, указанной в параметре конфигурации duckdb.postgres_role, имеют такие же права доступа в этом хранилище, как пользователь postgres. Это необходимо для чтения и записи в Parquet-файлы:
Пример 3.9.
postgres=> show duckdb.disabled_filesystems;
duckdb.disabled_filesystems
-----------------------------
(1 row)
postgres=> COPY test TO 'out.parquet';
COPY 7
postgres=> SELECT * FROM read_parquet('out.parquet');
a | b
---+---
1 | 2
...
(7 rows)Однако в этом случае пользователи также имеют доступ к файлам в каталоге PGDATA:
Пример 3.10.
postgres=> show duckdb.disabled_filesystems ;
duckdb.disabled_filesystems
-----------------------------
(1 row)
postgres=> SELECT pg_read_file('postgresql.auto.conf');
ERROR: permission denied for function pg_read_file
postgres=> SELECT * FROM duckdb.query('SELECT content FROM read_text(''postgresql.auto.conf'')');
content
-------------------------------------------------------
# Do not edit this file manually! +
# It will be overwritten by the ALTER SYSTEM command.+В то время как если вы отключите локальное хранилище:
Пример 3.11.
postgres=> show duckdb.disabled_filesystems ;
duckdb.disabled_filesystems
-----------------------------
LocalFileSystem
(1 row)
postgres=> SELECT * FROM duckdb.query('SELECT content FROM read_text(''postgresql.auto.conf'')');
ERROR: (PGDuckDB/CreatePlan) Prepared query returned an error: 'Permission Error: File system LocalFileSystem has been disabled by configurationРекомендации по использованию pgpro_axe с локальным хранилищем:
Используйте локальное хранилище, только если вы уверены, что пользователи будут правильно вызывать функции pgpro_axe.
Изолируйте процессы Postgres Pro от файлов вне каталога
PGDATAи файлов, которые будут прочитаны или записаны.
3.2.4. Рекомендации по работе с S3-хранилищем #
Для работы с S3-хранилищем укажите информацию о подключении. Например, если у вас развёрнут экземпляр S3-хранилища MinIO, выполните следующие действия от имени пользователя postgres:
Создайте сервер для S3-хранилища:
Пример 3.12.
postgres=# CREATE SERVER my_secret1 TYPE 's3' FOREIGN DATA WRAPPER duckdb OPTIONS ( endpoint '127.0.0.1:9000', url_style 'path', use_ssl 'FALSE' ); CREATE SERVER
Создайте сопоставление для пользователя, который будет работать с S3-хранилищем:
Пример 3.13.
postgres=# CREATE USER MAPPING FOR user1 SERVER my_secret1 OPTIONS (KEY_ID 'minioadmin', SECRET 'minioadmin'); CREATE USER MAPPING
Указанный пользователь теперь имеет права доступа, необходимые для работы с S3-хранилищем:
Пример 3.14.
postgres=> SELECT * FROM read_parquet('s3://bucket1/results.parquet');
a | b
---+---
1 | 2
2 |
(2 rows)
postgres=> COPY a TO 's3://bucket1/a.parquet';
COPY 8Если вы создаёте сопоставление для пользовательской роли, указанной в параметре конфигурации duckdb.postgres_role, все члены этой роли смогут работать с S3-хранилищем.
Чтобы отозвать доступ к S3-хранилищу у пользователя, удалите соответствующее сопоставление:
Пример 3.15.
postgres=# DROP USER MAPPING FOR user1 SERVER my_secret1; DROP USER MAPPING
Чтобы отозвать доступ к S3-хранилищу у всех пользователей, отключите хранилище:
Пример 3.16.
postgres=> show duckdb.disabled_filesystems ;
duckdb.disabled_filesystems
------------------------------
LocalFileSystem,S3FileSystem
(1 row)
postgres=> SELECT * FROM read_parquet('s3://bucket1/results.parquet');
ERROR: (PGDuckDB/CreatePlan) Prepared query returned an error: 'Permission Error: File system S3FileSystem has been disabled by configuration
postgres=> COPY a TO 's3://bucket1/a.parquet';
ERROR: (PGDuckDB/DuckdbUtilityHook_Cpp) Permission Error: File system S3FileSystem has been disabled by configuration3.2.5. Удаление хранилища #
Выполните следующий запрос:
SELECT metastore.remove_storage('имя_хранилища');Где имя_хранилища — это имя хранилища, которое будет удалено.
Пример 3.17.
SELECT metastore.remove_storage('example_storage');После выполнения этого запроса pgpro_metastore выполняет следующие действия:
Проверяет права пользователей.
Создаёт новый снимок в таблице метаданных
pga_snapshotи указывает для хранилища и всех связанных с ним объектов pgpro_metastore значениеend_snapshotв таблице метаданныхpga_storageи других таблицах метаданных.