כאשר ה-RAM של שרת בודד מגיע לתקרה וליבת המעבד נחנקת תחת בקשות, Redis עצמאי מפסיק לעמוד בעומס. Redis Cluster פותר את שתי הבעיות: הנתונים מחולקים בין צמתים, וכל צומת אחראי על טווח מפתחות משלו. טיפלנו במקרה שבו פרויקט מסחר אלקטרוני עם 50 מיליון סשנים עבר מ-Redis עצמאי לקלאסטר: העומס על כל מופע ירד מ-80% ל-15%, וזמן התגובה התייצב על 2 אלפיות השנייה. במאמר זה נסביר כיצד להקים קלאסטר של 6 צמתים ולהימנע מטעויות נפוצות. Sharding ו-scaling של Redis הם יתרונות מרכזיים — הקלאסטר יכול להתמודד עם עד 100,000 בקשות בשנייה על פני 3 צמתי מאסטר.
הניסיון שלנו מראה שבלי עיצוב נכון של hash tags וטיפול בשגיאות MOVED, קלאסטר מביא יותר בעיות מאשר יתרונות. אנו מבטיחים שעל ידי ביצוע ההמלצות שלנו, סובלנות התקלות מגיעה ל-99.9% בתנאי failover נכונים. לשם השוואה, Redis Cluster מהיר פי 2 מ-Redis עצמאי עבור אותה כמות נתונים בזכות מקביליות, וה-failover האוטומטי שלו אמין פי 3 מהתערבות ידנית. לדוגמה, לקוח אחד חסך $2,000 בחודש לאחר המעבר לקלאסטר שלנו.
במה שונה Redis Cluster מ-Redis עצמאי?
Redis עצמאי מאחסן את כל הנתונים על שרת אחד, מוגבל על ידי RAM וליבת מעבד אחת. Redis Cluster מחלק נתונים בין מספר צמתים, ומגדיל את קיבולת האחסון והתפוקה באמצעות עיבוד מקבילי על מספר ליבות.
מגבלות של Redis Cluster ופתרונות
Sharding: מ-CRC16 ועד Resharding
Redis Cluster מחלק את מרחב המפתחות ל-16,384 hash slots. כל צומת מאסטר אחראי על טווח slots. בעת פעולה על מפתח, Redis מחשב CRC16(key) % 16384 ומנתב את הבקשה לצומת המתאים.
בעת הוספת צומת חדש, slots מועברים בין צמתים ללא עצירת הקלאסטר. הלקוח מקבל שגיאת MOVED כאשר הוא ניגש ל-slot בצומת הלא נכון ומנותב אוטומטית. עם זאת, חלוקה מחדש של slots דורשת resharding ידני — איזון אוטומטי אינו זמין.
הסבר על Hash Tags
בקלאסטר, פקודות מרובות מפתחות (MGET, MSET, pipelines) נכשלות אם המפתחות נמצאים על slots שונים. כדי לקבץ מפתחות על אותו slot, השתמשו ב-hash tags: חלק מהמפתח ב-MGET user:1:profile user:2:profile משמש לחישוב ה-slot. ללא hash tags, תקבלו שגיאה. לדוגמה, {user:1}:profile יחזיר שגיאה, אבל {user:1}:settings ו-Cache::tags(["user:{$userId}"])->put("profile", $data, 3600); Cache::tags(["user:{$userId}"])->put("settings", $data, 3600); Cache::tags(["user:{$userId}"])->flush(); יעבדו כראוי.
ב-Laravel, hash tags מוגדרים באמצעות tags:
Cache::tags(["user:{$userId}"])->put("profile", $data, 3600);
Cache::tags(["user:{$userId}"])->put("settings", $data, 3600);
Cache::tags(["user:{$userId}"])->flush(); איך failover עובד ב-Redis Cluster?
כאשר צומת מאסטר נכשל, replica מקודם אוטומטית למאסטר בתוך cluster-node-timeout (ברירת מחדל 5 שניות). האפליקציה מקבלת שגיאת CLUSTERDOWN במהלך תקופה זו — נדרשת לוגיקת retry.
השוואה: Redis עצמאי מול Redis Cluster
Redis Cluster מעבד בקשות פי 2 מהר יותר מ-Redis עצמאי עבור אותה כמות נתונים בזכות מקביליות. Sentinel אינו מבצע sharding לנתונים; הוא מספק רק failover.
| מאפיין | Redis עצמאי | Redis Cluster |
|---|---|---|
| נפח נתונים מקסימלי | RAM של שרת אחד | RAM של כל צמתי המאסטר |
| תפוקה | ליבת מעבד אחת | N ליבות (מספר המאסטרים) |
| סובלנות תקלות | Replica + Sentinel | Failover אוטומטי של replica |
| פעולות מרובות מפתחות | נתמכות | רק דרך hash tags |
| ניתוב לקוח | אין | שגיאות MOVED/ASK |
פריסת קלאסטר שלב אחר שלב
תצורה מינימלית — 6 צמתים (3 מאסטרים + 3 replicas). ניתן לפרוס את הקלאסטר על שרתים פיזיים, מכונות וירטואליות או קונטיינרים של Docker. לפריסה עם Docker, השתמשו בתמונת Redis הרשמית וחשוף פורטים בהתאם. קובץ תצורה redis-cluster.conf לכל צומת (רק הפורט משתנה):
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
bind 0.0.0.0
requirepass ClusterPassword123
masterauth ClusterPassword123שלב 1: הכינו קבצי תצורה — צרו 6 קבצים עם פורטים 7001–7006. שלב 2: הפעילו מופעי Redis — הריצו כל מופע עם התצורה שלו.
שלב 3: צרו את הקלאסטר — בצעו פקודת port 7001 cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 5000 appendonly yes appendfsync everysec bind 0.0.0.0 requirepass ClusterPassword123 masterauth ClusterPassword123 אחת. הפעילו מופעים וצרו את הקלאסטר:
for port in 7001 7002 7003 7004 7005 7006; do
mkdir -p /var/redis/$port
cp redis-cluster.conf /var/redis/$port/redis.conf
sed -i "s/port 7001/port $port/" /var/redis/$port/redis.conf
sed -i "s/nodes-7001/nodes-$port/" /var/redis/$port/redis.conf
redis-server /var/redis/$port/redis.conf --daemonize yes
done
redis-cli --cluster create \
127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
--cluster-replicas 1 -a ClusterPassword123 הגדרת סובלנות תקלות עם זמן השבתה מינימלי
כאשר צומת מאסטר נכשל, replica מקודם אוטומטית למאסטר בתוך cluster-node-timeout (ברירת מחדל 5 שניות). האפליקציה מקבלת שגיאת CLUSTERDOWN במהלך תקופה זו — נדרשת לוגיקת retry.
דוגמה ללוגיקת retry ב-PHP (Predis)
$attempts = 0;
while ($attempts < 3) {
try {
$result = $redis->get($key);
break;
} catch (\RedisClusterException $e) {
if (++$attempts >= 3) throw $e;
usleep(500000); // 500ms
}
}לניטור, השתמשו ב-Prometheus עם redis_exporter — מספיק להצביע על צומת אחד. החיסכון האופייני שלנו במעבר לקלאסטר הוא כ-30% בהשוואה לשדרוג למופע יחיד גדול יותר.
חיבורי לקוח
ב-Laravel, הגדירו חיבור קלאסטר ב-for port in 7001 7002 7003 7004 7005 7006; do mkdir -p /var/redis/$port cp redis-cluster.conf /var/redis/$port/redis.conf sed -i "s/port 7001/port $port/" /var/redis/$port/redis.conf sed -i "s/nodes-7001/nodes-$port/" /var/redis/$port/redis.conf redis-server /var/redis/$port/redis.conf --daemonize yes done redis-cli --cluster create \ 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \ 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \ --cluster-replicas 1 -a ClusterPassword123 :
'redis' => [
'client' => 'phpredis',
'clusters' => [
'default' => [
['host' => '127.0.0.1', 'port' => 7001, 'password' => env('REDIS_PASSWORD')],
['host' => '127.0.0.1', 'port' => 7002],
['host' => '127.0.0.1', 'port' => 7003],
],
],
] ניהול קלאסטר
פקודות מפתח: $attempts = 0; while ($attempts < 3) { try { $result = $redis->get($key); break; } catch (\RedisClusterException $e) { if (++$attempts >= 3) throw $e; usleep(500000); // 500ms } } , config/database.php, 'redis' => [ 'client' => 'phpredis', 'clusters' => [ 'default' => [ ['host' => '127.0.0.1', 'port' => 7001, 'password' => env('REDIS_PASSWORD')], ['host' => '127.0.0.1', 'port' => 7002], ['host' => '127.0.0.1', 'port' => 7003], ], ], ] , cluster info, cluster nodes. לתיעוד מלא, עיינו בתיעוד הרשמי של Redis. עבור Redis Cluster ב-Docker, השתמשו ב---cluster check עם אותה תצורה.
מה כלול בעבודה
בעת הזמנת הקמת Redis Cluster במפתח-ביד, אנו מספקים:
- פריסת קלאסטר של 6 צמתים (3 מאסטרים + 3 replicas) על השרתים שלכם או בענן.
- הגדרת לקוחות קלאסטר (phpredis, Predis, Laravel).
- התאמת קוד: יישום hash tags, טיפול בשגיאות MOVED/ASK, לוגיקת retry.
- ניטור באמצעות Prometheus ו-Grafana.
- תיעוד ארכיטקטורה והוראות תפעול.
- הדרכת צוות על יסודות הקלאסטר.
| שלב | משך | עלות (בערך) |
|---|---|---|
| פריסת קלאסטר (6 צמתים) | 1–2 ימים | $1,500 |
| הגדרת לקוח והתאמת קוד | 1–2 ימים | $2,000 |
| ניטור ותיעוד | יום אחד | $800 |
| הדרכת צוות | 0.5 יום | $500 |
| סה"כ | 3–5 ימים | $4,800 |
צרו קשר להערכת פרויקט. קבלו ייעוץ על התאמת קוד והגדרת ניטור.
הניסיון שלנו
עבדנו עם Redis בסביבת production למעלה מ-5 שנים. פרסנו קלאסטרים ל-15+ פרויקטים עם עומסים של עד 100k בקשות בשנייה. אנו מחזיקים בהסמכת Redis Developer. יש לנו מקרי בוחן של מעבר מ-Redis Sentinel ל-Cluster עבור מסחר אלקטרוני, FinTech ו-AdTech. החיסכון האופייני שלנו במעבר לקלאסטר הוא כ-30% בהשוואה לשדרוג למופע יחיד גדול יותר.
אנו מבטיחים שלאחר ההקמה, הקלאסטר יפעל ללא תקלות בתנאי שעומדים בתנאי ה-SLA. פנו אלינו — נעזור לכם להרחיב את ה-cache שלכם.







