העברת Memcache ל-Memorystore

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

הפתרון של App Engine לבעיה הזו הוא Memcache, מאגר נתונים מבוזר בזיכרון שמשמש כמטמון למשימות ספציפיות.

כשמבצעים העברה משירותים מדור קודם, השירות המומלץ להחלפת App Engine Memcache הוא Memorystore, שירות אחסון במטמון מבוסס-ענן ומנוהל באופן מלא, שתומך במנועי אחסון במטמון בקוד פתוח, Redis ו-Memcached. במדריך הזה מוסבר איך להשתמש ב-Memorystore for Redis, שמאפשר ליצור מטמון לאפליקציות עם גישה לנתונים תוך פחות מאלפית השנייה.

אם אפליקציית Python שלכם משתמשת ב-Memcache רק כדי לצמצם את זמן האחזור של בקשות ndb או Cloud NDB, אתם יכולים להשתמש בתמיכה המובנית של Cloud NDB ב-Redis במקום ב-Memcache או ב-Memorystore for Redis.

לפני שמתחילים, חשוב לוודא שהאפליקציה לא תחרוג ממכסות השימוש ב-Memorystore for Redis.

מתי כדאי להשתמש במטמון זיכרון לאפליקציות Python

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

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

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

אם עדיין לא עשיתם זאת, צריך להגדיר את סביבת הפיתוח של Python כך שתשתמש בגרסת Python שתואמת ל- Google Cloud, ולהתקין כלי בדיקה ליצירת סביבות Python מבודדות.

הסבר על ההרשאות ב-Memorystore

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

כברירת מחדל, האפליקציה מספקת את פרטי הכניסה של חשבון השירות שמוגדר כברירת מחדל ב-App Engine, שיש לו הרשאה לגשת למסדי נתונים באותו פרויקט שבו נמצאת האפליקציה.

אם אחד מהתנאים הבאים מתקיים, צריך להשתמש בטכניקת אימות חלופית שכוללת פרטי כניסה באופן מפורש:

  • האפליקציה ומסד הנתונים של Memorystore נמצאים בGoogle Cloud פרויקטים שונים.

  • שיניתם את התפקידים שהוקצו לחשבון השירות שמוגדר כברירת מחדל ב-App Engine.

מידע על שיטות אימות חלופיות זמין במאמר הגדרת אימות לאפליקציות ייצור מסוג Server to Server.

סקירה כללית של תהליך המיגרציה

כדי להשתמש ב-Memorystore במקום ב-Memcache באפליקציית Python:

  1. מגדירים את Memorystore for Redis. לשם כך צריך ליצור מכונת Redis ב-Memorystore וליצור Serverless VPC Access שהאפליקציה משתמשת בו כדי לתקשר עם מכונת Redis. אין חשיבות לסדר שבו יוצרים את שתי הישויות העצמאיות האלה, ואפשר להגדיר אותן בכל סדר. ההוראות במדריך הזה מתייחסות להגדרה של חיבור לרשת (VPC) מאפליקציית serverless.

  2. מתקינים ספריית לקוח ל-Redis ומשתמשים בפקודות Redis כדי לשמור נתונים במטמון.

    ‫Memorystore for Redis תואם לכל ספריית לקוח ל-Redis.

    במדריך הזה מוסבר איך להשתמש בספריית הלקוח של redis-py כדי לשלוח פקודות Redis מהאפליקציה.

  3. בודקים את העדכונים.

  4. פריסת האפליקציה ב-App Engine.

הגדרה של Memorystore for Redis

כדי להגדיר את Memorystore for Redis:

  1. חיבור של App Engine לרשת VPC. האפליקציה יכולה לתקשר עם Memorystore רק דרך מחבר VPC.

    חשוב להוסיף את פרטי החיבור ל-VPC לקובץ app.yaml כמו שמתואר במאמר הגדרת השימוש באפליקציה במחבר.

  2. חשוב לשים לב לכתובת ה-IP ולמספר היציאה של מופע Redis שיוצרים. תשתמשו במידע הזה כשיוצרים לקוח Redis בקוד.

  3. יצירת מכונת Redis ב-Memorystore.

    כשמוצגת בקשה לבחור אזור למופע Redis, בוחרים באותו אזור שבו נמצאת אפליקציית App Engine.

יחסי תלות בהתקנות

