چگونه از rsync برای همگام‌سازی دایرکتوری‌های Remote و Local روی یک VPS استفاده کنیم

Rsync که پایه و اساس remote sync است، یک ابزار برای همگام‌سازی فایل‌های Local و Remote است. با استفاده از این الگوریتم مقدار اطلاعات کپی شده تنها با حرکت بخش‌هایی از فایلهایی که تغییر کرده‌اند به حداقل می‌رسد. در این مقاله کاربردهای اساسی این ابزار سودمند را ارائه می‌دهیم. ما در این مثال‌ها از سرور مجازی Ubuntu 12.04 استفاده می‌کنیم اما شما می‌توانید از هر توزیع لینوکس استفاده کنید.

Rsync چیست؟

Rsync یک ابزار بسیار منعطف برای همگام‌سازی شبکه‌های فعال است. شما همچنین برای استفاده از این ابزار می‌توانید به پروتکل توسعه‌یافته شبکه مراجعه کنید.

هنگامی‌که ما در این مقاله به Rsyns رجوع می‌کنیم درواقع به سودمندی این ابزار اشاره می‌کنیم نه پروتکل.

با توجه به اینکه لینوکس و سیستم‌های Unix-like در همه جا حضور دارند و به عنوان یک ابزار دارای اسکریپت سیستم، محبوبیت بسیاری دارند باعث شده که این مورد در اکثر توزیع‌های لینوکس به صورت پیش‌فرض قرار داده شود.

Basic Syntax

سوئیچ‌های پایه‌ای Rsync بسیار ساده هستند و اجرای آن‌ها شبیه به ssh, scp, و cp است.

ما می‌خواهیم دو دایرکتوری برای تست ایجاد کنیم و با دستورات زیر برخی از فایل‌ها را تست کنیم:

cd ~ mkdir dir1 mkdir dir2 touch dir1/file{1..100}

درحال حاضر ما یک دایرکتوری به نام dir1 با ۱۰۰ فایل خالی درون آن داریم.

ls dir1
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

ما همچنین یک دایرکتوری خالی به نام dir2 داریم.

برای یکی کردن محتویات dir1 به dir2 در همان سیستم دستور زیر را تایپ کنید:

rsync -r dir1/ dir2

گزینه r- بر ای تمامی زیرپوشه‌ها نیزعمل می‌کند و برای یکی کردن دایرکتوری لازم است.

همچنین می‌توانیم از سوئیچ a- به جای آن استفاده کنیم.

rsync -a dir1/ dir2

گزینه a- یک سوئیچ ترکیبی است.

این یک پایه برای archive و همگام‌سازی به صورت بازگشتی و حفظ لینک‌های نمادین، فایل‌های دستگاه و خاص، زمان ویرایش، گروه، مالک و سطح دسترسی است.

به همین دلیل معمولا از r- استفاده می‌شود و این چیزی است که معمولا شما می‌خواهید استفاده کنید.

یک نکته مهم:

ممکن است که متوجه شده باشید که یک / در پایان اولین آرگومان در دستورات بالا وجود دارد.

rsync -a dir1/ dir2

این کار لازم است و به معنی محتویات درون dir1 است.

در موارد جایگزین، بدون/باید مکان dir1، محتوی دایرکتوری درون dir2 باشد. به این‌صورت سلسله مراتبی ایجاد می‌شود که مانند زیر به نظر می‌رسد:

~/dir2/dir1/[files]

همیشه آرگومان‌ها را قبل از اجرای یک دستور rsync مجددا چک کنید.

Rsync با عبور از گزینه‌های n- یا dir- روش‌هایی برای انجام این کار فراهم می‌کند. سوئیچ v- برای دریافت خروجی مناسب است.

rsync -anv dir1/ dir2
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .

این خروجی را با خروجی که هنگام حذف / بدست می آورید مقایسه کنید.

rsync -anv dir1 dir2
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .

در این‎جا می‎بینید که دایرکتوری‌هایتان منتقل شدند.

چگونه از rsync برای همگام‌سازی یک Remote system استفاده کنیم؟

همگام‌سازی به یک Remote system بسیار واضح و بدیهی است اگر دسترسی SSH به یک remote machine داشته باشید و Rsync درهر دو سمت نصب شده باشد. اگر نیاز به راه‌اندازی کلید SSH دارید set up SSH keys را کلیک کنید.

