Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

API маршрутизатора

Публичный API роутера

vshard.router.bootstrap()

Выполняет начальную загрузку кластера и распределяет все бакеты по наборам реплик.

Параметры:

  • timeout — количество секунд до завершения попытки начальной загрузки как неуспешной. При времени ожидания начальной загрузки пересоздайте кластер.
  • if_not_bootstrapped — по умолчанию false — означает вызывать ошибку, если кластер уже прошел начальную загрузку. True означает, что уже загруженный кластер считается успешным результатом.

Пример:

vshard.router.bootstrap({timeout = 4, if_not_bootstrapped = true})

vshard.router.cfg(cfg)

Настраивает базу данных и запускает шардирование для указанного экземпляра router.

  • cfg — таблица конфигурации

vshard.router.new(name, cfg)

Создает новый экземпляр роутера. vshard поддерживает несколько роутеров в одном экземпляре Tarantool. Каждый роутер может быть подключен к любому кластеру vshard, и несколько роутеров могут быть подключены к одному кластеру.

Роутер, созданный через vshard.router.new(), работает так же, как статический роутер, но перед именем метода ставится двоеточие (vshard.router:method_name(...)), тогда как для статического роутера перед именем метода ставится точка (vshard.router.method_name(...)).

Статический роутер можно получить с помощью метода vshard.router.static() и затем использовать как роутер, созданный методом vshard.router.new().

  • name — имя экземпляра роутера. Это имя используется как префикс в логах роутера и должно быть уникальным в пределах экземпляра
  • cfg — таблица конфигурации

Возвращает

экземпляр роутера при успешном создании; в противном случае — nil и объект ошибки

vshard.router.call(bucket_id, mode, function_name, {argument_list}, {options})

Вызывает функцию, заданную параметром function_name, на шарде, хранящем бакет, заданный параметром bucket_id. Подробнее о работе функции см. в разделе Обработка запросов.

  • bucket_id — идентификатор бакета

  • mode — либо строка = 'read'|'write', либо таблица с mode='read'|'write' и/или prefer_replica=true|false и/или balance=true|false.

  • function_name — функция для выполнения

  • argument_list — массив аргументов функции

  • options — none

  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.

  • request_timeout (начиная с vshard 0.1.28) — время ожидания в секундах, служащий защитой от зависших реплик. Параметр используется только в запросах на чтение (mode=read). Параметры request_timeout и timeout необходимо передавать вместе, при этом должно выполняться условие: timeout > request_timeout.

    Параметр request_timeout контролирует, сколько времени может занять одна попытка запроса. По истечении этого времени (возникает ошибка TimedOut) роутер повторяет запрос на следующей реплике, пока не истечет значение timeout.

  • другие опции net.box, такие, как is_async, buffer, on_push, также поддерживаются.

Параметр mode имеет две возможные формы: строку или таблицу. Примеры строковой формы: 'read', 'write'. Примеры формы таблицы: {mode='read'}, {mode='write'}, {mode='read', prefer_replica=true}, {mode='read', balance=true}, {mode='read', prefer_replica=true, balance=true}.

Если указано 'write', целевым узлом является мастер.

Если указано prefer_replica=true, предпочтительной целью является одна из реплик, но если нет удобно доступной реплики, целевым узлом становится мастер.

Указание prefer_replica=true может быть полезно для функций, требующих больших ресурсов, чтобы избежать замедления мастера.

Если указано balance=true, включается балансировка нагрузки — операции чтения распределяются по всем узлам в наборе реплик по принципу round-robin, с предпочтением реплик, если также задано prefer_replica=true.

Возвращает

исходное возвращаемое значение выполненной функции или nil и объект ошибки. Объект ошибки имеет атрибут type, равный ShardingError или одной из стандартных ошибок Tarantool (ClientError, OutOfMemory, SocketError и т.д.).

ShardingError возвращается при ошибках, специфичных для шардирования: отсутствие мастера, неверный идентификатор бакета и т.д. Объект имеет атрибут code, содержащий одно из значений из таблицы vshard.error.code.* LUA, необязательный атрибут с сообщением, содержащим читаемое описание ошибки, и другие атрибуты, специфичные для кода ошибки.

