Вопрос или проблема
Я ищу способ поделиться файлом в p2p-формате между несколькими серверами.
Серверы знают друг о друге, они находятся в дата-центрах, у них есть соединение друг с другом, но их много. Между ними нет NAT. Им нужно поделиться большим файлом друг с другом.
В данный момент я использую простой https сервер, и весь флот просто скачивает файл с сервера.
Я думал о том, чтобы написать способ разбивки файла на части, а затем распространять части и делиться ими в p2p-формате, и серверы, которые уже имеют некоторые части, будут их публиковать, и я осознал, что просто думаю о трекере торрентов.
Тем не менее, использование торрентов на флоте хорошо известных серверов кажется слишком сложным; там столько накладных расходов, которые бесполезны в этом случае, и весь протокол выглядит очень ориентированным на конечного пользователя, и так много настроек и версий всего.
IPFS выглядит несколько проще (и у них даже есть библиотеки на go), но мне не слишком важно DHT; мне не нужно искать файл по всему миру, я знаю список серверов.
Я могу закончить с IPFS, но это выглядит слишком сложно; мне не нужно глобальное самоорганизующееся сообщество; я знаю серверы. Список можно сохранить в конфигурационном файле на диске. Мне просто нужен способ поделиться файлами между ними.
(Идеальное программное обеспечение/библиотека должно быть использовано из golang, но я могу использовать оболочку, так что нормально, если это не так)
Рекомендую обратить внимание на открытое решение Syncthing.
Оно доступно на Windows, Linux, macOS, Android и других менее распространенных ОС.
Руководство по установке и использованию доступно по ссылке
Ответ или решение
Для решения задачи синхронизации файлов между известными серверами в P2P-режиме, стоит рассмотреть несколько подходов. Вы уже отметили своё желание использовать подходы, схожие с торрент-технологиями и IPFS, однако указали, что в вашем случае эти методы могут быть избыточными. Давайте рассмотрим ваше требование подробнее и предложим некоторые решения.
Синхронизация файлов: P2P-решения
-
Использование Syncthing
-
Что такое Syncthing?
Syncthing — это open-source решение для синхронизации файлов, которое позволяет легко обмениваться файлами между несколькими устройствами в реальном времени. Оно работает по принципу P2P, что значит, что каждый из серверов может одновременно выступать и в роли отправителя, и в роли получателя. -
Преимущества:
- Простота установки и настройки. Вы можете быстро настроить Syncthing на нескольких серверах, следуя официальной документации.
- Поддержка различных платформ, включая Windows, Linux и macOS.
- Автоматическая синхронизация изменений. Если файл изменится на одном из серверов, он автоматически будет обновлён на всех остальных.
- Шифрование при передаче данных, что добавляет уровень безопасности.
-
Недостатки:
- Может быть несколько сложным в настройке для больших масштабов, особенно если вам нужно заранее установить конфигурацию серверов.
- Необходимость открытых портов в брандмауэрах для связи между серверами.
-
-
Реализация кастомного решения (например, на Go)
-
Вы можете создать своё решение для синхронизации, разбивая файлы на блоки, как вы упомянули. Подобный подход позволяет управлять данными более гибко, так как вы будете контролировать процесс передачи и хранения файлов.
-
Используя стандартные библиотеки Go, такие как
net
,os
, иsync
, можно создать простую систему, которая будет обмениваться файлами между серверами напрямую, без необходимости в сложных протоколах. -
Примерный алгоритм:
- Разделите файл на несколько частей (чеков).
- Реализуйте механизм, который будет отслеживать, какие части уже есть на сервере.
- При наличии новых частей маленькими чанками отправляйте их на другие сервера.
- По завершении передачи убедитесь, что все сервера имеют актуальные версии файлов.
-
-
Использование особых библиотек для P2P-соединений
- Вы можете использовать библиотеку для P2P-соединений, например, libp2p, которая предоставляет низкоуровневое API для построения P2P-сетей. Хотя это может быть несколько сложнее, а также требует более глубокого понимания сетевых протоколов, это даст вам полный контроль над вашим решением.
Заключение
Учитывая вашу ситуацию, Syncthing представляется как наиболее удобный и надежный вариант для реализации вашей задачи без избыточных сложностей. Если вы всё же хотите реализовать решение на Go, кастомная реализация с использованием стандартных библиотек может предоставить вам необходимую гибкость. Рассмотрите свои конкретные требования к производительности, безопасности и управлению, чтобы выбрать оптимальное решение.