У меня тут внезапно завалялся гайд по настройке 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
Meklon Автор
Если интересно — могу предоставить тестовый доступ к одному из каталогов для проверки. К сожалению, это требует подключения ноды. Нельзя просто расшарить каталог в сеть.
datacompboy
Meklon Автор
Вообще, syncthing в данном случае был бы идеален для раздачи разного рода сериалов, когда серии подтягиваются автоматически.
datacompboy
А как у него с возможностью игнорировать удалённые удаления?
Meklon Автор
При нормальному не может, насколько я помню. Но умеет версионирование и корзину для таких вещей.
Meklon Автор
О! А ведь есть у него такой флаг. Вот кусок из документации:
datacompboy
Во! Спасибо, это ТЧДП
Meklon Автор
Не за что) будут нужны тестовые ноды — пиши.
arheops
А что, этот флаг отменяет замену файла файлом с мусором?
Meklon Автор
Нет, не отменяет. Но там есть возможность задать глубину версий файла. И восстановить предыдущую версию.
arheops
Ну 10 раз заменить файл. Не большая разница вобщем-то. Вобщем, делайте параллельно копии раз в день с именем дня.
Meklon Автор
Можно копии суточные синхронизировать. Конечно, серебряной пули не бывает. Везде свои грабли.
Glorian
Или можно так:
Meklon Автор
Не очень люблю docker. Мне нативно проще управлять. Если что-то совсем злое в плане зависимостей, то предпочитаю полную виртуализацию.
sanrega
Согласен. Docker хорош когда нужно что-то не особо конфигурируемое и сложное, на уровне «установил одной командой и забыл».
kavax
Тестировал syncthing под нагрузкой в более 120 постоянно активных клиентов (использовал сеть IoT) — хочу предупредить:
— под нагрузкой начинает потреблять большое количество ресурсов (иногда на столько большое что allwiner h3 1Gb просто не откроет интерфейс настройки);
— вылит клиента и возвращение через неделю, в такой сети, приводит к дублированию файлов (он их помечает как конфликтные). Решается в ручную удалением дублей, но все хосты сети перекачают по трафику.
Пришлось отказаться в пользу схемы клиент-сервер (хотя очень жаль).
Meklon Автор
Спасибо, не сталкивался пока. Для меня это резервный вариант копирования в любом случае.
red_led
Эта проблема решается:
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
DistortNeo
Главная беда как BTSync, Syncthing и их аналогов — отвратительная работа с большим количеством мелких файлов и директорий. Они просто захлёбываются и перестают нормально работать, выжирая кучу памяти и процессорного времени.
Раньше пытался использовать их для синхронизации рабочего окружения на десктопе, сервере и ноутбуке. Было очень удобно: не нужно вообще ни о чём задумываться — всё синхронизируется само в автомате. Но со временем стали появляться проблемы, и в итоге пришлось от этих программ отказаться после пары случае рассинхронизации.
Одна из фундаментальных проблем — отсутствие полноценных средств слежения за изменениями в файлах и директориях в ОС и ФС. Механизм inotify очень плохо масштабируется: с его помощью нельзя следить рекурсивно за всеми директориями, за каждой директорией нужно сделить отдельно, но дескрипторов-то у нас не бесконечное количество. В Windows дела обстоят лучше — там средство слежения рекурсивное, но возможен приход события до вступления изменения в силу. И в обоих случаях есть ещё один подводный камень: переполнение очереди событий, восставление после которого будет очень болезненным.
Tsvetik
Мне надо было синхронизировать кэш программы SasPlanet — миллион мелких файлов. В результате BTSync отжирал всю память и зависал. Если добавить паку с кэшем в игнор, то BTSync все равно ее индекисировал, отжирал память и зависал.
Syncthing тоже отжирает кучу памяти, но при добавлении папки в игнор, перестает ее индексировать и работает вобщем-то нормально.
Сейчас как раз использую SyncThing на трех машинах.
Revertis
Я тоже нарывался на проблему, которую вы описываете. Но только с BTSync. После перехода на Syncthing такой проблемы не было, хотя папка и количество файлов в ней только росло.
DistortNeo
Было бы неплохо указать ещё количество файлов, директорий и ОС. В моём случае — 22 тыщи директорий. Syncthing я тоже пробовал — но видимо, тогда он был совсем сырой и работал хуже BTSync.
Revertis
Ну, сейчас это выглядит так: 3 063 Files, 200 Folders. В самом начале файлов было раза в четыре меньше, директорий была парочка.
Начинал всё это синкать с помощью BTSync, почти сразу попал на полный рассинхрон на всех трех устройствах (винда, линукс и андроид). И каждый клиент показывал разную информацию.
Тогда (года два назад) я решил попробовать Syncthing, и никакого рассинхрона до сих пор не было. Были пару раз какие-то дубли-конфликты, но решалось быстро ручной проверкой.
DistortNeo
Ну это же вообще несерьёзно, на таких объёмах всё должно работать просто идеально.
Вот мой случай:
Folder "F:\.BTSync"
Contains:
Folders 22481
Files 387593
Files size 137 GB
Правда, из этого количества нужно ещё выкинуть игнорируемые директории — останется примерно 15к папок и 200к файлов, что все равно дофига для синхронизации.
voidMan
3k файлов это совсем цветочки, когда будет под 300k тогда можно будет судить о чём-то. Посмотрел на свою синхронизируемую папку — это 260094?файла и 60123 папки (между двумя маками в локальной сети), действительно порой дикие CPU-всплески бывают, но по памяти большого «отжирания» не заметил.
typ6o0jiehb
Использую syncthing, несколько кейсов:
для синхронизации каталога с мелкими файлами (заметки, логи, версии этого в git) — 33 тысячи файлов, 1.3 гб — полет нормальный. постоянно несколько нод онлайн, максимально — до 5 нод поднимал.
в другом месте на двух windows машинах синхронизация данных — около 180 гб, используется версионирование, переодически слышу отзывы о пропадании корректной версии, или наоборот, о невозможности откатиться на нужную, часто вижу конфликты по синхронизации, и там более нескольких сотен таких ошибок — разбирать часто нет времени/желания. отказываться ещё не хочу, но проблемы признаю.
На днях добавил к тем windows-нодам свой linux сервер — чтобы организовать версионирование силами btrfs, при синхронизации сотни ошибок по поводу длины имени файла (ntfs vs btrfs )) ) — но с моей точки зрения, если это будет работать, то резервные копии уже не так и нужны.
alexkbs
Всем программам динамической синхронизации, то есть такой, которая происходит в реальном времени, нужно держать в памяти все метаданные к файлам. Хотя бы потому что система inotify ненадёжна по определению. Потому любые такие программы будут есть много памяти на множестве мелких файлов пока не придумали надёжный вид inotify. Это не беда программ синхронизации, это особенность современных ОС.
Иначе говоря, вы либо терпите этот недостаток, либо делаете rsync раз в полчаса. Ругаться, жаловаться и порицать не имеет смысла: это не та проблема, которую можно решить.
DistortNeo
Почему же? В той же Mac OS проблемы с переполнением очереди событий, насколько я понимаю, нет. FSEvents — вполне эффективная штука, судя по её описанию.
Ругаться, жаловаться и порицать как раз имеет смысл. Если программа синхронизации использует ненадёжный источник данных, работает в условиях сетеового соединени я низкого качества, и при этом не способна восстановиться после ошибки, то это недоработка программы.
Кстати, интересно, почему до сих пор нет решений на базе виртуальных файловых систем? Берём FUSE/Dokan, проксифицируем обращения к ФС и имеем полный контроль за всеми изменениями, правда, ценой небольшого падения производительности из-за накладных расходов.
Goodkat
А можно настроить запуск какой-нибудь команды по окончанию синхронизации?
Например, раздача софта или обновлений баз данных: сейчас для этого по крону запускается скрипт, который сперва через rsync выкачивает содержимое папки, потом запускает команду распаковки/установки. Чтобы 200+ серверов выкачивающих гигабайты данных не положили сеть и раздающий сервер, приходится разбрасывать время старта.
Syncthing мог бы распараллелить и снизить нагрузку, но как узнать, что точно все файлы и папки загрузились, и можно запускать программу установки?
Meklon Автор
Тривиально никак, на мой взгляд. Из особо извращённых вариантов — запуск после того, как хеши файлов сойдутся. Или размер каталогов. Хотя кейс интересный.
Meklon Автор
Порылся еще. Там есть syncthing CLI. Один из вариантов — писать логи куда-то. Потом парсить их на предмет статуса up to date.
Tsvetik
Вообще-то там есть REST API
docs.syncthing.net/dev/rest.html
и в нем можно подписаться на какие-то события и прочитать состояние ноды
Meklon Автор
Не знал, спасибо. Надо подумать, возможно я смогу что-то оптимизировать.
mltk
Возможно вам подойдёт не средство синхронизации (syncthing, btsync), а просто консольный торрент-клиент, например aria2:
Meklon Автор
Да, но тогда для каждого чиха придется перехешировать весь каталог и заново создавать/рассылать torrent файл.
Goodkat
По-моему, это только всё усложнит.
Syncthing удобен тем, что расшарил папочку, и клиенты её выкачивают, а если папочка большая и клиентов много, то они качают и друг от друга, а не только с раздающего сервера.
Не хватает только хука syncCompleted.sh, который бы выполнялся после завершения синхронизации.
Но исходники открытые, можно и подкостылить для себя, наверное, или зацепиться за event-ы ItemFinished или FolderCompletion, как предлагает Tsvetik.
VulvarisMagistralis
Разве API не хватает?
VulvarisMagistralis
Использую Syncthing для перемещения больших файлов на/с удаленные Windows со/на своего компьютера.
Очень нравится стабильность и скорость и не ломать головы насчет NAT на слабом канале по сравнению с другими способами перекачки файлов.
DarkTwin
Используем данный продукт для синхронизации данных между филиалами.
Работает более года уже.
Meklon Автор
У меня больше проблема с частичной синхронизацией той же базы данных. Канал потух, не успев дать полную копию и на руках не валидная каша из старых и новых файлов. Я думаю поднимать сервис только в субботу и к понедельнику гасить. Возможно, синхронизировать не саму базу, а ее упакованные снапшоты.
DarkTwin
Про дампы.
Инкрементальный бэкап сильно упрощает жизнь, а если с сжатием так вообще сказка.
На одном из серверов БД сделано так. Сервер делает бэкапы в папку на самом сервере. Полные, инкрементальные, транзакций. После этого «синком» улетает на сервер бекапов. Контроль версий не используется из за того что в названии бэкапа имеется timestamp.
А вообще сильно индивидуально. Зависит от объема, нагрузки, etc.
Описанное выше это слабонагруженный сервер и ему такие вольности простительны.
Meklon Автор
Там винда стоит. Штатными средствами резервные копии льются. Надо подумать.
Igorjan
Спасибо, очень интересно!
А как дела с NTFS-правами?
Meklon Автор
Насколько я знаю, при синхронизации между NTFS все переносит, если не стоит флаг игнорирования. При синхронизации с линуксовыми файловыми системами метаинформация теряется.
DarkTwin
Права не переносятся. Ни доменные, ни локальные группы\пользователи.
Специально сейчас провел эксперимент, думал что то поменялось.
Все так же ка ки было.
Возможно мы что то не так делаем, но права не переносятся с других нод.
Meklon Автор
Надо копаться в документации. При работе от root по идее все должен переносить. Там даже галочка есть в настройках Ignore permissions.
Igorjan
так и придется поднимать 2 виртуалки на win и пробовать.
Спасибо!
Meklon Автор
Отпишитесь потом)
Taragolis
Печалит, что
.stignore
не передается между нодами и необходимо придумывать велосипеды с #includeoldbie
Если мне память не изменяет от вас уже были мануалы тут об own(next)cloud. Правильно ли понимаю что вы сменили метод синхронизации? И если да, то почему?
VulvarisMagistralis
Syncthing реально неимоверно крут
Meklon Автор
Нет, не сменил, просто задачи разные. Тут как раз фишка именно в том, что это единый кластер, который хорошо работает при проблемах со скоростью на отдельных нодах.
sumanai
Работает в последней версии на WinXP x64. Годно!
vconst
А для простых и приземленных вещей, вроде синхронизации я-то с андроида на домашнюю винду эта хитрая штука лучше или хуже банального бтсинк? Про то андроид ничего и не сказано…
14th
На андройде не интересно тем, что не умеет работать с картой памяти.
vconst
Значит чисто корпоративная прога. Может в повседневном использовании кому-то будет полезна… Но…
14th
Тут надо привет Гугол передать. На каких-то версия андроида работает полностью.
Meklon Автор
Не обязательно. Каталоги конфигурационные можно синхронизировать, например. Условные два планшета на Android с Kodi-медицентром. Синхронизация рабочего каталога Kodi даст возможность иметь единую базу фильмотеки и просмотренных фильмов. Это просто как пример. От потребностей зависит. Просто синхронизация каталогов между своими компьютерами.
vconst
Может быть да, а может и нет. Надо всесторонне испытывать мобильное приложение. Дропболкс и БТСинк работают хорошо и без сбоев — проверено. А вот эта штука — кот в мешке, без тестов на смарте поднимать такой сервер для «синхронизации фоточек» — может быть слишком избыточно.
RevenantX
На смарте можно использовать другие приложения для синхронизации (например FolderSync) И заливать по SFTP (ssh), webdav, итд.
vconst
Я много пробовал, но остановился на банальном Дропбоксе. Плата за сервис компенсируется тем, что он очень хорошо интегрирован во всякие другие службы и программы.
LESHIY_ODESSA
Нашел у себя в закромах: SyncTrayzor — is a little tray utility for Syncthing on Windows.
Meklon Автор
Пригодится, спасибо)