יישומים קריטיים למשימה דורשים גבוהה זמינות. המטרה של גבוהה זמינות היא לספק למשתמשים גישה עקבית לשירותים או משאבים, מפחיתה את הסיכויים להפרעה. התמוטטות אוטומטית היא מנגנון ספציפי המשמש להשיג גבוהה זמינות. הוא כולל גילוי אוטומטי של כשל ברכיב מערכת (כמו שרת, רשת או מסד נתונים) ומעבר מיידי של הפעולות לרכיב מיוחד ללא התערבות אנושית. זה מעלה את העמידות.
MariaDB MaxScale הוא פרוטוקול מסד נתונים שמכיל תכונות לגבוהה זמינות. במאמר זה, אראה לך איך אפשר לנסות אותו עם אפליקציה סימולטור חנות מקוונת שמומשה ב-Java ו-Svelte.
ארכיטקטורה
התרשים הבא מציג את הארכיטקטורה של אפליקציית הדגמא:
A web application developed with JavaScript and the Svelte framework makes HTTP requests to a Java backend. The backend answers with server-sent events that the frontend uses to update the user interface on the browser.
הגב מומשה עם Spring Boot ומתחבר למסד נתונים MariaDB באמצעות R2DBC (רטרקטיבי). הלוגיקה של הגב היא, בקיצור, הדמיה של קריאות וכתיבות למסד נתונים של חנות מקוונת. ההדמיה מותאמת אישית, והמשתמש יכול להתאים:
- ביקורים למוצרים לדקה: כמה קריאות למסד הנתונים לדקה.
- הזמנות לדקה: כמה כתיבות למסד הנתונים לדקה.
- מוצרים לפרישה: כתיבת תרמית.
- זמן מתיחת במילי-שניות: כמה שניות עד שבקשה למסד הנתונים נחשבת לכשל.
מערך מסד הנתונים מוקדם על ידי מסנן מסד נתונים הנקרא MaxScale. מסנן זה גורם למערך להיראות כמו מסד נתונים לוגי אחד לבחינת הג'אווה. MaxScale מבצע גם הפרדת קריאה/כתיבה (שולח כתיבות לשרת הראשי MariaDB וקריאות לעותקים), כמו גם חלוקת העבודה של קריאות בין שרתי העותקים באמצעות אלגוריתם מוגדר על ידי המשתמש. נתונים מועתקים אוטומטית מהראשי לשרתי העותק של מסדי הנתונים.
בניית תמונות Docker מהמקור
I have prepared custom Docker images for every component in the simulator. You can either build the images from the source (optional) or use the already built and published images from Docker Hub. If you decide to build the images yourself, you can find the source code on GitHub:
- פריסות MariaDB: תמונות מותאמות אישית לפריסת מבני MariaDB משוכפלים בקלות עם MaxScale. אל תשתמשו באלה בייצור! תמונות אלה מתאימות רק ליישומים הדוגמא. השתמשו בתמונות הרשמיות של MariaDB Docker לפריסות ייצור.
- יישום רקע: היישום הרקע המחובר למבנה המסד הנתונים.
- יישום קדמי: היישום הקדמי המבקש את קביעת הפרוצדורה להדמיה מהרקע ומקבל אירועים להצגת תוצאות ההדמיה.
לכל מאגר יש דוקריינים שאפשר להשתמש בהם לבניית תמונות דוקר משלך. לדוגמא, לבניית תמונת היישום הרקע, רוץ:
docker build --tag alejandrodu/online-store-simulator-java-backend .
הפעלת ההדמיה
כל השירותים יכולים להתחיל באמצעות קובץ Docker Compose הבא (docker-compose.yml
):
version: "3.9"
services:
server-1:
container_name: server-1
image: alejandrodu/mariadb
ports:
- "3306:3306"
environment:
- MARIADB_CREATE_DATABASE=demo
- MARIADB_CREATE_USER=user:Password123!
- MARIADB_CREATE_REPLICATION_USER=replication_user:ReplicationPassword123!
- MARIADB_CREATE_MAXSCALE_USER=maxscale_user:MaxScalePassword123!
server-2:
container_name: server-2
image: alejandrodu/mariadb
ports:
- "3307:3306"
environment:
- MARIADB_REPLICATE_FROM=replication_user:ReplicationPassword123!@server-1:3306
server-3:
container_name: server-3
image: alejandrodu/mariadb
ports:
- "3308:3306"
environment:
- MARIADB_REPLICATE_FROM=replication_user:ReplicationPassword123!@server-1:3306
maxscale:
container_name: maxscale
image: alejandrodu/mariadb-maxscale
command: --admin_host 0.0.0.0 --admin_secure_gui false
ports:
- "4000:4000"
- "8989:8989"
- "27017:27017"
environment:
- MAXSCALE_USER=maxscale_user:MaxScalePassword123!
- MARIADB_HOST_1=server-1 3306
- MARIADB_HOST_2=server-2 3306
- MARIADB_HOST_3=server-3 3306
healthcheck:
test: ["CMD", "maxctrl", "list", "servers"]
interval: 5s
timeout: 10s
retries: 5
java-backend:
container_name: java-backend
image: alejandrodu/online-store-simulator-java-backend
ports:
- "8080:8080"
environment:
- spring.r2dbc.url=r2dbc:mariadb://maxscale:4000/demo
- spring.r2dbc.username=user
- spring.r2dbc.password=Password123!
- spring.liquibase.url=jdbc:mariadb://maxscale:4000/demo
- spring.liquibase.user=user
- spring.liquibase.password=Password123!
depends_on:
maxscale:
condition: service_healthy
svelte-frontend:
container_name: svelte-fronted
image: alejandrodu/online-store-simulator-svelte-frontend
ports:
- "5173:80"
environment:
- BACKEND_URL=http://java-backend:8080
עבור לספרייה שבה נמצא קובץ Docker Compose, והתחל את השירותים במצב מופנה כך:
docker compose up -d
הגדרת MaxScale
לפני שתתחיל את ההדמיה, הגדר את MaxScale לשחרור עסקאות. כמו כן, שנה את זמני ההמתנה כדי להפוך את ההדמיה למעניינת יותר.
היכנס ל-http://localhost:8989/ והתחבר לממשק באמצעות:
- שם משתמש:
admin
- סיסמה:
mariadb
אתה תראה לוח מחויכים עם מצב הקלסטר של MariaDB.

