Цель
В этом уроке мы создадим кластерное хранилище с тремя серверами, которые взаимодействуют по протоколу TCP. Там также будет клиент кластера. Каждый сервер будет иметь сервер HTTP GUI для простоты использования и отладки. Хранилище кластера будет поддерживать загрузку файлов с автоматическим разделением в соответствии с предоставленным правилом и количеством копий.
Какие активные технологии будут использоваться?
- Active FS – облегченная абстракция для управления распределенным хранилищем файлов.
- Active Inject – быстрая и мощная библиотека инъекций зависимостей.
- Активный HTTP – высокопроизводительные HTTP-клиенты, серверы и сервлеты.
- Активный Пусковые установки – инструмент для управления жизненным циклом приложений.
- Активный цикл событий – эффективное управление асинхронными операциями.
- Активный Config – полезное расширение для файлов свойств.
Что такое Активный FS?
Активы – одна из наиболее важных технологий в этом учебном пособии. Он обеспечивает упрощенную абстракцию поверх обычных файловых операций, таких как загрузка, загрузка, добавление, перечисление, копирование, перемещение, удаление и другие. Он позволяет выполнять операции с локальным, удаленным или распределенным хранилищем файлов. Активы является автономной технологией Активный Платформа Java, ее можно использовать независимо от платформы.
Импортируйте компоненты в свой проект
Добавьте все необходимые зависимости Maven в свой проект:
io.activej activej-launchers-fs 3.0-rc2 com.github.spullara.mustache.java compiler 0.9.4 ch.qos.logback logback-classic 1.2.3
модуль active-launcher-fs
импортирует все необходимые активные технологии, которые были упомянуты ранее.
Настройка запуска сервера
Первое, что нам нужно сделать, это создать класс запуска Запуск кластерного сервера для наших серверов. Нам понадобятся следующие экземпляры:
- Активные серверы ,
- местные Активы ,
- Асинхронный Http-сервер для графического интерфейса, который упростит работу с вашим кластерным хранилищем,
- утилиты для управления перераспределением разделов, такие как планировщики задач, Контроллер перераспределения кластеров и Разделы Fs для отслеживания живых разделов и их статусов.
Разделы будут взаимодействовать по протоколу TCP, в то время как графический сервер будет использовать протокол HTTP.
public final class ClusterServerLauncher extends Launcher { public static final Path DEFAULT_PATH = Paths.get(System.getProperty("java.io.tmpdir"), "fs-storage"); @Provides public Eventloop eventloop() { return Eventloop.create(); } @Provides Executor executor() { return Executors.newCachedThreadPool(); } @Provides ActiveFs localActivefs(Eventloop eventloop, Executor executor, Config config) { return LocalActiveFs.create(eventloop, executor, config.get(ofPath(), "activefs.path", DEFAULT_PATH)); } @Eager @Provides ActiveFsServer activeFsServer(Eventloop eventloop, ActiveFs activeFs, Config config) { return ActiveFsServer.create(eventloop, activeFs) .withInitializer(ofActiveFsServer(config.getChild("activefs"))); } @Provides AsyncServlet guiServlet(ActiveFs fs, ClusterRepartitionController controller) { return ActiveFsGuiServlet.create(fs, "Cluster server [" + controller.getLocalPartitionId() + ']'); } @Provides @Eager AsyncHttpServer guiServer(Eventloop eventloop, AsyncServlet servlet, Config config) { return AsyncHttpServer.create(eventloop, servlet) .withInitializer(ofHttpServer(config.getChild("activefs.http.gui"))); } @Provides FsPartitions fsPartitions(Config config, Eventloop eventloop, ActiveFs fs) { Map
Клиентский Лаунчер
Теперь мы можем перейти к созданию клиентского лаунчера Запуск Клиента Tcp Кластера . Нам нужно предоставить планировщик задач для обнаружения мертвых разделов, |/Асинхронный Http-сервер для графического интерфейса, удаленный |/Активы , и Разделы Fs для управления разделами. Нам также нужен экземпляр класса Cluster Active Fs , реализация Active Fs
public class ClusterTcpClientLauncher extends Launcher { public static final String PROPERTIES_FILE = "activefs-client.properties"; public static final String DEFAULT_DEAD_CHECK_INTERVAL = "1 seconds"; public static final String DEFAULT_GUI_SERVER_LISTEN_ADDRESS = "*:8080"; @Provides Eventloop eventloop() { return Eventloop.create(); } @Provides @Eager @Named("clusterDeadCheck") EventloopTaskScheduler deadCheckScheduler(Config config, FsPartitions partitions) { return EventloopTaskScheduler.create(partitions.getEventloop(), partitions::checkDeadPartitions) .withInitializer(ofEventloopTaskScheduler(config.getChild("activefs.repartition.deadCheck"))); } @Provides @Eager AsyncHttpServer guiServer(Eventloop eventloop, AsyncServlet servlet, Config config) { return AsyncHttpServer.create(eventloop, servlet) .withInitializer(ofHttpServer(config.getChild("activefs.http.gui"))); } @Provides AsyncServlet guiServlet(ActiveFs activeFs) { return ActiveFsGuiServlet.create(activeFs, "Cluster FS Client"); } @Provides ActiveFs remoteActiveFs(Eventloop eventloop, FsPartitions partitions, Config config) { return ClusterActiveFs.create(partitions) .withInitializer(ofClusterActiveFs(config.getChild("activefs.cluster"))); } @Provides FsPartitions fsPartitions(Eventloop eventloop, Config config) { return FsPartitions.create(eventloop) .withInitializer(ofFsPartitions(config.getChild("activefs.cluster"))); } @Provides Config config() { return createConfig() .overrideWith(Config.ofClassPathProperties(PROPERTIES_FILE, true)) .overrideWith(Config.ofSystemProperties("config")); } protected Config createConfig(){ return Config.create() .with("activefs.http.gui.listenAddresses", DEFAULT_GUI_SERVER_LISTEN_ADDRESS) .with("activefs.repartition.deadCheck.schedule.type", "interval") .with("activefs.repartition.deadCheck.schedule.value", DEFAULT_DEAD_CHECK_INTERVAL); } @Override protected final Module getModule() { return combine( ServiceGraphModule.create(), JmxModule.create(), ConfigModule.create() .withEffectiveConfigLogger()); } @Override protected void run() throws Exception { awaitShutdown(); } public static void main(String[] args) throws Exception { new ClusterTcpClientLauncher().launch(args); } }
Вот архитектура нашего распределенного хранилища P2P:
Вы можете создать столько разделов, сколько пожелаете, клиент кластера необязателен, так как вы можете создать альтернативный клиент реализация, поддерживающая Активный протокол FS
Тестирование хранилища
Давайте запустим три раздела на разных портах. Для этого вам необходимо создать три конфигурации запуска/отладки для Кластерного запуска Tcp-сервера и предоставить следующие параметры виртуальной машины:
-Dconfig.activefs.listenAddresses=*:9001 -Dconfig.activefs.http.gui.listenAddresses=*:8081 -Dconfig.activefs.cluster.partitions=127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003 -Dconfig.activefs.repartition.replicationCount=2 -Dconfig.activefs.path=/tmp/server1 -Dconfig.activefs.repartition.localPartitionId=127.0.0.1:9001
-Dconfig.activefs.listenAddresses=*:9002 -Dconfig.activefs.http.gui.listenAddresses=*:8082 -Dconfig.activefs.cluster.partitions=127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003 -Dconfig.activefs.repartition.replicationCount=2 -Dconfig.activefs.path=/tmp/server2 -Dconfig.activefs.repartition.localPartitionId=127.0.0.1:9002
-Dconfig.activefs.listenAddresses=*:9003 -Dconfig.activefs.http.gui.listenAddresses=*:8083 -Dconfig.activefs.cluster.partitions=127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003 -Dconfig.activefs.repartition.replicationCount=2 -Dconfig.activefs.path=/tmp/server3 -Dconfig.activefs.repartition.localPartitionId=127.0.0.1:9003
Затем укажите следующие параметры виртуальной машины для Запуска клиента Tcp кластера :
-Dconfig.activefs.http.gui.listenAddresses=*:8080 -Dconfig.activefs.cluster.partitions=127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003
Хранилище будет работать со следующими конфигурациями:
Server1: TCP-connection port 9001, HTTP GUI port 8081 Server2: TCP-connection port 9002, HTTP GUI port 8082 Server3: TCP-connection port 9003, HTTP GUI port 8083 Client: HTTP GUI port 8080
Запустите все созданные конфигурации и перейдите в 127.0.0.1:8080
в своем браузере для работы с хранилищем. Переключение между портами ( 8081
, 8082
, 8083
) чтобы проверить графический интерфейс ваших разделов. Вы можете попробовать загрузить файлы, создать каталоги, уничтожить некоторые разделы, чтобы проверить перераспределение разделов.
Оригинал: “https://dev.to/activej/cluster-file-storage-with-activefs-library-477n”