מבוא ל־HAProxy ולמושגי הטעינה מאוזנים

הקדמה

HAProxy, שעומדת על High Availability Proxy, היא תוכנה פתוחה מקור TCP/HTTP Load Balancer ופתרון לפרוקסי שנפוצה המצויינת שניתן להריץ על Linux, macOS ו- FreeBSD. השימוש הנפוץ ביותר שלה הוא לשפר את הביצועים והאמינות של סביבת השרתים על ידי חלוקת העומס בין שרתים מרובים (לדוגמה: אינטרנט, אפליקציה, מסד נתונים). היא משמשת בסביבות רבות ומפורסמות, כולל: GitHub, Imgur, Instagram ו- Twitter.

במדריך זה, תקבל סקירה כללית של מהו HAProxy, תבחן מונחי פיצול העומס, ותראה דוגמאות לשימושים שבהם ניתן לשפר את הביצועים והאמינות של סביבת השרתים שלך באמצעותו.

מונחי HAProxy

ישנם הרבה מונחים וקונצפטים שחשובים בשיחה על פיצול עומס ופרוקסי. תעבור על מונחים נפוצים בעוקבות.

לפני שתתחיל בסוגי הפיצול הבסיסיים, עליך להתחיל עם ביקורת של ACLs, backends, ו- frontends.

רשימת בקרת גישה (ACL)