Примеры:

Чтобы вызвать функцию customer_add из vshard/example, используйте:

vshard.router.call(100,                   'write',                   'customer_add',                   {{customer_id = 2, bucket_id = 100, name = 'name2', accounts = {}}},                   {timeout = 5})-- or, the same thing but with a map for the second argumentvshard.router.call(100,                   {mode='write'},                   'customer_add',                   {{customer_id = 2, bucket_id = 100, name = 'name2', accounts = {}}},                   {timeout = 5})

vshard.router.callro(bucket_id, function_name, {argument_list}, {options})

Вызывает функцию, заданную параметром function_name, на шарде, хранящем бакет, заданный параметром bucket_id, в режиме только для чтения (аналогично вызову vshard.router.call с mode='read'). Подробнее о работе функции см. в разделе Обработка запросов.

  • bucket_id — идентификатор бакета
  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • request_timeout (начиная с vshard 0.1.28) — время ожидания в секундах, служащий защитой от зависших реплик. Параметры request_timeout и timeout необходимо передавать вместе, при этом должно выполняться условие: timeout > request_timeout. Параметр request_timeout контролирует, сколько времени может занять одна попытка запроса. По истечении этого времени (возникает ошибка TimedOut) роутер повторяет запрос на следующей реплике, пока не истечет значение timeout.
  • другие опции net.box, такие, как is_async,buffer, on_push, также поддерживаются.

Возвращает

Исходное возвращаемое значение выполненной функции или nil и объект ошибки. Объект ошибки имеет атрибут type, равный ShardingError или одной из стандартных ошибок Tarantool (ClientError, OutOfMemory, SocketError и т.д.).

ShardingError возвращается при ошибках, специфичных для шардирования: набор реплик недоступен, отсутствие мастера, неверный идентификатор бакета и т.д. Объект имеет атрибут code, содержащий одно из значений из таблицы vshard.error.code.* LUA, необязательный атрибут с сообщением, содержащим читаемое описание ошибки, и другие атрибуты, специфичные для данного кода ошибки.

vshard.router.callrw(bucket_id, function_name, {argument_list}, {options})

Вызывает функцию, заданную параметром function_name, на шарде, хранящем бакет, заданный параметром bucket_id, в режиме чтения-записи (аналогично вызову vshard.router.call с mode='write'). Подробнее о работе функции см. в разделе Обработка запросов.

  • bucket_id — идентификатор бакета
  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • другие опции net.box, такие, как is_async, buffer, on_push, также поддерживаются.

Возвращает

Исходное возвращаемое значение выполненной функции или nil и объект ошибки. Объект ошибки имеет атрибут type, равный ShardingError или одной из стандартных ошибок Tarantool (ClientError, OutOfMemory, SocketError и т.д.).

ShardingError возвращается при ошибках, специфичных для шардирования: набор реплик недоступен, отсутствие мастера, неверный идентификатор бакета и т.д. Объект имеет атрибут code, содержащий одно из значений из таблицы vshard.error.code.* LUA, необязательный атрибут с сообщением, содержащим читаемое описание ошибки, и другие атрибуты, специфичные для данного кода ошибки.

vshard.router.callre(bucket_id, function_name, {argument_list},{options})

Вызывает функцию, заданную параметром function_name, на шарде, хранящем бакет, заданный параметром bucket_id, в режиме только для чтения (аналогично вызову vshard.router.call с mode='read') с предпочтением реплики, а не мастера (аналогично вызову vshard.router.call с prefer_replica = true). Подробнее о работе функции см. в разделе Обработка запросов.

  • bucket_id — идентификатор бакета
  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • request_timeout (начиная с vshard 0.1.28) — время ожидания в секундах, служащий защитой от зависших реплик. Параметры request_timeout и timeout необходимо передавать вместе, при этом должно выполняться условие: timeout > request_timeout. Параметр request_timeout контролирует, сколько времени может занять одна попытка запроса. По истечении этого времени (возникает ошибка TimedOut) роутер повторяет запрос на следующей реплике, пока не истечет значение timeout.
  • другие опции net.box, такие, как is_async, buffer, on_push, также поддерживаются.

