مانیتورینگ سرویس در کلاستر ویندوز میکروسافت


#1

یکی از قبلیت های خیلی خوبی که زبیکس نسبت به سایر نرم افزارهای مانیتورینگ داره امکان مانیتور و کنترل برنامه های کاربردی روی سرور های کلاستر است .
در خصوص کلاستر ویندوز قبل از اشاره باید دو نکته را یادآور شویم . سیستم عامل ویندوز دو مدل کلاستر را پشتیبانی میکند .
1- Failover Cluster
2- Load balance Cluster

ردیف اول یک سرور به عنوان اکتیو و سرور دوم به عنوان Standby قرار گرفته و این دو سرور با یک IP دیگر Public میشوند . سرویسهایی که قرار است به صورت FailOver کار کنند روی این دو سرور نصب شده و باقی سیستم ها با آیپی پابلیش میتوانند از این سرور استفاده کنند .
در صورت بروز مشکل در سرور اصلی کلاستر به سرور دوم سوییچ نموده و کابران بدون متوجه شدن قطعی ( در حد یک ثانیه ) به سرور دوم متصل شده و سرویس را دریافت میکندد .

در پیاده سازی این سرویس ما از سرویسی استفاده کردیم که امکان کار کردن مستقیم با کلاستر را نداشت برای همین منظور نرم افزار مربوطه را به صورت مستقل روی هر دو سرور راه اندازی کرده و فعال نمودیم .
در حالت اصلی وقتی کلاستر اصلی در حال کار است سرویس دهی به کاربران به خوبی انجام میشود .میخواهیم وقتی سرویس ما دچار اختلال شد کلاستر به سرور دوم سوییچ کرده و ادامه سرویس دهی از طریق سرور دوم انجام پذیرد .
برای این راهکارسناریوی من به این صورت بود
1- کلاستر سرورفعال را در هر دو سرور بدست می آورم ( برای این منظور از کامند های PowerShell استفاده نموده و Hostname کلاستر فعال را بدست می آوردم ) این کار را با استفاده از USerParameter روی ZabbixAgent نصب شده در سرور اول انجام داده و پارامتر را به سمت سرور زبیکس میفرستم
2- وضعبت برنامه کاربردی را در هر دو سرور بدست آورده و مقدار آن را به سرور مانیتورینگ ارسال میکنم . ( با استفاده از دستور tasklist و فیلتر نمودن نام سرویس در صورت وجود سرویس مقدار یک و در صورت عدم وجود مقدار یک را برمیگردانم )
3- برای هر یک از مقادیر بدست آمده تریگر شرطی مینویسم که بتوانم تریگر را در صورت بروز مشکل بدست بیاورم . این تریگر به صورت زیر میباشد و در هر دو سرور نوشته میشود )
اگر سرور کلاستر اکتیو بود و وضعیت برنامه کاربردی من روی آن صفر بود تریگر فعال شود
4- در قسمت Action ها یک اکشن تعریف میکنم که روی تریگر فوق فعال شود در داخل این اکشن کارهایی که باید انجام شود را به ترتیب مینویسم
a. در سرور دوم سرویس مورد نظر را فعال کن
b. کلاستر را به سرور دوم انتقال بده
c. سرویس را در سرور اول غیر فعال کن
5- با افعال شدن تریگر اکشن فوق فعال شده و سرویس من در سرور Standby فعال شده و کلاستر به سرور دوم منتقل میشود .بنابر این تمامی ارتباطهای من به سرور دوم منتقل شده و کاربر متوجه بروز مشکل نمیشود ( زمان قطعی بسیار کوتاه میباشد که این زمان با توجه به Interval های 30 ثانیه ای که برای آن در نظر گرفته شده اصلا قابل احساس نیست
6- پیام هشدار به مدیر سیستم ارسال میشود تا نسبت به رفع مشکل اقدام شود .

نکات مهم :
1- در پیاده سازی این سناریو در مواردی به مشکل مواجه میشدم که عدم اجرای Powershell مربوطه در بازه Timeout سیستم بود که با افزودن آن تا حدی مشکل برطرق شد ( اما باز هم در بعضی زمانها دچار اختلال هستیم که هنوز راهکار بهتری برای رفع این مشکل پیدا نکرده ام )
2- در مواقعی که سرور اصلی به هر دلیل Crash کند کلاستر به سرور دوم منتقل میشود و برنامه کاربردی سرور دوم شروع به کار میکند . ( در این حالت مشکلی نداریم اما مانیتورینگ کلاستر به دلیل Lock شدن روی دیتای قدیمی از کار افتاده و نمیتواند وضعیت موجود را مانیتور کند ) این حالت با تعریف مقدار NoData تا حدی برطرف شده اما باز هم دچار اختلال های مقطعی هستیم .
3- خوشحال میشود دوستانی که در این خصوص تجربیات بهتری دارند بنده را راهنمایی کنند . پارامتر های استفاده شده جهت جمع آوری اطلاعات سرور و ارسال آن به زبیکس در زیر آورده شده است
برای بدست آوردن اکتیو کلاستر

UserParameter=appStatusReport,tasklist /fi “IMAGENAME eq myAPP.exe” 2>NUL | find /i /n “MyApp.exe” /c
UserParameter=ActiveClusterNodeTrue,powershell -NoProfile -ExecutionPolicy “RemoteSigned” -File “C:\zabbix\script\ShowClusterActiveNode.ps1” | findstr 1 | find /C “1”

Type ShowClusterActiveNode.ps1:
get-ClusterGroup “Cluster Group” | select OwnerNode | findstr “Server”

MyApp : نام برنامه سرویس دهی مورد استفاده
Server1 , Server2 نام دو سرور کلاستر


#2

سنارویویی که استفاده کردین خیلی خوبه. در واقع شما از زبیکس هم برای مانیتورینگ و هم برای راه اندازی HA برای سرویس هاتون استفاده کردین و این خیلی خوبه ولی همون طور که گفتین ممکنه با مشکلاتی هم مواجه بشین که البته حتما با زبیکس می شه راه کارهایی رو براش پیدا کرد. ولی من می خوام بهتون یه پیشنهاد دیگه بدم و اون اینه که اگر می تونید یه تستی با HAProxy روی سرویس هاتون بزنید.
این سرویس یکی از بهترین و کاربردی ترین سرویس هایی هستش که برای HA کردن سرویس های دیگه می شه از اون استفاده کرد. فقط کافیه روی یه سرور لینوکسی راه اندازی بشه و بعد تحت شبکه سرویس های ویندوزی شما رو تحت نظر بگیره.
به خاطر اینکه HAProxy برای راه اندازی HA, Load balancing طراحی شده بنابراین شما کاملا دستتون بازه که هر طور که میخواید این ساختار رو تغییر بدین.

علاوه بر این می تونید از طریق زبیکس هم خود HAProxy رو مانیتور کنید و ببینید در هر لحظه کدوم یکی از Resourse هاتون فعاله.

برای اطلاعات بیشتر بد نیست به دو تا لینک زیر یه سری بزنید:


#3

سلام
ممنون از توجهتون
من قبلا HAProxy رو به عنوان سرور های LoadBalance استفاده کرده بودم . الان دیدم میشه به عنوان Failover هم استفاده کرد و سناریوی ان فرقی نداره . اما مسله که من باهاش مشکل دارم سرویس ویندوز هست .
اینکه چطوری به HAProxy بگم وقتی سرور اول من مشکل داره بیاد سرویس رو روی سرور اول Stop کنه و روی سرور دوم Start کنه . من چنین موردی رو ندیدم که HAProxy بتونه باهاش کار کنه .
نکته بعدی اینکه سرویس من روی دو سرور پشت HAProxy داره با یک سرور دیگه یک ارتباط از نوع Permanent برقرار میکنه و من نمیتونم به طور همزمان روی هر دو سرور خودم سرویس رو بالا بیارم چون ارتباطم با سرور بالا دستی دایما می افته. بنابر این امکان Start و Start کردن سرویس رو باید حتما از طریق HAProxy انجام بدم . همین کاری که الان با زبیکس انجام میدادم و به مشکل خوردم .
برای این سناریو راه حل دارید ؟

ممنون از اینکه وقت میذارین و جواب میدید. یک پیام خصوصی هم براتون فرستادم ممنون میشوم جواب بدید


#4

خواهش می کنم

البته روش دیگری که برای این کار استفاده میشه استفاده از ترکیب Pacemaker, Corosync هستش که دقیقا برای نیاز شما ساخته شده. یعنی با استفاده از اون این امکان برای شما وجود داره بتونید در هر لحظه یک سرویس رو در حالت Start داشته باشید. ولی نکته اینجاست که من این سرویس رو به دفعات روی سرورهای لینوکسی و یونیکسی استفاده کردم و نمی دونم که آیا نسخه ویندوزی داره یا نه؟

البته الان در حال بررسی این هستم که آیا می شه با استفاده از HAProxy هم سناریویی شبیه به اونی که شما می خواهید رو ایجاد کرد یا نه. در صورتی که به جواب رسیدم حتما در ادامه براتون می فرستم.

:wink: