הגדרת פרמטרים של ליבת מערכת ההפעלה ל-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 שמריצים pod של אשכול מסד נתונים:

קובץ ערך
/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. כדי להגדיר את פרמטרים של הליבה בצמתים עם התווית 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 למכונות של מאגר קריאה
      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 באחת מהרשומות, צריך להפעיל מחדש את ה-pod המתאים:

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