هنگامی‌که شما دسترسی SSH بین دو ماشین دارید، می‌توانید قبل از remote computer با استفاده از syntax همگام سازی کنید ( توجه داشته باشید که ما می‌خواهیم دایرکتوری‌های واقعی را در این مورد انتقال دهیم، بنابراین / را حذف می کنیم).

rsync -a ~/dir1 username@remote_host:destination_directory

این کار Push عملیات نامیده می‌شود چون دایرکتوری را از یک سیستم Local به یک Remote سیستم فشار (Push) می‌دهد.

pull” عملیات مخالف با Push است. عمل Pull برای همگام‌سازی یک دایرکتوری از Remote سیستم به یک سیستم Local است. اگر dir1 به جای سیستم Local بر روی Remote سیستم قرار داشته باشد Syntax به صورت زیر است:

rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

مانند CP و ابزارهای مشابه، اولین آرگومان به عنوان مبدا و دومین آرگومان مقصد است.

گزینه‌های مفید برای Rsync

Rsync گزینه‌های بسیاری برای تغییر رفتار پیش‌فرض ارائه می‌کند. ما در حال حاضر در مورد بعضی از پرچم‌های ضروری گفتگو می‌کنیم.

اگر شما درحال انتقال فایل‌هایی هستید که فشرده شده نیستند، مانند فایل‌های متنی، می‌توانید با اضافه کردن گزینه z- فایل‌ها را فشرده کنید و انتقال را کاهش دهید.

rsync -az source destination

سوئیچ p- خیلی مفید است. این سوئیچ ترکیب سوئیچ‌های progress — و partial — است. اولین مورد پیشرفت انتقال را نشان می‌دهد و دومی به شما اجازه می‌دهد تا انتقال قطع شده را مجددا ارسال کنید.

rsync -azP source destination
sending incremental file list
./
file1
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#2, to-check=98/101)
file100
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#3, to-check=97/101)
file11
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#4, to-check=96/101)

اگر دستور را دوباره اجرا کنیم خروجی کوتاه‌تری خواهیم داشت چون هیچ تغییری ایجاد نشده است.

این مورد قابلیت rsync را بیان می‌کند که با استفاده از تاریخ تغییر فایل‌ها بتواند مشخص کند که آیا تغییراتی بر روی فایل‌ها اعمال شده است یا نه.

rsync -azP source destination

sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00

ما می‌توانیم زمان اصلاح را در برخی از فایل‌ها بروزرسانی کنیم و می‌بینیم که Rsync هوشمندانه فایل‌های تغییر یافته را مجددا کپی می‌کند.

touch dir1/file{1..10}

rsync -azP source destination
sending incremental file list
file1
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#2, to-check=98/101)
file2
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#3, to-check=87/101)
file3
۰ ۱۰۰% ۰٫۰۰kB/s 0:00:00 (xfer#4, to-check=76/101)
. . .

به منظور این‌که هر دو دایرکتوری که به درستی همگام شده را حفظ کنیم، اگر این فایل‌ها از منبع حذف شده باشند لازم است که فایل‌ها را از دایرکتوری مقصد حذف کنیم. Rsync بطور پیش‌فرض هیچ فایلی را از دایرکتوری مقصد حذف نمی‌کند.
ما می‌توانیم این رفتار را با گزینه delete – تغییر دهیم. قبل از استفاده از این گزینه از گزینه dry –run- استفاده کنید و این تست را برای آزمایش از دست دادن اطلاعات انجام دهید.

rsync -a --delete source destination

اگر مایل به حذف فایل‌های خاص یا دایرکتوری واقع در دایرکتوری که درحال همگام‌سازی آن هستید می‌توانید بعد از گزینه –exclude= آنها را در یک لیست با کاما از هم جدا کنید.

rsync -a --exclude=pattern_to_exclude source destination

اگر ما یک الگوی مشخص برای حذف کردن داشته باشیم، می‌توانیم برای فایل‌هایی که با الگوی متفاوت مطابق هستند با استفاده از گزینه –include= استثنا ایجاد کنیم.

rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

نتیجه

Rsync می‌تواند به سادگی فایل‌های شما را بر روی بستر شبکه منتقل کند و همچنین با قدرت بالا پوشه‌های موجود بر روی سیستم شما را همگام (sync) کند. انعطاف‌پذیری Rsync گزینه‌های خوبی برای عملیات بر روی فایل‌ها سطوح مختلف ایجاد می‌کند.