ניהול הקצאת CPU באמצעות קבוצות משאבים של MySQL

במאמר הזה מוסבר איך להגדיר ולהשתמש בקבוצות משאבים של MySQL ב-Cloud SQL ל-MySQL כדי לנהל את הקצאת משאבי המעבד (CPU) לצרכים שונים של עיבוד נתונים ולתת להם עדיפות.

סקירה כללית

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

קבוצות משאבים נתמכות בכל המכונות של Cloud SQL ל-MySQL 8.0 ואילך, גם במהדורת Cloud SQL Enterprise וגם במהדורת Cloud SQL Enterprise Plus.

ההבדלים בין קבוצות משאבים ב-MySQL של הקהילה לבין קבוצות משאבים ב-Cloud SQL

‫Cloud SQL ל-MySQL הוא שירות שמנוהל במלואו. כדי להבטיח את המהימנות של המכונה ולהגן על התהליכים הפנימיים של Cloud SQL, חלים ההבדלים וההגבלות הבאים בהשוואה להתנהגות של MySQL בקהילה:

אין תמיכה בהקצאת ליבות CPU

אין תמיכה בהצמדה של מעבד ברמת הליבה. לדוגמה, אי אפשר לציין VCPU = 2-3 או VCPU = 0 כשיוצרים קבוצת משאבים ב-Cloud SQL ל-MySQL. מכיוון שהטופולוגיה הבסיסית של ליבת המכונה הווירטואלית מופשטת, כל ניסיון להשתמש בסעיף VCPU בהצהרה CREATE RESOURCE GROUP או ALTER RESOURCE GROUP נכשל עם שגיאת דחיית הגישה הבאה.

ERROR 1227 (42000): Access denied; This operation (CPU clause) is not allowed on the Cloud SQL environment. Only THREAD_PRIORITY allowed;

קבוצות אסורות של משאבי מערכת

אי אפשר ליצור קבוצות של משאבי מערכת ב-Cloud SQL. מותרות רק קבוצות משאבים ברמת המשתמש (TYPE = USER), עם עדיפויות לשרשור שנעות בין 0 (העדיפות הכי גבוהה למשתמש) לבין 19 (העדיפות הכי נמוכה למשתמש).

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

הפעלת הפקודה CREATE RESOURCE GROUP עם TYPE = SYSTEM תיכשל עם השגיאה הבאה:

ERROR 1227 (42000): Access denied; This operation (TYPE=SYSTEM) is not allowed on the Cloud SQL environment. Only TYPE=USER is allowed;

רישום אוטומטי של יומנים בינאריים ושכפול של DDL של קבוצות משאבים

ב-MySQL של הקהילה, פעולות של קבוצת משאבים כמו CREATE,‏ ALTER ו-DROP RESOURCE GROUP אף פעם לא נכתבות ביומן הבינארי. ב-Cloud SQL, התנהגות ברירת המחדל הזו מבוטלת כך שכל הפקודות להגדרת קבוצת משאבים נכתבות ביומן הבינארי.

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

הקצאות של סשנים לשרשורים, כמו SET RESOURCE GROUP, לא נכתבות ביומני הבינארי.

הרשאות אדמין הוענקו ל-cloudsqlsuperuser

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

  • RESOURCE_GROUP_ADMIN: יצירה, שינוי ומחיקה של קבוצות משאבים
  • RESOURCE_GROUP_USER: הקצאת שרשורים או שימוש ברמזים בשאילתות

ב-Cloud SQL, שתי ההרשאות מוענקות כברירת מחדל לתפקיד cloudsqlsuperuser.

אדמינים של MySQL יכולים גם להעניק למשתמשים אחרים את הרשאת מסד הנתונים RESOURCE_GROUP_USER או RESOURCE_GROUP_ADMIN.

ניהול קבוצות משאבים ב-Cloud SQL

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

פרטים נוספים על הגדרת קבוצות משאבים ב-MySQL ועל התנהגות ההפניה מופיעים במאמר קבוצות משאבים במסמכי התיעוד של MySQL.

כדי לנהל קבוצות של משאבים ב-Cloud SQL, אפשר לבצע את הפעולות הבאות:

לפני שמתחילים