יש שרת ראשי (server-1), ושני עותקים (server-2 ו-server-3). השכפול כבר מוגדר מ-server-1 (ראשי) ל-server-2 ו-server-3 (עותקים). כל השרתים צריכים להיות פעילים.
לחץ על mdb_monitor ואז על הסמל עיפרון כדי לאפשר עריכת פרמטרים. הגדר את הפרמטרים הבאים:
auto_failover
(true
): זה מאפשר עיכוב אוטומטי. כששרת MariaDB מת, MaxScale בוחר שרת עותק ומכוונן אותו כשרת ראשי חדש כך שכתיבה יכולה להמשיך.auto_rejoin
(true
): זה מאפשר התחברות אוטומטית של שרתים שהתאוששו. כששרת נכשל שוב, MaxScale מזהה אותו ומכוון אותו כשרת עותק זמין.failcount
(1
): קובע את מספר האיטרציות של המוניטור (רכיב ב-MaxScale שבודק את מצב השרת) הנדרשות לשרת להיות מדומה כדי להפעיל את תהליך העיכוב. קבענו ערך של1
כדי לוודא שהעיכוב מתחיל מייד לאחר הכשלון.backend_connect_timeout
(1000
): זמן מתיחה לחיבורים של המוניטור. קבענו ערך נמוך (שנייה אחת) כדי להפעיל מהר עיכוב להפגן הזה.backend_read_timeout
(1000
): זמן תגובה לקריאה עבור חיבורי המוניטור.backend_write_timeout
(1000
): זמן תגובה לכתיבה עבור חיבורי המוניטור.master_failure_timeout
(1000
): זמן תגובה לכשל ראשי.monitor_interval
(1000
): תדירות הפעלות המעקב אחר השרתים.
אזהרה: ערכים אלו מתאימים לדגמא זו אך כנראה לא הטובים ביותר עבור סביבות ייצור!
לאחר קביעת הפרמטרים, לחץ על גמר העריכה ואז אישור.
כמו כן, עליך להפעיל אימות עיסוקים שמשחזרים אוטומטית עיסוקים נכשלים בתהליך על שרתים שנכשלו מיד לאחר שהוזרקה מסדרת SQL. זהו תכונה שימושית עבור מפתחי התוכנה מכיוון שהיא מונעת את הצורך בקידוד מקרי כשל וניסיון חזרה עיסוקים.
בתפריט הראשי, לחץ על לוח המחוונים ואז על אחת הקישורים שירות שליחת_שאילתות ברשימת השרתים. שנה את הפרמטרים כך:
transaction_replay
(true
): מאפשר חזרה אוטומטית של עיסוקים נכשלים.transaction_replay_retry_on_deadlock
(true
): כמו קודם כשמתרחשת תיקו תהליך.transaction_replay_retry_on_mismatch
(true
): כמו קודם כשמתרחשת שגיאת סכום בדיקה.
לאחר קביעת הפרמטרים, לחץ על גמר העריכה ואז אישור.
התחלת ההדמיה
עם כל ההתקנה מאולצת, אפשר להתחיל את ההדמיה. גלשו ל-http://localhost:5173/ והתאימו את הפרמטרים הבאים (השמות, אני מקווה, מסבירים עצמם):
- ביקורי מוצר לדקה:
6000
- הזמנות לדקה:
60
- זמן מעצר באלפיות השנייה:
8000
אך לפני שתתחילו את ההדמיה, עליכם ליצור את המוצרים לחנות האינטרנט. לחצו על נתונים | יצירת מוצרים…. השאירו את הערכים הברירת מחדל ולחצו על יצירה. אסתכלו על הממשק כשהוא מתעדכן כשמוצרים נוצרים במסד הנתונים.
עכשיו אפשר לבסוף לחץ על התחל ולראות את ההדמיה בפעולה.

