Syncthing: улучшение локального обнаружения и ускорение синхронизации

компьютер, ноут, телефон, облако, замок, стрелки туда-сюдаЯ довольно долго пользовался для синхронизации файлов между своими серверами, компьютерами и мобильными устройствами такой программой, как Resilio Sync (в девичестве BTSync). Но от Resilio пришлось отказаться, поскольку на протяжении нескольких лет разработчики так и не смогли избавиться от проблемы, связанной с зависанием приложения для Android. Ошибка была признанной, обнаруживалась у многих пользователей, но не исправлялась. Вероятно, что у Resilio просто закончились программисты для Android. Пришлось перейти на Syncthing.

Syncthing – open-source аналог Resilio, а именно децентрализованная система синхронизации файлов между устройствами. Принципы ее работы схожи с Resilio, но благодаря обширному комьюнити – система работает стабильно, мобильное приложение не останавливается, синхронизация происходит без сбоев. Как и у большинства open-source проектов, связанных с программным обеспечением, у Syncthing самую малость хромает документация. Разработчики справедливо полагают, что пользователь, решивший погрузиться в мир open-source, вполне сам способен просмотреть исходный код и найти нужный ему параметр настройки, а заодно и понять, что он означает, в каких случаях применяется, а в каких нет.

Syncthing может проводить синхронизацию между устройствами как напрямую, если оба устройства находятся в одной сети или же хотя бы одно из них имеет «белый» IP-адрес, так и через сервер посредник, расположенный где-то в глобальной сети. Поиск устройства для синхронизации осуществляется через сервер посредник обнаружения, расположенный тоже где-то в глобальной сети. Сообщество Syncthing предоставляет несколько десятков или даже сотен серверов посредников обоих типов, разбросанных по всему миру.

Однако если синхронизируемые устройства располагаются в одной сети, то они могут найти друг друга, если включена функция локального обнаружения, а она включена по умолчанию. В этом случае каждое из устройств, с заданной периодичностью (от 30 до 60 секунд) шлет broadcast (в случае IPv4) и multicast (в случае IPv6) сообщение в локальную сеть. По идее, остальные устройства должны их прослушивать, анализировать и применять полученные данные для последующей прямой синхронизации.

Но все идет далеко не всегда как по маслу и в некоторых случаях автоматическое обнаружение устройства для синхронизации происходит не сразу или не случается вовсе. В этом случае задействуется внешний сервер посредник для обнаружения и велика вероятность, что и трафик синхронизации аналогично пойдет через внешний сервер посредник. Анализируя свои устройства, а под синхронизацией у меня 8 устройств, включая машины под Windows, Android-устройства и сервера с Linux, я обнаружил, что часть устройств соединяется через IPv6 (соединение хоть и прямое, но идет через туннельный сервис, так как не везде еще провайдеры предоставляют IPv6 своим клиентам), часть ходит через мост между объеденными посредством VPN локальными сетями используя внутреннюю адресацию моста. Синхронизацию как ее начало, так и время, можно попробовать ускорить, если подсказать устройствам, где именно, по какому адресу непосредственно искать другое устройство для синхронизации. Это актуально для устройств работающих в локальной сети или объединенных локальных сетях.

В настройках устройств Syncthing присутствует отдельный пункт для указания адреса, по умолчанию он устанавливается в dynamic. И все работает «из коробки». Но именно в этом пункте кроется возможность для оптимизации, настройки на конкретную сетевую инфраструктуру.

Syncthing, advance, addresses, synamic

Настройка устройства. В Addresses указано dynamic.

Согласно документации на Syncthing, поле Addresses (в конфигурационном файле это address) может принимать несколько значений. А dynamic используется как универсальный элемент, позволяющий полагаться исключительно на функцию автоматического обнаружения другого устройства для синхронизации. Помимо dynamic поле способно принимать конкретные указания на IP-адрес как IPv4, так и IPv6. Вместо IP-адреса может быть использовано доменное имя как локальное, так и глобальное из сети Internet (для обоих типов имен важно, чтобы они могли быть разрешены в IP-адрес, посредством DNS, WINS и прочего). Дополнительно можно указать порт, на котором работает Syncthing на удаленном устройстве, если не используется порт по умолчанию (22000).