כדי להשתמש בספריית הלקוח redis-py:

  1. מעדכנים את הקובץ app.yaml. פועלים לפי ההוראות שמתאימות לגרסת Python:

    ‫Python 2

    באפליקציות Python 2, מוסיפים את הגרסאות האחרונות של הספריות grpcio ו-setuptools.

    קובץ app.yaml לדוגמה:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    - name: setuptools
      version: latest
    

    Python 3

    באפליקציות Python 3, מציינים את הרכיב runtime בקובץ app.yaml עם גרסה נתמכת של Python 3. לדוגמה:

    runtime: python310 # or another support version
    

    סביבת זמן הריצה של Python 3 מתקינה ספריות באופן אוטומטי, כך שלא צריך לציין ספריות מובנות מסביבת זמן הריצה הקודמת של Python 2. אם האפליקציה שלכם ב-Python 3 משתמשת בשירותים אחרים מדור קודם שכלולים בחבילה במהלך ההעברה, אתם יכולים להמשיך לציין את הספריות המובנות הנדרשות. אחרת, אפשר למחוק את השורות המיותרות בקובץ app.yaml.

  2. מעדכנים את הקובץ requirements.txt. פועלים לפי ההוראות שמתאימות לגרסת Python:

    ‫Python 2

    מוסיפים את Cloud Client Libraries for Memorystore for Redis לרשימת יחסי התלות בקובץ requirements.txt.

    redis
    

    מריצים את הפקודה pip install -t lib -r requirements.txt כדי לעדכן את רשימת הספריות שזמינות לאפליקציה.

    Python 3

    מוסיפים את Cloud Client Libraries for Memorystore for Redis לרשימת יחסי התלות בקובץ requirements.txt.

    redis
    

    ‫App Engine מתקין באופן אוטומטי את התלות האלה במהלך פריסת האפליקציה בסביבת זמן הריצה של Python 3, לכן צריך למחוק את התיקייה lib אם היא קיימת.

  3. באפליקציות Python 2, אם האפליקציה משתמשת בספריות מובנות או בספריות שהועתקו שצוינו בספרייה lib, צריך לציין את הנתיבים האלה בקובץ appengine_config.py שנמצא באותה תיקייה כמו הקובץ app.yaml:

    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set PATH to your libraries folder.
    PATH = 'lib'
    # Add libraries installed in the PATH folder.
    vendor.add(PATH)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(PATH)
    

יצירת לקוח Redis

כדי ליצור אינטראקציה עם מסד נתונים של Redis, הקוד צריך ליצור לקוח Redis כדי לנהל את החיבור למסד הנתונים של Redis. בקטעים הבאים מתואר תהליך היצירה של לקוח Redis באמצעות ספריית הלקוח redis-py.

ציון משתני סביבה

ספריית הלקוח redis-py משתמשת בשני משתני סביבה כדי להרכיב את כתובת ה-URL של מסד הנתונים של Redis:

  • משתנה לזיהוי כתובת ה-IP של מסד הנתונים של Redis שיצרתם ב-Memorystore.
  • משתנה לזיהוי מספר היציאה של מסד הנתונים של Redis שיצרתם ב-Memorystore.

מומלץ להגדיר את המשתנים האלה בקובץ app.yaml של האפליקציה במקום להגדיר אותם ישירות בקוד. כך קל יותר להפעיל את האפליקציה בסביבות שונות, כמו סביבה מקומית ו-App Engine.

לדוגמה, מוסיפים את השורות הבאות לקובץ app.yaml:

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

ייבוא של redis-py ויצירת הלקוח

אחרי שמגדירים את משתני הסביבה REDISHOST ו-REDISPORT, משתמשים בשורות הבאות כדי לייבא את הספרייה redis-py וליצור לקוח:

  import redis

  redis_host = os.environ.get('REDISHOST', 'localhost')
  redis_port = int(os.environ.get('REDISPORT', 6379))
  redis_client = redis.Redis(host=redis_host, port=redis_port)

אם השתמשתם בגרסה ישנה יותר של redis-py באפליקציות אחרות, יכול להיות שהשתמשתם במחלקה StrictClient במקום ב-Client. עם זאת, redis-py ממליץ עכשיו על Client במקום על StrictClient.

שימוש בפקודות Redis לאחסון ולאחזור נתונים במטמון

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

שימו לב: בספרייית הלקוח redis-py לא תמיד יש שיטות אסינכרוניות מקבילות, למרות שב-Memcache יש חלופות אסינכרוניות לרבות מהפקודות שלה. אם אתם רוצים שכל האינטראקציות עם המטמון יהיו אסינכרוניות, תוכלו להשתמש בספריות לקוח אחרות של Redis עבור Python.

משימה פקודת Redis
יצירת רשומה במטמון הנתונים והגדרת זמן תפוגה לרשומה
SETNX
MSETNX
אחזור נתונים מהמטמון GET
MGET
החלפת ערכי מטמון קיימים SET
MSET
הגדלה או הקטנה של ערכי מטמון מספריים INCR
INCRBY
DECR
DECRBY
מחיקת רשומות מהמטמון DEL
UNLINK
תמיכה באינטראקציות בו-זמניות עם הזיכרון המטמון (השוואה והגדרה) פרטים על עסקאות ב-Redis שימו לב שבספריית הלקוח `redis-py` כל העסקאות צריכות להתבצע בצינור.

בדיקת העדכונים

כשבודקים את האפליקציה באופן מקומי, כדאי להריץ מופע מקומי של Redis כדי להימנע מאינטראקציה עם נתוני ייצור (Memorystore לא מספק אמולטור). כדי להתקין את Redis ולהריץ אותו באופן מקומי, פועלים לפי ההוראות במסמכי התיעוד של Redis. שימו לב: בשלב הזה אי אפשר להריץ את Redis באופן מקומי ב-Windows.

מידע נוסף על בדיקת אפליקציות Python זמין במאמר שימוש בשרת פיתוח מקומי.

פריסת האפליקציה

אחרי שהאפליקציה פועלת בשרת הפיתוח המקומי ללא שגיאות:

  1. בדיקת האפליקציה ב-App Engine.

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

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