image

image
У меня тут внезапно завалялся гайд по настройке syncthing. Я уверен, что многим это может пригодиться.

Про революцию в дистрибуции файлов, которую совершил torrent-протокол рассказывать излишне. Одна проблема была у классических версии технологии — статичность. Если данные в каталоге изменялись, приходилось заново создавать и передавать всем новый torrent-файл. И вдруг, внезапно появляется BitTorrentSync. Наступает всеобщее счастье, теперь можно синхронизировать целые массивы изменяющихся данных. Однако, спустя время проприетарность софта выливается в сильное урезание функциональности, привязку к своим серверам и довольно агрессивную монетизацию. Вот тут и выходит на сцену идеологически кошерный свободный преемник — Syncthing.

Syncthing, как и обычный torrent может пролезть практически через любые барьеры в виде файерволлов, NAT и тому подобное. В случае серых IP-адресов полагается на централизованные релеи и сервера-анонсеры. При этом можно спокойно поднять их самостоятельно, что дает полную независимость от инфрастуруктуры разработчиков. Все узлы в кластере равноправны. Можно задать двустороннюю и одностороннюю синхронизацию, когда изменения на удаленных копиях не затронут оригинал. Умеет версионирование. Красота, одним словом.

В моем случае решалась задача ежедневного создания резервных копий баз данных. 3 независимых отделения в разных концах города. Интернет через Yota-модем, воткнутый в Mikrotik. Канал узкий и нестабильный по ширине. Основная идея, которая была реализована — обмен по принципу torrent-протокола копиями баз по ночам, когда нагрузка на сеть минимальна, а базы никто не трогает. В результате, каждое подразделение хранит копии двух соседних. Хорошая избыточность и географическая распределенность, что уже спасло однажды, когда сервер внезапно был убит ударом молнии.

Устанавливаем. По умолчанию я имею в виду сервер на базе deb-based Linux, хотя у syncthing есть и версии для Windows и Android. Для продакшена добавим репозитории из стабильной ветки и установим:

# Add the release PGP keys:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -

# Add the "stable" channel to your APT sources:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing

Теперь надо разобраться с демонами. Подобный софт не должен работать от имени root. Все созданные в результате синхронизации файлы должны принадлежать локальному пользователю. Поэтому есть два варианта — автоматический запуск как системный сервис либо в качестве пользовательского сервиса. Второй вариант будет работать только тогда, когда пользователь залогинился через ssh или авторизировался в локальной системе. Нас интересует системный демон и для этого лучше всего подойдет глубоко любимый общественностью systemd. Пути могут немного отличаться в разных дистрибутивах. Данный мануал применим к Debian и Ubuntu 16.04 Server. Для начала создаем юнит:

sudo nano /etc/systemd/system/syncthing@.service

И вносим туда следующее содержимое:

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
Wants=syncthing-inotify@.service

