אופטימיזציה של ביצועי עומסי עבודה של Redis ב-GKE

במאמר הזה נסביר איך לשפר את הביצועים של עומסי העבודה של Redis ב-Google Kubernetes Engine ‏ (GKE) באמצעות יצירה של הגדרות אופטימליות ברמת האפליקציה וברמת הצומת. פרטים נוספים זמינים במאמר אופטימיזציה של עומסי עבודה ב-GKE.

האופטימיזציות ל-Redis נקבעו עבור מופע Redis 7 שמשמש כמטמון look-aside עם צומת יחיד ויחס קריאה/כתיבה של 4:1 (4 קריאות לכל כתיבה אחת), והביצועים נמדדו באמצעות Memtier 2.2.1. כדאי להשוות בין אופן השימוש בעומס העבודה של Redis באשכול שלכם לבין אופן השימוש בתרחיש הזה. אם תרחיש השימוש שלכם שונה, יכול להיות שתצטרכו לשנות את ההמלצות לאופטימיזציה בהתאם להקשר שלכם.

לפני שמתחילים

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

  • מפעילים את GKE Recommender API ואת Google Kubernetes Engine API.
  • הפעלת ממשקי API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

דרישות

משתמשים בגרסה ‎1.31.1-gke.12000 ואילך של GKE.

אופטימיזציה לעומסי עבודה של Redis

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

כדי לשפר את הביצועים של עומס עבודה של Redis, צריך לבצע את הפעולות הבאות:

  1. כדי ליצור את קובצי המניפסט עם אופטימיזציות לעומס העבודה של Redis, מבצעים את הפעולות הבאות:

    1. כדי ליצור קובצי מניפסט עם אופטימיזציות מומלצות, מריצים את הפקודה הבאה:

      gcloud container workload profiles manifests create \
         --workload=redis-7-caching \
         --cluster-version=CLUSTER_VERSION \
         --options=machineType=MACHINE_TYPE \
         --output-path=/tmp/manifests.yaml
      

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

      • CLUSTER_VERSION: גרסת GKE. ההמלצה היא להשתמש בגרסה ‎1.31.1-gke.12000 של GKE ואילך.
      • MACHINE_TYPE: סוג המכונה הרצוי.

      הדגל --output-path=/tmp/manifests.yaml הוא אופציונלי. אם לא מציינים את הפרמטר הזה, המניפסטים מודפסים בטרמינל, אבל לא נשמרים בקובץ.

      הפקודה הזו יוצרת קובץ YAML יחיד שמכיל שני משאבי Kubernetes:

      • ‫ConfigMap שמציין הגדרת Redis בשם redis.conf.
      • אובייקט ComputeClass. ההגדרה הזו מציינת את המכונות שבהן Redis יפעל, והיא אופציונלית. פרטים על האופן שבו מציינים סוגי מכונות זמינים במאמר מידע על ComputeClasses בהתאמה אישית

      זו דוגמה למניפסט שנוצר:

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: redis.conf
      data:
        redis.conf: |
          io-threads 2
          io-threads-do-reads yes
          save ""
      ---
      apiVersion: cloud.google.com/v1
      kind: ComputeClass
      metadata:
        generateName: optimized-gke-redis-7-caching-
      spec:
        nodePoolAutoCreation:
          enabled: true
        priorities:
        - machineType: c4-standard-4
        whenUnsatisfiable: DoNotScaleUp
      
    2. בודקים את ההמלצות ומשנים את קובצי המניפסט כך שיכללו את האופטימיזציות המועדפות. כדי להעריך את ההמלצות, אפשר לבצע את הפעולות הבאות:

      • כדאי לעיין בתיעוד של Redis כדי להעריך את ההגדרה המומלצת בהקשר שלכם.
      • כדאי להשוות את אופן השימוש בעומס העבודה של Redis באשכול שלכם לתרחיש השימוש הבא. אם התרחיש לדוגמה שלכם שונה, יכול להיות שתצטרכו להתאים את האופטימיזציות המומלצות להקשר שלכם.

      האופטימיזציות ל-Redis נקבעו עבור מופע Redis 7 שמשמש כמטמון look-aside עם צומת יחיד ויחס קריאה/כתיבה של 4:1 (4 קריאות לכל כתיבה אחת), והביצועים נמדדו באמצעות Memtier 2.2.1.

    3. עורכים את קובץ המניפסט אם רוצים לשנות את ההגדרה או להוסיף לה.

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

      kubectl create -f /tmp/manifests.yaml
      
  2. פורסים Pod שמפנה לאופטימיזציות. לדוגמה:

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
    spec:
      containers:
        - name: redis
          image: redis:7
          args:
            - /etc/gke/optimization/redis.conf
          volumeMounts:
            - name: gke-optimized-workload-config
              subPath: redis.conf
              mountPath: /etc/gke/optimization/redis.conf
              readOnly: true
      volumes:
        - name: gke-optimized-workload-config
          configMap:
            name: redis.conf
      nodeSelector:
        cloud.google.com/compute-class: optimized-gke-redis-7-caching-abc123
    

    לאחר מכן, מחילים את מניפסט ה-Pod על האשכול:

    kubectl apply -f pod.yaml
    
  3. מוודאים ש-Redis משתמש בהגדרה שעברה אופטימיזציה. כדי לעשות זאת, אפשר להריץ את הפקודה הבאה כדי לוודא ש-Redis משתמש בהגדרה שעברה אופטימיזציה:

    kubectl exec redis -- redis-cli INFO server | grep config_file
    

    הפלט אמור להיראות כך:

    config_file:/etc/gke/optimization/redis.conf
    

    אפשר גם להשתמש בפקודה redis-cli כדי לשלוח שאילתה לגבי ההנחיות הנפרדות שמוגדרות בהגדרה האופטימלית, כמו io-threads.

כשפורסים את עומס העבודה, האשכול יוצר מאגר צמתים חדש שתואם להגדרה האופטימלית, ומקצה את ה-Pods למאגרי הצמתים האלה.

אין שינוי בפודים שכבר קיימים. רק פודים שמפנים להגדרות שעברו אופטימיזציה עוברים אופטימיזציה. אם כבר פרסתם עומסי עבודה של Redis באשכול, תצטרכו לפרוס מחדש את עומסי העבודה האלה כדי להריץ אותם עם ההגדרות האופטימליות.

המאמרים הבאים