Возвращает

Исходное возвращаемое значение выполненной функции или nil и объект ошибки. Объект ошибки имеет атрибут type, равный ShardingError или одной из стандартных ошибок Tarantool (ClientError, OutOfMemory, SocketError и т.д.).

ShardingError возвращается при ошибках, специфичных для шардирования: набор реплик недоступен, отсутствие мастера, неверный идентификатор бакета и т.д. Объект имеет атрибут code, содержащий одно из значений из таблицы vshard.error.code.* LUA, необязательный атрибут с сообщением, содержащим читаемое описание ошибки, и другие атрибуты, специфичные для данного кода ошибки.

vshard.router.callbro(bucket_id, function_name, {argument_list}, {options})

Действует аналогично vshard.router.call() с параметром mode = {mode='read', balance=true}.

vshard.router.callbre(bucket_id, function_name, {argument_list}, {options})

Действует аналогично vshard.router.call() с параметром mode = {mode='read', balance=true, prefer_replica=true}.

vshard.router.map_callrw(function_name, {argument_list}, {options})

Функция реализует консистентный map-reduce по всему кластеру. Консистентность означает:

  • Все данные доступны.
  • Данные не перемещались между физическими хранилищами во время выполнения map-запросов.

Функция может быть полезна, если требуется доступ:

  • ко всем данным в кластере
  • к большому числу бакетов, разбросанных по экземплярам, если их индивидуальные вызовы vshard.router.call() занимают слишком много времени.

Функция вызывается на мастер-узле каждого набора реплик с заданными аргументами.

  • function_name — функция для вызова на хранилищах (мастерах всех наборов реплик)
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Время ожидания распространяется на весь map_callrw(), включая все его этапы.
  • return_rawопция net.box, реализованная в Tarantool начиная с версии 2.10.0. Если установлено значение true, net.box возвращает данные ответа, обернутые в объект MessagePack, вместо декодирования в Lua. Подробнее см. в разделе Возвращаемое значение ниже.

Возвращает

  • При успехе: таблица с UUID наборов реплик (ключи) и результатами function_name (значения).

    {uuid1 = {res1}, uuid2 = {res2}, ...}

    Если функция возвращает nil или box.NULL с одного из хранилищ, это значение не будет присутствовать в результирующей таблице.

    Если используется опция return_raw, результат представляет собой таблицу следующего формата: {[replicaset_uuid] = msgpack.object}, где msgpack.object — объект, хранящий массив MessagePack с результатами, возвращенными map-функцией хранилища.

    Сценарий использования опции такой же, как при работе с net.box: избежать декодирования результатов вызова в Lua. Опция может быть полезна, если роутер используется как прокси и результаты, полученные от хранилища, велики.

    Пример:

    local res = vshard.router.map_callrw('my_func', args, {..., return_raw = true})for replicaset_uuid, msgpack_value in pairs(res) do    log.info('Replicaset %s returned %s', replicaset_uuid,             msgpack_value:decode())end

    Это иллюстрация использования опции. Обычно return_raw не требуется, если вызывается функция decode().

  • При ошибке: nil, объект ошибки и необязательный UUID набора реплик, в котором произошла ошибка. UUID не возвращается, если ошибка не связана с конкретным набором реплик. Например, метод завершается ошибкой, если найдены не все бакеты, даже если все наборы реплик были успешно просканированы. Обработка результата выглядит так:

    res, err, uuid = vshard.router.map_callrw(...)if not res then    -- Error.    -- 'err' - error object. 'uuid' - optional UUID of replica set    -- where the error happened.    ...else    -- Success.    for uuid, value in pairs(res) do        ...    endend

    Если используется опция return_raw, результат при ошибке такой же, как описано выше.

Map-Reduce в vshard можно разделить на три этапа: Ref, Map и Reduce.

