کلاستر (Cluster) در حقیقت مجموعه سرورهایی هستند که هر کدام میتواند نقش اصلی را بازی کند و این سرورها به گونه ای تنظیم و تعریف میشوند تا در مواقع اضطراری بتوانند نقش یکدیگر را ایفا کنند و در حقیقت در دسترس بودن منابع را به میزان حداکثر ممکن میرسانند. بدین گونه که در مواقع بروز هر گونه مشکلی در سرور اصلی (خاموش شدن و ...) بدون هیچ گونه packet lost از سرور اصلی، سرور بک آپ به سرعت جایگزین شود و در این میان هیچ گونه دیتایی از بین نرود، در حقیقت میتوان گفت در لحظه sync کامل بین سرورها صورت پذیرد.
در این پست قصد داریم نحوه cluster کردن 2 سرور لینوکسی الستیکس با تنها یک کارت شبکه (روی هر سرور) و با استفاده از DRBD و Heartbeat را به صورت کامل با جزئیات آموزش دهیم.
DRBD چیست ؟
DRBD به block device هایی گفته میشود که به عنوان یک building block برای تشکیل high availability (HA) cluster طراحی شده اند. و برای انجام آن از Mirror کردن کل یک block device از طریق یک شبکه اختصاص یافته صورت میگیرد. DRBD را در حقیقت به عنوان شبکه بر اساس raid-1 میتوان فرض کرد.
در تصویر بالا 2 مربع نارنجی نمایشگر 2 سروری هستند که یک HA cluster را تشکیل میدهند. هر کدام از آنها شامل component های معمولی یک Linux TM Kernel همانند file system, buffer cache, disk scheduler, disk drivers, TCP/IP stack و network interface card (NIC) driver میباشند.
فلش های سیاه رنگ نشان دهنده ی جریان data بین این component ها می باشد.
فلش های نارنجی بیانگر جریان data یی هستند که DRBD mirror نشان میدهد و در حقیقت همان data ی سرویس Highly Available هستند که از Node فعال کلاستر (HA Cluster) به Node غیر فعال کلاستر (standby node) در جریانند.
در این پیاده سازی ما پارتیشن dev/sda3/ را با نام replica بعنوان پارتیشن DRBD syncronization ایجاد میکنیم. این پارتیشن تنها شامل فایل و دایرکتوری هایی (در حقیقت فایل ها و دایرکتوری های مربوطه در استریسک و الستیکس) هست که میخواهیم بین سرور primary (سرور اصلی) و secondary (سرور دوم) سینک (synchronize) شوند.
Heartbeat چه کاری انجام میدهد ؟
قسمت بالایی از این تصویر یک cluster را نشان میدهد که NODE سمت چپ در حال حاضر فعال است و همچنین ip address سرویسی که ماشین های client در حال حاضر با آن ارتباط دارند روی NOD سمت چپ میباشد.
سرویسی به همراه ip آدرسش میتواند به NODE دیگر و در هر زمانی انتقال یابد. حال ممکن است به دلیل یک نقصی node فعال باشد و یا به صورت دستی توسط ادمین سیستم انجام شود. قسمت پایینی تصویر یک کلاستر مشکل دار را نمایش میدهد. در عملیات HA به انتقال یک سرویس Failover گفته میشود همچنین عملیات معکوس یعنی برگشت به سرویس اول Failback نامیده میشود و هنگامی که این انتقال توسط یک administrator صورت پذیرد switchover نامیده میشود.
در این پیاده سازی ما از heartbeat برای مانیتور کردن حالت 2 سرور و همچنین در طول یک failover برای mount کردن پارتیشن مربوط به synchronization روی سرور ثانویه همچنین start up کردن ریسورس ها و اپلیکیشن های asterisk, mysql و http مورد استفاده قرار میگیرد. در طول عملیات failover آی پی ادرس معلق ما از سرور primary به سرور secondary انتقال خواهد یافت این ip در حقیقت باید برای ریجیستر شدن end point های SIP و دیگر device های voip (داخلی ها) مورد استفاده قرار گیرد.
مرور تجهیزات :
این سناریو به 2 سرور نیاز دارد و روی هر کدام یک اینترفیس شبکه و یک هارد ساتا مورد نیاز میباشد. شما ممکن است انواع متفاوتی از هارد دیسک (IDE, SCSI, etc) داشته باشید که بنابراین بعضی از این مراحل ممکن است نیاز به تغییر برای تاثیر بهتر در محیط تان داشته باشد.
نصب و تنظیم DRBD :
مراحل زیر باید روی هر 2 سرور primary و secondary اجرا شود :
1 - Boot کردن cd نصب elastix
2 - از منوی boot کلمه advanced را تایپ کنید و enter را فشار دهید.
3 - در طول مراحل عادی نصب گزینه manually partition hard drive را انتخاب کنید. و پارتیشن های زیر را با توجه به یک هارد sata 500G و 4 گیگ ram ایجاد کنید.
- یک پارتیشن ext3 برای روت (/) با 50 گیگ فضا و تحت عنوان sda1 ایجاد کنید. (10 درصد از فضای هارد خود را برای گسترش های آینده کنار بگذارید.
- پارتیشن swap با 8 گیگ فضا تحت عنوان sda2 بسازید. (فضای swap خود را 2 برابر سایز ram خود انتخاب کنید)
4 - سپس ip address های سرور ها را وارد کنید و همچنین نام localhost را به voipserver.drbd و voipbackup.drbd تغییر دهید. بقیه مراحل نصب به شیوه معمولی انجام میشود.
5 - بعد از اتمام نصب و boot شدن سیستم با استفاده از دستور زیر سیستم را upgrade کنید :
6 - ایجاد پارتیشنی که شامل اطلاعات replicate شده خواهد بود.
- افزودن پارتیشن جدید (کلید n را بزنید)
- انتخاب primary (کلید p را بزنید)
- انتخاب پارتیشن (عدد 3 را بزنید)
- enter را بزنید.
توجه : اگر 2 هارد با ظرفیت های متفاوت دارید دقت کنید که سایز پارتیشن 3 (سوم) حتما باید در هر 2 سرور یکسان باشد و گرنه از طریق DRBD عملیات sync انجام نخواهد شد. این کار را با در نظر گرفتن first sylinder و last cylinder با در نظر گرفتن آپشن +sizeM انجام دهید به طور مثال "+6048M" که باید روی هر دو سرور یکسان تعریف شود.
- کلید t را برای تغییر partition system ID فشار دهید.
- کلید شماره 3 را برای انتخاب پارتیشن شماره 3 بزنید.
- کد HEX 83 را برای type پارتیشن وارد کنید.
- w را برای ذخیره تغییرات بزنید.
در این مرحله هر 2 سرور را Restart میکنیم
7 - فرمت پارتیشن جدید :
8 - در اینجا filesystem را از disk که ساختیم حذف میکنیم :
9 - نصب DRBD, Heartbeat با استفاده از yum :
توجه : اگر تصادفا شما با DRBD83 مشکلی پیدا کردید از ورژن DRDB82 64bit استفاده کنید.
10 - برای اطمینان از host name درست و مربوط به ip توصیه میشود که به صورت دستی فایل /etc/hosts را برای map کردن host به ip صحیح آپدیت کنید و خطوط زیر را به آنها اضافه کنید.
11 - فایل /etc/drbd.conf روی voipserver.drbd ویرایش کنید. نمونه زیر را با توجه به نیاز خود تغییر دهید:
توجه : خطوط زیر به منظور کمک به سرورها برای حل split brain recovery مورد استفاده قرار میگیرند. split brain زمانیست که هر 2 سرور در mode primary هستند و نیاز است که بدانیم چگونه مسئله را رفع کنیم که چه کسی باید نقش primary و همچنین چه کسی نقش secondary را ایفا کند. (لغو یا قبول تغییرات ایجاد شده در primary ها)
12 - فایل کانفیگ /etc/drbd.conf را به سرور شماره 2 کپی کنید :
13 - محدوده meta data را روی دیسک قبل از start کردن سرویس drbd ، ایجاد و استارت کنید : (روی هر 2 سرور انجام شود)
14 - سرویس drbd را روی هر 2 تا node استارت کنید :
15 - بررسی کنید که هر 2 سرور secondary باشند :
16 - همانطور که میبینید هر 2 تا node در حال حاضر secondary هستند که normal میباشد. ما باید تصمیم بگیریم که کدام node به عنوان primary یا اولیه (voipserver.drbd) عمل کند و اولین full sync بین هر دو node آغاز خواهد شد.با اجرای دستور زیر در سرور voipserver.drbd علاوه بر عملیات sync کامل، در حقیقت سرور را به مد primary هم میبریم:
17 - بعد از اجرای دستور منتظر بمانید تا عملیات syncronization کامل شود (بعد از تکمیل عملیات sync دقیقا مینویسد که سینک به پایان رسیده ) :
نکته : دقت کنید اگر عملیات sync با موفقیت انجام نشود وقتی نقش سرور را با دستور "drbdadm role r0" بررسی کنیم در سرور اول نتیجه ی Primary/Unknown وهمچنین در سرور بک آپ Secondary/Unknown مشاهده میشود.
18 - بعد از تکمیل مرحله بالا اکنون میتوانیم /dev/drbd0 را فرمت کنیم و آن را روی voipserver.drbd مانت (mount) کنیم :
19 - اکنون با اجرای دستور زیر نقش سرور را میتوانیم تشخیص دهیم :
در سرور primary باید جواب زیر برگردد :
Primary/Secondary
20 - اکنون تمام دایرکتوری هایی که میخواهیم بین 2 سرور sync شوند به پارتیشن جدیدمان کپی خواهیم کرد. دایرکتوری های اصلی را حذف و سپس symbolic link ها را برای جایگزین کردن آنها روی voipserver.drbd ایجاد میکنیم :
21 - سرویس های mysqld, asterisk و httpd را روی voipserver.drbd متوقف (stop) میکنیم :
22 - در این مرحله بعد از اطمینان از استاپ شدن سرویس ها ، به صورت دستی به سرور 2 سوییچ میکنیم :
قبل از آن در سرور اول (voipserver.drbd) پارتیشن را unmount میکنیم و سرور را به مد secondary میبریم:
توجه : دستور بالا برای چک کردن اینکه آیا اطلاعات روی هر 2 سرور replicate می شوند یا نه مورد استفاده قرار میگیرد. شما باید تمامی اطلاعات replicate شده را در سرور 2 دقیقا شبیه به اطلاعات در سرور اول مشاهده کنید.
این دستور را با ترمینال فیزیکی login شده اجرا نکنید و از ssh استفاده کنید در غیر اینصورت فولدر /replica به دلایلی unmount نخواهد شد همچنین مطمئن باشید که در پوشه replica نیستید. "cd /" را تایپ کنید.(همانظور که ما بعد از کپی دایرکتوری ها به مسیر (/) اسلش cd کردیم)
اکنون به سرور voipbackup.drbd سوییچ میکنیم و :
23 - وضعیت سرور voipbackup.drbd را بررسی کنید تا ببینید این بار سرور دوم در مد primary قرار گرفته : (primary/secondary)
24 - روی سرور primary که در حال حاضر سرور voipbackup.drbd می باشد دستور df -h را اجرا کنید تا مطمئن شوید که پارتیشن /dev/drbd0 مانت (mount) شده و در حال استفاده میباشد :
توجه : در همین لحظه این دستور را در سرور اصلی voipserver.drbd هم اجرا کنید ولی نباید پارتیشن /dev/drbd0 نمایش داده شود (مگر اینکه در mode primary باشد):
25 - اکنون که سرور voipbackup.drbd در مد primary هست شروع به حذف و لینک مسیر ها روی آن خواهیم کرد :
26 - سرویس های mysql, asterisk و httpd را روی voipbackup.drbd متوقف (stop) میکنیم :
27 - اکنون به سرور اول برمیگردیم :
قبل از آن در سرور دوم (voipbackup.drbd) پارتیشن را unmount میکنیم و سرور را به مد secondary میبریم:
اکنون به voipserver.drbd سوییچ میکنیم و آن را به مد primary میبریم :
28 - اکنون drbd در حال کار است ... مطمئن شویم که همیشه کار خواهد کرد :
تنظیمات Heartbeat :
29 - به خاطر داشته باشید هر سرویس boot up روی هر 2 سرور را stop کنید که باید توسط heartbeat کنترل شوند. این سرویس ها توسط heartbeat روی سروری که تحت کنترل هست مدیریت میشوند :
30 - اکنون فایل etc/ha.d/ha.cf/ را روی voipserver.drbd ایجاد میکنیم وخطوط زیر را در آن کپی میکنیم :
توجه : من گزینه auto_failback را off تعریف کردم این گزینه برای من مناسب تر است دستور زیر را روی سرور دوم برای switch back کردن اجرا کنید :
31 - همچنین فایل etc/ha.d/authkeys/ روی سرور voipserver.drbd ایجاد کنید و خطوط زیر را در آن وارد کنید :
نکته : sha1 همان موردی است که در فایل drbd.conf قرار دادیم و MySecret هم صرفا یک پسورد می باشد.
32 - پرمیژن های فایل etc/ha.d/authkeys/ را روی voipserver.drbd تغییر دهید :
33 - فایل etc/ha.d/haresources/ را روی voipserver.drbd ویرایش کنید. (شامل 2 خط است !!!! اما فرمت آن بسیار مهم است). آدرس های email را در خط دوم با email خودتان جایگزین کنید :
نکته : قسمت "IPaddr::172.16.16.220/24/eth0/172.16.16.255" مربوط به تنظیمات آی پی معلق می باشد که باید با فرمت "IPaddr::ip/subnet/eth0/broadcast" باشد.
34 - سرویس heartbeat را روی voipserver.drbd استارت (start) میکنیم :
35 - اکنون فایل های ha.cf, authkeys و haresources را به سرور voipbackup.drbd کپی میکنیم :
سرویس heartbeat را روی سرور بک آپ استارت میکنیم :
36 - تنظیمات مربوط به start شدن heartbeat به هنگام boot شدن در هر 2 سرور انجام میدهیم :
37 - وضعیت سرور voipserver.drbd را بررسی میکنیم : (primary/secondary)
38 - دستور df -h را روی سرور primary اجرا میکنیم تا مطمئن شویم پارتیشن /dev/drbd0 مانت (mount) و در حال استفاده میباشد :
39 - اکنون کار خود را با ایجاد یک داخلی sip یا هر چیزی درون اینترفیس وب الستیکس تست میکنیم بعد از ان سرور primary را shutdown میکنیم در حالی که ping مستمر آی پی 172.16.16.220 (آی پی آدرس معلق/مشترک) ما را مطمئن میسازد که همچنان ارتباط برقرار است و چیزی از دست نرفته.
تغییری دیگری در سرور secondary دهید و سپس primary را دوباره روشن کنید همه تغییرات باید در سرور اول لحاظ شود.
توجه ویژه : تمام تغییرات ایجاد شده در فایل های استریسک باید تنها از طریق اینترفیس وب انجام شود. بعد از اتمام کلاستر سعی در upgrade ورژن elastix نکنید که این کار فایل های مربوط به خود را دوباره write خواهد کرد و لینک های درون دایرکتوری /replica لغو خواهند شد.
Troubleshooting :
در این پست قصد داریم نحوه cluster کردن 2 سرور لینوکسی الستیکس با تنها یک کارت شبکه (روی هر سرور) و با استفاده از DRBD و Heartbeat را به صورت کامل با جزئیات آموزش دهیم.
DRBD چیست ؟
DRBD به block device هایی گفته میشود که به عنوان یک building block برای تشکیل high availability (HA) cluster طراحی شده اند. و برای انجام آن از Mirror کردن کل یک block device از طریق یک شبکه اختصاص یافته صورت میگیرد. DRBD را در حقیقت به عنوان شبکه بر اساس raid-1 میتوان فرض کرد.
در تصویر بالا 2 مربع نارنجی نمایشگر 2 سروری هستند که یک HA cluster را تشکیل میدهند. هر کدام از آنها شامل component های معمولی یک Linux TM Kernel همانند file system, buffer cache, disk scheduler, disk drivers, TCP/IP stack و network interface card (NIC) driver میباشند.
فلش های سیاه رنگ نشان دهنده ی جریان data بین این component ها می باشد.
فلش های نارنجی بیانگر جریان data یی هستند که DRBD mirror نشان میدهد و در حقیقت همان data ی سرویس Highly Available هستند که از Node فعال کلاستر (HA Cluster) به Node غیر فعال کلاستر (standby node) در جریانند.
در این پیاده سازی ما پارتیشن dev/sda3/ را با نام replica بعنوان پارتیشن DRBD syncronization ایجاد میکنیم. این پارتیشن تنها شامل فایل و دایرکتوری هایی (در حقیقت فایل ها و دایرکتوری های مربوطه در استریسک و الستیکس) هست که میخواهیم بین سرور primary (سرور اصلی) و secondary (سرور دوم) سینک (synchronize) شوند.
Heartbeat چه کاری انجام میدهد ؟
قسمت بالایی از این تصویر یک cluster را نشان میدهد که NODE سمت چپ در حال حاضر فعال است و همچنین ip address سرویسی که ماشین های client در حال حاضر با آن ارتباط دارند روی NOD سمت چپ میباشد.
سرویسی به همراه ip آدرسش میتواند به NODE دیگر و در هر زمانی انتقال یابد. حال ممکن است به دلیل یک نقصی node فعال باشد و یا به صورت دستی توسط ادمین سیستم انجام شود. قسمت پایینی تصویر یک کلاستر مشکل دار را نمایش میدهد. در عملیات HA به انتقال یک سرویس Failover گفته میشود همچنین عملیات معکوس یعنی برگشت به سرویس اول Failback نامیده میشود و هنگامی که این انتقال توسط یک administrator صورت پذیرد switchover نامیده میشود.
در این پیاده سازی ما از heartbeat برای مانیتور کردن حالت 2 سرور و همچنین در طول یک failover برای mount کردن پارتیشن مربوط به synchronization روی سرور ثانویه همچنین start up کردن ریسورس ها و اپلیکیشن های asterisk, mysql و http مورد استفاده قرار میگیرد. در طول عملیات failover آی پی ادرس معلق ما از سرور primary به سرور secondary انتقال خواهد یافت این ip در حقیقت باید برای ریجیستر شدن end point های SIP و دیگر device های voip (داخلی ها) مورد استفاده قرار گیرد.
مرور تجهیزات :
این سناریو به 2 سرور نیاز دارد و روی هر کدام یک اینترفیس شبکه و یک هارد ساتا مورد نیاز میباشد. شما ممکن است انواع متفاوتی از هارد دیسک (IDE, SCSI, etc) داشته باشید که بنابراین بعضی از این مراحل ممکن است نیاز به تغییر برای تاثیر بهتر در محیط تان داشته باشد.
نصب و تنظیم DRBD :
مراحل زیر باید روی هر 2 سرور primary و secondary اجرا شود :
1 - Boot کردن cd نصب elastix
2 - از منوی boot کلمه advanced را تایپ کنید و enter را فشار دهید.
3 - در طول مراحل عادی نصب گزینه manually partition hard drive را انتخاب کنید. و پارتیشن های زیر را با توجه به یک هارد sata 500G و 4 گیگ ram ایجاد کنید.
- یک پارتیشن ext3 برای روت (/) با 50 گیگ فضا و تحت عنوان sda1 ایجاد کنید. (10 درصد از فضای هارد خود را برای گسترش های آینده کنار بگذارید.
- پارتیشن swap با 8 گیگ فضا تحت عنوان sda2 بسازید. (فضای swap خود را 2 برابر سایز ram خود انتخاب کنید)
4 - سپس ip address های سرور ها را وارد کنید و همچنین نام localhost را به voipserver.drbd و voipbackup.drbd تغییر دهید. بقیه مراحل نصب به شیوه معمولی انجام میشود.
5 - بعد از اتمام نصب و boot شدن سیستم با استفاده از دستور زیر سیستم را upgrade کنید :
کد PHP:
yum -y update
کد PHP:
fdisk /dev/sda
- انتخاب primary (کلید p را بزنید)
- انتخاب پارتیشن (عدد 3 را بزنید)
- enter را بزنید.
توجه : اگر 2 هارد با ظرفیت های متفاوت دارید دقت کنید که سایز پارتیشن 3 (سوم) حتما باید در هر 2 سرور یکسان باشد و گرنه از طریق DRBD عملیات sync انجام نخواهد شد. این کار را با در نظر گرفتن first sylinder و last cylinder با در نظر گرفتن آپشن +sizeM انجام دهید به طور مثال "+6048M" که باید روی هر دو سرور یکسان تعریف شود.
- کلید t را برای تغییر partition system ID فشار دهید.
- کلید شماره 3 را برای انتخاب پارتیشن شماره 3 بزنید.
- کد HEX 83 را برای type پارتیشن وارد کنید.
- w را برای ذخیره تغییرات بزنید.
کد PHP:
[root@voipserver.drbd ~]# fdisk /dev/sda
The number of cylinders for this disk is set to 1044.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (512-1044, default 512):
Using default value 512
Last cylinder or +size or +sizeM or +sizeK (512-1044, default 1044):
Using default value 1044
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 83
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@voipserver.drbd~]# reboot
در این مرحله هر 2 سرور را Restart میکنیم
7 - فرمت پارتیشن جدید :
کد PHP:
mke2fs -j /dev/sda3
8 - در اینجا filesystem را از disk که ساختیم حذف میکنیم :
کد PHP:
dd if=/dev/zero bs=1M count=500 of=/dev/sda3; sync
9 - نصب DRBD, Heartbeat با استفاده از yum :
کد PHP:
yum install heartbeat drbd83 kmod-drbd83
10 - برای اطمینان از host name درست و مربوط به ip توصیه میشود که به صورت دستی فایل /etc/hosts را برای map کردن host به ip صحیح آپدیت کنید و خطوط زیر را به آنها اضافه کنید.
کد PHP:
172.16.16.225 voipserver.drbd
172.16.16.224 voipbackup.drbd
11 - فایل /etc/drbd.conf روی voipserver.drbd ویرایش کنید. نمونه زیر را با توجه به نیاز خود تغییر دهید:
کد PHP:
global { usage-count no; }
resource r0 {
protocol C;
startup { wfc-timeout 10; degr-wfc-timeout 30; } #change timers to your need
disk { on-io-error detach; } # or panic, ...
net {
after-sb-0pri discard-least-changes;
after-sb-1pri discard-secondary;
after-sb-2pri call-pri-lost-after-sb;
cram-hmac-alg "sha1";
shared-secret "Cent0Sru!3z";
}
syncer { rate 5M; }
on voipserver.drbd {
device /dev/drbd0;
disk /dev/sda3;
address 172.16.16.225:7788;
meta-disk internal;
}
on voipbackup.drbd {
device /dev/drbd0;
disk /dev/sda3;
address 172.16.16.224:7788;
meta-disk internal;
}
}
توجه : خطوط زیر به منظور کمک به سرورها برای حل split brain recovery مورد استفاده قرار میگیرند. split brain زمانیست که هر 2 سرور در mode primary هستند و نیاز است که بدانیم چگونه مسئله را رفع کنیم که چه کسی باید نقش primary و همچنین چه کسی نقش secondary را ایفا کند. (لغو یا قبول تغییرات ایجاد شده در primary ها)
کد PHP:
after-sb-0pri discard-least-changes;
after-sb-1pri discard-secondary;
after-sb-2pri call-pri-lost-after-sb;
12 - فایل کانفیگ /etc/drbd.conf را به سرور شماره 2 کپی کنید :
کد PHP:
scp /etc/drbd.conf root@voipbackup.drbd:/etc/
13 - محدوده meta data را روی دیسک قبل از start کردن سرویس drbd ، ایجاد و استارت کنید : (روی هر 2 سرور انجام شود)
کد PHP:
drbdadm create-md r0
14 - سرویس drbd را روی هر 2 تا node استارت کنید :
کد PHP:
service drbd start
15 - بررسی کنید که هر 2 سرور secondary باشند :
کد PHP:
cat /proc/drbd
16 - همانطور که میبینید هر 2 تا node در حال حاضر secondary هستند که normal میباشد. ما باید تصمیم بگیریم که کدام node به عنوان primary یا اولیه (voipserver.drbd) عمل کند و اولین full sync بین هر دو node آغاز خواهد شد.با اجرای دستور زیر در سرور voipserver.drbd علاوه بر عملیات sync کامل، در حقیقت سرور را به مد primary هم میبریم:
کد PHP:
drbdadm -- --overwrite-data-of-peer primary r0
17 - بعد از اجرای دستور منتظر بمانید تا عملیات syncronization کامل شود (بعد از تکمیل عملیات sync دقیقا مینویسد که سینک به پایان رسیده ) :
کد PHP:
watch -n 1 cat /proc/drbd
نکته : دقت کنید اگر عملیات sync با موفقیت انجام نشود وقتی نقش سرور را با دستور "drbdadm role r0" بررسی کنیم در سرور اول نتیجه ی Primary/Unknown وهمچنین در سرور بک آپ Secondary/Unknown مشاهده میشود.
18 - بعد از تکمیل مرحله بالا اکنون میتوانیم /dev/drbd0 را فرمت کنیم و آن را روی voipserver.drbd مانت (mount) کنیم :
کد PHP:
mkfs.ext3 /dev/drbd0
mkdir /replica
mount /dev/drbd0 /replica
19 - اکنون با اجرای دستور زیر نقش سرور را میتوانیم تشخیص دهیم :
کد PHP:
drbdadm role r0
Primary/Secondary
20 - اکنون تمام دایرکتوری هایی که میخواهیم بین 2 سرور sync شوند به پارتیشن جدیدمان کپی خواهیم کرد. دایرکتوری های اصلی را حذف و سپس symbolic link ها را برای جایگزین کردن آنها روی voipserver.drbd ایجاد میکنیم :
کد PHP:
cd /replica
amportal chown
tar -zcvf etc-asterisk.tgz /etc/asterisk
tar -zxvf etc-asterisk.tgz
tar -zcvf var-lib-asterisk.tgz /var/lib/asterisk
tar -zxvf var-lib-asterisk.tgz
tar -zcvf usr-lib-asterisk.tgz /usr/lib/asterisk/
tar -zcvf var-www.tgz /var/www/
tar -zxvf usr-lib-asterisk.tgz
tar -zcvf var-spool-asterisk.tgz /var/spool/asterisk/
tar -zxvf var-spool-asterisk.tgz
tar -zcvf var-lib-mysql.tgz /var/lib/mysql/
tar -zxvf var-lib-mysql.tgz
tar -zcvf var-log-asterisk.tgz /var/log/asterisk/
tar -zxvf var-log-asterisk.tgz
tar -zxvf var-www.tgz
rm -rf /etc/asterisk
rm -rf /var/lib/asterisk
rm -rf /usr/lib/asterisk/
rm -rf /var/spool/asterisk
rm -rf /var/www
rm -rf /var/lib/mysql/
rm -rf /var/log/asterisk/
ln -s /replica/etc/asterisk/ /etc/asterisk
ln -s /replica/var/lib/asterisk/ /var/lib/asterisk
ln -s /replica/usr/lib/asterisk/ /usr/lib/asterisk
ln -s /replica/var/spool/asterisk/ /var/spool/asterisk
ln -s /replica/var/lib/mysql/ /var/lib/mysql
ln -s /replica/var/log/asterisk/ /var/log/asterisk
ln -s /replica/var/www /var/www
cd /
21 - سرویس های mysqld, asterisk و httpd را روی voipserver.drbd متوقف (stop) میکنیم :
کد PHP:
service mysqld restart
service mysqld stop
service asterisk stop
service httpd stop
service elastix-updaterd stop
service elastix-portknock stop
22 - در این مرحله بعد از اطمینان از استاپ شدن سرویس ها ، به صورت دستی به سرور 2 سوییچ میکنیم :
قبل از آن در سرور اول (voipserver.drbd) پارتیشن را unmount میکنیم و سرور را به مد secondary میبریم:
کد PHP:
[root@voipserver.drbd ~]# umount /replica ; drbdadm secondary r0
این دستور را با ترمینال فیزیکی login شده اجرا نکنید و از ssh استفاده کنید در غیر اینصورت فولدر /replica به دلایلی unmount نخواهد شد همچنین مطمئن باشید که در پوشه replica نیستید. "cd /" را تایپ کنید.(همانظور که ما بعد از کپی دایرکتوری ها به مسیر (/) اسلش cd کردیم)
اکنون به سرور voipbackup.drbd سوییچ میکنیم و :
کد PHP:
[root@voipbackup.drbd ~]# mkdir /replica ; drbdadm primary r0 ; mount /dev/drbd0 /replica
[root@voipbackup.drbd ~]# ls /replica/
23 - وضعیت سرور voipbackup.drbd را بررسی کنید تا ببینید این بار سرور دوم در مد primary قرار گرفته : (primary/secondary)
کد PHP:
drbdadm role r0
24 - روی سرور primary که در حال حاضر سرور voipbackup.drbd می باشد دستور df -h را اجرا کنید تا مطمئن شوید که پارتیشن /dev/drbd0 مانت (mount) شده و در حال استفاده میباشد :
کد PHP:
[root@voipbackup.drbd ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.4G 2.6G 583M 82% /
tmpfs 243M 0 243M 0% /dev/shm
/dev/drbd0 4.1G 497M 3.4G 13% /replica
توجه : در همین لحظه این دستور را در سرور اصلی voipserver.drbd هم اجرا کنید ولی نباید پارتیشن /dev/drbd0 نمایش داده شود (مگر اینکه در mode primary باشد):
کد PHP:
[root@voipserver.drbd ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.4G 2.6G 567M 83% /
tmpfs 243M 0 243M 0% /dev/shm
You have new mail in /var/spool/mail/root
کد PHP:
rm -rf /etc/asterisk
rm -rf /var/lib/asterisk
rm -rf /usr/lib/asterisk/
rm -rf /var/spool/asterisk
rm -rf /var/lib/mysql/
rm -rf /var/log/asterisk/
rm -rf /var/www
ln -s /replica/etc/asterisk/ /etc/asterisk
ln -s /replica/var/lib/asterisk/ /var/lib/asterisk
ln -s /replica/usr/lib/asterisk/ /usr/lib/asterisk
ln -s /replica/var/spool/asterisk/ /var/spool/asterisk
ln -s /replica/var/lib/mysql/ /var/lib/mysql
ln -s /replica/var/log/asterisk/ /var/log/asterisk
ln -s /replica/var/www /var/www
26 - سرویس های mysql, asterisk و httpd را روی voipbackup.drbd متوقف (stop) میکنیم :
کد PHP:
service mysqld restart
service mysqld stop
service asterisk stop
service httpd stop
service elastix-updaterd stop
service elastix-portknock stop
27 - اکنون به سرور اول برمیگردیم :
قبل از آن در سرور دوم (voipbackup.drbd) پارتیشن را unmount میکنیم و سرور را به مد secondary میبریم:
کد PHP:
[root@voipbackup.drbd ~]# umount /replica/ ; drbdadm secondary r0
کد PHP:
[root@voipserver.drbd ~]# drbdadm primary r0 ; mount /dev/drbd0 /replica
کد PHP:
chkconfig drbd on
تنظیمات Heartbeat :
29 - به خاطر داشته باشید هر سرویس boot up روی هر 2 سرور را stop کنید که باید توسط heartbeat کنترل شوند. این سرویس ها توسط heartbeat روی سروری که تحت کنترل هست مدیریت میشوند :
کد PHP:
chkconfig asterisk off
chkconfig mysqld off
chkconfig httpd off
chkconfig elastix-updaterd off
chkconfig elastix-portknock off
service mysqld stop
service asterisk stop
service httpd stop
service elastix-portknock stop
service elastix-updaterd stop
30 - اکنون فایل etc/ha.d/ha.cf/ را روی voipserver.drbd ایجاد میکنیم وخطوط زیر را در آن کپی میکنیم :
کد PHP:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0
auto_failback off
node voipserver.drbd
node voipbackup.drbd
توجه : من گزینه auto_failback را off تعریف کردم این گزینه برای من مناسب تر است دستور زیر را روی سرور دوم برای switch back کردن اجرا کنید :
کد PHP:
sh /usr/lib/heartbeat/hb_takeover
31 - همچنین فایل etc/ha.d/authkeys/ روی سرور voipserver.drbd ایجاد کنید و خطوط زیر را در آن وارد کنید :
کد PHP:
auth 1
1 sha1 MySecret
32 - پرمیژن های فایل etc/ha.d/authkeys/ را روی voipserver.drbd تغییر دهید :
کد PHP:
chmod 600 /etc/ha.d/authkeys
33 - فایل etc/ha.d/haresources/ را روی voipserver.drbd ویرایش کنید. (شامل 2 خط است !!!! اما فرمت آن بسیار مهم است). آدرس های email را در خط دوم با email خودتان جایگزین کنید :
کد PHP:
voipserver.drbd drbddisk::r0 Filesystem::/dev/drbd0::/replica::ext3 IPaddr::172.16.16.220/24/eth0/172.16.16.255 mysqld asterisk httpd elastix-updaterd elastix-portknock
voipserver.drbd MailTo::support@linux-zone.org,support@linux-zone.org::DRBD/HA-ALERT
34 - سرویس heartbeat را روی voipserver.drbd استارت (start) میکنیم :
کد PHP:
service heartbeat start
35 - اکنون فایل های ha.cf, authkeys و haresources را به سرور voipbackup.drbd کپی میکنیم :
کد PHP:
[root@voipserver.drbd ~]# scp /etc/ha.d/ha.cf /etc/ha.d/authkeys /etc/ha.d/haresources root@voipbackup.drbd:/etc/ha.d/
کد PHP:
[root@voipbackup.drbd ~]# service heartbeat start
36 - تنظیمات مربوط به start شدن heartbeat به هنگام boot شدن در هر 2 سرور انجام میدهیم :
کد PHP:
chkconfig --add heartbeat
chkconfig heartbeat on
37 - وضعیت سرور voipserver.drbd را بررسی میکنیم : (primary/secondary)
کد PHP:
drbdadm role r0
38 - دستور df -h را روی سرور primary اجرا میکنیم تا مطمئن شویم پارتیشن /dev/drbd0 مانت (mount) و در حال استفاده میباشد :
کد PHP:
[root@voipserver.drbd ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.4G 2.6G 583M 82% /
tmpfs 243M 0 243M 0% /dev/shm
/dev/drbd0 4.1G 497M 3.4G 13% /replica
تغییری دیگری در سرور secondary دهید و سپس primary را دوباره روشن کنید همه تغییرات باید در سرور اول لحاظ شود.
توجه ویژه : تمام تغییرات ایجاد شده در فایل های استریسک باید تنها از طریق اینترفیس وب انجام شود. بعد از اتمام کلاستر سعی در upgrade ورژن elastix نکنید که این کار فایل های مربوط به خود را دوباره write خواهد کرد و لینک های درون دایرکتوری /replica لغو خواهند شد.
Troubleshooting :
کد PHP:
tcpdump –i eth0:0 –s 1500 –w captura.pcap #capture traffic
mv captura.pcap /var/www/html #move file to web for download
کامنت