Настраиваем Syncthing. Синяя изолента в мелком бизнесе и дома

  • Tutorial
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
.
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

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



      вспоминается как N лет назад нихронизацию поднимали на базах Fidonet стека, с помощью «левонета организации»…
      • +1
        Вообще, syncthing в данном случае был бы идеален для раздачи разного рода сериалов, когда серии подтягиваются автоматически.
        • 0
          А как у него с возможностью игнорировать удалённые удаления?
          • 0
            При нормальному не может, насколько я помню. Но умеет версионирование и корзину для таких вещей.
            • +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.
              • +2
                Во! Спасибо, это ТЧДП
                • 0
                  Не за что) будут нужны тестовые ноды — пиши.
                  • 0
                    А что, этот флаг отменяет замену файла файлом с мусором?
                    • 0
                      Нет, не отменяет. Но там есть возможность задать глубину версий файла. И восстановить предыдущую версию.
                      • 0
                        Ну 10 раз заменить файл. Не большая разница вобщем-то. Вобщем, делайте параллельно копии раз в день с именем дня.
                        • 0
                          Можно копии суточные синхронизировать. Конечно, серебряной пули не бывает. Везде свои грабли.
      • +4
        Или можно так:
        docker run -d --name syncthing -v /var/syncthing:/var/syncthing -p 8384:8384 -p 22000:22000 --restart=always
        • +3
          Не очень люблю docker. Мне нативно проще управлять. Если что-то совсем злое в плане зависимостей, то предпочитаю полную виртуализацию.
          • 0
            Согласен. Docker хорош когда нужно что-то не особо конфигурируемое и сложное, на уровне «установил одной командой и забыл».
        • +2
          Тестировал syncthing под нагрузкой в более 120 постоянно активных клиентов (использовал сеть IoT) — хочу предупредить:
          — под нагрузкой начинает потреблять большое количество ресурсов (иногда на столько большое что allwiner h3 1Gb просто не откроет интерфейс настройки);
          — вылит клиента и возвращение через неделю, в такой сети, приводит к дублированию файлов (он их помечает как конфликтные). Решается в ручную удалением дублей, но все хосты сети перекачают по трафику.
          Пришлось отказаться в пользу схемы клиент-сервер (хотя очень жаль).
          • 0
            Спасибо, не сталкивался пока. Для меня это резервный вариант копирования в любом случае.
            • 0
              Еще были проблемы с именами файлов (не знаю, починили или нет, в 0.14.44 так было). Суть в том, что если просто поменяешь регистр буквы в имени, то Syncthing не может синхронизировать такой файл.
          • +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

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

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

              Одна из фундаментальных проблем — отсутствие полноценных средств слежения за изменениями в файлах и директориях в ОС и ФС. Механизм inotify очень плохо масштабируется: с его помощью нельзя следить рекурсивно за всеми директориями, за каждой директорией нужно сделить отдельно, но дескрипторов-то у нас не бесконечное количество. В Windows дела обстоят лучше — там средство слежения рекурсивное, но возможен приход события до вступления изменения в силу. И в обоих случаях есть ещё один подводный камень: переполнение очереди событий, восставление после которого будет очень болезненным.
              • +1
                Мне надо было синхронизировать кэш программы SasPlanet — миллион мелких файлов. В результате BTSync отжирал всю память и зависал. Если добавить паку с кэшем в игнор, то BTSync все равно ее индекисировал, отжирал память и зависал.
                Syncthing тоже отжирает кучу памяти, но при добавлении папки в игнор, перестает ее индексировать и работает вобщем-то нормально.
                Сейчас как раз использую SyncThing на трех машинах.
                • +1
                  Я тоже нарывался на проблему, которую вы описываете. Но только с BTSync. После перехода на Syncthing такой проблемы не было, хотя папка и количество файлов в ней только росло.
                  • 0
                    Было бы неплохо указать ещё количество файлов, директорий и ОС. В моём случае — 22 тыщи директорий. Syncthing я тоже пробовал — но видимо, тогда он был совсем сырой и работал хуже BTSync.
                    • 0
                      Ну, сейчас это выглядит так: 3 063 Files, 200 Folders. В самом начале файлов было раза в четыре меньше, директорий была парочка.
                      Начинал всё это синкать с помощью BTSync, почти сразу попал на полный рассинхрон на всех трех устройствах (винда, линукс и андроид). И каждый клиент показывал разную информацию.
                      Тогда (года два назад) я решил попробовать Syncthing, и никакого рассинхрона до сих пор не было. Были пару раз какие-то дубли-конфликты, но решалось быстро ручной проверкой.
                      • 0
                        Ну это же вообще несерьёзно, на таких объёмах всё должно работать просто идеально.

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

                        Folder "F:\.BTSync"

                        Contains:

                        Folders 22481
                        Files 387593
                        Files size 137 GB


                        Правда, из этого количества нужно ещё выкинуть игнорируемые директории — останется примерно 15к папок и 200к файлов, что все равно дофига для синхронизации.
                        • 0
                          3k файлов это совсем цветочки, когда будет под 300k тогда можно будет судить о чём-то. Посмотрел на свою синхронизируемую папку — это 260094 файла и 60123 папки (между двумя маками в локальной сети), действительно порой дикие CPU-всплески бывают, но по памяти большого «отжирания» не заметил.
                    • +1
                      Использую syncthing, несколько кейсов:
                      для синхронизации каталога с мелкими файлами (заметки, логи, версии этого в git) — 33 тысячи файлов, 1.3 гб — полет нормальный. постоянно несколько нод онлайн, максимально — до 5 нод поднимал.
                      в другом месте на двух windows машинах синхронизация данных — около 180 гб, используется версионирование, переодически слышу отзывы о пропадании корректной версии, или наоборот, о невозможности откатиться на нужную, часто вижу конфликты по синхронизации, и там более нескольких сотен таких ошибок — разбирать часто нет времени/желания. отказываться ещё не хочу, но проблемы признаю.
                      На днях добавил к тем windows-нодам свой linux сервер — чтобы организовать версионирование силами btrfs, при синхронизации сотни ошибок по поводу длины имени файла (ntfs vs btrfs )) ) — но с моей точки зрения, если это будет работать, то резервные копии уже не так и нужны.
                      • 0

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


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

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

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


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

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


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

                      • +1

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


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

                        • 0
                          Тривиально никак, на мой взгляд. Из особо извращённых вариантов — запуск после того, как хеши файлов сойдутся. Или размер каталогов. Хотя кейс интересный.
                          • 0
                            Порылся еще. Там есть syncthing CLI. Один из вариантов — писать логи куда-то. Потом парсить их на предмет статуса up to date.
                            • +2
                              Вообще-то там есть REST API
                              docs.syncthing.net/dev/rest.html

                              и в нем можно подписаться на какие-то события и прочитать состояние ноды
                              • 0
                                Не знал, спасибо. Надо подумать, возможно я смогу что-то оптимизировать.
                            • +2
                              Возможно вам подойдёт не средство синхронизации (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.

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

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

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

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

                                Очень нравится стабильность и скорость и не ломать головы насчет NAT на слабом канале по сравнению с другими способами перекачки файлов.
                                • +1
                                  Используем данный продукт для синхронизации данных между филиалами.
                                  Работает более года уже.
                                  Скриншот одной из нод
                                  image

                                  Главное настроить исключения нормально. С последними билдами отпала необходимость выставлять время синхронизации. Ставим «Watch for Changes» и на всякий случай «Full Rescan Interval» в час или часы.
                                  • 0
                                    У меня больше проблема с частичной синхронизацией той же базы данных. Канал потух, не успев дать полную копию и на руках не валидная каша из старых и новых файлов. Я думаю поднимать сервис только в субботу и к понедельнику гасить. Возможно, синхронизировать не саму базу, а ее упакованные снапшоты.
                                    • 0
                                      Про дампы.
                                      Инкрементальный бэкап сильно упрощает жизнь, а если с сжатием так вообще сказка.
                                      На одном из серверов БД сделано так. Сервер делает бэкапы в папку на самом сервере. Полные, инкрементальные, транзакций. После этого «синком» улетает на сервер бекапов. Контроль версий не используется из за того что в названии бэкапа имеется timestamp.

                                      А вообще сильно индивидуально. Зависит от объема, нагрузки, etc.
                                      Описанное выше это слабонагруженный сервер и ему такие вольности простительны.
                                      • 0
                                        Там винда стоит. Штатными средствами резервные копии льются. Надо подумать.
                                  • 0
                                    Спасибо, очень интересно!
                                    А как дела с NTFS-правами?
                                    • 0
                                      Насколько я знаю, при синхронизации между NTFS все переносит, если не стоит флаг игнорирования. При синхронизации с линуксовыми файловыми системами метаинформация теряется.
                                      • 0
                                        Права не переносятся. Ни доменные, ни локальные группы\пользователи.
                                        Специально сейчас провел эксперимент, думал что то поменялось.
                                        Все так же ка ки было.
                                        Возможно мы что то не так делаем, но права не переносятся с других нод.
                                        • 0
                                          Надо копаться в документации. При работе от root по идее все должен переносить. Там даже галочка есть в настройках Ignore permissions.
                                        • 0
                                          так и придется поднимать 2 виртуалки на win и пробовать.
                                          Спасибо!
                                          • 0
                                            Отпишитесь потом)
                                      • 0

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

                                        • 0
                                          Если мне память не изменяет от вас уже были мануалы тут об own(next)cloud. Правильно ли понимаю что вы сменили метод синхронизации? И если да, то почему?
                                          • Syncthing реально неимоверно крут
                                            • 0
                                              Нет, не сменил, просто задачи разные. Тут как раз фишка именно в том, что это единый кластер, который хорошо работает при проблемах со скоростью на отдельных нодах.
                                            • +2
                                              Работает в последней версии на WinXP x64. Годно!
                                              • 0
                                                А для простых и приземленных вещей, вроде синхронизации я-то с андроида на домашнюю винду эта хитрая штука лучше или хуже банального бтсинк? Про то андроид ничего и не сказано…
                                                • 0
                                                  На андройде не интересно тем, что не умеет работать с картой памяти.
                                                  • 0
                                                    Значит чисто корпоративная прога. Может в повседневном использовании кому-то будет полезна… Но…
                                                    • 0
                                                      Тут надо привет Гугол передать. На каких-то версия андроида работает полностью.
                                                      • 0
                                                        Не обязательно. Каталоги конфигурационные можно синхронизировать, например. Условные два планшета на Android с Kodi-медицентром. Синхронизация рабочего каталога Kodi даст возможность иметь единую базу фильмотеки и просмотренных фильмов. Это просто как пример. От потребностей зависит. Просто синхронизация каталогов между своими компьютерами.
                                                        • 0
                                                          Может быть да, а может и нет. Надо всесторонне испытывать мобильное приложение. Дропболкс и БТСинк работают хорошо и без сбоев — проверено. А вот эта штука — кот в мешке, без тестов на смарте поднимать такой сервер для «синхронизации фоточек» — может быть слишком избыточно.
                                                          • 0
                                                            На смарте можно использовать другие приложения для синхронизации (например FolderSync) И заливать по SFTP (ssh), webdav, итд.
                                                            • 0
                                                              Я много пробовал, но остановился на банальном Дропбоксе. Плата за сервис компенсируется тем, что он очень хорошо интегрирован во всякие другие службы и программы.
                                                  • 0
                                                    Нашел у себя в закромах: SyncTrayzor — is a little tray utility for Syncthing on Windows.
                                                    • 0
                                                      Пригодится, спасибо)
                                                    • 0
                                                      Поставил сабж для оперативной синхронизации рабочего виндового dev окружения. Так вот он в такой конфигурации постоянно шуршит диском — пришлось SSD взять под рабочий каталог

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

                                                      Самое читаемое