Конфигурация в коде
В этом разделе рассматриваются особенности настройки Tarantool в коде с
помощью API box.cfg. В этом случае конфигурация хранится
в файле инициализации — Lua-скрипте с заданными
параметрами конфигурации. Все доступные параметры см.
в справочнике по конфигурации.
Если команде запуска Tarantool
передается файл экземпляра, то Tarantool начинает работу с выполнения
Lua-программы из этого файла, который может называться init.lua.
Lua-программа может получать дополнительные аргументы из командной
строки или использовать функции операционной системы, такие как
getenv(). Lua-программа почти всегда начинается с вызова box.cfg(),
если используется сервер базы данных или если нужно открыть порты.
Например, предположим, что init.lua содержит следующие строки:
#!/usr/bin/env tarantoolbox.cfg{listen = os.getenv("LISTEN_URI"),memtx_memory = 33554432,pid_file = "tarantool.pid",wal_max_size = 2500}print('Starting ', arg[1])
А также переменная окружения LISTEN_URI содержит 3301, и командная строка равна tarantool init.lua ARG.
Тогда на экране может отобразиться следующее:
$ export LISTEN_URI=3301$ tarantool init.lua ARG... main/101/init.lua C> Tarantool 2.8.3-0-g01023dbc2... main/101/init.lua C> log level 5... main/101/init.lua I> mapping 33554432 bytes for memtx tuple arena...... main/101/init.lua I> recovery start... main/101/init.lua I> recovering from './00000000000000000000.snap'... main/101/init.lua I> set 'listen' configuration option to "3301"... main/102/leave_local_hot_standby I> ready to accept requestsStarting ARG... main C> entering the event loop
Если после завершения инициализации нужно запустить интерактивный сеанс в том же терминале,
передайте параметр командной строки -i.
Начиная с версии 2.8.1, задавать параметры конфигурации можно через специальные переменные
окружения. Имя переменной должно соответствовать шаблону: TT_<NAME>,
где <NAME> — имя соответствующего параметра box.cfg в верхнем регистре.
Например:
-
TT_LISTEN– соответствует параметру box.cfg.listen. -
TT_MEMTX_DIR– соответствует параметру box.cfg.memtx_dir.
Если значение представляет собой массив, разделяйте элементы запятой без пробела:
export TT_REPLICATION="localhost:3301,localhost:3302"
Если нужно передать дополнительные параметры для URI,
используйте разделители ? и &:
export TT_LISTEN="localhost:3301?param1=value1¶m2=value2"
Пустая переменная (TT_LISTEN=) действует так же, как и не заданная:
это означает, что при вызове box.cfg{} соответствующий параметр
конфигурации установлен не будет.
Параметры конфигурации имеют следующий вид:
{**{box.cfg}**}{[{*{key = value}*} [, {*{key = value ...}*}]]}
Параметры конфигурации можно задать в Lua-файле инициализации, который указывается в командной строке Tarantool.
Большинство параметров конфигурации предназначены для выделения
ресурсов, открытия портов и настройки поведения базы данных. Все
параметры необязательны. Большинство параметров являются динамическими,
то есть их можно изменить во время выполнения, повторно вызвав
box.cfg{}. Например, следующая команда задает значение 3301 для
порта прослушивания.
tarantool> box.cfg{ listen = 3301 }2023-05-10 13:28:54.667 [31326] main/103/interactive I> tx_binary: stopped2023-05-10 13:28:54.667 [31326] main/103/interactive I> tx_binary: bound to [::]:33012023-05-10 13:28:54.667 [31326] main/103/interactive/box.load_cfg I> set 'listen' configuration option to 3301---...
Чтобы увидеть все параметры, значения которых не равны null, выполните
box.cfg (без скобок).
tarantool> box.cfg: –-- replication_skip_conflict: false: wal_queue_max_size: 16777216 feedback_host:<https://feedback.tarantool.io> memtx_dir: . memtx_min_tuple_size:16 – other parameters –
Чтобы получить значение конкретного параметра, вызовите соответствующую
опцию box.cfg. Например, box.cfg.listen возвращает
указанный адрес прослушивания.
tarantool> box.cfg.listen---- 3301...
Некоторые параметры конфигурации и некоторые функции зависят от URI (универсального идентификатора ресурса). Строковый формат URI похож на общий синтаксис для схемы URI. Он может содержать (в следующем порядке):
- имя пользователя для входа
- пароль
- имя хоста или IP-адрес хоста
- номер порта
- параметры запроса
Только номер порта является обязательным в любом случае. Пароль обязателен, если указано имя пользователя, если только имя пользователя не 'guest'.
Формально синтаксис URI выглядит как [host:]port или
[username:password@]host:port. Если хост опущен, подразумевается
"0.0.0.0" или "[::]", что означает любой IPv4-адрес или любой
IPv6-адрес на локальной машине соответственно. Если username:password
опущено, подразумевается пользователь "guest". Несколько примеров:
Фрагмент URI | Пример |
|---|---|
port | 3301 |
host: | 127.0.0.1:3301 |
username: | notguest: |
В коде значение URI можно передать в виде числа (если указан только порт) или строки:
box.cfg { listen = 3301 }box.cfg { listen = "127.0.0.1:3301" }
В определенных случаях вместо URI может использоваться доменный сокет
Unix, например, unix/:/tmp/unix_domain_socket.sock или просто
/tmp/unix_domain_socket.sock.
Модуль uri предоставляет функции, которые преобразуют строки URI в их компоненты или собирают компоненты в строки URI.
Начиная с версии 2.10.0, на экземпляре Tarantool можно открыть несколько слушающих сокетов iproto и, как следствие, указать несколько URI в параметрах конфигурации, таких как box.cfg.listen и box.cfg.replication.
Значения URI можно задать несколькими способами:
-
В виде строки со значениями URI, разделенными запятыми.
box.cfg { listen = "127.0.0.1:3301, /unix.sock, 3302" } -
В виде таблицы, содержащей URI в строковом формате.
box.cfg { listen = {"127.0.0.1:3301", "/unix.sock", "3302"} } -
В виде массива таблиц с полем
uri.box.cfg { listen = {{uri = "127.0.0.1:3301"},{uri = "/unix.sock"},{uri = 3302}}}
- Комбинированным способом — массив, содержащий URI как в строковом, так и в табличном форматах.
box.cfg { listen = {"127.0.0.1:3301",{ uri = "/unix.sock" },{ uri = 3302 }}}
Кроме того, начиная с версии 2.10.0, для URI можно указывать дополнительные параметры. Это можно сделать несколькими способами:
-
Используя разделитель
?при указании URI в строковом формате.box.cfg { listen = "127.0.0.1:3301?p1=value1&p2=value2, /unix.sock?p3=value3" } -
Используя таблицу
params: URI передается в таблице с дополнительными параметрами в таблице "params". Параметры в таблице "params" перезаписывают параметры из строки URI ("value2" перезаписывает "value1" дляp1в примере ниже).box.cfg { listen = {"127.0.0.1:3301?p1=value1",params = {p1 = "value2", p2 = "value3"}}} -
Используя таблицу
default_paramsдля задания значений параметров по умолчанию.В примере ниже два URI передаются в таблице. Значение по умолчанию для параметра
p3задается в таблицеdefault_paramsи используется, если этот параметр не указан в URI. Параметры в таблицеdefault_paramsприменяются ко всем URI, переданным в таблице.box.cfg { listen = {"127.0.0.1:3301?p1=value1",{ uri = "/unix.sock", params = { p2 = "value2" } },default_params = { p3 = "value3" }}}
Рекомендуемый способ указания URI с дополнительными параметрами:
box.cfg { listen = {{uri = "127.0.0.1:3301", params = {p1 = "value1"}},{uri = "/unix.sock", params = {p2 = "value2"}},{uri = 3302, params = {p3 = "value3"}}}}
В случае с одним URI также работает следующий синтаксис:
box.cfg { listen = {uri = "127.0.0.1:3301",params = { p1 = "value1", p2 = "value2" }}}
Начиная с версии 2.10.0 в Tarantool Enterprise Edition встроена поддержка SSL для шифрования обмена данными между клиентом и сервером по бинарным соединениям, то есть между экземплярами Tarantool в кластере или при подключении к экземпляру через коннекторы с использованием LINK_NOT_DEFINED(../../../reference/reference_lua/net_box).
Tarantool использует библиотеку OpenSSL, которая входит в комплект поставки. Обратите внимание, что SSL-соединения используют только TLSv1.2.
Для настройки шифрования трафика необходимо задать специальные параметры URI для
конкретного соединения. Параметры можно задать для следующих опций box.cfg и метода net.box:
- box.cfg.listen — на стороне сервера.
- box.cfg.replication — на стороне клиента.
- net_box_object.connect() — на стороне клиента.
Ниже приведен список параметров. В следующем разделе можно посмотреть подробности и примеры настройки на стороне сервера и клиента.
-
transport— включает SSL-шифрование для соединения, если установлено значениеssl. Значение по умолчанию —plain, при котором шифрование отключено. Если параметр не задан, шифрование также отключено. Другие параметры, связанные с шифрованием, можно использовать только приtransport = 'ssl'.Пример:
local connection = require('net.box').connect({uri = 'admin:topsecret@127.0.0.1:3301',params = { transport = 'ssl',ssl_cert_file = 'certs/instance001/server001.crt',ssl_key_file = 'certs/instance001/server001.key',ssl_password = 'qwerty' }})
-
ssl_key_file— путь к файлу закрытого SSL-ключа. Обязателен для сервера. Для клиента обязателен, если для сервера задан параметрssl_ca_file; в противном случае — необязателен. Если закрытый ключ зашифрован, укажите пароль для него в параметреssl_passwordилиssl_password_file. -
ssl_cert_file— путь к файлу SSL-сертификата. Обязателен для сервера. Для клиента обязателен, если для сервера задан параметрssl_ca_file; в противном случае — необязателен. -
ssl_ca_file— путь к файлу доверенных центров сертификации (CA). Необязателен. Если параметр не задан, подлинность узла не проверяется.Параметр
ssl_ca_fileможет использоваться как на стороне сервера, так и на стороне клиента: -
Если параметр задан на стороне сервера, сервер проверяет клиента.
-
Если параметр задан на стороне клиента, клиент проверяет сервер.
-
Если файлы CA заданы с обеих сторон, сервер и клиент проверяют друг друга.
-
ssl_ciphers— разделенный двоеточием (:) список наборов шифров SSL, которые могут использоваться для соединения. Подробнее см. в разделе configuration_code_iproto-encryption-ciphers.Необязателен. Обратите внимание, что список не проверяется на корректность: если набор шифров неизвестен, Tarantool просто игнорирует его, не устанавливает соединение и записывает в лог сообщение о том, что не найден общий набор шифров.
-
ssl_password— пароль для зашифрованного закрытого SSL-ключа. Необязателен. Также пароль можно указать вssl_password_file. -
ssl_password_file— текстовый файл с одним или несколькими паролями для зашифрованных закрытых SSL-ключей (по одному на каждой строке). Необязателен. Также пароль можно указать вssl_password.
Параметры ssl_password и ssl_password_file применяются в следующем порядке:
-
Если задан параметр
ssl_password, Tarantool пытается расшифровать закрытый ключ с его помощью. -
Если
ssl_passwordневерный или не задан, Tarantool поочередно пытается использовать все пароли изssl_password_fileв порядке их следования в файле. -
Если
ssl_passwordи все пароли изssl_password_fileневерные или ни один из них не задан, Tarantool считает закрытый ключ незашифрованным.
Пример конфигурации:
box.cfg{ listen = {uri = 'localhost:3301',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file',ssl_ciphers = 'HIGH:!aNULL',ssl_password = 'topsecret'}}}
Tarantool Enterprise поддерживает следующие наборы шифров:
- ECDHE-ECDSA-AES256-GCM-SHA384
- ECDHE-RSA-AES256-GCM-SHA384
- DHE-RSA-AES256-GCM-SHA384
- ECDHE-ECDSA-CHACHA20-POLY1305
- ECDHE-RSA-CHACHA20-POLY1305
- DHE-RSA-CHACHA20-POLY1305
- ECDHE-ECDSA-AES128-GCM-SHA256
- ECDHE-RSA-AES128-GCM-SHA256
- DHE-RSA-AES128-GCM-SHA256
- ECDHE-ECDSA-AES256-SHA384
- ECDHE-RSA-AES256-SHA384
- DHE-RSA-AES256-SHA256
- ECDHE-ECDSA-AES128-SHA256
- ECDHE-RSA-AES128-SHA256
- DHE-RSA-AES128-SHA256
- ECDHE-ECDSA-AES256-SHA
- ECDHE-RSA-AES256-SHA
- DHE-RSA-AES256-SHA
- ECDHE-ECDSA-AES128-SHA
- ECDHE-RSA-AES128-SHA
- DHE-RSA-AES128-SHA
- AES256-GCM-SHA384
- AES128-GCM-SHA256
- AES256-SHA256
- AES128-SHA256
- AES256-SHA
- AES128-SHA
- GOST2012-GOST8912-GOST8912
- GOST2001-GOST89-GOST89
В статической сборке Tarantool Enterprise
встроен движок для поддержки криптографических алгоритмов ГОСТ. Если эти
алгоритмы используются для шифрования трафика, укажите соответствующий
набор шифров в параметре ssl_ciphers, например:
box.cfg{ listen = {uri = 'localhost:3301',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file',ssl_ciphers = 'GOST2012-GOST8912-GOST8912'}}}
Подробнее о шифрах SSL и их синтаксисе см. в документации OpenSSL.
Параметры URI для шифрования трафика также можно задать через переменные окружения, например:
export TT_LISTEN="localhost:3301?transport=ssl&ssl_cert_file=/path_to_cert_file&ssl_key_file=/path_to_key_file"
При настройке шифрования трафика необходимо указать нужные параметры как на стороне сервера, так и на стороне клиента. Ниже приведены сведения об используемых опциях и параметрах, а также примеры конфигурации.
На стороне сервера
- Настраивается с помощью опции
box.cfg.listen. - Обязательные параметры URI:
transport,ssl_key_fileиssl_cert_file. - Необязательные параметры URI:
ssl_ca_file,ssl_ciphers,ssl_passwordиssl_password_file.
На стороне клиента
- Настраивается с помощью опции
box.cfg.replication(см. подробности) илиnet_box_object.connect().
Параметры:
-
Если на стороне сервера заданы только параметры
transport,ssl_key_fileиssl_cert_file, на стороне клиента в качестве обязательного параметра необходимо указать толькоtransport = ssl. Все остальные параметры URI являются необязательными. -
Если на стороне сервера также задан параметр
ssl_ca_file, на стороне клиента в качестве обязательных параметров необходимо указатьtransport,ssl_key_fileиssl_cert_file. Остальные параметры –ssl_ca_file,ssl_ciphers,ssl_passwordиssl_password_file– являются необязательными.
Предположим, существует набор реплик master-replica с двумя экземплярами Tarantool:
-
127.0.0.1:3301 – мастер (сервер)
-
127.0.0.1:3302 – реплика (клиент).
Ниже приведены примеры конфигурации, связанной с шифрованием соединения, для двух случаев: когда файл доверенных центров сертификации (CA) не задан на стороне сервера и когда он задан. В этих примерах указаны только обязательные параметры URI.
-
Без CA
- 127.0.0.1:3301 – мастер (сервер)
box.cfg{listen = {uri = '127.0.0.1:3301',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file'}}}
- 127.0.0.1:3302 – реплика (клиент)
box.cfg{listen = {uri = '127.0.0.1:3302',params = {transport = 'ssl'}},replication = {uri = 'username:password@127.0.0.1:3301',params = {transport = 'ssl'}},read_only = true}
-
С CA
- 127.0.0.1:3301 – мастер (сервер)
box.cfg{listen = {uri = '127.0.0.1:3301',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file',ssl_ca_file = '/path_to_ca_file'}}}
- 127.0.0.1:3302 – реплика (клиент)
box.cfg{listen = {uri = '127.0.0.1:3302',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file'}},replication = {uri = 'username:password@127.0.0.1:3301',params = {transport = 'ssl',ssl_key_file = '/path_to_key_file',ssl_cert_file = '/path_to_cert_file'}},read_only = true}
Ниже приведен синтаксис команды для запуска экземпляра Tarantool, настроенного в скрипте инициализации на Lua:
$ tarantool LUA_INITIALIZATION_FILE [OPTION ...]
Команда tarantool также предоставляет набор опций,
которые могут быть полезны при разработке.
Следующая команда запускает экземпляр Tarantool, настроенный в файле init.lua:
$ tarantool init.lua