Ref и Map. map_callrw() объединяет этапы Ref и Map. Этап Ref обеспечивает консистентность данных при выполнении пользовательской функции (function_name) на всех узлах. Следует учитывать, что консистентность несовместима с ребалансировкой (ребалансировка нарушает консистентность данных). Map-reduce и ребалансировка взаимно исключают друг друга и конкурируют за время кластера. Любое перемещение бакета делает узлы отправителя и получателя неконсистентными, поэтому невозможно вызвать функцию на них для доступа ко всем данным без vshard.storage.bucket_ref(). Это делает этап Ref сложным, так как он должен работать совместно с ребалансировщиком, чтобы они не блокировали друг друга.

Для этого на хранилище имеется специальный планировщик для перемещений бакетов и storage ref. Storage ref — это изменяемый счетчик, определенный на каждом экземпляре. Он увеличивается при поступлении запроса map-reduce и уменьшается при его завершении. Storage ref закрепляет весь экземпляр со всеми его бакетами, а не только один бакет (как bucket ref).

Планировщик справедливо распределяет время хранилища между перемещениями бакетов и storage ref. Распределение зависит от того, насколько долгими и частыми являются перемещения и ref. Оно может быть настроено с помощью опций хранилища sched_move_quota и sched_ref_quota. Следует учитывать, что конфигурация планировщика может влиять на запросы map-reduce, если они выполняются во время ребалансировки.

На этапе Map map_callrw() последовательно отправляет map-запросы на несколько серверов. При успехе функция возвращает таблицу. Таблица представляет собой набор пар «ключ—значение». Ключами являются UUID наборов реплик, а значениями — результаты пользовательской функции function_name.

Reduce. Этап Reduce не выполняется vshard. Это то, что пользовательский код делает с результатами map_callrw().

vshard.router.route(bucket_id)

Возвращает объект набора реплик для бакета с указанным идентификатором.

  • bucket_id — идентификатор бакета

Возвращает

объект набора реплик

Пример:

replicaset = vshard.router.route(123)

vshard.router.routeall()

Возвращает все доступные объекты наборов реплик.

Возвращает

таблица следующего вида: {UUID = replicaset}

Тип возвращаемого значения

таблица объектов наборов реплик

Пример:

function selectall()    local resultset = {}    shards, err = vshard.router.routeall()    if err ~= nil then        error(err)    end    for uid, replica in pairs(shards) do        local set = replica:callro('box.space.*space-name*:select', {{}, {limit=10}}, {timeout=5})        for _, item in ipairs(set) do            table.insert(resultset, item)        end    end    table.sort(resultset, function(a, b) return a[1] < b[1] end)    return resultsetend

vshard.router.bucket_id(key)

Устаревший. При использовании выводит предупреждение, так как не обеспечивает консистентность для чисел cdata.

В частности, функция возвращает 3 разных значения для обычных чисел Lua, таких как 123, для чисел типа unsigned long long cdata (таких как 123ULL или ffi.cast('unsigned long long',123)), и для чисел типа signed long long cdata (таких как 123LL или ffi.cast('long long', 123)). И это важно.

vshard.router.bucket_id(123)vshard.router.bucket_id(123LL)vshard.router.bucket_id(123ULL)

Для чисел типа float и double cdata (ffi.cast('float', number), ffi.cast('double', number)) эти функции возвращают разные значения даже для одинаковых чисел одного типа с плавающей точкой. Это связано с тем, что tostring() для числа cdata с плавающей точкой возвращает не само число, а указатель на него. Разный при каждом вызове.

vshard.router.bucket_id_strcrc32() ведет себя точно так же, но не выводит предупреждение. На случай, если нужно именно такое поведение.

vshard.router.bucket_id_strcrc32(key)

Вычисляет идентификатор бакета с помощью простой встроенной хеш-функции.

  • key — хеш-ключ. Может быть любым объектом Lua (число, таблица, строка).

Возвращает

идентификатор бакета

Тип возвращаемого значения

number

Пример:

tarantool> vshard.router.bucket_count()---- 3000...tarantool> vshard.router.bucket_id_strcrc32("18374927634039")---- 2032...tarantool> vshard.router.bucket_id_strcrc32(18374927634039)---- 2032...tarantool> vshard.router.bucket_id_strcrc32("test")---- 1216...tarantool> vshard.router.bucket_id_strcrc32("other")---- 2284...

