Библиотека реализации 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);
}
StateMachine
:// Данный интерфейс содержит три метода, которые используются внутри Raft
public interface StateMachine {
/**
* Создаёт снимок состояния машины. Каждый узел вызывает этот метод периодически.
* @param snapshotDir каталог для сохранения снимка
*/
void writeSnapshot(String snapshotDir);
/**
* Восстанавливает состояние машины из снимка. Вызывается при запуске узла.
* @param snapshotDir каталог со снимком
*/
void readSnapshot(String snapshotDir);
/**
* Применяет данные к состоянию машины.
* @param dataBytes двоичные данные
*/
void apply(byte[] dataBytes);
}
В классе реализации 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);
// Инициализируем 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 )