[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

[Install]
WantedBy=multi-user.target


Теперь остается лишь активировать сервис от имени нужного пользователя и можно настраивать ноду.

sudo systemctl enable syncthing@username.service
sudo systemctl start syncthing@username.service



Интерфейс доступен по адресу 127.0.0.1:8384. Если вы хотите заходить с другой машины — придется поправить конфиг ~/.config/syncthing/config.xml. Дальнейшие настройки предельно просты — добавляются доверенные ноды по уникальному ключу, а затем расшариваются нужные каталоги в режиме одно- или двусторонней синхронизации. При необходимости можно вручную указать ip адрес и порт ноды, без этого для установления связи будет использоваться сеть серверов-анонсеров и релеев. Более того, вы можете поднять анонсеры и релеи на своей инфраструктуре, что позволяет использовать ПО в рамках разветвленной локальной сети компании.



В любой момент можно удобно просмотреть список синхронизируемых файлов. Крайне полезный и удобный в настройке получился софт. Ресурсы потребляет достаточно экономно. прямо сейчас в режиме ожидания ест около 15 мегабайт RAM и доли процента процессорного времени. Общий объем данных в кластере в районе 500 ГБ.

Всем удачи в экспериментах. Прочной изоленты.

Update 1


Спасибо datacompboy. Нашел интересный флаг для игнорирования удаления в мастер-ноде.
ignoreDelete is an advanced folder setting that affects the handling of incoming index updates. When set, incoming updates with the delete flag set are ignored.


Некоторая проблема в том, что с точки зрения других нод, это будет рассинхроном.

Assume two devices, “Alice” and “Bob”, are sharing a folder. Bob has set ignoreDelete.

New and updated files are synchronized as usual between Alice and Bob. When Bob deletes a file, it is deleted for Alice as well. When Alice deletes a file, Bob ignores that update and does not delete the file.

In this state, Bob is fully up to date from his own point of view, as is Alice from her own point of view.

However from the point of view of Alice, who deleted a file and propagated the update, Bob is now out of date because he is yet to remove the file that was deleted.

From the point of view of Bob, who ignored the delete entry from Alice, Alice is now out of date because she is missing the file that was deleted
.

Комментарии (63)


  1. Meklon Автор
    11.03.2018 15:49
    +1

    Если интересно — могу предоставить тестовый доступ к одному из каталогов для проверки. К сожалению, это требует подключения ноды. Нельзя просто расшарить каталог в сеть.


    1. datacompboy
      11.03.2018 16:44
      +1

      ызвинитити


      1. Meklon Автор
        11.03.2018 17:08
        +1

        Вообще, syncthing в данном случае был бы идеален для раздачи разного рода сериалов, когда серии подтягиваются автоматически.


        1. datacompboy
          11.03.2018 17:12

          А как у него с возможностью игнорировать удалённые удаления?


          1. Meklon Автор
            11.03.2018 17:24

            При нормальному не может, насколько я помню. Но умеет версионирование и корзину для таких вещей.


          1. Meklon Автор
            11.03.2018 17:55
            +1

            О! А ведь есть у него такой флаг. Вот кусок из документации:

            ignoreDelete is an advanced folder setting that affects the handling of incoming index updates. When set, incoming updates with the delete flag set are ignored.


            1. datacompboy
              11.03.2018 18:03
              +1

              Во! Спасибо, это ТЧДП


              1. Meklon Автор
                11.03.2018 18:05

                Не за что) будут нужны тестовые ноды — пиши.


                1. arheops
                  11.03.2018 20:31

                  А что, этот флаг отменяет замену файла файлом с мусором?


                  1. Meklon Автор
                    11.03.2018 20:36

                    Нет, не отменяет. Но там есть возможность задать глубину версий файла. И восстановить предыдущую версию.


                    1. arheops
                      11.03.2018 20:41

                      Ну 10 раз заменить файл. Не большая разница вобщем-то. Вобщем, делайте параллельно копии раз в день с именем дня.


                      1. Meklon Автор
                        11.03.2018 20:47

                        Можно копии суточные синхронизировать. Конечно, серебряной пули не бывает. Везде свои грабли.


  1. Glorian
    11.03.2018 17:05
    -1

    Или можно так:

    docker run -d --name syncthing -v /var/syncthing:/var/syncthing -p 8384:8384 -p 22000:22000 --restart=always


    1. Meklon Автор
      11.03.2018 17:07
      +3

      Не очень люблю docker. Мне нативно проще управлять. Если что-то совсем злое в плане зависимостей, то предпочитаю полную виртуализацию.


      1. sanrega
        12.03.2018 22:15

        Согласен. Docker хорош когда нужно что-то не особо конфигурируемое и сложное, на уровне «установил одной командой и забыл».


  1. kavax
    11.03.2018 19:43
    +1

    Тестировал syncthing под нагрузкой в более 120 постоянно активных клиентов (использовал сеть IoT) — хочу предупредить:
    — под нагрузкой начинает потреблять большое количество ресурсов (иногда на столько большое что allwiner h3 1Gb просто не откроет интерфейс настройки);
    — вылит клиента и возвращение через неделю, в такой сети, приводит к дублированию файлов (он их помечает как конфликтные). Решается в ручную удалением дублей, но все хосты сети перекачают по трафику.
    Пришлось отказаться в пользу схемы клиент-сервер (хотя очень жаль).


    1. Meklon Автор
      11.03.2018 19:44

      Спасибо, не сталкивался пока. Для меня это резервный вариант копирования в любом случае.


  1. red_led
    11.03.2018 19:43
    +1

    Второй вариант будет работать только тогда, когда пользователь залогинился через ssh или авторизировался в локальной системе.

    Эта проблема решается:
    https://wiki.archlinux.org/index.php/Systemd/User_(Русский)#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA_systemd_.D0.BE.D1.82_.D0.B8.D0.BC.D0.B5.D0.BD.D0.B8_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F


  1. DistortNeo
    11.03.2018 20:20
    +2

    Главная беда как BTSync, Syncthing и их аналогов — отвратительная работа с большим количеством мелких файлов и директорий. Они просто захлёбываются и перестают нормально работать, выжирая кучу памяти и процессорного времени.

    Раньше пытался использовать их для синхронизации рабочего окружения на десктопе, сервере и ноутбуке. Было очень удобно: не нужно вообще ни о чём задумываться — всё синхронизируется само в автомате. Но со временем стали появляться проблемы, и в итоге пришлось от этих программ отказаться после пары случае рассинхронизации.

    Одна из фундаментальных проблем — отсутствие полноценных средств слежения за изменениями в файлах и директориях в ОС и ФС. Механизм inotify очень плохо масштабируется: с его помощью нельзя следить рекурсивно за всеми директориями, за каждой директорией нужно сделить отдельно, но дескрипторов-то у нас не бесконечное количество. В Windows дела обстоят лучше — там средство слежения рекурсивное, но возможен приход события до вступления изменения в силу. И в обоих случаях есть ещё один подводный камень: переполнение очереди событий, восставление после которого будет очень болезненным.


    1. Tsvetik
      11.03.2018 20:53
      +1

      Мне надо было синхронизировать кэш программы SasPlanet — миллион мелких файлов. В результате BTSync отжирал всю память и зависал. Если добавить паку с кэшем в игнор, то BTSync все равно ее индекисировал, отжирал память и зависал.
      Syncthing тоже отжирает кучу памяти, но при добавлении папки в игнор, перестает ее индексировать и работает вобщем-то нормально.
      Сейчас как раз использую SyncThing на трех машинах.


    1. Revertis
      11.03.2018 22:05
      +1

      Я тоже нарывался на проблему, которую вы описываете. Но только с BTSync. После перехода на Syncthing такой проблемы не было, хотя папка и количество файлов в ней только росло.


      1. DistortNeo
        12.03.2018 00:28

        Было бы неплохо указать ещё количество файлов, директорий и ОС. В моём случае — 22 тыщи директорий. Syncthing я тоже пробовал — но видимо, тогда он был совсем сырой и работал хуже BTSync.


        1. Revertis
          12.03.2018 00:39

          Ну, сейчас это выглядит так: 3 063 Files, 200 Folders. В самом начале файлов было раза в четыре меньше, директорий была парочка.
          Начинал всё это синкать с помощью BTSync, почти сразу попал на полный рассинхрон на всех трех устройствах (винда, линукс и андроид). И каждый клиент показывал разную информацию.
          Тогда (года два назад) я решил попробовать Syncthing, и никакого рассинхрона до сих пор не было. Были пару раз какие-то дубли-конфликты, но решалось быстро ручной проверкой.


          1. DistortNeo
            12.03.2018 00:43

            Ну это же вообще несерьёзно, на таких объёмах всё должно работать просто идеально.

            Вот мой случай:

            Folder "F:\.BTSync"

            Contains:

            Folders 22481
            Files 387593
            Files size 137 GB


            Правда, из этого количества нужно ещё выкинуть игнорируемые директории — останется примерно 15к папок и 200к файлов, что все равно дофига для синхронизации.


          1. voidMan
            12.03.2018 05:41

            3k файлов это совсем цветочки, когда будет под 300k тогда можно будет судить о чём-то. Посмотрел на свою синхронизируемую папку — это 260094?файла и 60123 папки (между двумя маками в локальной сети), действительно порой дикие CPU-всплески бывают, но по памяти большого «отжирания» не заметил.


    1. typ6o0jiehb
      12.03.2018 00:57

      Использую syncthing, несколько кейсов:
      для синхронизации каталога с мелкими файлами (заметки, логи, версии этого в git) — 33 тысячи файлов, 1.3 гб — полет нормальный. постоянно несколько нод онлайн, максимально — до 5 нод поднимал.
      в другом месте на двух windows машинах синхронизация данных — около 180 гб, используется версионирование, переодически слышу отзывы о пропадании корректной версии, или наоборот, о невозможности откатиться на нужную, часто вижу конфликты по синхронизации, и там более нескольких сотен таких ошибок — разбирать часто нет времени/желания. отказываться ещё не хочу, но проблемы признаю.
      На днях добавил к тем windows-нодам свой linux сервер — чтобы организовать версионирование силами btrfs, при синхронизации сотни ошибок по поводу длины имени файла (ntfs vs btrfs )) ) — но с моей точки зрения, если это будет работать, то резервные копии уже не так и нужны.


    1. alexkbs
      13.03.2018 12:34

      Всем программам динамической синхронизации, то есть такой, которая происходит в реальном времени, нужно держать в памяти все метаданные к файлам. Хотя бы потому что система inotify ненадёжна по определению. Потому любые такие программы будут есть много памяти на множестве мелких файлов пока не придумали надёжный вид inotify. Это не беда программ синхронизации, это особенность современных ОС.


      Иначе говоря, вы либо терпите этот недостаток, либо делаете rsync раз в полчаса. Ругаться, жаловаться и порицать не имеет смысла: это не та проблема, которую можно решить.


      1. DistortNeo
        13.03.2018 15:38

        Это не беда программ синхронизации, это особенность современных ОС.…

        Почему же? В той же Mac OS проблемы с переполнением очереди событий, насколько я понимаю, нет. FSEvents — вполне эффективная штука, судя по её описанию.


        Ругаться, жаловаться и порицать не имеет смысла: это не та проблема, которую можно решить.

        Ругаться, жаловаться и порицать как раз имеет смысл. Если программа синхронизации использует ненадёжный источник данных, работает в условиях сетеового соединени я низкого качества, и при этом не способна восстановиться после ошибки, то это недоработка программы.


        Кстати, интересно, почему до сих пор нет решений на базе виртуальных файловых систем? Берём FUSE/Dokan, проксифицируем обращения к ФС и имеем полный контроль за всеми изменениями, правда, ценой небольшого падения производительности из-за накладных расходов.


  1. Goodkat
    11.03.2018 20:38

    А можно настроить запуск какой-нибудь команды по окончанию синхронизации?


    Например, раздача софта или обновлений баз данных: сейчас для этого по крону запускается скрипт, который сперва через rsync выкачивает содержимое папки, потом запускает команду распаковки/установки. Чтобы 200+ серверов выкачивающих гигабайты данных не положили сеть и раздающий сервер, приходится разбрасывать время старта.
    Syncthing мог бы распараллелить и снизить нагрузку, но как узнать, что точно все файлы и папки загрузились, и можно запускать программу установки?


    1. Meklon Автор
      11.03.2018 20:48

      Тривиально никак, на мой взгляд. Из особо извращённых вариантов — запуск после того, как хеши файлов сойдутся. Или размер каталогов. Хотя кейс интересный.


    1. Meklon Автор
      11.03.2018 20:56

      Порылся еще. Там есть syncthing CLI. Один из вариантов — писать логи куда-то. Потом парсить их на предмет статуса up to date.


      1. Tsvetik
        11.03.2018 21:02
        +1

        Вообще-то там есть REST API
        docs.syncthing.net/dev/rest.html

        и в нем можно подписаться на какие-то события и прочитать состояние ноды


        1. Meklon Автор
          11.03.2018 21:03

          Не знал, спасибо. Надо подумать, возможно я смогу что-то оптимизировать.


    1. mltk
      11.03.2018 21:28
      +1

      Возможно вам подойдёт не средство синхронизации (syncthing, btsync), а просто консольный торрент-клиент, например aria2:

      aria2 is a lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink. aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.


      1. Meklon Автор
        11.03.2018 21:29

        Да, но тогда для каждого чиха придется перехешировать весь каталог и заново создавать/рассылать torrent файл.


      1. Goodkat
        12.03.2018 02:12

        По-моему, это только всё усложнит.
        Syncthing удобен тем, что расшарил папочку, и клиенты её выкачивают, а если папочка большая и клиентов много, то они качают и друг от друга, а не только с раздающего сервера.
        Не хватает только хука syncCompleted.sh, который бы выполнялся после завершения синхронизации.
        Но исходники открытые, можно и подкостылить для себя, наверное, или зацепиться за event-ы ItemFinished или FolderCompletion, как предлагает Tsvetik.


        1. VulvarisMagistralis
          12.03.2018 10:04

          Но исходники открытые, можно и подкостылить для себя

          Разве API не хватает?


  1. VulvarisMagistralis
    12.03.2018 09:10

    Использую Syncthing для перемещения больших файлов на/с удаленные Windows со/на своего компьютера.

    Очень нравится стабильность и скорость и не ломать головы насчет NAT на слабом канале по сравнению с другими способами перекачки файлов.


  1. DarkTwin
    12.03.2018 10:24

    Используем данный продукт для синхронизации данных между филиалами.
    Работает более года уже.

    Скриншот одной из нод
    image


    1. Meklon Автор
      12.03.2018 11:00

      У меня больше проблема с частичной синхронизацией той же базы данных. Канал потух, не успев дать полную копию и на руках не валидная каша из старых и новых файлов. Я думаю поднимать сервис только в субботу и к понедельнику гасить. Возможно, синхронизировать не саму базу, а ее упакованные снапшоты.


      1. DarkTwin
        12.03.2018 13:21

        Про дампы.
        Инкрементальный бэкап сильно упрощает жизнь, а если с сжатием так вообще сказка.
        На одном из серверов БД сделано так. Сервер делает бэкапы в папку на самом сервере. Полные, инкрементальные, транзакций. После этого «синком» улетает на сервер бекапов. Контроль версий не используется из за того что в названии бэкапа имеется timestamp.

        А вообще сильно индивидуально. Зависит от объема, нагрузки, etc.
        Описанное выше это слабонагруженный сервер и ему такие вольности простительны.


        1. Meklon Автор
          12.03.2018 13:23

          Там винда стоит. Штатными средствами резервные копии льются. Надо подумать.


  1. Igorjan
    12.03.2018 12:22

    Спасибо, очень интересно!
    А как дела с NTFS-правами?


    1. Meklon Автор
      12.03.2018 12:55

      Насколько я знаю, при синхронизации между NTFS все переносит, если не стоит флаг игнорирования. При синхронизации с линуксовыми файловыми системами метаинформация теряется.


      1. DarkTwin
        12.03.2018 13:44

        Права не переносятся. Ни доменные, ни локальные группы\пользователи.
        Специально сейчас провел эксперимент, думал что то поменялось.
        Все так же ка ки было.
        Возможно мы что то не так делаем, но права не переносятся с других нод.


        1. Meklon Автор
          12.03.2018 14:06

          Надо копаться в документации. При работе от root по идее все должен переносить. Там даже галочка есть в настройках Ignore permissions.


      1. Igorjan
        12.03.2018 17:20

        так и придется поднимать 2 виртуалки на win и пробовать.
        Спасибо!


        1. Meklon Автор
          12.03.2018 21:21

          Отпишитесь потом)


  1. Taragolis
    12.03.2018 12:39

    Печалит, что .stignore не передается между нодами и необходимо придумывать велосипеды с #include


  1. oldbie
    12.03.2018 14:40

    Если мне память не изменяет от вас уже были мануалы тут об own(next)cloud. Правильно ли понимаю что вы сменили метод синхронизации? И если да, то почему?


    1. VulvarisMagistralis
      12.03.2018 15:08

      Syncthing реально неимоверно крут


    1. Meklon Автор
      12.03.2018 15:27

      Нет, не сменил, просто задачи разные. Тут как раз фишка именно в том, что это единый кластер, который хорошо работает при проблемах со скоростью на отдельных нодах.


  1. sumanai
    12.03.2018 17:28

    Работает в последней версии на WinXP x64. Годно!


  1. vconst
    14.03.2018 08:14

    А для простых и приземленных вещей, вроде синхронизации я-то с андроида на домашнюю винду эта хитрая штука лучше или хуже банального бтсинк? Про то андроид ничего и не сказано…


    1. 14th
      14.03.2018 11:30

      На андройде не интересно тем, что не умеет работать с картой памяти.


      1. vconst
        14.03.2018 11:37

        Значит чисто корпоративная прога. Может в повседневном использовании кому-то будет полезна… Но…


        1. 14th
          14.03.2018 11:39

          Тут надо привет Гугол передать. На каких-то версия андроида работает полностью.


        1. Meklon Автор
          14.03.2018 11:40

          Не обязательно. Каталоги конфигурационные можно синхронизировать, например. Условные два планшета на Android с Kodi-медицентром. Синхронизация рабочего каталога Kodi даст возможность иметь единую базу фильмотеки и просмотренных фильмов. Это просто как пример. От потребностей зависит. Просто синхронизация каталогов между своими компьютерами.


          1. vconst
            14.03.2018 11:46

            Может быть да, а может и нет. Надо всесторонне испытывать мобильное приложение. Дропболкс и БТСинк работают хорошо и без сбоев — проверено. А вот эта штука — кот в мешке, без тестов на смарте поднимать такой сервер для «синхронизации фоточек» — может быть слишком избыточно.


            1. RevenantX
              14.03.2018 13:14

              На смарте можно использовать другие приложения для синхронизации (например FolderSync) И заливать по SFTP (ssh), webdav, итд.


              1. vconst
                14.03.2018 13:28

                Я много пробовал, но остановился на банальном Дропбоксе. Плата за сервис компенсируется тем, что он очень хорошо интегрирован во всякие другие службы и программы.


  1. LESHIY_ODESSA
    14.03.2018 17:18

    Нашел у себя в закромах: SyncTrayzor — is a little tray utility for Syncthing on Windows.


    1. Meklon Автор
      14.03.2018 20:00

      Пригодится, спасибо)