vshard.router.bucket_id_mpcrc32(key)

Эта функция безопаснее, чем bucket_id_strcrc32. Она вычисляет CRC32 от значения, закодированного в MessagePack. Таким образом, идентификатор бакета целых чисел не зависит от их типа в Lua. В случае строкового ключа кодирование в MessagePack не выполняется, а хэш вычисляется непосредственно из строки.

  • key — хэш-ключ. Может быть любым объектом Lua (число, таблица, строка).

Возвращает

идентификатор бакета

Тип возвращаемого значения

number

Тем не менее, для неравных чисел с плавающей точкой функция всё ещё может возвращать разные значения. То есть ffi.cast('float', number) может дать идентификатор бакета, не равный результату ffi.cast('double', number). Это невозможно исправить, так как значение типа float, даже при приведении к double, может содержать мусорный хвост в дробной части.

Как правило, не следует использовать ключи с плавающей точкой для вычисления идентификатора бакета.

Следует проявлять особую осторожность при хранении чисел с плавающей точкой в спейсе. При возврате данных из спейса они приводятся к типу Lua number. Если у такого значения дробная часть пуста, оно будет обработано как целое число функцией bucket_id_mpcrc32(). В таких случаях необходимо выполнять явное приведение типов. Ниже приведён пример проблемы:

tarantool> s = box.schema.create_space('test', {format = {{'id', 'double'}}}); _ = s:create_index('pk')---...tarantool> inserted = ffi.cast('double', 1)---...-- Значение хранится в формате doubletarantool> s:replace({inserted})---- [1]...-- Но при возврате в Lua сохраняется как число Lua, а не как cdata.tarantool> returned = s:get({inserted}).id---...tarantool> type(returned), returned---- number- 1...tarantool> vshard.router.bucket_id_mpcrc32(inserted)---- 1411...tarantool> vshard.router.bucket_id_mpcrc32(returned)---- 1614...

vshard.router.bucket_count()

Возвращает общее количество бакетов, заданное в vshard.router.cfg().

Возвращает

общее количество бакетов

Тип возвращаемого значения

число

tarantool> vshard.router.bucket_count()---- 10000...

vshard.router.sync(timeout)

Ожидает завершения синхронизации набора данных на репликах.

  • timeout — время ожидания в секундах

Возвращает

true, если набор данных успешно синхронизирован; либо nil и err с объяснением, почему синхронизация невозможна.

vshard.router.discovery_wakeup()

Принудительно активирует файбер обнаружения бакетов.

vshard.router.discovery_set(mode)

Включает/выключает фоновый файбер обнаружения, используемый роутером для поиска бакетов.

  • mode — режим работы файбера обнаружения. Доступны три режима: on, off и once

Если указано значение on (по умолчанию), файбер обнаружения работает в течение всего времени существования роутера. Даже после обнаружения всех бакетов он будет обращаться к хранилищам и скачивать их бакеты с большим интервалом (DISCOVERY_IDLE_INTERVAL). Это полезно, если топология бакетов часто меняется, а количество бакетов невелико. Роутер будет поддерживать таблицу маршрутизации в актуальном состоянии даже при отсутствии запросов.

Если указано значение off, обнаружение полностью отключается.

Если указано значение once, запускается процесс обнаружения, который находит расположение всех бакетов, после чего файбер обнаружения завершает работу. Это подходит для большого числа бакетов и кластеров, где ребалансировка происходит редко.

Этот метод удобно использовать для включения/отключения обнаружения после запуска роутера, однако по умолчанию обнаружение уже включено. Если требуется не включать его даже на короткое время, укажите параметр discovery_mode в конфигурации. Он принимает те же значения, что и vshard.router.discovery_set({mode}).

Отключить обнаружение или перевести его в режим once может быть целесообразно, если используется много роутеров или огромное количество бакетов (сотни тысяч и более), а процесс обнаружения потребляет значительную часть ресурсов CPU на роутерах и хранилищах. В таком случае имеет смысл отключать обнаружение, когда в кластере не происходит ребалансировка, и включать его для новых роутеров, а также для всех роутеров при запуске ребалансировки.