הדמיית כשל שרת
בשלב זה, השרת הראשי מטפל בכתיבה (הזמנות). מה קורה אם תפסיקו את השרת הזה? בשורת הפקודה הרץ:
docker stop server-1
תלוי בגורמים מרובים אולי תקבל קצת "אורחים מתסכלים" או אפילו כמה "הזדמנויות שכו׳בו׳" בסימולטור. או אולי אין לך כלום! ביקורי מוצרים (קריאות) והזמנות (כתיבה) ממשיכים לקרות תודות ל-MaxScale. ללא הפיכת כשל באופן אוטומטי, עליכם להתקין הכל באופן ידני שמסתיים ביותר זמן בלתי זמין ובהרבה אורחים מתסכלים והזדמנויות שכו׳בו׳!
התחל את השרת המופסל:
docker start server-1
עברו ל-MaxScale לוח המחוונים (http://localhost:8989/) ובדקו ש-server-1 כעת הפך לשידור מעובד.
אפשר לבצע מעבר ידני כדי להפוך שרת-1 לשרת הראשי שוב. לחץ על מערכת_ניטור_mdb ואז החכה על הMASTER בסעיף. לחץ על העיפרון ובחר שרת-1. לחץ על החלפה ובדוק שוב בלוח_מחוונים שהשרת הראשי החדש הוא שרת-1.
מסקנה
הכשלון האוטומטי הוא רק אחד מהרכיבים במערכות בעלות גבוהה. אפשר להשתמש במסנן מסד נתונים כמו MaxScale כדי להגדיר הכשלון האוטומטי, אך גם רכיבים אחרים כמו בקרת עבודה, מסנני שאילתות, נסיונות מחדש של עיסוקים, בודדת טופולוגיה ועוד. תראה את התיעוד כאן.
Source:
https://dzone.com/articles/high-availability-and-resiliency-in-databases