לדלג לתוכן

אחסון קבצים בענן - Object Storage בסגנון S3 מוסבר

כל אפליקציה שמאפשרת למשתמשים להעלות תמונת פרופיל, קובץ PDF או סרטון, מגיעה מוקדם או מאוחר לאותה שאלה - איפה בעצם שומרים את הקבצים האלה. התשובה הנכונה כמעט תמיד היא לא "על השרת עצמו", אלא במשהו שנקרא Object Storage. זה לא שירות ספציפי של חברה אחת, אלא דפוס ארכיטקטורה שלם שכדאי להבין לעומק, לא רק לדעת ש"יש S3".

מודל החשיבה - באקט, מפתח ואובייקט

בבסיס של כל שירות Object Storage, בין אם זה S3 של אמזון, Google Cloud Storage, Cloudflare R2 או אפילו MinIO שמריצים בעצמכם, עומד אותו מודל בדיוק. יש לכם באקט (bucket) שהוא בעצם מרחב אחסון, ובתוכו שומרים אובייקטים (objects) - שזה בעצם הקבצים עצמם. לכל אובייקט יש מפתח (key), שהוא מזהה טקסטואלי ייחודי בתוך הבאקט.

הטעות הכי נפוצה של מתחילים היא לחשוב על זה כמו על מערכת קבצים רגילה עם תיקיות ותתי תיקיות. זה לא נכון. כשאתם רואים מפתח כמו images/users/42/avatar.png, זה נראה כמו נתיב תיקיות, אבל בפועל זו סתם מחרוזת טקסט שטוחה עם לוכסנים בתוכה. אין "תיקייה" אמיתית שאפשר לפתוח או לסגור - זה רק ממשק שמדמה תיקיות בשביל הנוחות שלכם.

למה לא לשמור קבצים על הדיסק של השרת

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

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

קישורים חתומים מראש - Presigned URLs

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

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

CDN מול Object Storage - הצמד שעובד ביחד

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

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

Lifecycle ו-Versioning - ניקוי שלא דורש התערבות ידנית

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

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

לסיכום

שירות Object Storage הוא לא רק "מקום לשים בו קבצים" - זה דפוס ארכיטקטורה שלם שמבוסס על מרחב שטוח של אובייקטים, גישה ישירה מהלקוח דרך presigned URLs, שכבת CDN להגשה מהירה, וכללים אוטומטיים לניהול מחזור החיים של הקבצים. בין אם תבחרו ב-S3, בגוגל קלאוד, ב-R2 או במשהו שאתם מארחים בעצמכם, המודל הזה נשאר כמעט זהה. בקורס צד שרת בונים את זה בפועל, כולל חיבור אמיתי בין השרת לאחסון קבצים חיצוני.

יש לכם שאלה על הארכיטקטורה של אחסון הקבצים בפרויקט שלכם? בואו לשאול בדיסקורד.

הצטרפו לקהילה בדיסקורד