SQL מבוזר: אלטרנטיבה לשיירת מסדי נתונים

חלוקת מסדי נתונים (Database sharding) היא התהליך של חלוקת הנתונים ליחידות קטנות שנקראות "שרידים" (shards). חלוקת מסדי נתונים בדרך כלל מופעלת כאשר מגיעה הצורך בהתרחבות של כתיבות. במהלך תוחלתו של יישום מוצלח, שרת המסדי נתונים יכול להגיע למספר המקסימלי של כתיבות שהוא מסוגל לבצע, בין על פי שעת עבודה או בין על פי קיבולת. חיתוך הנתונים למספר שרידים – כל אחד על שרת מסדי נתונים נפרד – מפחית את הלחץ על כל צומת נפרד, ובכך מגביר את קיבולת הכתיבה של המסד הנתונים כולו באופן יעיל. זהו מה שחלוקת מסדי נתונים היא.

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

חסרונות של חלוקת מסדי נתונים

חלוקה מציגה מספר אתגרים:

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

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

מהי SQL מופשטת?

SQL המופץ מתייחס לדור חדש של מסדי נתונים רפרנציאליים. במונחים פשוטים, מסד נתונים SQL מופץ הוא מסד נתונים רפרנציאלי עם שיופרדות שקופה שנראה כמו מסד נתונים לוגי יחיד ליישומים. מסדי נתונים SQL מופצים מיושמים כארכיטקטורת שיתוף שום דבר ומנוע אחסון שמתקצב גם קריאות וגם כתיבות תוך שמירה על הסכמי ACID אמיתיים וגישה גבוהה לא זמנית. מסדי נתונים SQL מופצים כוללים את תכונות הקצבה של מסדי נתוני NoSQL – שזכו להידגשה בשנות ה2000 – אך לא מקטינים את ההתאמה. הם שומרים על היתרונות של מסדי נתונים רפרנציאליים ומוסיפים תאימות לענן עם עמידות רב-אזורית.

A different but related term is NewSQL (coined by Matthew Aslett in 2011). This term also describes scalable and performant relational databases. However, NewSQL databases don’t necessarily include horizontal scalability.

איך מסדי נתונים SQL מופצים עובדים?

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

בואו נלמד דוגמה. נניח שיש לנו מופע מסד נתונים עם some_table ומספר שורות:

אנו יכולים לחלק את הנתונים לשלושה גושים (שרדים):

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

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

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

כמה שורות עוברות לצומת החדש כדי להגדיל את קיבולת המערכת הכוללת. זכור שלמרות שלא מוצג בתרשים, מדדים כמו גם עותקים גם מועברים ומתואמים בהתאמה. תצוגה מעט יותר מלאה (עם העברת נתונים מעט שונה) של הקבוצה הקודמת מוצגת בתרשים זה:

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

כשהאפליקציה שולחת פעולת כתיבה (למשל, INSERT או UPDATE), מחושב החשבון ונשלח לתיקון הפרוסה. כמה כתיבות נשלחות במקביל לצמתים מרובים.

מתי לא להשתמש ב-SQL מופץ

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

התחלה עם SQL מופץ

מאחר שמסד נתונים SQL מופץ נראה ליישום כאילו הוא היה מסד נתונים לוגי אחד, התחלה פשוטה. כל מה שאתה צריך הוא הבא:

  • לקוח SQL כמו DBeaver, DbGate, DataGrip, או כל רחביית לקוח SQL עבור ה-IDE שלך
  • A distributed SQL database

Docker מקל על החלק השני. לדוגמה, MariaDB מפרסמת את התמונת ה-Docker mariadb/xpand-single המאפשרת לך להפעיל מסד נתונים Xpand בצומת יחיד לבחינה, בדיקה ופיתוח.

כדי להתחיל מכונת Xpand, הפעל את הפקודה הבאה:

Shell

 

docker run --name xpand \
	-d \
	-p 3306:3306 \
	--ulimit memlock=-1 \
	mariadb/xpand-single \
	--user "user" \
	--passwd "password"

ראה את התמונה של דוקר תיעוד לפרטים.

הערה: בזמן כתיבת המאמר הזה, התמונה של mariadb/xpand-single של דוקר אינה זמינה עבור מערכות ההפעלה של ARM. בארכיטקטורות אלו (למשל מכשירי אפל עם מעבדי M1), השתמש בUTM כדי ליצור מכונת וירטואלית (VM) ולהתקין, למשל, דבין. ציין שם מאקרו והשתמש בSSH כדי להתחבר ל-VM כדי להתקין את דוקר וליצור את מיכאנית איקספנד מכלול.

התחברות למסד הנתונים

התחברות למסד נתונים איקספנד זהה להתחברות לשרת מיכאנית קהילה או ארגון. אם התקינת כלי ה-CLI mariadb, פשוט הפעל את הפקודה הבאה:

Shell

 

mariadb -h 127.0.0.1 -u user -p

אפשר להתחבר למסד הנתונים באמצעות GUI למסדי נתונים SQL כמו DBeaver, DataGrip או חבילת SQL עבור ה-IDE שלך (כמו זו עבור VS Code). אנו הולכים להשתמש בלקוח SQL חינמי ומקורי שנקרא DbGate. אפשר להוריד את DbGate ולהריץ אותו כיישומון דפוס או מאחר ואתה משתמש ב-Docker, אפשר לפרוס אותו כיישומון אינטרנט שאפשר לגשת אליו מכל מקום דרך דפדפן אינטרנט (דומה ל-phpMyAdmin). פשוט הרץ את הפקודה הבאה:

Shell

 

docker run -d --name dbgate -p 3000:3000 dbgate/dbgate

ברגע שהמיכאלית מתחילה, הפנה את הדפדפן שלך ל-http://localhost:3000/. מלא את פרטי החיבור:

לחץ על בדיקה ואשר שהחיבור הושג:

לחץ על שמירה ובונה מסד נתונים חדש באמצעות לחיצה ימנית על החיבור בפאנל השמאלי ובחירה ב-צור מסד נתונים. נסה ליצור טבלאות או לייבא תסריט SQL. אם אתה רוצה רק לנסות משהו, Nation או Sakila הם מסדי נתונים דוגמא טובים.

לחיבור מ-Java, JavaScript, Python ו-C++

כדי להתחיל להתחבר ל-Xpand מיישומים, תוכלו להשתמש ב-MariaDB Connectors. ישנם מספר רב של שילובים אפשריים של שפות תכנות ומסגרת שמירה. כיסוי זה נמצא מחוץ לתחום של מאמר זה, אך אם אתם רוצים להתחיל ולראות משהו בפועל, עיינו בדף ההתחלה המהירה זה עם דוגמאות קוד עבור Java, JavaScript, Python, ו-C++.

הכוח האמיתי של SQL מופשט

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

אם אתם רוצים ללמוד עוד על SQL מופשט ו-MariaDB Xpand, הנה רשימה של משאבים שימושיים:

Source:
https://dzone.com/articles/distributed-sql-an-alternative-to-sharding