آموزش همگام‌سازی دوطرفه فایل‌ها بین دو سرور با استفاده از Unison

در این آموزش، یاد می‌گیریم که چطور دایرکتوری خاصی را بین دو سرور لینوکسی به صورت دوطرفه (bi-directional sync) همگام‌سازی کنیم؛ به‌طوری که اگر فایلی در هر یک از سرورها ایجاد یا تغییر کند، به سرور دیگر نیز منتقل شود.به طور مثال سینک کردن دایرکتوری های ویس ها در سرور های HA که نیازمند داشتن ویس ها در هر دو سرور هستیم ( در صورتی که امکان راه اندازی san storage نداریم )

معایب روش‌های همگام‌سازی با Unison

  • تاخیر در همگام‌سازی: اگر همگام‌سازی به‌صورت دوره‌ای (مثلاً با cron) انجام شود، ممکن است فایل‌ها با چند دقیقه تأخیر در سرور دوم ظاهر شوند. (قابل بهبود با lsyncd یا روش‌های sync لحظه‌ای)
  • تعارض (Conflict) بین فایل‌ها: اگر همزمان در دو سرور فایل‌هایی با نام مشابه ایجاد یا ویرایش شوند، ابزارهایی مثل Unison ممکن است دچار conflict شوند و نیاز به مداخله دستی داشته باشند.
  • افزایش مصرف شبکه: همگام‌سازی دوطرفه باعث افزایش ترافیک شبکه می‌شود، به‌ویژه اگر فایل‌ها حجیم باشند (مثل فایل‌های صوتی).
  • نیاز به امنیت بالا در اتصال SSH: به دلیل اتصال دائمی و خودکار بین سرورها، در صورت ضعف در تنظیمات امنیتی SSH ممکن است خطر دسترسی غیرمجاز وجود داشته باشد.
  • عدم تطابق با معماری‌های HA واقعی: در سناریوهای High Availability واقعی معمولاً از ساختارهای اشتراک‌گذاری مانند NFS یا SAN استفاده می‌شود، نه از روش‌های همگام‌سازی دستی بین سرورها.

اطلاعات سرور های دو طرف :

سرور نام IP Address
Server A my-boy 192.192.192.100
Server B my-girl 192.192.192.101

مرحله ۱: نصب Unison روی هر دو سرور

sudo apt update
sudo apt install unison -y

مرحله ۲: تنظیم SSH بدون رمز (passwordless)

روی سرور A (my-boy):

ssh-keygen

(فقط Enter بزن، پسورد نزن)


سپس کلید را به سرور B ارسال می کنیم:

ssh-copy-id hamid@192.192.192.101

اگر انتقال با موفقیت انجام شود باید خروجی زیر رو به شما نشان دهد و بدون زدن پسورد بتوانید به سرور B متصل شوید:

نکته : اگر می‌خوای از سمت B هم این کار رو انجام بدی (برای سینک دوطرفه از B به A)، همون مراحل رو روی سرور B تکرار کن.

مرحله ۳: اجرای دستور Unison برای سینک دوطرفه

روی سرور A (my-boy):

unison /home/hamid ssh://hamid@192.192.192.101//home/hamid -auto -batch

روی سرور B (my-girl) : ( اگر مراحل 1 و 2 انجام داده شده!!)

unison /home/hamid ssh://hamid@192.192.192.100//home/hamid -auto -batch

گزینه‌ها:

  • -auto → اجرای خودکار
  • -batch → بدون تأیید دستی

مرحله ۴: اجرای دوره‌ای با cron

اگر بخوای هر ۵ دقیقه یکبار این سینک انجام بشه:

روی سرور A:

crontab -e

و مقدار زیر را وارد کنید:

*/5 * * * * unison /home/hamid ssh://hamid@192.192.192.101//home/hamid -auto -batch > /dev/null 2>&1

روی سرور B هم مقدار زیر را :

*/5 * * * * unison /home/hamid ssh://hamid@192.192.192.100//home/hamid -auto -batch > /dev/null

تست نهایی

روی سرور A (my-boy):

echo "sync test from my-boy" > /home/hamid/test.txt

بعد از اجرای cron یا اجرای دستی unison، فایل روی سرور B هم ظاهر میشه و با گرفتن دستور ls میتوانید محتوای انتقال داده شده رو مشاهده کنید .

اگر فقط روی یک سرور sync رو تنظیم کنیم چی میشه؟

فرض کن:

  • فقط روی سرور A → B داریم sync می‌کنیم.
  • وقتی HA failover می‌کنه و سرور B فعال میشه، همه ویس‌ها درسته.
  • اما وقتی سیستم برمی‌گرده روی سرور A، فایل‌هایی که روی B ساخته شدن، برنمی‌گردن به A چون A هیچ sync نمی‌کنه!
    نتیجه: sync باید دوطرفه باشه. یعنی هم A → B و هم B → A فعال باشه.

با تشکر از اینکه این آموزش را مطالعه کردید :folded_hands: