Именованные коллекции
Именованные коллекции (named collections) в ADQM/ClickHouse — предопределенные наборы параметров в виде пар ключ/значение, которые можно неоднократно использовать в SQL-запросах при подключении к внешним источникам данных (таким как PostgreSQL, Kafka, S3, MySQL и другим) через табличные функции, словари, интеграционные движки таблиц и баз данных.
Эта функциональность позволяет:
-
делать SQL-запросы более короткими и понятными, избегая повторного определения одних и тех же параметров — значения параметров можно указать один раз в рамках именованной коллекции, а затем обращаться к этой коллекции в различных запросах по мере необходимости;
-
централизованно управлять наборами параметров — конфигурация для интеграции с внешней системой хранится в одном месте, где можно, например, легко проанализировать ошибки подключения в случае их возникновения и обновить необходимые параметры;
-
защитить конфиденциальные учетные данные (например, пароли) для интеграции с внешними системами, скрывая их от пользователей без прав доступа администратора.
ПРИМЕЧАНИЕ
В данной статье способы создания и использования именованных коллекций описаны на примере интеграции ADQM и ADPG. Для воспроизведения приведенных примеров подготовьте ADPG, как описано в статье Интеграция ADQM и ADPG: создайте пользователя PostgreSQL, от имени которого будет выполняться подключение к ADPG из ADQM, и две базы данных PostgreSQL с таблицами для тестирования. |
Управление именованными коллекциями
Для управления именованными коллекциями (создания/изменения/удаления) можно использовать:
-
DDL-запросы. Чтобы у пользователя было разрешение конфигурировать именованные коллекции через DDL-запросы, ему должна быть предоставлена привилегия
named_collection_control
— для этого в конфигурационном файле /etc/clickhouse-server/users.xml (или в другом XML-файле директории /etc/clickhouse-server/users.d/) установите значение параметраnamed_collection_control
равным1
в настройках пользователя.Пример
Назначение привилегииnamed_collection_control
пользователюdefault
в файле users.xml:<users> <default> ... <named_collection_control>1</named_collection_control> ... </default> </users>
-
XML-файлы. Именованные коллекции можно определять в конфигурационном файле /etc/clickhouse-server/config.xml или в других XML-файлах директории /etc/clickhouse-server/config.d/. Созданную или измененную в конфигурационном файле именованную коллекцию можно применять после перезапуска сервера ClickHouse.
Список всех существующих именованных коллекций (созданных с помощью DDL-запросов и описанных в XML-файлах) можно посмотреть в системной таблице named_collections
.
Переопределение параметров
Параметры, указанные в именованной коллекции, могут быть переопределены в использующем эту коллекцию SQL-запросе. Для каждого параметра в составе именованной коллекции можно ограничить возможность изменения его значения с помощью специального флага:
-
OVERRIDABLE
(илиoverridable="true"
в XML-конфигурации) — значение параметра можно переопределять; -
NOT OVERRIDABLE
(илиoverridable="false"
в XML-конфигурации) — значение параметра запрещено переопределять; -
флаг не указан — возможность переопределения значения параметра определяется настройкой allow_named_collection_override_by_default.
ВНИМАНИЕ
Если вы используете именованные коллекции с целью скрыть учетные данные для подключения к внешним системам от пользователей без доступа администратора, следует ограничить возможность переопределения соответствующих параметров.
|
Создание именованных коллекций
DDL-запросы
Создать именованную коллекцию можно с помощью запроса CREATE NAMED COLLECTION
:
CREATE NAMED COLLECTION [IF NOT EXISTS] <collection_name> [ON CLUSTER <cluster_name>] AS
key1 = 'value1' [[NOT] OVERRIDABLE],
key2 = 'value2' [[NOT] OVERRIDABLE],
...;
Ключи в именованной коллекции должны совпадать с названиями параметров соответствующей функции, источника данных для словаря, движка таблицы или базы данных. Посмотреть точные названия параметров можно в документации ClickHouse — например, в статьях postgresql, mysql, s3, remote для соответствующих табличных функций или PostgreSQL, MySQL, Kafka для табличных движков.
При обращении к именованной коллекции, в которой указан недопустимый ключ, консольный клиент clickhouse-client выведет сообщение о соответствующей ошибке с указанием списка допустимых ключей (обязательных и опциональных). Например, если в именованной коллекции указан ключ user_password
, при вызове функции postgresql
со ссылкой на эту коллекцию clickhouse-client
сообщит, что функция не поддерживает такой ключ:
DB::Exception: Unexpected key user_password in named collection. Required keys: database, db, password, table, user, username, optional keys: addresses_expr, host, hostname, on_conflict, port, schema, use_table_cache. (BAD_ARGUMENTS)
Пример
Следующий запрос создает именованную коллекцию my_adpg
с параметрами для подключения ADQM к ADPG:
CREATE NAMED COLLECTION my_adpg AS
host = '<adpg_host>',
port = 5432,
database = 'adpg_db1' NOT OVERRIDABLE,
user = 'adqm_user',
password = '<adqm_user_secret_password>';
Значения параметров (база данных adpg_db1
и пользователь PostgreSQL adqm_user
) здесь указаны в соответствии с примерами, описанными в статье Интеграция ADQM и ADPG — см. раздел Подготовка ADPG для тестовых примеров.
XML-файлы
Чтобы определять именованные коллекции в XML-конфигурации сервера ClickHouse, используйте секцию named_collections
:
<clickhouse>
<named_collections>
<named_collection1>
<key1 overridable="true">value1</key1>
<key2 overridable="false">value2</key2>
<key3>value3</key3>
...
</named_collection1>
<named_collection2>
...
</named_collection2>
...
</named_collections>
</clickhouse>
Пример
Следующая конфигурация описывает именованную коллекцию my_adpg_xml
с параметрами подключения к базе данных ADPG adpg_db2
(детали создания этой базы данных также описаны в статье Интеграция ADQM и ADPG):
<clickhouse>
<named_collections>
<my_adpg_xml>
<host>adpg_host</host>
<port>5432</port>
<database>adpg_db2</database>
<user>adqm_user</user>
<password>adqm_user_secret_password</password>
</my_adpg_xml>
</named_collections>
</clickhouse>
Использование именованных коллекций
После того как именованная коллекция создана, ее можно использовать в SQL-запросах, чтобы ссылаться на предопределенные параметры подключения к внешнему источнику данных при работе с табличной функцией, интеграционным табличным движком или движком баз данных, словарем.
Следующие примеры демонстрируют различные способы получить доступ к данным PostgreSQL из ADQM с использованием созданных выше именованных коллекций с параметрами подключения к ADPG.
-
Табличная функция postgresql
Чтение данных из таблицы ADPG
adpg_db1.table1
с помощью табличной функции postgresql (таблица не определена в именованной коллекции, поэтому ее необходимо указать отдельно в параметрах табличной функции):SELECT id, name FROM postgresql(my_adpg, table = 'table1');
Запись данных в таблицу ADPG из ADQM:
INSERT INTO TABLE FUNCTION postgresql(my_adpg, table = 'table1') (id, name) VALUES (3, 'three');
-
Табличный движок PostgreSQL
Создание таблицы ADQM на базе табличного движка PostgreSQL:
CREATE TABLE psql_table (id Int32, name String) ENGINE = PostgreSQL(my_adpg, table = 'table1');
Движок копирует данные из именованной коллекции при создании таблицы. Последующее изменение коллекции не будет влиять на существующие таблицы.
-
База данных PostgreSQL
Создание в ADQM базы данных на основе движка баз данных PostgreSQL (в эту базу данных будут автоматически добавлены таблицы из базы данных PostgreSQL
adpg_db1
— в данном примере одна таблицаtable1
):CREATE DATABASE psql_database ENGINE = PostgreSQL(my_adpg);
-
Табличный движок MaterializedPostgreSQL
Создание таблицы MaterializedPostgreSQL для репликации данных таблицы ADPG
adpg_db2.table1
с указанием параметров подключения к ADQG через именованную коллекцию my_adpg_xml:SET allow_experimental_materialized_postgresql_table=1;
CREATE TABLE psql_table_replica (id Int32, name String) ENGINE = MaterializedPostgreSQL(my_adpg_xml, table = 'table1');
-
База данных MaterializedPostgreSQL
Создание базы данных MaterializedPostgreSQL, в которую будут реплицироваться таблицы
table1
иtable2
из базы данных ADPGadpg_db2
, с использованием именованной коллекцииmy_adpg_xml
для указания параметров подключения для этой репликации:SET allow_experimental_database_materialized_postgresql=1;
CREATE DATABASE psql_db_replica ENGINE = MaterializedPostgreSQL(my_adpg_xml) SETTINGS materialized_postgresql_tables_list = 'table1,table2';
-
Источник данных для словаря типа POSTGRESQL
Создание в ADQM словаря, который будет считывать данные из таблицы ADPG
adpg_db2.roles_dict
(именованная коллекция с настройками подключения к ADPG указывается с помощью параметраname
в конфигурации источника данных для словаря):CREATE DICTIONARY roles_dict_psql (id Int32, role String DEFAULT 'no role assigned') PRIMARY KEY id SOURCE(POSTGRESQL(name my_adpg_xml table roles_dict)) LIFETIME(MIN 10 MAX 20) LAYOUT(FLAT());
Изменение и удаление именованных коллекций
Именованные коллекции, созданные через DDL-запросы, можно изменять или удалять также с помощью DDL-запросов. Именованные коллекции, определенные в XML-файлах, можно изменять и удалять, редактируя или удаляя соответствующие им XML-описания.
Изменение именованных коллекций DDL
Изменить существующую именованную коллекцию можно с помощью запроса ALTER NAMED COLLECTION
, используя ключевое слово SET
для добавления/изменения параметров и DELETE
— для удаления существующих параметров. Синтаксис запроса в общем виде:
ALTER NAMED COLLECTION [IF EXISTS] <collection_name> [ON CLUSTER <cluster_name>]
[SET key1 = 'value1' [[NOT] OVERRIDABLE], key2 = 'value2' [[NOT] OVERRIDABLE], ... ] |
[DELETE key3, key4, ... ];
Ниже приведены примеры использования запроса ALTER NAMED COLLECTION
для изменения именованной коллекции my_adpg.
-
Добавление/изменение параметров
Изменение значения параметра
database
и добавление параметраtable
(при этом изначально установленный для параметраdatabase
флагNOT OVERRIDABLE
не меняется, то есть базу данных по-прежнему нельзя переопределить в SQL-запросе):ALTER NAMED COLLECTION my_adpg SET database = 'adpg_db2', table = 'table1';
Изменение значения параметра
database
с разрешением его переопределять:ALTER NAMED COLLECTION my_adpg SET database = 'adpg_db1' OVERRIDABLE;
-
Удаление параметров
Удаление параметра
table
из коллекцииmy_adpg
:ALTER NAMED COLLECTION my_adpg DELETE table;
Если параметр необходимо перенастроить так, чтобы в качестве флага на разрешение/ограничение переопределения его значения применялась настройка по умолчанию (
allow_named_collection_override_by_default
), этот параметр нужно удалить из именованной коллекции и снова добавить без указания флага:ALTER NAMED COLLECTION my_adpg DELETE database;
ALTER NAMED COLLECTION my_adpg SET database = 'adpg_db1';
Изменение значения параметра
password
и удаление параметраdatabase
в одном запросе:ALTER NAMED COLLECTION my_adpg SET password = '<new_password>' DELETE database;