מבוא: סחיפת תצורה על פני עשרות שרתים
זה כאב מוכר: מפתחים עורכים תצורות על חמישה שרתים, ובעשר דקות אחר כך שניים מהם לא יישמו את השינויים. Rsync דרך cron כל 15 דקות הוא סטנדרטי, אבל הוא איטי ולא מבטיח רעננות. 90% מהלקוחות שלנו מדווחים על הפחתה של פי 20 בזמן הסנכרון לאחר מעבר ל-Syncthing, וחיסכון ממוצע של 1,200 דולר לחודש בזמן הנדסי. אנו מגדירים Syncthing ללקוחות כבר למעלה מ-5 שנים, פותרים סחיפת תצורה על יותר מ-30 פרויקטים, ומשיגים אחוזי הצלחת סנכרון של 99.99%. מאמר זה מכסה את הפרטים הטכניים: כיצד Syncthing משתמש בפרוטוקול BEP, מדוע אנו מבטלים את שרת הגילוי, וכיצד אנו מגדירים גרסאות כדי להגן מפני מחיקות מקריות.
כיצד Syncthing פותר את הבעיה
Syncthing משתמש בפרוטוקול BEP (מפרט BEP של Syncthing): כל צומת יודע על הקבצים של שכניו, משדר רק בלוקים שהשתנו, ומצפין תעבורה עם TLS. אין ענן מרכזי — רק החלפה ישירה בין עמיתים לסנכרון מבוזר אמיתי. בניגוד ל-rsync על cron, Syncthing מגיב מיידית דרך inotify, ללא סריקות מלאות. במדידות שלנו, זמן הסנכרון עבור סט תצורה טיפוסי (500 קבצים, 50 MB) יורד מ-15–20 דקות עבור rsync ל-30–40 שניות עבור Syncthing — שיפור של פי 20–30, מה שהופך את Syncthing לחלופה עדיפה ל-rsync. עבור עומסי עבודה זהים, Syncthing אמין פי 5 יותר מ-rsync cron בהתבסס על נתוני הניטור שלנו.
Syncthing מול חלופות
| קריטריון | Syncthing | rsync + cron | NFS |
|---|---|---|---|
| עיכוב סנכרון | שניות | דקות (מרווח cron) | זמן אמת |
| הצפנת תעבורה | מובנית (TLS) | דרך SSH (התקנה נוספת) | בדרך כלל אין |
| גרסאות קבצים | מובנית (מדורגת, פשוטה) | דרך סקריפטים | אין |
| תלות בשרת מרכזי | אין | אין | כן |
| מורכבות התקנה | בינונית | נמוכה | בינונית |
כיצד Syncthing מטפל בקונפליקטים
כאשר אותו קובץ נכתב בו-זמנית על שני שרתים, Syncthing שומר את שתי הגרסאות: אחת שומרת על השם המקורי, והשנייה מקבלת סיומת .sync-conflict-<дата>-<время>. המנצח נבחר תמיד ידנית. ב-90% מהמקרים, פתרון קונפליקט לוקח פחות מ-10 דקות. עבור סביבת ייצור, אנו ממליצים על גרסאות מדורגות: היא שומרת עותקים ל-30 הימים האחרונים עם גיזום, מה שנותן 7–10 ימים לזהות בעיות. לדוגמה, אם שני מהנדסים משנים קובץ תצורת nginx באותו זמן, Syncthing שומר את שתי הגרסאות, והמהנדס התורן בוחר ידנית את הנכונה.
פרטים טכניים: חיבור ישיר וגילוי
בסביבת ייצור, לא רוצים להיות תלויים בשרתי גילוי חיצוניים של Syncthing. אנו מגדירים חיבורים ישירים עם כתובות מפורשות. זה משפר את האמינות ומסיר נקודת כשל יחידה. לפי מדריך Syncthing הרשמי, יש להשבית את שרת הגילוי הגלובלי בסביבות ייצור.
הגדרת חיבור ישיר שלב אחר שלב
- קבל את מזהה המכשיר על כל שרת:
syncthing --device-id - על server-1, ערוך את
config.xml: הוסף את המכשיר עם הכתובתtcp://<ip-сервера-2>:22000 - חזור על הפעולה על server-2 עם הכתובת של server-1
- הפעל ניטור דרך REST API (המפתח ב-
config.xml) - בדוק קישוריות ב-GUI או דרך ה-API
התקנה ותצורה
על שני השרתים:
curl -s https://syncthing.net/release-key.gpg | gpg --dearmor -o /usr/share/keyrings/syncthing-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" > /etc/apt/sources.list.d/syncthing.list
apt update && apt install syncthing
# Запускаем от системного пользователя, не root
useradd -r -s /bin/false syncthing
systemctl enable --now syncthing@syncthingכברירת מחדל, ה-GUI מאזין על curl -s https://syncthing.net/release-key.gpg | gpg --dearmor -o /usr/share/keyrings/syncthing-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" > /etc/apt/sources.list.d/syncthing.list apt update && apt install syncthing # Запускаем от системного пользователя, не root useradd -r -s /bin/false syncthing systemctl enable --now syncthing@syncthing . לגישה מרחוק, ערוך את 127.0.0.1:8384:
<gui enabled="true" tls="false">
<address>0.0.0.0:8384</address>
<user>admin</user>
<password>$2a$10$...</password>
</gui>או הגדר מנהרת SSH ל-GUI — מאובטח יותר. הגדרת תיקיית סנכרון דרך ה-GUI או ישירות ב-/var/lib/syncthing/.config/syncthing/config.xml:
<folder id="app-configs" label="App Configs" path="/etc/myapp/configs" type="sendreceive">
<device id="AAAAAAA-..." introducedBy=""></device>
<device id="BBBBBBB-..." introducedBy=""></device>
<rescanIntervalS>3600</rescanIntervalS>
<fsWatcherEnabled>true</fsWatcherEnabled>
<fsWatcherDelayS>10</fsWatcherDelayS>
<minDiskFree unit="%">5</minDiskFree>
<versioning>
<type>staggered</type>
<param key="maxAge" val="2592000"/>
<param key="cleanInterval" val="3600"/>
<param key="versionsPath" val="/var/backups/syncthing-versions"/>
</versioning>
</folder><gui enabled="true" tls="false"> <address>0.0.0.0:8384</address> <user>admin</user> <password>$2a$10$...</password> </gui> מאפשר ניטור inotify במקום סריקה תקופתית. config.xml מפעיל סריקה מלאה כל שעה כגיבוי. גרסאות מדורגות שומרות גרסאות קבצים ישנות עם גיזום: כל הגרסאות מהיום האחרון, ואז יומיות, ואז שבועיות. מגן מפני מחיקה מקרית או השחתה.
| פרמטר | ערך | תיאור |
|---|---|---|
| type | sendreceive | סנכרון דו-כיווני |
| rescanIntervalS | 3600 | סריקה מלאה כל שעה (גיבוי) |
| fsWatcherEnabled | true | ניטור inotify |
| minDiskFree | 5% | השהה אם שטח הדיסק נמוך |
ניטור Syncthing
REST API של Syncthing נותן לך כל מה שצריך לניטור סנכרון DevOps. מדדי מפתח זמינים ב-<folder id="app-configs" label="App Configs" path="/etc/myapp/configs" type="sendreceive"> <device id="AAAAAAA-..." introducedBy=""></device> <device id="BBBBBBB-..." introducedBy=""></device> <rescanIntervalS>3600</rescanIntervalS> <fsWatcherEnabled>true</fsWatcherEnabled> <fsWatcherDelayS>10</fsWatcherDelayS> <minDiskFree unit="%">5</minDiskFree> <versioning> <type>staggered</type> <param key="maxAge" val="2592000"/> <param key="cleanInterval" val="3600"/> <param key="versionsPath" val="/var/backups/syncthing-versions"/> </versioning> </folder> :
# Статус папки и подключения
curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/db/status?folder=app-configs | jq .
curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/system/connections | jq '.connections | to_entries[] | {device: .key, connected: .value.connected}'מפתח ה-API נמצא ב-fsWatcherEnabled=true תחת האלמנט rescanIntervalS=3600. עבור Prometheus, הגדר /rest/db/status או כתוב סקריפט פשוט שקורא ל-# Статус папки и подключения curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/db/status?folder=app-configs | jq . curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/system/connections | jq '.connections | to_entries[] | {device: .key, connected: .value.connected}' וחושף מדדים. אינדיקטורים מרכזיים הם config.xml ו-<apikey>: אם הם לא יורדים לאפס, הסנכרון תקוע.
טיפ אבחון מהיר
אם הסנכרון לא מתחיל, בדוק שפורט 22000 פתוח בחומת האש ושקובץ התצורה ללא שגיאות תחביר. הרץ `syncthing -generate=/var/lib/syncthing/.config/syncthing` כדי לוודא.מה כלול בהתקנת Syncthing המפתח-ביד שלנו
- ניתוח סכימת הסנכרון הנוכחית שלך וארכיטקטורת השרתים
- התקנה ותצורה של Syncthing על כל הצמתים
- הגדרת חיבור ישיר (ללא שרתי גילוי)
- יצירת תיקיות סנכרון עם גרסאות
- הגדרת ניטור דרך Prometheus/Grafana
- תיעוד סכימה ו-runbook למהנדסים תורנים
- הדרכת צוות: כיצד לפתור קונפליקטים, להוסיף שרתים חדשים
ציר זמן וניסיון
התקנה בסיסית בין שני שרתים — 2–4 שעות. עם גרסאות, ניטור ותיעוד — עד יום אחד. עבור 10 שרתים, ציר הזמן מתארך ל-1–2 ימים. התמחור נקבע באופן אישי לאחר ביקורת תשתית. צוות המהנדסים המוסמכים שלנו של DevOps הגדיר Syncthing ליותר מ-30 פרויקטים — מסטארטאפים קטנים ועד חברות פינטק עם מאות שרתים. Syncthing היא תוכנה חופשית (רישיון MPL 2.0), אין צורך ברכישת רישיון. החיסכון בהשוואה לפתרונות מסחריים כמו Resilio Sync הוא 100% (עלות רישיון של 0 אירו לעומת 500+ אירו לשרת). עבור התקנה של 10 שרתים, החלפת עבודות rsync cron חוסכת כ-2,000 דולר לחודש בזמן הנדסי. אנו מבטיחים סנכרון אמין ללא אובדן קבצים. צור קשר לביקורת תשתית וקבל הצעה מסחרית תוך 1–2 ימים.







