הגדרת פרמטרים של ליבת מערכת ההפעלה מאפשרת ל-AlloyDB Omni להשתמש במשאבי הזיכרון והקלט/פלט של המערכת בצורה יעילה יותר כשמטפלים בעומסי עבודה כבדים.
דרישות מוקדמות
לפני שמתחילים, חשוב לוודא שבצמתי Kubernetes פועלת ליבת Linux בגרסה 6.1 ואילך, ובמיוחד ליבה שתומכת בדגלים MADV_COLLAPSE ו-MADV_POPULATE_WRITE. מידע נוסף על הדגלים האלה זמין במאמרי העזרה של Linux madwise.
החלת הגדרות ליבה מומלצות על צמתי Kubernetes
בטבלה הבאה מפורטים פרמטרים נדרשים של ליבת המערכת והערכים התואמים שלהם לצמתים של 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:
מחילים תוויות על הצמתים שבהם מתכננים להפעיל אשכולות של מסדי נתונים, לפי ההוראות במאמר הוספת תווית לצומת.
כדי להגדיר את פרמטרי הליבה בצמתים עם התווית
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.
-
אחרי פריסת ה-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כדי לוודא שהדגל של ליבת המערכת הוחל בהצלחה, מריצים את הפקודה הבאה לכל אחד מהפודים שזוהו אחרי פריסת ה-DaemonSet:
kubectl logs POD_NAMEמחליפים את
POD_NAMEבשם של ה-Pod שרוצים לבדוק את היומנים שלו.פלט לדוגמה:
always [within_size] advise never deny force
הרצת אשכולות של מסדי נתונים בצמתים של Kubernetes עם פרמטרים מומלצים של ליבת המערכת
כדי לפרוס אשכולות של מסדי נתונים בצמתי Kubernetes עם פרמטרים מומלצים של ליבת מערכת ההפעלה, מוסיפים קטע nodeAffinity לאחד מהקטעים הבאים במניפסט של אשכול מסד הנתונים:
primarySpec.schedulingConfigלמכונות ראשיות-
spec.schedulingConfigread pool instances
nodeaffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: LABEL_KEY
operator: In
values:
- "LABEL_VALUE"
מידע נוסף על הפעלת אשכולות של מסדי נתונים בצמתים ספציפיים של Kubernetes זמין במאמר הקצאת צמתים לאשכול של מסד נתונים באמצעות תזמון.
אימות של החלת פרמטרים של ליבת המערכת
כדי לוודא שהפרמטרים של ליבת המערכת חלים על פודים של מסד נתונים, מבצעים את הפעולות הבאות:
אם זמינה זמינות גבוהה, כלומר אם הערך של
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-
מציגים רשימה של קבוצות ה-Pod של Kubernetes ששייכות לאשכול מסד הנתונים:
kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAMEכדי לבדוק את פרטי הזיכרון המשותף, מריצים את הפקודה הבאה:
kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfoבכל הערכים בפלט צריכים להיות מספרים שונים מאפס.
פלט לדוגמה:
Shmem: 126255872 kB ShmemHugePages: 18403328 kB ShmemPmdMapped: 2961408 kBאם באחת מהרשומות מופיע הערך
0 kB, מפעילים מחדש את הפוד המתאים:kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAMEחוזרים על שלבים 1 עד 5 אחרי שה-Pod במצב
Running.