Актуальные на конец 2022 года версии Syncthing поддерживают два протокола для соединения между устройствами для синхронизации. Это обычный протокол TCP и новый протокол QUIC основанный на UDP. QUIC хоть и считается некоторыми ретроградами – экспериментальным, но он уже твердо вошел в обиход и на нем уже работают самые продвинутые Web-сервера. Основная особенность QUIC – большая производительность на хороших каналах по сравнению с TCP за счет отсутствия необходимости установления сеансовых соединений, обеспечения подтверждения получения пакетов и мультиплексирования потоков.

TCP-соединения прописываются как tcp4 или tcp6 для, соответственно, подключения по протоколу IPv4 и IPv6. Если не требуется разделения по версиям IP, то указывается просто tcp. Однако если указывать не доменное имя, а IP-адрес с модификатором протокола tcp, то будет выбран вариант версии протокола в зависимости от версии указанного адреса. Например, tcp://[2001:db8::23:42] указывает на использование TCP протокола с адресом IPv6. Для QUIC все аналогично: quic для универсального использования, quic4 для использования IPv4, а quic6 для IPv6.

Куда и как прописывать адреса и протоколы? Для начала следует убедиться, что прописываемые адреса – постоянны для устройств в рамках выбранной инфраструктуры сети. Например, для мобильного, стационарного компьютера и сервера я зафиксировал в маршрутизаторе (роутере) постоянные IPv4 адреса. Их же прописал и в Syncthing. А вот для IPv6 использовал локальный адрес fe80. Такой адрес формируется на основе MAC-адреса (в большинстве случаев) и в рамках локальной сети остается уникальным.

Адреса с протоколами можно прописать через запятую в интерфейсе Syncthing, настройках устройства, либо указать адреса в конфигурационном файле settings.xml. Конфигурационный файл располагается в системах Linux по следующим путям (в зависимости от типа системы):

$HOME/.config/syncthing

$HOME/Library/Application Support/Syncthing

А в Windows:

%LOCALAPPDATA%\Syncthing

Прописать адреса устройств в конфигурационном файле можно следующим образом:

<device id="...">
    <address>tcp://192.0.2.1:22001</address>
    <address>quic://192.0.1.254</address>
    <address>quic://[2001:db8::23:42]</address>
    <address>quic4://my_local_server</address>
    <address>tcp6://blog.kvv213.com:54001</address>
    <address>dynamic</address>
</device>

Таким образом, после правильной настройки адресов модно получить более высокую скорость подключения устройств друг к другу, а также оптимизацию каналов синхронизации, исключающую, с одной стороны, пересылку данных через не самые прямые маршруты, с другой, если вдруг что-то пойдет не так, то параметр dynamic позволит безальтернативно, найти устройство и подключиться к нему.



Подписаться
Уведомить о
guest

7 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей
Андрей
1 год назад

Здравствуйте. Подскажите пожалуста, как запустить syncthing по локальной сети без интернета по "схеме" андроидроутерпк (виндовс 10)?

Андрей
Андрей
Ответить на  kvv213
1 год назад

Спасибо за ответ. А можно узнать, как именно устанавливаются локальные адреса?

Андрей
Андрей
Ответить на  kvv213
1 год назад

Спасибо! Буду пробовать.

Max
Max
1 год назад

Хаха.
Вот эти слова повеселили:
"система работает стабильно, мобильное приложение не останавливается, синхронизация происходит без сбоев."

Ошибки синхронизации как только создаешь в синхронизируемой папке на телефоне что-либо.
В приложении на ПК сразу появляется ошибка: current 0.30 % < required 1 %
И эта ошибка появляется на любой файл какой бы ты ни создал на телефоне (в папке синхронизации.