load balance בשרת

שיווקי

New member
load balance בשרת

שלום,

כאשר משתמשים ב-load balance ב-.net (שיש מספר שרתים שהמשתמש יכול לפעול מולם), ורוצים לטפל ב-session-ים של לקוחות - מה הבעיות שנתקלים ב-load balance ואיך ניתן לפתור אותן.
יש מונחים כ-session manager ו-pt-session - רציתי גם קצת הרחבה על המושגים, ואם הם באים כפיתרון לנ"ל.

תודה.
 

arik23m

New member
אתה רוצה לשמור על SESSION בין השרתים?

במילים פשוטות אתה רוצה שכאשר משתמש עשה לוגין למערכת הוא ישאר מחובר גם אם לפתע נפל השרת שאליו הוא עשה לוגין?
זו הדרישה שאתה אמור לבצע?
&nbsp
 

שיווקי

New member
קצת הבנה של מה מקובל ב-load balance

אם זה מה שמקובל ב-load balance, אז ה-session הואה-session בשרת שבו נמצא ה-load balancer, ואז זה ה-session שאני עובד מולו.
רק אם יש בשרתים האחרים שהם לא load balance התייחסות ל-sessions, אז ה-session של ה-load balance צריך לעבור לשרתים האחרים.

האם הטופלוגיה הנ"ל קיימת? אם כן - איך אני מממש אותה?

אם לא - מה מקובל לעשות שיש load balance.
(או שאם שרת אחד נופל - זה לא ממש משנה, ותלוי ברמה שה-load balance מטפל. אם רק בחלוקת עומסים, או גם ב-redaundancy? אם זה תלוי הגדרה של ה-load balancy - איך עושים זאת?)

תודה.
 

arik23m

New member
Load Balancer

Load Balancer כמו שאני מכיר אותו (ברמה של מתכנת ולא איש IT)
הוא רכיב חומרה דיי טיפש בדומה לנתב שאמור לנתב את התנועה בין שרתים בהתאם לעומסים עליהם
כמובן אם שרת א' לא זמין הוא יפנה את התנועה לשרת השני
המטרה היא להקל על הביצועים של אתר \ מערכת עקב ריבוי משתמשים.
ז"א אם עקב ריבוי משתמשים האתר קורס או לא זמין או מאתחל את הAPPLICATION POOL לעתים קרובות כדאי לחשוב על LB + שרת נוסף
במידה ואין הרבה משתמשים מחוברים בו זמנית לשרת ושאר הRESOURCE-ים שלהם זקוק הSESSION זמינים (שטח דיסק למשל) אין סיבה שיהיו ניתוקי SESSION
&nbsp
עכשיו אם המטרה שלשמה מחברים LB היא ניתוקי סשן יש עוד כמה שאלות שצריכים לשאול - מכיון שיתכן שעדיף יהיה להגדיל שטח דיסק או זיכרון בשרת או לקנפג את הגדרות הסשן הAPPLICATION POOL או אפילו להוציא את הSESSION לשרת אחר או SQL (לא מתאים לכל אפליקציה - תלוי מה אתה נוהג לאחסן בסשן)
&nbsp
לשאלתך לא נתקלתי בLB שמנהל סשן. וזה נשמע לי לא מקובל (אולי שווה לחפור על זה יותר)
&nbsp
זה מצד המתכנת
מעבר לזה אני לא ראיתי שרת LB פיזית או איך מחברים ומגדירים אותו בשביל זה יש אנשי IT
&nbsp
&nbsp
 

שיווקי

New member
לגבי LB

אני מניח שיש מונח של session manager, וכנראה גם כלים חיצוניים שמאפשרים את הנ"ל ברמת IT לקשור בניהול session-ים.

תודה, בכל אופן
 

blue25

New member
LB ו Session

ישנה אפשרות להגדיר ברמת ה LB שיהיה Sticky Sessions, כלומר ברגע שמשתמש פנה בפעם הראשונה והגיע לשרת X, מעתה והלאה כל עוד הדפדפן שלו פתוח הוא יעבוד מול השרת הזה, בצורה הזו אתה מבטיח לעצמך שהוא לא "יטייל" בין השרתים.
כברירת מחדל ב .net ה session הוא in-proc כלומר המידע ברמת השרת לוקאלי, משמע במידה ויוזר "מטייל" בין השרתים בכל שרת יהיה לו session אחר על כל מה שתמשמע מכך...

מי שלא רוצה לעבוד בתצורה הזו, כלומר לא להכריח את ה lb לעבוד ב mode של Sticky Sessions צריך לדאוג ל session ברמה אפליקטיבית שלא יעבוד בתצורה של in-prod, כלומר לשמור את ה session במקור חיצוני כלשהו (db, distributed caching ועוד) - ע"י מימוש custom session provider וכ"ו.

זה עונה על השאלות שלך ?
 

שיווקי

New member
נראה שכן. תודה


בהתאם למה שאמרת, ולפי האתר:
https://msdn.microsoft.com/en-us/library/ms178586.aspx

אני פותר את בעיית השינוי של ה-session כשקיים LB ע"י שמירתו בבסיס נתונים,
ז"א, sessionStateMode = SqlState,
אך לפי מה שנראה - זה תלוי ב-SQL Server שיש לי, ולא תמיד יש SQL Server במערכת התוכנה.

