Поправил английскую версию и выполнил перевод.
7.5 KiB
toc_priority | toc_title |
---|---|
40 | remote |
remote, remoteSecure
Позволяет обратиться к удалённым серверам без создания таблицы типа Distributed. Функция remoteSecure
такая же, как и remote
, но с защищенным соединением.
Обе функции могут быть использованы в запросах типа SELECT
и INSERT
.
Синтаксис
remote('addresses_expr', db, table[, 'user'[, 'password']])
remote('addresses_expr', db.table[, 'user'[, 'password']])
remoteSecure('addresses_expr', db, table[, 'user'[, 'password']])
remoteSecure('addresses_expr', db.table[, 'user'[, 'password']])
Параметры
-
addresses_expr
— выражение, генерирующее адреса удалённых серверов. Это может быть просто один адрес сервера. Адрес сервера — этохост:порт
, или толькохост
.Хост может быть указан в виде имени сервера, или в виде IPv4 или IPv6 адреса. IPv6 адрес указывается в квадратных скобках.
Порт — TCP-порт удалённого сервера. Если порт не указан, используется tcp_port из конфигурационного файла сервера, к которому обратились через функцию
remote
(по умолчанию - 9000), и tcp_port_secure, к которому обратились через функциюremoteSecure
(по умолчанию — 9440).С IPv6-адресом обязательно нужно указывать порт.
Тип: 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.
Возвращаемое значение
Набор данных с удаленных серверов.
Использование
Использование табличной функции remote
менее оптимально, чем создание таблицы типа Distributed
, так как в этом случае соединения с серверами устанавливаются заново при каждом запросе. В случае задания имён хостов делается резолвинг имён, а также не ведётся подсчёт ошибок при работе с разными репликами. При обработке большого количества запросов всегда создавайте таблицу типа Distributed
заранее, не используйте табличную функцию remote
.
Табличная функция remote
может быть полезна в следующих случаях:
- Обращение на конкретный сервер в целях сравнения данных, отладки и тестирования.
- Запросы между разными кластерами ClickHouse в целях исследований.
- Нечастые распределённые запросы, задаваемые вручную.
- Распределённые запросы, где набор серверов определяется каждый раз заново.
Адреса
example01-01-1
example01-01-1:9000
localhost
127.0.0.1
[::]:9000
[2a02:6b8:0:1111::11]:9000
Адреса можно указать через запятую. В этом случае ClickHouse обработает запрос как распределённый, т.е. отправит его по всем указанным адресам как на шарды с разными данными. Пример:
example01-01-1,example01-02-1
Часть выражения может быть указана в фигурных скобках. Предыдущий пример может быть записан следующим образом:
example01-0{1,2}-1
В фигурных скобках может быть указан диапазон (неотрицательных целых) чисел через две точки. В этом случае диапазон раскрывается в множество значений, генерирующих адреса шардов. Если запись первого числа начинается с нуля, то значения формируются с таким же выравниванием нулями. Предыдущий пример может быть записан следующим образом:
example01-{01..02}-1
При наличии нескольких пар фигурных скобок генерируется прямое произведение соответствующих множеств.
Адреса или их фрагменты в фигурных скобках можно указать через символ |. В этом случае соответствующие множества адресов понимаются как реплики — запрос будет отправлен на первую живую реплику. При этом реплики перебираются в порядке, согласно текущей настройке load_balancing. В этом примере указано два шарда, в каждом из которых имеется две реплики:
example01-{01..02}-{1|2}
Количество генерируемых адресов ограничено константой. Сейчас это 1000 адресов.
Примеры
Выборка данных с удаленного сервера:
SELECT * FROM remote('127.0.0.1', db.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;