سرور پشتیبان برای یک وب اپلیکیشن – راهنمای جامع


در بخشهای قبلی این راهنما با روش راهاندازی سرورهای مختلف و همچنین تهیه طرحهای بازیابی برای موارد از کارافتادن هر یک از اجزا آشنا شدیم. همچنین دیدیم که باید برای این مجموعه از سرورهای خود یک سرور پشتیبان راهاندازی کنیم. در این بخش از Bacula به عنوان یک راهحل برای پشتیبانگیری استفاده میکنیم. مزایای استفاده از یک سیستم پشتیبانگیری صفر تا صد مانند Bacula این است که کنترل کاملی روی مراحل پشتیبانگیری و بازیابی در سطح تکتک فایلها خواهید داشت و همچنین میتوانید این مراحل پشتیبانگیری و بازیابی را بر اساس نیازهای خود زمانبندی کنید.
در این بخش از راهنمای جامع توزیع نهایی وب اپلیکیشنها، یک سرور Bacula برای نگهداری از فایلهای پشتیبان روزانه از موارد الزامی برای سرورهای تشکیلدهنده اپلیکیشن (db1T app1,app2,lb1) راهاندازی میکنیم. مراحل راهاندازی و تهیه طرحهای بازیابی برای این سرورها در بخشهای قبلی این راهنما معرفی شدهاند. در این بخش بر روی روش استفاده از Bacula برای ایجاد پشتیبانهایی برای یک استک LAMP متمرکز میشویم. همچنین از Percona XtraBackup برای ایجاد پشتیبانهای پایگاه داده MySQL استفاده میکنیم. در نهایت از rsync برای تهیه یک کپی از پشتیبانها روی یک سرور در دیتاسنتر ریموت استفاده میکنیم. بدین ترتیب دو سرور دیگر به مجموعه سرورهای ما اضافه میشوند: سرورهای Backups و remotebackups (که در دیتاسنتر دیگری قرار دارند)
نصب Bacula روی سرور Backups
ابتدا سرور Bacula را روی سرور Backups نصب کنید و سپس Bacula Director را پیکربندی نمایید. شما به نام این Director درزمان پیکربندی کلاینتهای Bacula روی سرورهایی که میخواهید پشتیبان بگیرید نیاز خواهید داشت.
دقت کنید که ما از RemoteFile pool برای همه کارهای پشتیبانگیری که تنظیم میکنیم استفاده خواهیم کرد. بدین ترتیب ممکن است پیش از ادامه لازم باشد برخی تنظیمات را تغییر دهیم.
نصب کلاینت Bacula روی هر سرور
روی هر سروری که میخواهید پشتیبان بگیرید (db1, app1, app2, and lb1) یک نسخه از کلاینت Bacula را نصب کنید. دقت کنید که ما به FileDaemon Name (معمولاً نام میزبانی به همراه «fd-» پایانی است) و Director Password (رمز عبوری که سرور Bacula برای اتصال به هر کلاینت استفاده خواهد کرد) از فایل bacula-fd.conf روی هر سرور نیاز داریم.
افزودن کلاینتهای Bacula به سرور پشتیبانگیری
در سرور Backups که سرور Bacula است برای هر سروری که کلاینت Bacula روی آن نصب شده است، یک Client Resource به فایل etc/bacula/conf.d/clients.conf/ اضافه میکنیم.
فایل clients.conf را باز کنید:
sudo vi /etc/bacula/conf.d/clients.conf
در این بخش نمونهای از تعریف منبع کلاینت برای سرور پایگاه داده (db1) ارائه شده است. توجه کنید که مقدار Name باید با نام منبع FileDaemon و Password باید با رمز عبور منبع Director روی سرور کلاینت مطابقت داشته باشد. این مقادیر را میتوانید برای هر سرور کلاینت Bacula در فایل /etc/bacula/bacula-fd.conf بیابید:
Client { Name = db1-fd Address = db1.nyc3.example.com FDPort = 9102 Catalog = MyCatalog Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46" # password for Remote FileDaemon File Retention = 30 days # 30 days Job Retention = 6 months # six months AutoPrune = yes # Prune expired Jobs/Files }
یک منبع کلاینت مشابه برای هر یک از سرورهای کلاینت باقی مانده Bacula ایجاد کنید. در مثال ما میبایست چهار منبع کلاینت وجود داشته باشند: db1-fd, app1-fd, app2-fd, و lb1-fd. بدین ترتیب Bacula Director روی سرور Backups طوری پیکربندی میشود که بتواند به کلاینت Bacula روی هر یک از سرورهای فوق دسترسی داشته باشد. فایل را ذخیره کرده و خارج شوید.
ایجاد پشتیبانهای داغ از پایگاه داده
برای اطمینان از این که پشتیبانهای یکپارچه و قابل استفادهای از پایگاه داده فعال خود تهیه کردهایم، میبایست دقت بسیار زیادی را معمول داریم. یک روش ساده و مؤثر برای ایجاد پشتیبانهای داغ از MySQL بهرهگیری از Percona XtraBackup است.
نصب Percona XtraBackup
ابتدا روی سرور پایگاه داده db1 بسته Percona XtraBackup را نصب و پیکربندی کنید.
ایجاد اسکریپت XtraBackup
Percona XtraBackup آماده ایجاد پشتیبانهای داغ از پایگاه داده MySQL است که در نهایت توسط Bacula پشتیبانگیری خواهند شد. ما سادهترین راهحل را تنظیم میکنیم یعنی یک اسکریپت bash و یک cron job راهاندازی میکنیم.
یک اسکریپت bash به نام run_extra_backup.sh در مسیر usr/local/bin/ ایجاد کنید:
sudo vi /usr/local/bin/run_xtrabackup.sh
اسکریپت زیر را به آن اضافه کنید. مطمئن شوید که نام کاربر و رمز عبور را با آنچه که هنگام نصب XtraBackup تنظیم کردهاید یکسان است:
#!/bin/bash # pre xtrabackup chown -R mysql: /var/lib/mysql find /var/lib/mysql -type d -exec chmod 770 "{}" \; # delete existing full backup rm -r /data/backups/full # xtrabackup create backup innobackupex --user=bkpuser --password=bkppassword --no-timestamp /data/backups/full # xtrabackup prepare backup innobackupex --apply-log /data/backups/full
فایل را ذخیره کرده و ببندید. این اسکریپت را با دسترسی superuser اجرا کنید تا پشتیبان موجود Xtrabackup در مسیر data/backups/full/ حذف شده و یک پشتیبان کامل جدید ایجاد شود. جزییات بیشتر در مورد ایجاد پشتیبان با xtrabackup را میتوانید در آموزشهای مرتبط با آن مشاهده کنید.
این اسکریپت را به حالت اجرایی در آورید:
sudo chmod +x /usr/local/bin/run_xtrabackup.sh
جهت پشتیبانگیری صحیح از پایگاه داده باید اسکریپت xtrabackup را پیش از این که Bacula تلاش کند تا از سرور پایگاه داده پشتیبان بگیرد اجرا و تکمیل کنید. راهحل مناسب بدین منظور پیکربندی job پشتیبانگیری Bacula برای اجرای اسکریپت به عنوان «pre-backup script» است؛ اما ما از یک cron job استفاده میکنیم تا کارها سادهتر باشند:
یک فایل پیکربندی cron (فایلهای موجود در مسیر etc/cron.d/ که به ریشه crontab اضافه میشوند) ایجاد کنید:
sudo vi /etc/cron.d/xtrabackup
cron job زیر را اضافه کنید:
30 22 * * * root/usr/local/bin/run_xtrabackup.sh
بدین ترتیب اسکریپت زمانبندی میشود تا هر روز ساعت 10:30 بعد از ظهر اجرا شود. دلیل انتخاب این زمان آن است که Bacula زمانبندی شده است تا ساعت 11:05 دقیقه بعد از ظهر اجرا شود که در ادامه آن را بررسی میکنیم. بدین ترتیب اسکریپت xtrabackup 35 دقیقه زمان خواهد داشت تا تکمیل شود. اینک که پشتیبانگیری داغ روی سرور پایگاه داده راهاندازی شد، میتوانیم نگاهی به FileSets در پشتیبان Bacula داشته باشیم.
پیکربندی Bacula FileSets
Bacula پشتیبانهایی از فایلهایی که در FileSet ها مشخص شدهاند تهیه میکند که با job های پشتیبانگیری که اجرا خواهند شد ارتباط دارند. در این بخش روش ایجاد FileSet ها را بررسی میکنیم که شامل پشتیبانهای مورد نیاز است که در بخش تهیه طرحهای بازیابی مورد بحث قرار دادیم. جزییات بیشتر در این مورد در آموزشهای اختصاصی Bacula در دسترس است. در سرور Backups فایل filesets.conf را باز کنید:
sudo vi /etc/bacula/conf.d/filesets.conf
FileSet سرور پایگاه داده
پشتیبانهای مورد نیاز برای سرور پایگاه داده بر اساس طرح بازیابی سرور پایگاه داده شامل موارد زیر هستند:
- پایگاه داده MySQL – یک نسخه پشتیبان به وسیله اسکریپت XtraBackup در مسیر data/backups/full روزانه در ساعت 10:30 بعد از ظهر ایجاد میشود.
- پیکربندی MySQL – در مسیر etc/mysql/ قرار دارد
همچنین اسکریپت usr/local/bin/run_xtrabackup.sh/ فایل cron مرتبط را استفاده میکنیم.
با توجه به پشتیبانهای مورد نیاز، این FileSet را به پیکربندی Bacula خود اضافه میکنیم:
FileSet { Name = "MySQL Database" Include { Options { signature = MD5 compression = GZIP } File = /data/backups File = /etc/mysql/my.cnf File = /usr/local/bin/run_xtrabackup.sh File = /etc/cron.d/xtrabackup } Exclude { File = /data/backups/exclude } }
اینک به تنظیم FileSet سرور اپلیکیشن میپردازیم.
FileSet سرور اپلیکیشن
پشتیبانهای مورد نیاز برای سرورهای اپلیکیشن مطابق طرح بازیابی سرور اپلیکیشن شامل موارد زیر هستند:
- فایلهای اپلیکیشن – که در مثال ما در مسیر var/www/html/ قرار دارند.
با توجه به پشتیبانهای مورد نیاز که قبلاً تشخیص دادهایم، FileSet «Apache DocumentRoot» را به پیکربندی Bacula خود اضافه میکنیم:
FileSet { Name = "Apache DocumentRoot" Include { Options { signature = MD5 compression = GZIP } File = /var/www/html } Exclude { File = /var/www/html/exclude } }
ممکن است بخواهید فایل پیکربندی پورتهای آپاچی را نیز استفاده کنید؛ اما این مورد به راحتی قابل جایگزینی است.
اینک به تهیه FileSet سرور توزیع بار میپردازیم.
FileSet سرور توزیع بار
پشتیبانهای مورد نیاز برای سرورهای توزیع بار بر اساس طرح بازیابی سرور توزیع بار شامل موارد زیر هستند:
- گواهی SSL (PEM) و فایلهای مرتبط – که در مثال ما در مسیر root/certs/ قرار دارند.
- فایل پیکربندی HAProxy - که در مسیر etc/haproxy/ قرار دارد.
با توجه به پشتیبانهای مورد نیازمان این FileSet «Apache DocumentRoot» را به پیکربندی Bacula خود اضافه میکنیم:
FileSet { Name = "SSL Certs and HAProxy Config" Include { Options { signature = MD5 compression = GZIP } File = /root/certs File = /etc/haproxy } Exclude { File = /root/exclude } }
فایل را ذخیره کرده و خارج شوید. اینک FileSet ها پیکربندی شدهاند. در ادامه job های پشتیبانگیری Bacula را که از این FileSet ها استفاده خواهند کرد ایجاد میکنیم.
ایجاد job های پشتیبانگیری Bacula
در این بخش job های پشتیبان Bacula را ایجاد کرده و پشتیبانهایی از سرورهای خود تهیه میکنیم. ابتدا یک فایل به نام jobs.conf در مسیر /etc/bacula/conf.d ایجاد کنید:
sudo vi /etc/bacula/conf.d/jobs.conf
Job پشتیبانگیری از سرور پایگاه داده
برای job پشتیبانگیری از سرور پایگاه داده یک فایل به نام «Backup db1» ایجاد میکنیم. نکته مهم این است که باید کلاینت (db1-fd) و FileSet (MySQL Database) صحیح را تعیین کنیم:
Job { Name = "Backup db1" JobDefs = "DefaultJob" Client = db1-fd Pool = RemoteFile FileSet="MySQL Database" }
اینک job های پشتیبانگیری از سرور اپلیکیشن را راهاندازی میکنیم.
job های پشتیبانگیری از سرور اپلیکیشن
در مورد سرورهای اپلیکیشن باید دو job پشتیبانگیری به نامهای «Backup app1» و «Backup app2» ایجاد کنیم. در این مورد نیز نکته مهم این است که کلاینت (app1-fd و app2-fd) و FileSet (Apache DocumentRoot) های صحیحی را تعیین نماییم.
Job برای app1
Job { Name = "Backup app1" JobDefs = "DefaultJob" Client = app1-fd Pool = RemoteFile FileSet="Apache DocumentRoot" }
Job برای app2
Job { Name = "Backup app2" JobDefs = "DefaultJob" Client = app2-fd Pool = RemoteFile FileSet="Apache DocumentRoot" }
در ادامه job پشتیبانگیری از سرور توزیع بار را تنظیم میکنیم.
job پشتیبانگیری سرور توزیع بار
در این مورد به یک job به نام «Backup lb1» نیاز داریم. نکته مهم این است که کلاینت (lb1-fd) و FileSet (Cert های SSL و پیکربندی HAProxy) صحیح را تعیین کنیم:
Job { Name = "Backup lb1" JobDefs = "DefaultJob" Client = lb1-fd Pool = RemoteFile FileSet="SSL Certs and HAProxy Config" }
فایل را ذخیره کرده و ببندید. در نهایت همه job های پشتیبانگیری پیکربندی شدهاند. گام نهایی ریاستارت کردن Bacula Director است.
ریاستارت کردن Bacula Director
روی سرور backups اقدام به ریاستارت کردن Bacula Director بکنید تا همه تغییرات اعمال شوند:
sudo service bacula-director restart
در این زمان باید اتصالها و job های پشتیبانگیری را تست کنید. همچنین باید با روش بازیابی پایگاه داده MySQL آشنا باشید.
بررسی زمانبندیهای Bacula
جدول زمانبندی پشتیبانهای Bacula را میتوان با تغییر دادن پیکربندی Bacula Director یعنی فایل (/etc/bacula/bacula-dir.conf) اصلاح کرد. همه job های پشتیبانگیری که ایجاد کردهایم از «DefaultJob» استفاده میکنند که آن نیز از زمانبندی «WeeklyCycle» بهره میگیرد. این زمانبندی به صورت زیر تعریف شده است:
- پشتیبانگیری کامل در نخستین یکشنبه هر ماه در ساعت 1:05 بعد از ظهر
- پشتیبانگیری تفاضلی در همه یکشنبهها در ساعت 11:05 بعد از ظهر
- پشتیبانهای افزایشی در روزهای دیگر یعنی دوشنبه تا شنبه در ساعت 11:05 بعد از ظهر
این تنظیمات را با مراجعه به کنسول Bacula و بررسی وضعیت Director میتوانید تست کنید. بدین ترتیب همه job های زمانبندی شما در خروجی ارائه میشوند:
Director Status — Scheduled Jobs
Scheduled Jobs: Level Type Pri Scheduled Name Volume =================================================================================== Incremental Backup 10 20-May-15 23:05 BackupLocalFiles MyVolume Incremental Backup 10 20-May-15 23:05 Backup lb1 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup app2 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup app1 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup db1 Remote-0002
در این بخش به راحتی میتوانید هر یک از job ها را تغییر داده یا مورد جدیدی را اضافه کنید. بهتر است زمانبندی سرورهای اپلیکیشن را طوری تغییر دهیم که در همان زمانی که اسکریپت Percona XtraBackup اجرا میشود (10:30 بعد از ظهر) آغاز شود. بدین ترتیب از ناهماهنگی بین پشتیبانهای پایگاه داده و اپلیکیشن جلوگیری میشود.
راهاندازی پشتیبانهای ریموت
اینک آماده هستیم تا یک سرور ریموت برای نگهداری کپیهایی از پشتیبانهای Bacula راهاندازی کنیم. این سرور ریموت باید از لحاظ جغرافیایی در منطقه دیگری قرار داشته باشد تا بدین ترتیب بتوانیم حتی در صورت وقوع فجایع زیستمحیطی در محل دیتاسنتر production خود یک رونوشت از پشتیبانهای حیاتی خود در اختیار داشته باشیم. در این مثال ما از یک دیتاسنتر در منطقه جغرافیایی متفاوت استفاده میکنیم.
یک روش ساده برای ارسال پشتیبانها از سرور backups به سرور remotebackups استفاده از کلیدهای SSH عمومی، rsync و cron است. در سرور remotebackups یک کاربر ایجاد میکنیم که برای ورود به rsync مورد استفاده قرار خواهد گرفت.
سپس در سرور backups یک دستور rsync مینویسیم که کپیهایی از دادههای پشتیبان Bacula (/bacula/backup) را به جایی در سرور remotebackups ارسال میکند. این دستور چیزی مانند مورد زیر خواهد بود:
rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup
دستور فوق را به یک اسکریپت مانند usr/local/bin/rsync_backups.sh/ اضافه میکنیم و آن را به حالت اجرایی در میآوریم. در نهایت باید یک cron job تنظیم کنیم که اسکریپت rsync_backups.sh را در زمانهایی که معمولاً پشتیبانگیری Bacula پایان میپذیرد به عنوان root اجرا کند. پس از این که همه این موارد را تنظیم کردید، یک رونوشت از پشتیبانهای Bacula روی سرور remotebackups در روز بعد حاضر خواهد بود.
ملاحظات دیگر
ما در مورد الزامات دیسک برای پشتیبانگیری صحبت نکردیم. بدیهی است که ابتدا باید فضای دیسک مورد نیاز برای ذخیره پشتیبانها تصمیمگیری شود و سپس زمانبندی پشتیبانها بر اساس نیازها و منابع موجود مورد بازبینی قرار گیرد.
علاوه بر ایجاد پشتیبان از سرورهای اپلیکیشن احتمالاً باید از همه سرورهای دیگر که در آینده به این مجموعه اضافه میشوند نیز پشتیبانگیری کنید. برای نمونه Bacula را باید پیکربندی کنیم تا پشتیبانهایی از سرور نظارت و سرورهای گزارشگیری متمرکز تهیه کند.
سخن پایانی
اینک پشتیبانهای روزانه از سرورهای اپلیکیشن خود داریم که یک کپی ریموت از آنها نیز تهیه میشود. باید اطمینان حاصل کنیم که میتوانیم این فایلها را بازیابی کنی و مراحل بازیابی دادهها را به طرحهای بازیابی اضافه کنیم. در بخش بعدی این راهنما به راهاندازی سرور نظارت برای مجموعه سرورهای production خود میپردازیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- ابزارها و راهکارهای مدیریت وبسایتها
- تنظیم سرورهای محیط توزیع نهایی (Production) برای وب اپلیکیشن — راهنمای مقدماتی
- مجموعه آموزشهای پایگاه داده و سیستم های مدیریت اطلاعات
- انتخاب پلتفرم مناسب برای ساخت اپلیکیشن — رایانه شخصی، وب، موبایل یا کراسپلتفرم
- آموزش پشتیبان گیری از بانک اطلاعاتی و تهیه فایل نصبی در C#
- مجموعه آمورشهای طراحی و برنامه نویسی وب
==