vshard.router.info({options})

Возвращает информацию о каждом экземпляре. Начиная с vshard v.0.1.22, функция также принимает параметры, которые позволяют получить дополнительную информацию.

  • options — none
  • with_services — логическое значение. Если установлено значение true, функция возвращает информацию о фоновых службах (таких как обнаружение, поиск мастера или фейловер), работающих на текущем экземпляре.

Возвращает

Параметры набора реплик:

  • uuid набора реплик
  • параметры экземпляра мастера
  • параметры экземпляра реплики

Параметры экземпляра:

  • uri— URI экземпляра
  • uuid— UUID экземпляра
  • status —статус экземпляра (available, unreachable, missing)
  • network_timeout— время ожидания для запроса. Значение обновляется автоматически при каждом 10-м успешном запросе и каждом 2-м неудачном запросе.

Параметры бакетов:

  • available_ro – количество бакетов, известных роутеру и доступных для запросов на чтение
  • available_rw – количество бакетов, известных роутеру и доступных для запросов на чтение и запись
  • unreachable – количество бакетов, известных роутеру, но недоступных для любых запросов
  • unknown – количество бакетов, наборы реплик которых неизвестны `роутеру

Параметры службы:

  • name – имя службы. Возможные значения: discovery, failover, master_search.
  • status – статус службы. Возможные значения: ok, error.
  • error – сообщение об ошибке, возникающее при статусе error.
  • activity – состояние службы. Показывает, чем служба занимается в данный момент (например, updating replicas).
  • status_idx – увеличивающийся счетчик изменений статуса. Статус ok обновляется при каждой успешной итерации службы. Статус error обновляется только после устранения ошибки.

Пример:

tarantool> vshard.router.info()---- replicasets:    ac522f65-aa94-4134-9f64-51ee384f1a54:      replica: &0        network_timeout: 0.5        status: available        uri: storage@127.0.0.1:3303        uuid: 1e02ae8a-afc0-4e91-ba34-843a356b8ed7      uuid: ac522f65-aa94-4134-9f64-51ee384f1a54      master: *0    cbf06940-0790-498b-948d-042b62cf3d29:      replica: &1        network_timeout: 0.5        status: available        uri: storage@127.0.0.1:3301        uuid: 8a274925-a26d-47fc-9e1b-af88ce939412      uuid: cbf06940-0790-498b-948d-042b62cf3d29      master: *1  bucket:    unreachable: 0    available_ro: 0    unknown: 0    available_rw: 3000  status: 0  alerts: ...tarantool> vshard.router.info({with_services = true})---<all info from vshard.router.info()>  services:    failover:      status_idx: 2      error:      activity: idling      name: failover      status: ok    discovery:      status_idx: 2      error: Error during discovery: TimedOut      activity: idling      name: discovery      status: error...

vshard.router.buckets_info()

Возвращает информацию о каждом бакете. Поскольку карта бакетов может быть очень большой, можно указать только нужный диапазон бакетов.

  • offset — смещение в карте бакетов для первого отображаемого бакета
  • limit — максимальное количество отображаемых бакетов

Возвращает

карта следующего вида: {bucket_id = 'unknown'/replicaset_uuid}

tarantool> vshard.router.buckets_info()---- - uuid: aaaaaaaa-0000-4000-a000-000000000000    status: available_rw  - uuid: aaaaaaaa-0000-4000-a000-000000000000    status: available_rw  - uuid: aaaaaaaa-0000-4000-a000-000000000000    status: available_rw  - uuid: bbbbbbbb-0000-4000-a000-000000000000    status: available_rw  - uuid: bbbbbbbb-0000-4000-a000-000000000000    status: available_rw  - uuid: bbbbbbbb-0000-4000-a000-000000000000    status: available_rw  - uuid: bbbbbbbb-0000-4000-a000-000000000000    status: available_rw...

vshard.router.enable()

Начиная с vshard v.0.1.21. Вручную включает доступ к API маршрутизатора, отменяя действие vshard.router.disable().

vshard.router.disable()

Начиная с vshard v.0.1.21. Вручную ограничивает доступ к API маршрутизатора. Если API отключен, все его методы вызывают ошибку Lua, кроме vshard.router.cfg(), vshard.router.new(), vshard.router.enable() и vshard.router.disable(). Атрибут name объекта ошибки принимает значение ROUTER_IS_DISABLED.

По умолчанию маршрутизатор включен. Однако он автоматически и принудительно отключается до завершения конфигурации, так как обращение к методам маршрутизатора в это время небезопасно.

Ручное отключение можно использовать, например, если после вызова vshard.router.cfg() необходимо выполнить подготовительные работы до того, как методы маршрутизатора станут доступны. Это будет выглядеть так:

vshard.router.disable()vshard.router.cfg(...)-- Some preparatory work here ...vshard.router.enable()-- vshard.router's methods are available now

call(function_name, {argument_list}, {options})

Вызывает функцию на ближайшем доступном мастере (расстояния определяются с помощью матрицы replica.zone и cfg.weights) с указанными аргументами.

  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • также поддерживаются другие опции net.box, такие, как is_async, buffer, on_push.

Возвращает

none

  • результат выполнения function_name при успехе
  • nil, err в противном случае

callrw(function_name, {argument_list}, {options})

Вызывает функцию на ближайшем доступном мастере (расстояния определяются с помощью матрицы replica.zone и cfg.weights) с указанными аргументами.

  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • также поддерживаются другие опции net.box, такие, как is_async, buffer, on_push.

Возвращает

none

  • результат выполнения function_name при успехе
  • nil, err в противном случае
tarantool> local bucket = 1; return vshard.router.callrw(         >     bucket,         >     'box.space.actors:insert',         >     {{         >         1, bucket, 'Renata Litvinova',         >         {theatre="Moscow Art Theatre"}         >     }},         >     {timeout=5}         > )

callro(function_name, {argument_list}, {options})

Вызывает функцию на ближайшей доступной реплике (расстояния определяются с помощью матрицы replica.zone и cfg.weights) с указанными аргументами. Рекомендуется использовать replicaset_object:callro() для вызова только функций чтения, так как вызываемые функции могут выполняться не только на мастере, но и на репликах.

  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • также поддерживаются другие опции net.box, такие, как is_async, buffer, on_push.

Возвращает

none

  • результат выполнения function_name при успехе
  • nil, err в противном случае

replicaset:callre(function_name, {argument_list}, {options})

Вызывает функцию на ближайшей доступной реплике (расстояния определяются с помощью матрицы replica.zone и cfg.weights) с указанными аргументами, с предпочтением реплики, а не мастера (аналогично вызову vshard.router.call со значением true для параметра prefer_replica). Рекомендуется использовать replicaset_object:callre() для вызова только функций чтения, так как вызываемая функция может выполняться не только на мастере, но и на репликах.

  • function_name — функция для выполнения
  • argument_list — массив аргументов функции
  • options — none
  • timeout — время ожидания запроса в секундах. Если router не может определить шард с указанным bucket_id, повторные попытки будут выполняться до истечения времени ожидания.
  • также поддерживаются другие опции net.box, такие, как is_async, buffer, on_push.

Возвращает

none

  • результат выполнения function_name при успехе
  • nil, err в противном случае

vshard.router.master_search_wakeup()

Автоматический поиск мастера выполняется в отдельном файбере на маршрутизаторе, который активируется только в том случае, если хотя бы для одного набора реплик настроен поиск мастера (параметр master установлен в значение auto). Файбер просыпается через определенный период. Но его можно разбудить по требованию с помощью этой функции.

Ручное пробуждение файбера может помочь ускорить тесты на смену мастера. Другой вариант использования — выполнение некоторых действий с маршрутизатором в консоли маршрутизатора.

Функция ничего не делает, если поиск мастера не настроен ни для одного набора реплик.

Возвращает

нет

Внутренний API маршрутизатора

vshard.router.bucket_discovery(bucket_id)

Выполняет поиск бакета во всем кластере. Если бакет не найден, скорее всего, он не существует. Бакет также мог быть перемещен во время ребалансировки и в данный момент находиться в состоянии RECEIVING.

  • bucket_id — идентификатор бакета