הגדרת פרמטרים של ליבת המערכת ל-AlloyDB Omni ב-Kubernetes

בחירת גרסת תיעוד:

בדף הזה מוסבר איך להגדיר צמתי Kubernetes שמארחים אשכולות של מסדי נתונים ב-AlloyDB Omni, כדי להשיג ביצועים אופטימליים של אופרטור AlloyDB Omni Kubernetes ומנוע מסד הנתונים של AlloyDB Omni.

הגדרת פרמטרים של ליבת מערכת ההפעלה מאפשרת ל-AlloyDB Omni להשתמש במשאבי הזיכרון והקלט/פלט של המערכת בצורה יעילה יותר כשמטפלים בעומסי עבודה כבדים.

דרישות מוקדמות

לפני שמתחילים, חשוב לוודא שבצמתי Kubernetes פועלת ליבת Linux בגרסה 6.1 ואילך, ובמיוחד ליבה שתומכת בדגלים MADV_COLLAPSE ו-MADV_POPULATE_WRITE. מידע נוסף על הדגלים האלה זמין במאמרי העזרה של Linux madwise.

בטבלה הבאה מפורטים פרמטרים נדרשים של ליבת המערכת והערכים התואמים שלהם לצמתים של Kubernetes שמריצים פודים של אשכול מסדי נתונים:

קובץ ערך
/sys/kernel/mm/transparent_hugepage/shmem_enabled
מידע על זיכרון משותף זמין במאמר תמיכה ב-Transparent Hugepage
within_size או always
/proc/sys/vm/max_map_count
מידע על מספר האזורים של מיפוי הזיכרון שתהליך יכול ליצור זמין במסמכי התיעוד של /proc/sys/vm
גדול מהערך 1073741824 או שווה לו

כדי להגדיר את פרמטרים של ליבת המערכת בצמתי Kubernetes באמצעות DaemonSet:

  1. מחילים תוויות על הצמתים שבהם מתכננים להפעיל אשכולות של מסדי נתונים, לפי ההוראות במאמר הוספת תווית לצומת.

  2. כדי להגדיר את פרמטרי הליבה בצמתים עם התווית LABEL_KEY=LABEL_VALUE, יוצרים DaemonSet:

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: alloydb-omni-kernel-tuning
      namespace: DS_NAMESPACE
    spec:
      selector:
        matchLabels:
          name: alloydb-omni-kernel-tuning
      template:
        metadata:
          labels:
            name: alloydb-omni-kernel-tuning
        spec:
          volumes:
            - name: host-sys
              hostPath:
                path: /sys
          nodeSelector:
            LABEL_KEY: "LABEL_VALUE"
          restartPolicy: Always
          terminationGracePeriodSeconds: 1
          initContainers:
            - name: enable-thp-mmc
              image: INIT_IMAGE
              volumeMounts:
                - name: host-sys
                  mountPath: /sys
              securityContext:
                privileged: true
              command: ["sh", "-c", "sysctl -w vm.max_map_count=MAX_MAP_COUNT && echo within_size >/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
          containers:
            - name: CONTAINER_NAME
              image: CONTAINER_IMAGE
              command: ["watch", "-n", "600", "cat", "/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
    EOF
    

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

    • DS_NAMESPACE: מרחב השמות שבו רוצים לפרוס את DaemonSet – לדוגמה, default.
    • LABEL_KEY: המזהה של התווית, לדוגמה: workload.
    • LABEL_VALUE: הנתונים שמשויכים למזהה של התווית, לדוגמה: database.
    • INIT_IMAGE: השם של האימג' שמשמש לקונטיינר init.
    • MAX_MAP_COUNT: המספר המקסימלי של אזורי מיפוי זיכרון שתהליך יכול ליצור – לדוגמה, 1073741824.
    • CONTAINER_NAME: השם של המאגר הראשי, לדוגמה main.
    • CONTAINER_IMAGE: השם של התמונה שמשמשת כמאגר הראשי, לדוגמה latest.
  3. אחרי פריסת ה-DaemonSet, כדי לוודא שכל הפודים באשכול Kubernetes נמצאים במצב Running ושיש לכם פוד אחד לכל צומת עם התווית LABEL_KEY=LABEL_VALUE, משתמשים בפקודה הבאה:

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    פלט לדוגמה:

    NAME                               READY   STATUS    RESTARTS   AGE
    alloydb-omni-kernel-tuning-2dkwh   1/1     Running   0          22s
    alloydb-omni-kernel-tuning-pgkbj   1/1     Running   0          19s
    
  4. כדי לוודא שהדגל של ליבת המערכת הוחל בהצלחה, מריצים את הפקודה הבאה לכל אחד מהפודים שזוהו אחרי פריסת ה-DaemonSet:

    kubectl logs POD_NAME
    

    מחליפים את POD_NAME בשם של ה-Pod שרוצים לבדוק את היומנים שלו.

    פלט לדוגמה:

    always [within_size] advise never deny force
    

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

  • primarySpec.schedulingConfig למכונות ראשיות
  • spec.schedulingConfig read pool instances
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

מידע נוסף על הפעלת אשכולות של מסדי נתונים בצמתים ספציפיים של Kubernetes זמין במאמר הקצאת צמתים לאשכול של מסד נתונים באמצעות תזמון.

אימות של החלת פרמטרים של ליבת המערכת

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

  1. אם זמינה זמינות גבוהה, כלומר אם הערך של spec.availability.numberOfStandbys מוגדר כערך שגדול מאפס, צריך לוודא שבעמודה DBCLUSTERPHASE של משאב מסד הנתונים המותאם אישית מופיע הערך DBClusterReady, ובעמודה HAREADYSTATUS מופיע הערך True.

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

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

    • DBCLUSTER_NAME: השם של אשכול מסדי הנתונים שאתם מאמתים.
    • DBCLUSTER_NAMESPACE: השם של מרחב השמות הספציפי שבו נמצא אשכול מסד הנתונים.

    פלט לדוגמה:

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. מציגים רשימה של קבוצות ה-Pod של Kubernetes ששייכות לאשכול מסד הנתונים:

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. כדי לבדוק את פרטי הזיכרון המשותף, מריצים את הפקודה הבאה:

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. בכל הערכים בפלט צריכים להיות מספרים שונים מאפס.

    פלט לדוגמה:

    Shmem:          126255872 kB
    ShmemHugePages: 18403328 kB
    ShmemPmdMapped:  2961408 kB
    

    אם באחת מהרשומות מופיע הערך 0 kB, מפעילים מחדש את הפוד המתאים:

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. חוזרים על שלבים 1 עד 5 אחרי שה-Pod במצב Running.