לפני שיוצרים קבוצת משאבים, צריך לוודא את הדברים הבאים:

  • אתם מחוברים למסד הנתונים באמצעות חשבון משתמש עם הרשאת RESOURCE_GROUP_ADMIN. כברירת מחדל, למשתמש root ולכל חשבון מסד נתונים שהוקצה לו התפקיד cloudsqlsuperuser יש את ההרשאה הזו.

  • המכונה ב-Cloud SQL פועלת ב-MySQL מגרסה 8.0 ואילך.

יצירת קבוצת משאבים

יוצרים קבוצות משאבים ברמת המשתמש עם עדיפות לשרשור בין 0 (העדיפות הכי גבוהה) לבין 19 (העדיפות הכי נמוכה). עדיפות ברירת המחדל של השרשור לחיבורים רגילים היא 0.

כדי ליצור קבוצת משאבים, מריצים את ההצהרה הבאה:

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

מחליפים את מה שכתוב בשדות הבאים:

  • GROUP_NAME: השם של קבוצת המשאבים שרוצים ליצור.
  • PRIORITY_VALUE: עדיפות התזמון של ה-CPU לקבוצת המשאבים, מ-0 (העדיפות הכי גבוהה) עד 19 (העדיפות הכי נמוכה).

שינוי העדיפות של קבוצת משאבים

כדי לשנות את העדיפות של תזמון ה-CPU של קבוצת משאבים קיימת, מריצים את ההצהרה הבאה:

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

מחליפים את מה שכתוב בשדות הבאים:

  • GROUP_NAME: השם של קבוצת המשאבים שרוצים לשנות.
  • PRIORITY_VALUE: העדיפות החדשה של תזמון ה-CPU.

הסרה של קבוצת משאבים

כדי להסיר קבוצת משאבים, מריצים את ההצהרה הבאה:

DROP RESOURCE GROUP GROUP_NAME;

מחליפים את מה שכתוב בשדות הבאים:

  • GROUP_NAME: השם של קבוצת המשאבים שרוצים להסיר.

הקצאת חיבורים ושאילתות לקבוצת משאבים

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

כדי להקצות חיבורים של סשנים לקבוצה:

  1. נותנים הרשאה למשתמש של עומס העבודה:

    GRANT RESOURCE_GROUP_USER ON *.* TO 'USERNAME'@'%';

    מחליפים את מה שכתוב בשדות הבאים:

    • USERNAME: משתמש מסד הנתונים שרוצים להעניק לו את ההרשאה.
  2. כשהמשתמש מתחבר, מריצים את הפקודה:

    SET RESOURCE GROUP GROUP_NAME;

    מחליפים את מה שכתוב בשדות הבאים:

    • GROUP_NAME: השם של קבוצת המשאבים שרוצים להקצות לה את החיבור.

    אפשר גם לציין מזהה שרשור ספציפי:

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    מחליפים את מה שכתוב בשדות הבאים:

    • GROUP_NAME: השם של קבוצת המשאבים שרוצים להקצות לה את החיבור.
    • THREAD_ID: המזהה של השרשור הספציפי במסד הנתונים שרוצים להקצות.

כדי להקצות שאילתה יחידה לקבוצה (באמצעות רמז לאופטימיזציה):

משתמשים בהערה של האופטימיזציה של RESOURCE_GROUP בתוך הצהרת ה-DML או SELECT:

SELECT /*+ RESOURCE_GROUP(GROUP_NAME) */
  COLUMN_NAME_1,
  SUM(COLUMN_NAME_2)
FROM TABLE_NAME
GROUP BY COLUMN_NAME_1;

מחליפים את מה שכתוב בשדות הבאים:

  • GROUP_NAME: השם של קבוצת המשאבים שרוצים להריץ את השאילתה במסגרתה.
  • COLUMN_NAME_1: העמודה שלפיה רוצים לקבץ את התוצאות.
  • COLUMN_NAME_2: ערך העמודה שרוצים לסכם.
  • TABLE_NAME: הטבלה שרוצים לשלוח אליה שאילתה.

מעקב אחרי קבוצות משאבים

כדי לבדוק את קבוצות המשאבים שהוגדרו:

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

כדי לראות את שרשורי החיבור הפעילים ואת קבוצות המשאבים שהוקצו להם, מריצים את השאילתה הבאה:

SELECT THREAD_ID, NAME, TYPE, RESOURCE_GROUP
  FROM performance_schema.threads;

המאמרים הבאים