איך לנהל מסדי נתונים ומפתחות של Redis

הקדמה

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

במדריך זה, תלמד כיצד לבחור מסד נתונים, להעביר מפתחות בין מסדי נתונים, ולנהל ולמחוק מפתחות.

איך להשתמש במדריך זה

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

הפקודות שמוצגות במדריך זה נבדקו על שרת Ubuntu 22.04 המופעל Redis גרסה 6.0.16. כדי להגדיר סביבה דומה, תוכל לעקוב אחר שלב 1 במדריך שלנו על איך להתקין ולאבטח את Redis על Ubuntu 22.04. נדגים איך הפקודות הללו נמצאות בשימוש על ידי הרצתן עם redis-cli, ממשק השורת פקודה של Redis. שים לב שאם אתה משתמש בממשק Redis שונה — כמו Redli, לדוגמה — פלט מדויק של פקודות מסוימות עשוי להשתנות.

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

ניהול מסדי נתונים

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

מסדי הנתונים של Redis מסופרים מ-0 עד 15, ולפי ברירת מחדל, אתה מתחבר למסד נתונים 0 כאשר אתה מתחבר למופע Redis שלך. עם זאת, אתה יכול לשנות את המסד נתונים שאתה משתמש בו באמצעות פקודת select לאחר שאתה מתחבר:

  1. select 15

אם בחרת במסד נתונים שונה מ-0, זה יתבטא במחולל הפקודות של redis-cli:

כדי להחליף את כל הנתונים המאוחסנים במסד נתונים אחד עם הנתונים במסד נתונים אחר, השתמש בפקודת swapdb. בדוגמה הבאה נחליף את הנתונים במסד נתונים 6 עם הנתונים במסד נתונים 8, וכל הלקוחות המחוברים לאחד מהמסדים יוכלו ליישם שינויים מיידית:

  1. swapdb 6 8

פקודת swapdb תחזיר OK אם ההחלפה הצליחה.

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

  • שם המחשב או כתובת ה-IP של מסד הנתונים היעד
  • מספר הפורט של מסד הנתונים היעד
  • שם המפתח שברצונך להעביר
  • מספר מסד הנתונים שברצונך לאחסן את המפתח במופע היעד
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

להדגיש, הנה דוגמה:

  1. migrate 203.0.113.0 6379 key_1 7 8000

בנוסף, migrate מאפשר את האפשרויות הבאות שניתן להוסיף לאחר הארגומנט timeout:

  • COPY: מציין שהמפתח לא יימחק מהמקור
  • REPLACE: מציין שאם המפתח כבר קיים ביעד, הפעולה migrate תמחק ותחליף אותו
  • KEYS: במקום לספק מפתח ספציפי להעברה, ניתן להזין מחרוזת ריקה ("") ולאזן להשתמש בתחביר של הפקודה keys כדי להעביר כל מפתח שמתאים לתבנית. למידע נוסף על איך keys עובד, קראו את המדריך שלנו על כיצד לאתר בעיות ב־Redis.

ניהול מפתחות

ישנם מספר פקודות Redis שימושיות לניהול מפתחות בלתי תלויות בסוג הנתונים שהן מחזיקות. חלק מהן מבוארים בסעיף הבא.

rename ישנה את שם המפתח המצויין. אם זה מצליח, הוא יחזיר OK:

  1. rename old_key new_key

ניתן להשתמש ב־randomkey כדי להחזיר מפתח אקראי מבסיס הנתונים שנבחר כעת:

  1. randomkey
Output
"any_key"

השתמש ב־type כדי לקבוע איזה סוג של נתונים המפתח הנתון מחזיק. פלט הפקודה הזו יכול להיות או string, list, hash, set, zset, או stream:

  1. type key_1
Output
"string"

אם המפתח שצוין אינו קיים, type יחזיר none.

אפשר להעביר מפתח יחיד לבסיס נתונים אחר באינסטנס Redis שלך עם הפקודה move. הפקודה move מקבלת את שם המפתח ואת מסד הנתונים שבו ברצונך להעביר את המפתח כארגומנטים. לדוגמה, כדי להעביר את המפתח key_1 למסד הנתונים 8, תריץ את הפקודה הבאה:

  1. move key_1 8

move יחזיר OK אם העברת המפתח הצליחה.

