یک مدیر سیستمِ دیگر!

علاقه مند به ماشین، انسان و ماده

هاست اشتراکی و بک آپ ساده کار راه انداز

بدون دیدگاه

در یکی از پروژه های اخیرم که نیازمند یک سازوکار پشتیبان گیری ساده و سریع بودم که باید این اهداف رو اجرا میکرد:

  • پشتیبان گیری از پایگاه داده پروژه که اینجا MySQL نسخه 5.7 داریم و موتور InnoDB
  • پشتیبان گیری از فایل های تولید شده توسط مدیران برنامه که اینجا فقط Image داریم.

داده هایی که پشتیبان گیری میشن رو چطور ذخیره کردم؟

خیلی راحت توی دو تا اکانت DropBox آپلود و نگه داری میشه.

اما چطور پشتیبان گیری انجام میشه؟

  • ابتدا از کل پایگاه داده Dump گرفته میشه، که چون اصلا حجیم نیست پس مشکلی در پرفورمنس نداریم. فقط مسئله ای که وجود داره بحث Consistency هستش که با یک راهکار MySQL ای در موتورهای InnoDB میشه حلش کرد. چه راهکاری؟ کامند رو بخونید و بعد هرجاش نامفهوم بود براتون سعی کنین جستجو کنین و متوجه منظورم میشین. کامندی که برای این بخش اجرا میشه بدین شکل هست که ابتدا mysqldump از کل پایگاه داده با شروع یک Transaction بکآپ میگیره. و در نهایت با pipe کردن خروجی به برنامه gzip اون رو فشرده میکنه و در یک فایل ذخیره میکنه.

/usr/bin/mysqldump --user='USERNAME' --password='PASSWORD' --host='localhost' --single-transaction --skip-lock-tables DBNAME | gzip > /home/username/backup_files/db_backup.sql.gz

  • مرحله بعد شروع میکنم ساختن فایل zip از دایرکتوری static files هامون که اینجا فقط یک عالمه تصویرن. switch هایی که به برنامه zip پاس دادم علتش این بود که هم بره پوشه های داخلی رو نسبت به اونجایی که من گفتم بگرده یا اصطلاحا به صورت بازگشتی همه چیزها رو از اون نقطه شروع بگیره و فشرده کنه‌ (بخش r-) و هم این که اگر با zip کار کرده باشین به صورت کلی ساختار فولدر بندی رو هم ذخیره میکنه که با بخش j- میتونیم جلوشو بگیریم و فقط تصاویرمونو داشته باشیم:

/usr/bin/zip -j -r /home/username/backup_files/static_files.zip /home/username/public_html/uploads/images

  • مرحله بعد شروع میکنم به ساختن یک فایل شامل دو فایل فشرده قبلی؛ یعنی فایل فشرده شده پایگاه داده و فایل فشرده شده فایل ها داخل یک فایل:

/usr/bin/zip -j -r /home/username/backup_files/res.zip /home/username/backup_files/static_files.zip /home/username/backup_files/db_backup.sql.gz

  • و در نهایت هم با یک اسکریپت PHP شروع میکنم به ارسال فایل ها به دو اکانت مختلف DropBox بدین صورت:

/usr/bin/ea-php73 -q /home/username/backup_files/final_backup/app.php

اما اسکریپت php من به چه صورته:

به همین سادگی و راحتی با کتابخونه kunalvarma05/dropbox-php-sdk اطلاعاتو میفرستم دراپ باکس

و در نهایت همه این ها با یک Cron Job ساده به صورت ساعتی (* * * * 0) اجرا میشه و ارسال میشه.

میتونیم همه این ها رو داخل یک فایل bash بزاریم یا این که صرفا به عنوان یک سری کامند Cron Job پاس بدیم و با دستور && ترتیب منطقی اجراشونو پیاده کنیم.

آیا این پاسخگوی نیاز من هست؟

اگر پروژه کوچیکی دارین که حجم داده هاش زیر ۵۰ ۶۰ گیگابایت باشه احتمالا بتونه موقتا کار کنه ولی اگر Scale پروژه تون رو به رشده باید به فکر ایجاد سازوکار های بهتری باشید. چه در سطح پایگاه داده چه در سطح فایل های مختلف و پراکنده برنامه. از ابزارهای خوب پشتیبان گیری مثل Restic تا ایجاد سازوکارهای Master-Slave در پایگاه داده ها برای پشتیبان گیری های شبانه روزی بدون تاثیرات پرفورمنسی و صدها راه حل خوب و بد دیگه که باید از متخصصان SystemAdmin و DBA ها و … در تیمتون بپرسین !



برچسب‌ها:

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *