ארכיטקטורת מטמון: Redis, Memcased
ארכיטקטורת מטמון: Redis, Memcased
1) מתי ולמה מטמון
מטרות: להפחית איחור, לפרוק DB/PSP/API ופסגות מקלות.
שכבות מטמון הן לרוב רב-שכבתיות: בתהליכים (L1) * רמת השירות (Redis/Memcached L2) * edge/CDN. המטמון הפנימי מאיץ קריאות חמות, L2 נפוץ עבור שירותים, הקצה הוא עבור תוכן ציבורי.
2) Redis vs. Memcased - קצר
חוק: אם אתה צריך מבני נתונים מורכבים, התמדה, פאב/תת/זרמים/סקריפטים - קח את רדיס. אם שכבת מטמון KV סופר פשוטה, מהירה וזולה ללא עמידות היא Memcased.
3) דפוסי מטמון
3. 1 מטמון בצד (עצלן)
היישום קורא מהמטמון. * החטאה = קריאה מתוך מסד הנתונים.
בקרת TTL פשוטה, עצמאות מטמון.
3. 2 קריאה דרך
הלקוח/פרוקסי עצמו מושך ממקור בהחטאה ושם אותו במטמון.
היגיון מרוכז, תשתית מורכבת יותר.
3. 3 כתיבה/כתיבה מאחור
כתיבה דרך: כתיבה ראשונה למטמון, ולאחר מכן לבסיס הנתונים.
כתוב מאחור: כתיבה לתור, הבזק אסינכרוני בבסיס הנתונים (אובדן פוטנציאלי בעת התרסקות - אתה צריך יומן).
3. 4 שתי שכבות (L1 + L2)
L1 (בתהליך) עם TTL קצר ו-TTL רך, L2 (Redis/Memcached) - "אמת מטמון. "נכות דרך פאב/משנה.
4) TTL, סערות ועקביות
TTL-Set קרוב לתדר של שינוי הנתונים. עבור מפתחות חמים, השתמש ב ־ TTL (jitter) אקראי: tl = base ingrand (0. Base0. 1) מסיר זרימות סינכרוניות.
ערימת כלבים (עדר רועם):- Singleflight: רק תהליך אחד מגדיר יתר על המידה את הערך (ראה דוגמה של Lua).
- רענון רך-TTL + רקע: לאחר 'רך _ tl', לתת לו מעופש ולעדכן עם הרקע.
- Semaphore/lock: ”SET key: lock value NX PX = 2000”.
- כמעט מיושן: ”מעופש בזמן מחדש” עבור API תגובה (ראה סעיף 8).
5) מפתחות, אספות שם, סריאליזציה
5. שם מפתח 1
תבנית: ”דומיין” (ישות): דוגמאות:- 'user: פרופיל: 42' 'קטלוג: מוצר: 1001: v2' psp: תעריפים: 2025-11-03&pos
הוסף סכימה (': v2') - זה מקדם נכות המונית.
5. 2 מרחבי נימוסין באמצעות ”גרסת חלל”
החזק את המפתח 'ns: קטלוג = 17'. מפתחות אמיתיים: ”קטלוג: 17: מוצר: 1001”. עבור לקות ספרייה גלובלית, פשוט להעלות 'ns: קטלוג'.
5. 3 סריאליזציה/דחיסה
ג 'סון הוא נוח, אבל כבד. השתמש ב ־ Breash Pack/CBOR.
אפשר דחיסה (LZ4/ZSTD) עבור מטען גדול (> 1-2 KB). ברדיס - בצד הלקוח.
6) מפתחות חמים וחדות
צג למעלה-N על ידי להיט/מיס/בייט. עבור מפתחות חמים ביותר:- דפוס קריאה משוכפל: לשכפל את הערך בכמה מפתחות רסיס 'חם: k: 1.. N ', לבחור אקראי בעת קריאה.
- L1 מקומי: זכור את תהליך מנוי הנכות.
- רדיס קלאסטר - יליד (16384 חריצי חשיש).
- Memcased הוא חשיש עקבי בצד לקוח.
- Hash-tag ברדיס '...' מתקן חריץ עבור סט מפתחות: 'משתמש:': '42': פרופיל 'ו' משתמש ':' 42 ': גבולות' יהיה על אותו כרטיס.
7) מדיניות מניעה וגדלים
Redis 'maxmemory-policy': 'all keys-lru', 'הפכפך-lru', 'allkeys-lfu', 'noiciation' bustlac. д. למטמון, בדרך כלל 'alkeys-lu '/' allkeys-lfu'.
ממוזכר - LRU אתמול לוח פריטים.
גודל וערך מפתח: שים לב לגודל מקסימלי של פריט (Memcamed by default 1 MB, tuning lab).
מעבר לזיכרון צריך להתבזות באופן צפוי: לא ”לא פינוי” בנתיב הפעיל.
maxmemory 32gb maxmemory-policy allkeys-lfu hz 50 tcp-keepalive 60
8) דפוסי הגנה מפני סערות - קוד
8. 1 Redis Lua singleflight (פסאודו)
lua
-- KEYS[1] = data_key, KEYS[2] = lock_key
-- ARGV[1] = now_ms, ARGV[2] = soft_ttl_ms, ARGV[3] = hard_ttl_ms, ARGV[4] = lock_ttl_ms local payload = redis. call("GET", KEYS[1])
if payload then local meta = redis. call("HGETALL", KEYS[1].. ":meta")
local last = tonumber(meta[2] or "0")
if tonumber(ARGV[1]) - last < tonumber(ARGV[2]) then return { "HIT", payload }
end if redis. call ("SET," KEYS [2], "1," "NX," "PX," ARGV [4]) then return {"REFRESH," payload} - one worker updates, the rest give stale end return {"STALE," payload}
end if redis. call("SET", KEYS[2], "1", "NX", "PX", ARGV[4]) then return { "MISS", nil }
end return { "BUSY", nil }
8. 2 צומת. js מטמון-בצד (מפושט)
js const v = await redis. get(key);
if (v) return decode(v);
const lock = await redis. setNX(key+":lock", "1", { PX: 1500 });
if (lock) {
const fresh = await loadFromDB(id);
await redis. set(key, encode(fresh), { EX: ttl, NX: false });
await redis. del(key+":lock");
return fresh;
} else {
await sleep(60); // short backoff const retry = await redis. get (key) ;//give someone's already filled return decode (retry);
}
9) נכות וקוהרנטיות
על ידי אירוע: כאשר משתנים במסד הנתונים, פרסמו את ”אירוע פאב/סאב” (pub/sub) לא חוקי: (ns):- על ידי טיימר: TTL קצר לשינויים תכופים בנתונים.
- ורסיונינג: ראה: 'ns:' מפתחות.
- Outbox: ערבות להעברת נכות (אירוע רישום/נושא, רטריי).
- פעולות מטמון idempotency: השתמש ב- ”SETXX/SETNX”, גרסאות (”etag”) ושדות חשיש לגידול.
10) שכפול, אשכול, כשל
10. 1 רדיס
סנטינל: כשל אוטומטי בהעתק מאסטר (FUL IP/name).
אשכול: שריטה + כשל אוטומטי; הלקוחות חייבים לתמוך בהפניות נעות.
AOF/RDB: עבור מטמון בדרך כלל 'appendfsync eversec', זה אפשרי ללא התמדה (כמו מטמון טהור).
10. 2 ממוזכר
אין שכפול מהקופסה. אמינות - באמצעות רסיס רב שרת + חוזר 'n' (צד לקוח).
כאשר הצמתים נופלים, יש עלייה בהחמצות ו ”אימון מחדש” של המטמון.
10. 3 K8s ורשתות
Redis/Memcashed לא אוהבים את היצירה התכופה של תרמילים; השתמש באנטי-פודים StatCet + AZ, קבוע PVC/POD IP.
הגדרת תקציב PodGood ואילוצי טופולוגיה.
11) עסקאות, תסריטים ואטומיציה (רדיס)
INCR/DECR, HINCRBY - דלפקים, מכסות, מגבלות קצב (רק לשקול להתמיד).
צרור של פקודות אטומיות.
Lua (EVAL) - לקרוא-לשנות-לכתוב ללא מירוץ.
צינור - מקטין את RTT (במיוחד בכפיפות לרשת).
lua
-- KEYS[1]=bucket, ARGV[1]=capacity, ARGV[2]=refill_rate_per_sec, ARGV[3]=now_ms
-- Returns 1 if the token is issued, otherwise 0
12) תורים, פאב/תת ונחלים (רדיס)
פאב/סאב: נכות, אותות. אין חיסכון, מאזינים באינטרנט בלבד.
זרמים: תורים של אירוע אישור (ACK), קבוצת צרכנים, Retrai - שימושי לכתיבה מאחור/מאווררים.
רשימות (BRPOP): תורים פשוטים.
אל תשתמש ברדיס כ ”אוטובוס יחיד לכל דבר” ללא גיבוי - זהו מטמון/אוטובוס מהיר, לא קפקא.
13) ביטחון וגישה
בידוד רשת/VPC, mTLS ברמת הכניסה, ACL/סיסמאות ('דרישה pass'/ACL in Redis 6 +).
בטל פקודות מסוכנות ברדיס ('קונפיג', 'FLUSHALl',' מפתחות ') באמצעות ACL.
עבור Memcased - אל תקשיבו לממשקים ציבוריים, '-U 0' (ללא UDP), רק רשתות פרטיות.
אל תאחסן מח "ש; במידת הצורך - הצפנת TTL + קצרה ברמת היישום.
14) יכולת תצפית ותחזוקה
מדדי מפתח:- יחס להיט/מיס (על ידי שם/מסלול).
- פקודות latency p95/p99 'GET/SET/MGET', פסקי זמן.
- שגיאות של הפינוי.
- lag שכפול (רדיס), מצב אשכול, להגר/מחדש אירועים.
- מפתחות טופ-N על ידי תנועה/בייטים (דגימה).
- יומנים: פקודות איטיות (”איטי לוג”), שגיאות רשת.
- לוחות מחוונים: כללי (CPU/RAM/חיבורים), פקודות, חריצים אשכול, זקיפים, עובר דרך יצואני פרומתאוס.
15) תצורות ופריסות - דוגמאות
15. 1 רדיס סנטינל (קטע)
port 6379 protected-mode yes appendonly yes appendfsync everysec maxmemory-policy allkeys-lfu
'sentinel. conf ':
sentinel monitor m1 10. 0. 0. 11 6379 2 sentinel auth-pass m1 sentinel down-after-milliseconds m1 5000 sentinel failover-timeout m1 60000
15. 2 Redis Cluster (ערכי הגה, פשט)
yaml cluster:
enabled: true nodes: 6 # 3 masters + 3 replicas persistence:
size: 100Gi resources:
requests: { cpu: "500m", memory: "2Gi" }
15. 3 Memcased (פריסה)
yaml containers:
- image: memcached:1. 6 args: ["-m", "32768", "-I", "2m", "-v", "-t", "8", "-o", "modern"]
ports: [{ containerPort: 11211 }]
15. 4 NGINX בתור פרוקסי קריאה (לולאת API)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m max_size=10g inactive=10m;
map $request_uri $cache_key { default "api:$request_uri"; }
location /api/ {
proxy_cache api;
proxy_cache_valid 200 1m;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
proxy_cache_lock on; # singleflight на уровне NGINX proxy_cache_key $cache_key;
proxy_pass http://backend;
}
16) בדיקות ושערים
פרופילים של מטמון קר/חם/חם.
הזרקת החטאים (טיהור בהמוניהם) - המוצא חייב לעמוד ב ”הכשרה מחדש”.
התראות: ירידה חדה ביחס להיט, עלייה באיחור החטאה, מפולת של פינוי, עלייה בפסקי זמן.
17) אנטי דפוסים
לאחסן ”אמת” ברדיס ללא AOF/RDB וללא יתירות.
TTL = 0 (נצחי) עבור נתונים תנודתיים * חוסר עקביות תמידי.
המוני 'מפתחות' בדרבן.
היעדר ג 'יטר/רך-TTL * הפסקות סינכרוניות וסערות.
מקרה אחד לכל הפקודות ללא רסיסים/העתקים.
השתמש ב ־ Memced למשימות הדורשות אטומיציה/תסריטים.
18) רשימת יישומים (0-45 ימים)
0-10 ימים
בחר תבנית (מטמון בצד + L1/L2), תאר מפתחות, TTL, אספקטים.
אפשר jitter/soft-TTL, singleflight; התראות בסיסיות/לוחות מחוונים.
עבור Redis - הגדרת ACL, מצב מוגן, לוג איטי, מקסמורי-מדיניות.
11-25 ימים
עבור לחדד (רדיס קלאסטר או חשיש לקוח), העתקים.
נכות באמצעות פאב/תת או גירסת נימספייס; תיבת יוצא במסד הנתונים.
מטמון ”אימון מחדש” בדיקות טעינה; מגביל את המוצא.
26-45 ימים
אוטופרומו/צינורית TTL, חימום לפני השחרור.
זרמים לכתיבה מאחור/רקע הרכבה מחדש.
דיווחים שבועיים על יחס להיט, מפתחות עליונים, עלות זיכרון.
19) מדדי בגרות
יחס הלהיט L2 - 80% (סטטיסטיקות על מסלולים/שמות).
P95 GET <2-3 ms (in-DC), מתגעגע <SLO המקור.
0 סערות בנכות המונית (מוכחת על ידי בדיקות).
נכות אוטומטית וארוחת לילה.
כיווץ/שכפול מכסה 1 כשל הצומת ללא השפלה ראויה להערכה.
20) מסקנה
ארכיטקטורת מטמון חזקה היא המשמעת של מפתחות וטי-טי-אל, הגנה על סערות, פירוק נכון, והנעה מקדימה צפויה. רדיס נותן סמנטיקה עשירה, התמדה ואטומיות; ממוזכר - פשטות ומהירות מקסימלית. הוסף יכולת תצפית, לקות אירוע, L1 + L2, והמטמון הופך למאיץ פלטפורמה, לא מקור לטיפות מקריות ובאגים ”מיסטיים”.