מחיקת מפתחות

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

  1. del key_1 key_2

אם הפקודה מוחקת את המפתח(ות) בהצלחה, היא תחזיר (integer) 1. אחרת, תחזיר (integer) 0.

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

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

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

  1. unlink key_1

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

אזהרה: שתי הפקודות הבאות נחשבות מסוכנות. הפקודות flushdb ו- flushall ימחקו באופן בלתי הפיך את כל המפתחות במסד נתונים יחיד ואת כל המפתחות בכל מסדי הנתונים בשרת Redis, בהתאמה. מומלץ להריץ את הפקודות הללו רק אם אתה בטוח באופן מוחלט שברצונך למחוק את כל המפתחות במסד הנתונים או בשרת שלך.

זה עשוי להיות בתועלת שלך לשנות את שמות הפקודות האלו למשהו שיש לו סיכוי נמוך יותר להיבדק בטעות.

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

  1. flushdb

כדי למחוק את כל המפתחות בכל בסיס נתונים בשרת Redis (כולל בסיס הנתונים שנבחר כעת), הפעל flushall:

  1. flushall

גם flushdb ו־flushall מקבלים את האפשרות async, שמאפשרת לך למחוק את כל המפתחות בבסיס נתונים יחיד או בכל בסיס נתונים באשכול באופן אסינכרוני. זה מאפשר להם לפעול בדרך דומה לפקודת unlink, והם ייצורו תהליך חדש לשחרור זיכרון ברקע.

גיבוי של בסיס הנתונים שלך

כדי ליצור גיבוי של בסיס הנתונים הנבחר כעת, תוכל להשתמש בפקודה save:

  1. save

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

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

  1. bgsave

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

בנוסף, ניתן לערוך את קובץ התצורה של Redis כך ש־Redis ישמור תמונת מסד נתונים אוטומטית (ידוע גם בשם snapshotting או במצב RDB) לאחר כמות מסוימת של זמן אם מינימום מסוים של שינויים נעשו במסד הנתונים. זה ידוע כ־נקודת שמירה. הגדרות נקודת השמירה הבאות מופעלות כברירת מחדל בקובץ redis.conf:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

עם ההגדרות האלה, Redis יייצא תמונת מסד הנתונים לקובץ המוגדר על ידי הפרמטר dbfilename כל 900 שניות אם לפחות מפתח אחד השתנה, כל 300 שניות אם לפחות 10 מפתחות השתנו, וכל 60 שניות אם לפחות 10000 מפתחות השתנו.

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

נוסף, פקודת shutdown תשטף שינויים לקובץ append-only של Redis לפני שהיא יצאה מהמערכת אם מצב append-only מופעל. מצב הקובץ append-only (AOF) משליך יצירת יומן של כל פעולת כתיבה בשרת בקובץ שמסתיים ב- .aof אחרי כל תמונת מערכת. אפשר להפעיל את מצבי AOF ו-RDB על אותו שרת, ושימוש בשני שיטות הנמיכות הוא דרך יעילה לגבות את הנתונים שלך.

בקיצור, פקודת shutdown היא בעצם פקודת save מונעת שגיאה שגם תשטף את כל השינויים האחרונים לקובץ append-only ותסגור את החיבור למופע Redis:

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

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

  1. shutdown

אם לא הגדרת נקודות שמירה אך עדיין רוצה שה-Redis יבצע פעולת save, צריך להוסיף את אפשרות ה- save לפקודת shutdown:

  1. shutdown save

אם הגדרת לפחות נקודת שמירה אחת אך ברצונך לכבות את שרת ה־Redis מבלי לבצע שמירה, תוכל להוסיף את הארגומנט nosave לפקודה:

  1. shutdown nosave

שים לב שקובץ ה־append-only יכול לגדול במשך זמן רב, אך תוכל להגדיר את רדיס לכתוב מחדש את הקובץ על סמך משתנים מסוימים על ידי עריכת קובץ redis.conf. תוכל גם להורות לרדיס לכתוב מחדש את קובץ ה־append-only על ידי הרצת הפקודה bgrewriteaof:

  1. bgrewriteaof

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

מסקנה

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

למידע נוסף על פקודות Redis, בדוק את סדרת המדריכים שלנו על איך לנהל מסד נתונים של Redis.

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys