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-хранилище:

  1. Создайте 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 сервера.

      Возможные значения:

      • vhost

      • path

    • url_compatibility_mode: помогает, когда в URL сервера содержатся проблемные символы.

      Возможные значения:

      • true

      • false

    Важно

    Имя сервера должно быть simple_s3_secret, так как pgpro_metastore использует параметры подключения и учётные данные, зарегистрированные в postgres_fdw под этим именем хоста.

    Если указать другое имя хоста, при создании хранилища параметры подключения и учётные данные не будут обнаружены.

  2. Создайте сопоставление пользователя для 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 выполняет следующие действия:

  1. Проверяет права пользователей.

  2. Проверяет, что для хранилища достаточно дискового пространства, по умолчанию требуется 10 ГБ.

  3. Проверяет, что указанные каталоги существуют.

  4. Создаёт новое хранилище в таблице метаданных 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:

  1. Создайте сервер для 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

  2. Создайте сопоставление для пользователя, который будет работать с 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 configuration

3.2.5. Удаление хранилища #

Выполните следующий запрос:

  SELECT metastore.remove_storage('имя_хранилища');

Где имя_хранилища — это имя хранилища, которое будет удалено.

Пример 3.17.

  SELECT metastore.remove_storage('example_storage');

После выполнения этого запроса pgpro_metastore выполняет следующие действия:

  1. Проверяет права пользователей.

  2. Создаёт новый снимок в таблице метаданных pga_snapshot и указывает для хранилища и всех связанных с ним объектов pgpro_metastore значение end_snapshot в таблице метаданных pga_storage и других таблицах метаданных.