Табличная функция remote позволяет обращаться к удалённым серверам на лету, то есть без создания Distributed таблицы. Табличная функция remoteSecure аналогична remote, но использует защищённое соединение.
Обе функции можно использовать в запросах SELECT и INSERT, когда целевой объект — обычная db/table. Если целевой объект сам является табличной функцией (например, remote('127.0.0.1', numbers(10))), таблица доступна только для чтения: удалённой таблицы для вставки не существует, поэтому INSERT отклоняется с исключением NOT_IMPLEMENTED.
Синтаксис
remote(addresses_expr, [db, table, user [, password], sharding_key][, SETTINGS name = value, ...])
remote(addresses_expr, [db.table, user [, password], sharding_key][, SETTINGS name = value, ...])
remote(named_collection[, option=value [,..]][, SETTINGS name = value, ...])
remoteSecure(addresses_expr, [db, table, user [, password], sharding_key][, SETTINGS name = value, ...])
remoteSecure(addresses_expr, [db.table, user [, password], sharding_key][, SETTINGS name = value, ...])
remoteSecure(named_collection[, option=value [,..]][, SETTINGS name = value, ...])Параметры
| Аргумент | Описание |
|---|---|
addresses_expr |
Адрес удалённого сервера или выражение, генерирующее несколько адресов удалённых серверов. Формат: host или host:port.host можно указать как имя сервера либо как адрес IPv4 или IPv6. Адрес IPv6 необходимо указывать в [].port — TCP-порт удалённого сервера. Если порт не указан, используется tcp_port из файла конфигурации сервера для табличной функции remote (по умолчанию 9000) и tcp_port_secure для табличной функции remoteSecure (по умолчанию 9440).Для адресов IPv6 указание порта обязательно. Если указан только параметр addresses_expr, для db и table по умолчанию используется system.one.Тип: String. |
db |
Имя базы данных. Тип: String. |
table |
Имя таблицы. Тип: String. |
user |
Имя пользователя. Если не указано, используется default. Тип: String. |
password |
Пароль пользователя. Если не указан, используется пустой пароль. Тип: String. |
sharding_key |
Ключ сегментирования для распределения данных по узлам. Например: insert into remote('127.0.0.1:9000,127.0.0.2', db, table, 'default', rand()). Тип: UInt32. |
SETTINGS name = value, ... |
Настройки таблицы Distributed, созданной функцией, например skip_unavailable_shards. Необязательно. Настройка, указанная в запросе, имеет приоритет над ней. Это предложение допускается только внутри табличной функции; движки таблиц Remote и RemoteSecure принимают те же настройки после определения движка, см. движки Remote и RemoteSecure. |
Аргументы также можно передавать с помощью именованных коллекций.
Возвращаемое значение
Таблица, расположенная на удалённом сервере.
Использование
Поскольку табличные функции remote и remoteSecure заново устанавливают соединение для каждого запроса, вместо них рекомендуется использовать таблицу Distributed. Кроме того, если указаны имена хостов, выполняется разрешение имён, а ошибки при работе с различными репликами не учитываются. При обработке большого количества запросов всегда заранее создавайте таблицу Distributed и не используйте табличную функцию remote.
Табличная функция remote может быть полезна в следующих случаях:
- Однократная миграция данных из одной системы в другую
- Доступ к конкретному серверу для сравнения данных, отладки и тестирования, то есть разовые ad hoc-подключения.
- Запросы между различными кластерами ClickHouse в исследовательских целях.
- Нечастые распределённые запросы, выполняемые вручную.
- Распределённые запросы, в которых набор серверов каждый раз задаётся заново.
Те же параметры можно использовать с движками таблиц Remote и RemoteSecure, чтобы создать постоянную таблицу вместо разовой; см. движки Remote и RemoteSecure. Единственное различие — предложение SETTINGS: движки принимают его после определения движка, ENGINE = Remote(...) SETTINGS skip_unavailable_shards = 1, а не среди аргументов.
Адреса
example01-01-1
example01-01-1:9440
example01-01-1:9000
localhost
127.0.0.1
[::]:9440
[::]:9000
[2a02:6b8:0:1111::11]:9000Несколько адресов можно указать через запятую. В этом случае ClickHouse будет использовать распределённую обработку и отправлять запрос на все указанные адреса (как в случае с сегментами, содержащими разные данные). Пример:
example01-01-1,example01-02-1Примеры
Выборка данных с удалённого сервера:
SELECT * FROM remote('127.0.0.1', db.remote_engine_table) LIMIT 3;Или используя именованные коллекции:
CREATE NAMED COLLECTION creds AS
host = '127.0.0.1',
database = 'db';
SELECT * FROM remote(creds, table='remote_engine_table') LIMIT 3;Вставка данных в таблицу на удалённом сервере:
CREATE TABLE remote_table (name String, value UInt32) ENGINE=Memory;
INSERT INTO FUNCTION remote('127.0.0.1', currentDatabase(), 'remote_table') VALUES ('test', 42);
SELECT * FROM remote_table;Миграция таблиц из одной системы в другую:
В этом примере используется одна таблица из набора демонстрационных данных. База данных — imdb, а таблица — actors.
В исходной системе ClickHouse (системе, где сейчас хранятся данные)
-
Проверьте исходную базу данных и имя таблицы (
imdb.actors)show databasesshow tables in imdb -
Получите оператор CREATE TABLE в исходной системе:
SELECT create_table_query
FROM system.tables
WHERE database = 'imdb' AND table = 'actors'Ответ
CREATE TABLE imdb.actors (`id` UInt32,
`first_name` String,
`last_name` String,
`gender` FixedString(1))
ENGINE = MergeTree
ORDER BY (id, first_name, last_name, gender);В целевой системе ClickHouse
-
Создайте целевую базу данных:
CREATE DATABASE imdb -
Используя оператор CREATE TABLE из исходной системы, создайте целевую таблицу:
CREATE TABLE imdb.actors (`id` UInt32, `first_name` String, `last_name` String, `gender` FixedString(1)) ENGINE = MergeTree ORDER BY (id, first_name, last_name, gender);
Возвращаемся к исходному развертыванию
Выполните вставку данных в новую базу данных и таблицу, созданные в удаленной системе. Вам понадобятся host, port, имя пользователя, пароль, база данных пункта назначения и целевая таблица.
INSERT INTO FUNCTION
remoteSecure('remote.clickhouse.cloud:9440', 'imdb.actors', 'USER', 'PASSWORD')
SELECT * from imdb.actorsГлоббинг
Шаблоны в { } используются для генерации набора сегментов и указания реплик. Если есть несколько пар { }, генерируется декартово произведение соответствующих наборов.
Поддерживаются следующие типы шаблонов.
{a,b,c}- Обозначает любую из альтернативных строкa,bилиc. Шаблон заменяется наaв адресе первого сегмента, наb— в адресе второго сегмента и так далее. Например,example0{1,2}-1генерирует адресаexample01-1иexample02-1.{N..M}- Диапазон чисел. Этот шаблон генерирует адреса сегментов с последовательно возрастающими индексами отNдоMвключительно. Например,example0{1..2}-1генерируетexample01-1иexample02-1.{0n..0m}- Диапазон чисел с ведущими нулями. Этот шаблон сохраняет ведущие нули в индексах. Например,example{01..03}-1генерируетexample01-1,example02-1иexample03-1.{a|b}- Любое количество вариантов, разделённых символом|. Шаблон задаёт реплики. Например,example01-{1|2}генерирует репликиexample01-1иexample01-2.
Запрос будет отправлен на первую работоспособную реплику. Однако для remote реплики перебираются в порядке, заданном в параметре load_balancing.
Количество генерируемых адресов ограничено параметром table_function_remote_max_addresses.