ביחס לאיזון עומס, ACL משמשים לבדיקת תנאי וביצוע פעולה (לדוג' בחירת שרת או חסימת בקשה) בהתאם לתוצאת הבדיקה. השימוש ב-ACL מאפשר הפניית תעבורת רשת גמישה בהתבסס על מגוון של גורמים כמו התאמת דפוס ומספר החיבורים לשרתי צד אחורי, לדוגמה.

דוגמה ל-ACL:

acl url_blog path_beg /blog

ACL זה מתאים אם נתיב הבקשה של המשתמש מתחיל עם /blog. זה יתאים לבקשה של http://yourdomain.com/blog/blog-entry-1, לדוגמה.

למדריך מפורט על שימוש ב-ACL, ראה את מדריך הקונפיגורציה של HAProxy.

צד אחורי

A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:

  • איזו אלגוריתם לבחור לאיזון עומס
  • a list of servers and ports

A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.

כאן דוגמה להגדרה עם שני צדי אחור, web-backend ו־blog-backend עם שני שרתי רשת בכל צד, הקשובים בפורט 80:

backend web-backend
   balance roundrobin
   server web1 web1.yourdomain.com:80 check
   server web2 web2.yourdomain.com:80 check
   
backend blog-backend
   balance roundrobin
   mode http
   server blog1 blog1.yourdomain.com:80 check
   server blog1 blog1.yourdomain.com:80 check

שורת balance roundrobin מפרטת את אלגוריתם איזון העומס, כפי שמפורט בסעיף אלגוריתמי האיזון של עומס.

mode http מציין שנעשה שימוש בפרוקסי שכבת 7, כפי שמוסבר במקטע סוגי איזון עומס.

אפשרות check בסופי ההוראות של server מציינת שבדיקות בריאות יש לבצע על שרתי האחורה האלה.

חזית

A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend section of the HAProxy configuration. Their definitions are composed of the following components:

  • a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
  • קבוצות תנאים (ACLs)
  • חוקי use_backend, המגדירים אילו קיבוצי אחורה להשתמש בהם בהתאם לתנאי ACL המתאימים, ו/או חוק default_backend שטופל בכל מקרה אחר.

A frontend can be configured to various types of network traffic, as explained in the next section.

סוגי איזון עומס

עכשיו שיש לך הבנה ביסיסית של הרכיבים הבסיסיים שמשמשים באיזון עומס, תוכל לעבור אל סוגי האיזון הבסיסיים.

אין איזון עומס

A simple web application environment with no load balancing might look like the following:

No Load Balancing

בדוגמה זו, המשתמש מתחבר ישירות לשרת האינטרנט שלך, ב-yourdomain.com, ואין באיזור יישומי טעינה מאוזנים. אם השרת היחיד שלך נופל, המשתמש לא יוכל עוד לגשת לשרת האינטרנט שלך. בנוסף, אם רבים מאוד משתמשים מנסים לגשת לשרת שלך בו זמנית והוא לא מסוגל לטפל בעומס, ייתכן שיהיה להם חוויית שימוש איטית או שלא יוכלו להתחבר בכלל.

איזור טעינה של שכבת 4

הדרך הפשוטה ביותר להפצת תעבורת רשת למספר שרתים היא להשתמש בטעינת שכבת 4 (שכבת ההעברה). טעינה מאוזנת בדרך זו תפנה תעבורת משתמש על פי טווח כתובות IP ופורט (כלומר, אם בקשה מתקבלת עבור http://yourdomain.com/anything, התעבורה תופנה לשרת האחורי שמטפל בכל הבקשות עבור yourdomain.com ב-port 80). למידע נוסף על שכבת 4, ניתן לבדוק את תת הקטע TCP שבמדריך ה-מבוא לרשתות שלנו.

כאן נמצאת תרשים של דוגמה פשוטה של טעינת שכבת 4:

Layer 4 Load Balancing

המשתמש גושש לאחזור את מאזין העומס, אשר מפנה את בקשת המשתמש לקבוצת שרתי הצד האחורי של web-backend. כל שרת צד אחורי שנבחר יגיב ישירות לבקשת המשתמש. כללית, כל השרתים ב- web-backend צריכים לשרת תוכן זהה – אחרת המשתמש עשוי לקבל תוכן שונה. שים לב ששני שרתי האינטרנט מחוברים לאותו שרת מסד נתונים.

איזון עומס בשכבת 7

דרך נוספת יותר מורכבת לאיזון תעבורת רשת היא להשתמש באיזון עומס בשכבת 7 (שכבת היישום). בשימוש בשכבת 7, מאפשר המאזין להפנות בקשות לשרתים אחוריים שונים על פי תוכן הבקשה של המשתמש. צורת זו של איזון עומס מאפשרת לך להפעיל מספר שרתי אפליקציות אינטרנט תחת אותו דומיין ויציאה. למידע נוסף על שכבת 7, ראה את התת-קטע HTTP של ה- הקדמה לרשתות שלנו.

הנה תרשים של דוגמה פשוטה לאיזון עומס בשכבת 7:

Layer 7 Load Balancing

בדוגמה זו, אם משתמש מבקש yourdomain.com/blog, הוא מופנה לשרת הצד האחורי של הבלוג, אשר הוא סט של שרתים הפועלים אפליקציית בלוג. בקשות אחרות מופנות אל web-backend, שעשוי להריץ אפליקציה אחרת. שני הצדדים האחוריים משתמשים באותו שרת מסד נתונים, בדוגמה זו.

A snippet of the example frontend configuration would look like this:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog
 
  default_backend web-backend

זה מגדיר חזית בשם http, שמטפלת בכל תעבורת נכנסת בפורט 80.

acl url_blog path_beg /blog תואם בקשה אם נתיב בקשת המשתמש מתחיל עם /blog.

use_backend blog-backend if url_blog משתמש ב-ACL כדי להפנות את התעבורה ל-blog-backend.

default_backend web-backend מציין כי כל התעבורה האחרת תועבר ל-web-backend.

אלגוריתמי טעינה מאוזנת

האלגוריתם של טעינת הטעינה שמשמש קובע איזה שרת, בקדמת עבודה, יובחר בעת טעינה מאוזנת. HAProxy מציעה מספר אפשרויות לאלגוריתמים. בנוסף לאלגוריתם של טעינת הטעינה, ניתן להקצות לשרתים פרמטר משקל כדי לנהל איך בתדירות השרת יובחר ביחס לשרתים אחרים.

A few of the commonly used algorithms are as follows:

roundrobin

ה-Round Robin בוחר שרתים בתורים. זהו האלגוריתם ברירת המחדל.

leastconn

בוחר את השרת עם מספר החיבורים הנמוך ביותר. מומלץ זאת למשך ישיבות ארוכות. השרתים באותו מאחורה מתקיימים גם באופן סביבתי.

מקור

פעולת בחירת השרת מבוצעת בהתבסס על הצפנת כתובת ה-IP המקורית של המשתמשים שביקשו את הבקשות. השיטה הזו מבטיחה כי אותם משתמשים יתחברו לאותם שרתים.

סשנים יצמים

יישומים מסוימים דורשים שהמשתמש ימשיך להתחבר לאותו שרת מאחורה. זה ניתן להשיג דרך סשנים יצמים, באמצעות הפרמטר appsession במאחורה שדורשת זאת.

בדיקת בריאות

ה- HAProxy משתמש בבדיקות בריאות כדי לקבוע אם שרת מאחורה זמין לעיבוד בקשות. זה מתרחש ללא צורך בהסרה ידנית של השרת מהמאחורה אם הוא לא זמין. הבדיקה הבריאותית המוגדרת כברירת מחדל היא לנסות להקים חיבור TCP לשרת.

אם שרת נכשל בבדיקת בריאות ולכן לא יכול לשרת בקשות, הוא מושבת באופן אוטומטי בצד האחורי, ותעבורת לא תועבר אליו עד שיחזור לבריאות. אם כל השרתים בצד האחורי נכשלים, השירות יהיה אינו זמין עד שלפחות אחד מהשרתים בצד האחורי האלה יחזור לבריאות.

לסוגים מסוימים של צדי אחור, כמו שרתי מסדי נתונים, בדיקת הבריאות המוגדרת כברירת המחדל אינה בהכרח מיועדת לקביעת כך שהשרת עדיין בריא.

שרת האינטרנט Nginx יכול לשמש גם כשרת פרוקסי עצמאי או מאזין עומס, ונהוג להשתמש בו בשילוב עם HAProxy לקיבוע ודחיסת המידע שלו.

זמינות גבוהה

ההתקנים לאיזון משאבים שכבר 4 ו-7 המתוארים במדריך זה משתמשים במאיץ עומס כדי להפנות תעבורה לאחד מבין השרתים בצד האחורי. אך המאיץ עומס שלך הוא נקודת כשל בודדת בהגדרות אלה; אם הוא ייפול או יתבוסס עם בקשות, יכול לגרום להשהייה גבוהה או זמן עצירה עבור השירות שלך.

A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.

כאן תרשים של הגדרת זמינות גבוהה:

בדוגמה זו, יש לך מטעני עומס מרובים (אחד פעיל ואחד או יותר פסיביים) מאחורי כתובת IP סטטית שניתן להקצות מחדש משרת לשרת אחר. כאשר משתמש גושב את אתר האינטרנט שלך, הבקשה עוברת דרך כתובת ה-IP החיצונית אל מטען העומס הפעיל. אם מטען העומס הפעיל נופל, מנגנון העברת הכשל מזהה את זה ומשייך באופן אוטומטי מחדש את כתובת ה-IP לאחד מהשרתים הפסיביים. קיימות מספר דרכים שונות ליישום תצורת העמידות בפעולה פעיל/פסיבי. כדי למד עוד, קרא איך להשתמש ב-IPים שמורים.

מסקנה

עכשיו שיש לך הבנה של טעינת האיזון ואתה יודע כיצד להשתמש ב-HAProxy, יש לך בסיס יציב להתחלה בשיפור ביצועים ואמינות שרת בסביבת השרת שלך.

אם אתה מעוניין לאחסן את הפלט של HAProxy לצפייה מאוחרת, עיין ב- איך להגדיר יומן פעילות של HAProxy עם Rsyslog ב-CentOS 8 [התחלה מהירה]

אם אתה מחפש לפתור בעיה, תבדוק שגיאות נפוצות ב־HAProxy. אם נדרשת בדיקה נוספת, תסתכל על איך לטפל בשגיאות נפוצות ב־HAProxy.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts