Перейти к содержанию

Подключение к нескольким узлам

Подключение к нескольким узлам Tarantool

Прежде чем подключать Java-клиент к нескольким узлам Tarantool, необходимо определиться с форматом подключения. На выбор есть два варианта:

  • TarantoolCrudClient - высокоуровневый клиент для работы с vshard кластером Tarantool c возможностью подключения к нескольким маршрутизаторами (router). Использует вызовы методов модуля crud для манипулирования данными. Подробнее о crud и vshard.
  • TarantoolBoxClient - высокоуровневый клиент для работы с одиночными узлами Tarantool с возможностью подключения к набору узлов вне зависимости от топологии. В случае использования crud/vshard кластера попытки внести изменения на узлы с ролью storage могут привести к нарушению работы кластера.
Важно

Для подробного описания crud и box API в Tarantool Java SDK обратитесь к javadoc TarantoolBoxClient и TarantoolCrudClient

Для подключения к Tarantool вне зависимости от режима (кластерный или одиночный), требуются следующие данные:

  • Доменные имена или адреса узлов (например, localhost,127.0.0.1)
  • Порты, на которых прослушиваются подключения к Tarantool (например, 3301)
  • Имена пользователей, от имени которых идет взаимодействие клиента с Tarantool (например, admin, user и т.д.)
  • Пароли, соответствующие именам пользователей

Подключение к нескольким узлам (маршрутизаторам) Tarantool через TarantoolCrudClient API

Важно

В данном формате подключения взаимодействие с кластером Tarantool производится ИСКЛЮЧИТЕЛЬНО через узлы-маршрутизаторы

Рассмотрим пример со следующей топологией кластера Tarantool:

Пример топологии vshard-кластера

Для того чтобы настроить TarantoolCrudClient, необходимо воспользоваться API TarantoolCrudClientBuilder:

final TarantoolCrudClientBuilder crudClientBuilder = TarantoolFactory.crud();

Далее следует настроить группы соединений к узлам. Группа соединений настраивается через API InstanceConnectionGroup.Builder. Следующий код позволяет настроить группу соединений к узлу-маршрутизатору Router 1 (replicaset-1) (см. топологию):

final InstanceConnectionGroup firstRouterConnectionGroup = InstanceConnectionGroup.builder()
    .withAuthType(AuthType.CHAP_SHA1)
    .withHost("localhost")
    .withPort(3301)
    .withUser("seller-user")
    .withPassword("pwd-1")
    .withSize(2)
    .withTag("router-1")
    .build();
Заметка

Для более подробного описания класса InstanceConnectionGroup можете обратиться к соответствующей странице документации. Также изучите класс InstanceConnectionGroup в Javadoc

Создадим экземпляр InstanceConnectionGroup для второго маршрутизатора Router 2 (replicaset-2) (см. топологию):

final InstanceConnectionGroup secondRouterConnectionGroup = InstanceConnectionGroup.builder()
    .withPort(3302)
    .withUser("user-1182")
    .withPassword("pwd-2")
    .withSize(2)
    .withTag("router-2")
    .build();

Далее добавим созданные ранее экземпляры InstanceConnectionGroup в TarantoolCrudClientBuilder:

final List<InstanceConnectionGroup> connectionGroupsList = Arrays.asList(firstRouterConnectionGroup,
    secondRouterConnectionGroup); // (1)!

final TarantoolCrudClient crudClient = crudClientBuilder.withGroups(connectionGroupsList)
    .build(); // (2)!
  1. Позволяет задать список ранее созданных экземпляров InstanceConnectionGroup, которые отражают настройки групп подключений к соответствующим маршрутизаторам
  2. Создаем экземпляр класса TarantoolCrudClient. Клиент является ленивым и подключение к доступному узлу происходит при первом вызове методов манипуляции данных

Для доступа к методам манипулирования данными следует получить экземпляр TarantoolCrudSpace через API TarantoolCrudClient:

// Позволяет получить экземпляр TarantoolCrudSpace. Space имеет имя 'person'
final TarantoolCrudSpace personSpace = crudClient.space("person"); 

С помощью экземпляров TarantoolCrudSpace производится работа с данными конкретного space. В примере это space с именем person.

Заметка

Распределение запросов между узлами производится по правилам балансировки. Обратитесь к разделу, чтобы узнать больше.

Подключение к нескольким узлам Tarantool через TarantoolBoxClient API

В общем случае экземпляры TarantoolBoxClient предназначены для работы с одиночным узлом Tarantool, но есть сценарии, в которых TarantoolBoxSpace можно использовать при работе с несколькими узлами:

Выборка данных с нескольких реплик одного шарда

В приведенном примере одна из реплик replica-1 отказывает. Необходимо, чтобы Java-клиент продолжал выборку данных, переключившись на реплику replica-2.

Для того чтобы настроить подключение к двум узлам-репликам (replica-1, replica-2), необходимо воспользоваться TarantoolBoxClientBuilder API:

final TarantoolBoxClientBuilder boxBuilder = TarantoolFactory.box();

Далее необходимо настроить группы подключений к узлам-репликам, аналогично тому, как это демонстрируется в секции "Подключение к нескольким узлам-маршрутизаторам Tarantool через TarantoolCrudClient API:

final InstanceConnectionGroup firstReplicaConnectionGroup = InstanceConnectionGroup.builder()
    .withUser("user-1298")
    .withPassword("pwd-1")
    .withPort(3301)
    .withSize(2)
    .withTag("replica-1")
    .build();

final InstanceConnectionGroup secondReplicaConnectionGroup = InstanceConnectionGroup.builder()
    .withUser("storage-user")
    .withPassword("pwd-2")
    .withPort(3302)
    .withSize(2)
    .withTag("replica-2")
    .build();

Добавим созданные ранее экземпляры InstanceConnectionGroup в TarantoolBoxClientBuilder:

final List<InstanceConnectionGroup> connectionGroupsList = Arrays.asList(
    firstReplicaConnectionGroup,
    secondReplicaConnectionGroup);

final TarantoolBoxClient boxClient = boxClientBuilder.withGroups(connectionGroupsList)
    .build();

Для доступа к методам манипулирования данными следует получить экземпляр TarantoolBoxSpace через API TarantoolBoxClient:

final TarantoolBoxSpace personSpace = boxClient.space("person");

С помощью экземпляров TarantoolBoxSpace производится работа с данными конкретного space. В примере это space с именем person.

Важно

Таким образом, при отказе одной из реплик, Java-клиент переключится на вторую активную реплику в соответствии с правилами балансировки. Обратитесь к разделу, чтобы узнать больше