*** חייב להיות פה משהו יותר טריקי, כי אם יש 2 שרתים, כשיש בתווך load balance, יש פה למעשה 3 שרתים. אם ה-session הוא client מול שרת, והפניה היא אך ורק ל-LB מצד ה-client, אז ה-session נפתח מול ה-LB, והוא גם אתר - נראה לי, ותקן אותי אם אני טועה, שאת ה-LB אני צריך להגדיר כ-InProc, כיוון שיש רק LB אחד, ואת האחרים כ-custom, שאפנה אותם ל-LB. לא ביצעתי custom, ואני לא יודע אם יש דרך לקשר ל-session של ה-LB - אם כן, זה פותר את העניין.

הדרך לעשות custom היא בהתאם להלן:
http://stackoverflow.com/questions/5195341/asp-net-custom-session-state-management

האם הנ"ל נכון (להגדיר sessionStateMode =InProc ל-LB ולאחרים להגדיר לפי הדוגמה ב-Stackoverflow, כש-SessionStateMode=custom והשרת הוא ה-LB)?

ואז, אין כלל בעיה של session-ים שיכולים להתחלף בין 2 השרתים שהם לא LB?

תודה.
 

blue25

New member
אז לא הבנת :)

רשמת - "חייב להיות פה משהו יותר טריקי, כי אם יש 2 שרתים, כשיש בתווך load balance, יש פה למעשה 3 שרתים. אם ה-session הוא client מול שרת, והפניה היא אך ורק ל-LB מצד ה-client, אז ה-session נפתח מול ה-LB, והוא גם אתר - נראה לי"
ה session לא נפתח מול ה load balancer, ה load balancer הוא לא אתר.
כל תפקידו של ה load balancer להיות סוג של proxy בין ה client לשרתי אפליקציה שלך.
ה client אכן פונה ל load balancer, ה load balancer מפנה את ה request לאחד מהשרתים שלך (שרתים שכתובות ה ip מוגדרים אצלו לביצוע balance ביניהם), השרת מקבל את ה request יוצר session מבצע את מה שהוא אמור לבצע ומחזיר response, ה load balancer (כסוג של proxy) פשוט מחזיר את ה response ל client !!! הוא לא קשור לשמירה של ה session !!!

במידה ואתה מגדיר אותו כ Sticky Sessions הוא יודע שכאשר הוא הפנה אותך (הכוונה ל client) בפעם הראשונה לשרת X הוא אמור להמשיך ולהפנות אותך לשרת X (כלומר, שלא יהיה מצב שב request אחד תגיע לשרת X וב request שני תגיע לשרת Y), איך הוא מבצע את זה, ככל הנראה (אני לא בטוח בזה ב 100%) הוא מוסיף ל requset הראשון non persisted cookie שזה אומר cookie שיש לו תוקף כל עוד הדפדפן פתוח, והוא מבצע מעכב לפי ה cookie הנ"ל, כלומר לפי ה cookie הזה הוא יודע להחזיר אותך לשרת X.

כמו שכבר אמרתי, במידה וה load balancer שלך לא עובד בתצורה Sticky Sessions (הגדרה ברמת ה load balancer) כלומר, כל request יכול להגיע לכל שרת בצורה רנדומלית (לפי ההחלטה של ה lb) אתה צריך לדאוג לבד לכך שה session שלך לא יעבוד לוקאלי (משמע לא in-proc), זה יכול להיות מול sql server, יכול להיות מול appfabric cache וכ"ו - יש על זה אינסוף מאמרים.
יותר ברור ?
 

Sea Bass

New member
אני חושב שאני מבין לאן אתה חותר..

אז קודם כל כדאי שתדע שישנם LB-ים שממש לא טיפשים והם גם דגומים באופן תדיר את רמת ה CPU ורמת השימוש בזיכון בשרת ועל פי זה מכוונים בקשות.
זתומרת שאין כאן בהכרח רכיב טיפש שמפנה בקשה אחת לפה ובקשת אחד לשם.

דבר שני הוא שאני חושב שאתה חושב עליה היא מה הקורה במצב שבו:
יוזר מבצע בקשה והיא מופנה לשרת A ששם אתה שומר ב Cache נתונים.
בפעם השניה (או העשירית זה לא חשוב) שהיוזר מבצע בקשות , אם ה LB יפנה אותו לשרת B אז כל הנתונים ב Cache לא יהיו זמינים.
*ניתן להכניס גם את הבעיה של לרסט את ה IIS (מה קורה במצב הזה)??

-אם אתה חושש מבעיה זו אז כמו שרשמו למעלה ניתן לבצע StickySession והפיתרון הזה יכול להיות טוב בשבילך עד לשלב מסויים "בחיים".
בכדי להימנע מזה הייתי ממליץ לך לשמור את ה Cache בשרת אחר (MegaCacsh) נקרא לזה ככה (ישנם כלים פשוט צריך להטמיע) ואז גם אתה נותן ל LB לבצע את העבודה שלו ללא הגבלות.
** אז לסיכום קטן, יהיו לך בעיות אם:
1. אתה שומר Session בשרת Stanalone ולא מבצע StickySession
2. אתה שמור Session בשרת Standalone ומבצע ריסט ל IIS (או שרת נופל).
 
למעלה