Wednesday, April 9, 2014

WebLogic Clustered Env:

WebLogic  Clustered Env:

Corporate ေတြရဲ႕ web application ေတာ္ေတာ္မ်ားမ်ားဟာ Clustered Environment မွာထားၾကတယ္။

Clustering အေၾကာင္းေျပာေနရင္ ရွည္လ်ားေထြျပားကုန္မယ္။ အၾကမ္းဖ်င္းကေတာ႔ Availability ျမင္႔ေအာင္ၾကပါတာပါ။ Weblogic မွာေတာ႔ Managed Server  အေနနဲ႕လုပ္ၾကပါတယ္။ App1 ကို အရင္စ။ cluster ထဲသြင္းထား။ ေနာက္ထပ္ App2 ကုိစ Cluster ထဲသြင္း။  cluster နဲ႕မွန္မွန္ကန္ကန္ေလးတက္လာတဲ႔ server ေတြမွာဆို
 
အဲဒီ BEA 000102 ေလးေတြ႕ရလိမ္႔မယ္။ အဲဒီ IP နဲ႕ Port ေနာက္မွာ Clusters 2 ခုရိွတယ္ေပါ႔။ App1 နဲ႕ App2 ကို Node ေတြလုိ႕လည္းေခၚတယ္။ ဒါက အလြယ္ဆံုး ဥပမာေျပာတာ။

မ်ားေသာအားျဖင္႔ေတာ႔ Load Balancer Hardware/software/Plug-in တစ္ခုခု ေရွ႕နားကေန ခံထားေလ႔ရိွတယ္။ အဲဒါမွမဟုတ္ရင္လည္း အလကားလုပ္ထားသလိုျဖစ္ကုန္မွာကိုး။

ၾကံဳေလ႔ၾကံဳထရိွတဲ႔ ျပႆနာသံုးေလးခုအေၾကာင္းေျပာၾကရေအာင္။ ပထမဆံုးက cluster လုပ္ထားရင္ session ကို share ရမယ္။ မဟုတ္ရင္ ပထမ request က App1 ေၾကာင္႔၊ ဒုတိယ request က App2 ေရာက္ေတြျဖစ္ကုန္ရင္ Session Timeout ေတြျဖစ္ေစႏုိင္တယ္။

Load Balancer က App ကို တုိက္ရုိက္လႊဲလိုက္တာေတာ႔မဟုတ္ဘူး။ App ေတြရဲ႕ အေပၚမွာ Web ရိွဦးမယ္။ Balancer က Web ရဲ႕ အေပၚမွာရိွရမယ္။ အဲဒီလုိထားၾကတယ္။

ဒုတိယတစ္ခု သတိထားရမွာက session ကို share ပါျပီတဲ႔။ session ထဲကို ထည္႕လုိက္တဲ႔ bean ေတြက serializable ျဖစ္ရမယ္။ အဲဒါမွမဟုတ္ရင္ အဆင္မေျပဘူး။ Clustered Env မွာ Serialized မလုပ္ထားတဲ႔ object ေတြ ဒြတ္ခေရာက္ကုန္မယ္။ Good Practice ကေတာ႔ Object မွန္သမွ် Base object တစ္ခုကို extends လုပ္ခိုင္းထားျပီး၊ အဲဒီ base Object ကို serializable interface implements လုပ္လုိက္ရင္ ေနာက္လာေနာက္သားေတြ စိတ္ေအးရတယ္။

ေနာက္တစ္ခုကေတာ႔ ဂြစာေတြ။ third party plug-in ေတြက တစ္ခ်က္တစ္ခ်က္ serialized လုပ္လုိ႕မရတာရိွတယ္။ အဲဒီ lib ေတြပါလာရင္ ေစာေစာစီးစီး ေျပာင္းသံုးလုိ႕ရတုန္း ေျပာင္းသံုးထားလုိက္။မဟုတ္ရင္ ေနာက္မွာ ဒုကၡေသခ်ာေပါက္ေပးလိမ္႔မယ္။

အခုလက္ရိွလုပ္ေနတဲ႔ project အေဟာင္းတစ္ခုမွာ user ကို active ျဖစ္ေနလား၊ မျဖစ္ေနလားကို log-in လုပ္ကတည္းက user ID နဲ႕ session ID ကို persist လုပ္ထားလုိက္ျပီး၊ ျပန္ျပန္စစ္တာမ်ိဳး။ ဆာဗာတစ္လံုးထဲဆိုရင္ ဘာမွမျဖစ္ဘူး။ Load Balancer ကို sticky session လုပ္ထားရင္လည္း အဆင္ေျပတယ္။(သို႕ေသာ္ မေကာင္းဘူး။ std: အရလည္း မလုပ္သင္႔တာေတြရိွတယ္။) session ID ကို ျပန္သံုးတဲ႔အခါမွာ session.getSessionID() method နဲ႕သံုးထားတာေတြ႕တယ္။ အဲဒီမွာ ျပႆနာအၾကီးၾကီးရိွတယ္။ cluster ေတြမွာ session ထဲမွာ သိမ္းထားတဲ႔ Java Object ေတြကို replicate လုပ္တာမွန္ေပမယ္႔၊ session ID ႏွစ္ခုဟာ somehow identical ျဖစ္မေနတာေတြ႕တယ္။ အဲဒီမွာ logical error ျဖစ္ကုန္ျပီး၊ users မွန္သမွ် session timeout ၾကေလသတည္းျဖစ္ကုန္တယ္။ အရင္က အလုပ္မလုပ္တဲ႔ load balancer က သူ႕ဟာသူ ၂ ႏွစ္ေလာက္ပ်က္ေနတုန္းက အေကာင္းပဲ။ သူအလုပ္စလုပ္တာနဲ႕ အဲဒီျပႆနာေပၚလာတယ္။ ေနာက္ေတာ႔ session ID ကို user Obj ထဲေပါင္းထည္႕ထားျပီး အဲဒီ user Obj ကို session ထဲျပန္ထည္႕ထားလုိက္မွေအးသြားတယ္။ Obj ေတြက cluster မွာ replicate-if-cluster ဆိုတဲ႔ parameter on ထားလုိက္ရင္ အဆင္ေျပတယ္။ weblogic.xml မွာျပင္ရတယ္။

အခုကိစၥေတြဟာ ဖတ္ထားရင္ လြယ္လြယ္သိတယ္။ ကုိယ္တုိင္ၾကံဳမွဆုိရင္ ရြာလည္တတ္တယ္။ အထူးသျဖင္႔ Production Environment လိုမ်ိဳး Clustered Env မရိွရင္သာေတာင္ခက္တယ္။ အဲဒီ Setup Local မွာလုပ္တာကိုေတာ႔ ေနာက္ထပ္ post တစ္ခုမွာ ေရးလုိက္ပါဦးမယ္။

Regards,
Zero

Ref:http://docs.oracle.com/cd/E13222_01/wls/docs103/webapp/weblogic_xml.html#wp1071982