آموزش صفر تا صد بکاپ خودکار از دیتابیس یک سرور لینوکس
توی این آموزش هرچیزی که برای بکاپ گرفتن از دیتابیس یک سرور لینوکس لازمه رو توضیح میدم تا بتونید سریع و بدون دردسر از سرورتون بکاپ بگیرید
سلام. من جواد ادیب هستم و این اولین نوشته من در وبسایت #مسترادیب به نشانی MrAdib.com هست. طی روزهای اخیر که مصادف با عید ۱۴۰۰ بود، مشکلاتی برای زیرساخت #ابرآروان پیش اومد و حمله هکرها منجر به صدمه دیدن سرورهای #رایانش_ابری آروان شد و حواشی بسیاری رو در پی داشت.
اما در این میان مهمترین مسالهای که نظرم رو جلب کرد اینکه تعداد زیادی از کسب و کارها از سرورها و دیتابیسهای خودشون هیچ نسخه پشتیبانی نداشتند و از دسترس خارج شدن سرورهاشون منجر به قطع سرویس اونها شد. سرویسهایی که بعضی از اونها مشتریان قابل توجهی داشتند و این موضوع رو عجیبتر میکرد. الان حدود یک هفته از این اتفاق میگذره و هنوز برخی نتونستن حتی سایت خودشون رو مجدد راهاندازی کنند و معلوم نیست این ماجرا تا کی ادامه خواهد داشت!
این خطر #جیبرس رو هم تهدید کرد و شب قبل از بروز حادثه یه قطعی حدود ۵ ساعتی رو تجربه کردیم. بعد از گذشت حدود ۲ ساعت با وجود اینکه آروان گفت مشکل موقتی است و بزودی برطرف میشه، وقتی دیدم مشکل جدی بهنظر میرسه یک سرور جدید ستاپ کردم و سایت جیبرس رو روی این سرور جدید دوباره راهاندازی کردم. لازم به ذکر هست که ما برای مدیریت کدها از #گیت استفاده میکنیم و سایت جیبرس رو بهگونهای طراحی کردیم که صفحات اول در شرایط بحران مثل این مورد، بدون نیاز به اتصال به دیتابیس نمایش داده میشه و این حداقل از شدت فشار در ساعات اولیه حادثه کم میکنه.
بخاطر گستردگی سرویس جیبرس ما سرورهای متعددی برای کارهای مختلف داریم و به دلیل این پیچیدگی در زیرساخت، چند هفته پیش از بروز این حادثه، #معماری جدید شبکه زیرساخت جیبرس رو طراحی کرده بودم ولی از اونجایی که پیادهسازی اون زمان زیادی میبرد اجرای اون رو به بازه چند ماه آینده موکول کرده بودم. این اتفاق تلنگری به ما بود که ممکنه مساله ادامه داشته باشه و در این صورت خسارات بیشتری به ما وارد خواهد شد و این شروع استرس ما بود تا اینکه متاسفانه فردا شب اتفاقی که نباید رخ داد.
طی این مدت، روز و شبم شده بود انتقال و پیادهسازی معماری جدید زیرساخت جیبرس و خوشبختانه الان که در حال نوشتن این مقاله هستم کامل پیادهسازی شد و امیدوارم بتونم یه خواب راحت داشته باشم:)
با توجه به شرایط پیش اومده و خطری که جیبرس رو هم تهدید کرد، تصمیم گرفتن تغییراتی در سیستم #بکاپ جیبرس بوجود بیارم و اون رو قویتر کنم تا در بحرانهای اینچنینی کمتر #آسیب ببینیم. در کنار اون جدا از تمام داستانهای پیش اومده یک راهنمای سریع بکاپ از دیتابیس توی #گیتهاب منتشر کردم تا به کسانی که در حال انتقال و راهاندازی مجدد هستن کمک کنم تا اینبار از ابتدا به فکر نسخه پشتیبان باشند. این مقاله در تکمیل اون آموزش قبلی است و بزودی مقالهای جدید برای بکاپگرفتن از همه چیز در یک سرور لینوکس منتشر خواهم کرد. بکاپ خودکار از فایلها، تنظیمات و #دیتابیس از یک سرور به چندین #سرور پشتیبان.
همچنین لازمه بدونید ما برای دیتابیس میتونیم دونوع بکاپ داشته باشید. ما درباره بکاپ در بازه زمانی مثلا ساعتی، روزانه و ماهیانه داریم صحبت میکنیم که سادهتر قابل پیادهسازی هست و وجودش برای هر سروری الزامی است. بکاپ زنده از دیتابیس یا #ریپلیکیشن در دیتابیس نیاز خاصتری بوده و در آینده در مقالهای مجزا در اینباره توضیح خواهم داد.
بکاپ خودکار از مایاسکیوال MySQL
با طی کردن مراحل زیر میتونید یاد بگیرید که چطور از دیتابیس مایاسکیوال #MySQL خودتون بکاپ بگیرید و اون رو به یک مکان امن خارج از سرور فعلی منتقل کنید. توصیه میشه نسخه بکاپ برای شرایط بحران حداقل ۲۰۰ کیلومتر از نسخه اصلی فاصله داشته باشه. پس بهتره اون رو در یک دیتاسنتر دیگه ترجیحا در یک شهر دیگه نگهدارید.
ساخت یوزر دیتابیس با دسترسی فقط خواندن برای بکاپگیری
وارد سرور خودتون بشید و با یوزری که دارید وارد مایاسکیو ال بشید. ما فرض میگیریم که یوزر دیتابیس شما روت هست. مراحل زیر رو به ترتیب انجام بدید. توجه کنید که اگه روی سرور خودتون پیاچپیمایادمین #phpmyadmin ریختید نیازی به این کارهای سخت(!) نیست و کافیه از طریق رابط کاربری یوزر رو بسازید.
از طریق محیط دستوری MySQL و کامندلاین
۱. دستور زیر رو بزنید تا یوزر روت وارد بشید. اگه یوزر دیگهای دارید اون رو وارد کنید.
sudo mysql -u root -p
۲. دستور زیر یه یوزر به نام dumper با پسورد PUT_YOUR_PASSWORD_HERE میسازه. یوزر و پسورد رو به دلخواه خودتون تغییر بدید
CREATE USER 'dumper'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PUT_YOUR_PASSWORD_HERE';
۳. دسترسی خواندن، پروسس و قفل کردن جداول رو به این یوزر بدید. توجه کنید اگه اسم یوزر رو توی دستور بالا تغییر دادید توی پایینی هم تغییر رو اعمال کنید.
GRANT SELECT, PROCESS, LOCK TABLES ON *.* TO 'dumper'@'localhost';
۴. کد زیر رو بزنید تا سطوح دسترسی تنظیم شده اعمال بشه
flush privileges;
۵. از محیط اسکیوال خارج بشید
exit;
روش آسان از طریق phpmyadmin
ذخیرهکردن اطلاعات یوزر و پسورد برای بکاپگیری خودکار
حالا که یوزر جدید ساختین بهتره که اطلاعات اون رو ذخیره کنید تا نیازی نباشه که یوزر و پسورد رو توی کامند هربار پاس بدیم. دستور زیر رو بزنید تا فایل تنظیمات عمومی مایاسکیوال باز بشه
sudo nano ~/.my.cnf
حالا کافیه سه خط زیر رو توش کپی کنید. طبیعیه که یوزر و پسورد رو اگه (لطفا تغییرش بدید!) تغییر دادید اینجا هم باید مقدار جایگزین شده رو بزارید
[mysqldump]
user=dumper
password=PUT_YOUR_PASSWORD_HERE
برای ذخیره کردن و خروج از این فایل کافیه ctrl + x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید.
بکاپ گرفتن از دیتابیس
حالا که یوزر مورد نظرمون رو ساختیم، با یه دستور یک خطی میتونیم از همه دیتابیسهایی که روی این سرور داریم بکاپ بگیریم. از اونجایی که رمز رو هم ذخیره کردیم هیچی نمیپرسه و توی آدرسی که بهش دادیم ساخت بکاپ رو شروع میکنه که بسته به حجم دیتابیس کمی طول میکشه
بکاپ از یک دیتابیس خاص
mysqldump -v --column-statistics=0 --quick --single-transaction YOUR_DATABASE_NAME > /home/backup-$(date +%Y%m%d-%H%M%S).sql
بکاپ از همه دیتابیسها
mysqldump -v --column-statistics=0 --quick --single-transaction --all-databases > backup-$(date +%Y%m%d-%H%M%S).sql
بکاپ از همه دیتابیسها و فشردهسازی
برای دیتابیس نمونهای که روی این سیستم دارم بکاپ عادی از دیتابیسها ۱.۷ گیگابایت فضا اشغال کرد. در حالی که فشردهسازی حجم اون رو ۷۰ مگابایت کاهش داد. برای بکاپ بهدلیل جلوگیری از هدر رفتن بیدلیل فضا توصیه میشه که از مدل فشردهشده استفاده کنید.
mysqldump -v --column-statistics=0 --quick --single-transaction --all-databases | gzip > backup-$(date +%Y%m%d-%H%M%S).sql.gz
ارسال فایلهای بکاپ به یک سرور جدید
بکاپ گرفته شده در این سرور امن نیست. چون با از دسترس خارج شدن این سرور ما بکاپ خودمون رو از دست خواهیم داد. پس بهتره اون رو به یک سرور دیگه یا محلی مناسب انتقال بدیم. برای این کار در لینوکس میتونید از دستور rsync استفاده کنیم. اگه از اوبونتو استفاده میکنید که بهصورت پیشفرض نصب هست ولی در برخی از توزیعهای لینوکس لازمه که نصبش کنید که از طریق دستور زیر میتونید اون رو نصب کنید
apt-get install rsync
چون میخوایم تنظیم رو بهگونهای انجام بدیم که خودکار بکاپ ارسال بشه لازمه که اطلاعات دسترسی به سرور بکاپ(سرور مقصد یا B) رو توی سرور اصلی (سرور دیتابیس یا A) ذخیره کنیم. از اونجایی که استفاده از رمز ایمن نیست، پس یه کلید SSH میخوایم بسازیم. پس توی سرور اصلی دستور زیر رو بزنید. دو سه تا سوال میپرسه که میتونید با فشردن اینتر از اونها بگذرید.
ssh-keygen
حالا وقتشه که یکبار رمز رو وارد کنیم تا ذخیره بشه. پس دستور زیر رو بزنید تا به سرور A اجازه بدیم به سرور B دسترسی داشته باشه. لازم به ذکر هست که خوبه یه یوزر ساده و بدون دسترسی خاص توی سرور B بسازید و از اون استفاده کنید. ما اینجا برای سادهتر شدن آموزش از یوزر روت استفاده کردیم. همچنین آیپی 1.2.3.4 رو با آیپی سرور خودتون جایگزین کنید.
ssh-copy-id root@1.2.3.4
بعد از وارد کردن دستور بالا، اگه اولین باره باید yes رو بزنید و بعدش ازتون رمز این یوزر توی سرور B رو میخواد که وارد کنید. حالا سرور A بدون رمز میتونه به سرور B وصل بشه.
نمونه استفاده از دستور rsync
دستور زیر از پورت ssh 22 برای انتقال آدرس اول یا مبدا به آدرس دوم یا مقصد استفاده میکنه. فلگهای استفاده شده که بعد از دستور لیست شدن بهترتیب a مربوط به حالت آرشیو، v مربوط به نمایش جزئیات روند انتقال، r مربوط به انتقال زیرپوشهها، t مربوط به حفظ کردن تاریخ ویرایش فایلهاست.
rsync -avrt --delete --rsh='ssh -p 22' /home/backup-file.sql /target_server/path/
طبق پیشنهاد آقای احمد رفیعی، بهتره که دستور rsync رو توی سرور مقصد اجرا کنید که بسته به مدل پیادهسازی شما و اگه سرور اصلی دسترسی مستقیم به اینترنت رو داره میشه از این مدل استفاده کرد. البته توجه داشته باشید که اگر نفوذ به سرور شما رخ بده و هکر دسترسی پیدا کنه، در هر دو صورت امکان خرابکاری در بکاپ وجود داره و این روش برای چنین حالتی بهینه نشده است. در این حالت باید جای آدرسها رو باهم تغییر بدید شبیه به نمونه کد زیر خواهید داشت. همچنین لازمه این دستور rsync رو در سرور بکاپ در یک کرونجاب قرار بدید تا بهصورت منظم نسبت به تهیه بکاپ اقدام کنه
rsync -avrt --delete /primary_server/home/backup-file.sql /home/backup/
ایجاد یک فایل برای انجام بکاپ و انتقال با هم
برای اینکه روند بکاپ گرفتن خودکار بشه لازمه که فایلی برای انجام این دستوران با هم بسازیم پس دستور زیر رو وارد میکنیم تا ادیتور باز بشه
sudo nano /home/mysql-auto-backup/backup.sh
حالا هر خط از کدهای زیر رو کپی کرده و توی این فایل قرار میدیم. خطا اول اسم فایل رو تنظیم میکنه که برای اینکه فایلها تکراری نباشه تاریخ و ساعت رو به اسم فایل اضافه کردم
FILENAME=backup-$(date +%Y%m%d-%H%M%S).sql.gz
خط زیر از همه دیتابیسها بکاپ میگیره و اون رو فشرده کرده و توی فایلی که بالا اسمش رو ساختیم قرار میده
mysqldump --column-statistics=0 --quick --single-transaction --all-databases | gzip > /home/mysql-auto-backup/$FILENAME
خط زیر هم فایل ساخته شده رو به آدرس سرور مدنظرمون منتقل میکنه
rsync -avrt --delete /home/mysql-auto-backup/$FILENAME root@1.2.3.4:/home/mysql-auto-backup/
برای ذخیره کردن و خروج از این فایل کافیه ctrl + x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید. الان با هر بار فراخوانی این فایل تمام چیزهایی که برای بکاپ از دیتابیس لازم داریم با هم اجرا میشن
تنظیم کرونجاب برای اجرای بکاپ در بازه زمانی
به مرحله آخر رسیدیم. فایل ما آماده شده و تنها کافیه که اون رو به کرونجاب معرفی کنیم تا در بازه زمانیای که خودمون تنظیم کردیم اجرا بشه. دستور زیر رو بزنید تا فایل کرونجاب باز بشه
nano /etc/crontab
حالا کافیه خط زیر رو کپی کرده و توی این فایل قرار بدید. این خط بهمعنی اجرای اسکریپت ما در هر یک ساعت هست. اگر بازه زمانی دیگری مدنظر شماست میتونید با مراجعه به این سایت اون رو بسازید و جایگزین کنید
0 * * * * root sh /home/mysql-auto-backup/backup.sh >/dev/null 2>&1
برای ذخیره کردن و خروج از این فایل کافیه ctrl + x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید.
تلاش کردم که آموزش بالا ساده باشه تا کمک کوچکی به شما برای بکاپگیری خودکار و جلوگیری از صدمه دیدن کسب و کارتون کرده باشم. ولی از اونجایی که احساس کردم همین هم شاید سخت باشه این رو ارتقا دادم و یه اسکریپت آماده ساختم تا بتونید راحتتر از اینها بکاپ بگیرید. بزودی آموزش استفاده از اون اسکرپیت خودکار bash رو هم مینویسم و اینجا هم معرفی خواهم کرد.