1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wenweihu86-raft-java

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 5.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 07:22 f26beab

Raft-Java

Библиотека реализации Raft для Java.

Поддерживаемые функции:

  • выборы лидера;
  • репликация журнала;
  • создание снимков;
  • динамическое изменение членов кластера.

Быстрый старт

Чтобы развернуть на локальном компьютере кластер из трёх экземпляров Raft, выполните следующий скрипт:

cd raft-java-example && sh deploy.sh

Этот скрипт развернёт три экземпляра в каталоге raft-java-example/env с именами example1, example2 и example3. Также будет создан каталог client для тестирования функций чтения и записи кластера Raft.

После успешного развёртывания можно протестировать операции записи, выполнив следующий скрипт:

cd env/client
./bin/run_client.sh "127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053" hello world

Для тестирования операций чтения выполните следующую команду:

./bin/run_client.sh "127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053" hello

Использование

Далее описывается, как использовать библиотеку Raft-Java в коде для создания распределённой системы хранения данных.

Конфигурация зависимостей

Добавьте зависимость к файлу сборки проекта:

<dependency>
    <groupId>com.github.wenweihu86.raft</groupId>
    <artifactId>raft-java-core</artifactId>
    <version>1.8.0</version>
</dependency>

Определение интерфейсов для чтения и записи данных

Создайте протобуф-сообщения для запросов и ответов:

message SetRequest {
    string key = 1;
    string value = 2;
}
message SetResponse {
    bool success = 1;
}

message GetRequest {
    string key = 1;
}
message GetResponse {
    string value = 1;
}

Определите интерфейс для сервиса:

public interface ExampleService {
    Example.SetResponse set(Example.SetRequest request);
    Example.GetResponse get(Example.GetRequest request);
}

Реализация на сервере

  1. Реализуйте класс, который наследуется от интерфейса StateMachine:
// Данный интерфейс содержит три метода, которые используются внутри Raft
public interface StateMachine {
    /**
     * Создаёт снимок состояния машины. Каждый узел вызывает этот метод периодически.
     * @param snapshotDir каталог для сохранения снимка
     */
    void writeSnapshot(String snapshotDir);

    /**
     * Восстанавливает состояние машины из снимка. Вызывается при запуске узла.
     * @param snapshotDir каталог со снимком
     */
    void readSnapshot(String snapshotDir);

    /**
     * Применяет данные к состоянию машины.
     * @param dataBytes двоичные данные
     */
    void apply(byte[] dataBytes);
}
  1. Реализуйте методы чтения и записи:

В классе реализации ExampleService добавьте следующие поля:

private RaftNode raftNode;
private ExampleStateMachine stateMachine;

Реализуйте логику записи данных:

byte[] data = request.toByteArray();
boolean success = raftNode.replicate(data, Raft.EntryType.ENTRY_TYPE_DATA);
Example.SetResponse response = Example.SetResponse.newBuilder().setSuccess(success).build();

И логику чтения данных:

Example.GetResponse response = stateMachine.get(request);
  1. Запустите сервер:
// Инициализируем RPCServer
RPCServer server = new RPCServer(localServer.getEndPoint().getPort());

// Создаём экземпляр StateMachine
ExampleStateMachine stateMachine = new ExampleStateMachine();

// Устанавливаем параметры Raft (например, размер минимального лога для снимка)
RaftOptions.snapshotMinLogSize = 10 * 1024;
RaftOptions.snapshotPeriodSeconds = 30;
RaftOptions.maxSegmentFileSize = 1024 * 1024;

// Инициализируем RaftNode
RaftNode raftNode = new RaftNode(serverList, localServer, stateMachine);

// Регистрируем сервисы для взаимодействия между узлами Raft
RaftConsensusService raftConsensusService = new RaftConsensusServiceImpl(raftNode);
server.registerService(raftConsensusService);

// Регистрируем клиентские сервисы Raft
RaftClientService raftClientService = new RaftClientServiceImpl(raftNode);
server.registerService(raftClientService);

// Регистрируем сервис ExampleService
ExampleService exampleService = new ExampleServiceImpl(raftNode, stateMachine);
server.registerService(exampleService);

// Запускаем RPCServer и инициализируем RaftNode
server.start();
raftNode.init();

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wenweihu86-raft-java.git
git@api.gitlife.ru:oschina-mirror/wenweihu86-raft-java.git
oschina-mirror
wenweihu86-raft-java
wenweihu86-raft-java
master