הגדרת פרמטרים של ליבת מערכת ההפעלה ל-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 Support
within_size או always
/proc/sys/vm/max_map_count
מידע על מספר האזורים של מפת הזיכרון שתהליך יכול ליצור זמין במאמרי העזרה של /proc/sys/vm
גדול מהערך 1073741824 או שווה לו

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

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

  2. כדי להגדיר את הפרמטרים של הליבה (kernel) בצמתים עם התווית 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, כדי לוודא שכל ה-Pods באשכול Kubernetes נמצאים במצב Running ושיש לכם Pod אחד לכל צומת עם התווית 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. מציגים את הפודים של 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.