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

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