Redis والتخزين المؤقت المتقدم

تجميع Redis

20 دقيقة الدرس 20 من 30

تجميع Redis

يوفر Redis Cluster التوسع الأفقي والتوافر العالي من خلال توزيع البيانات عبر عقد Redis متعددة. يتعامل تلقائيًا مع تقسيم البيانات والنسخ المتماثل والتحويل التلقائي دون نقطة فشل واحدة.

لماذا نستخدم Redis Cluster؟

مع نمو تطبيقك، قد لا تتعامل مثيل Redis واحد مع الحمل. يحل Redis Cluster هذه المشكلة من خلال توزيع البيانات والمرور عبر خوادم متعددة.

الفوائد: قابلية التوسع الأفقي (إضافة المزيد من العقد)، التقسيم التلقائي (توزيع البيانات)، التوافر العالي (التحويل التلقائي)، لا توجد نقطة فشل واحدة.

معمارية التجميع

يستخدم Redis Cluster بنية بدون سيد حيث تعرف كل عقدة كل عقدة أخرى. يمكن للعملاء الاتصال بأي عقدة.

هيكل Redis Cluster:\n\nالسيد 1 (فتحات 0-5460)        الس يد 2 (فتحات 5461-10922)        السيد 3 (فتحات 10923-16383)\n    |                              |                                  |\n  نسخة 1                         نسخة 2                            نسخة 3\n\n- إجمالي 16,384 فتحة تجزئة\n- كل سيد يعالج نطاق من الفتحات\n- توفر النسخ المتماثلة التكرار\n- التحويل التلقائي عند فشل السيد

فتحات التجزئة

يقسم Redis Cluster مساحة المفاتيح إلى 16,384 فتحة تجزئة. يتم تعيين كل مفتاح لفتحة باستخدام تجزئة CRC16.

// كيف يتم تعيين المفاتيح للفتحات:\nslot = CRC16(key) % 16384\n\n// أمثلة:\nCRC16(\"user:1000\") % 16384 = 5478  // مخزن على السيد 1\nCRC16(\"product:5\") % 16384 = 12890 // مخزن على السيد 3\n\n// علامات التجزئة لتخزين نفس الفتحة:\n// استخدم {tag} لإجبار المفاتيح على نفس الفتحة\n\"user:{1000}:profile\"  // جميع المفاتيح بـ {1000} تذهب لنفس الفتحة\n\"user:{1000}:orders\"\n\"user:{1000}:cart\"\n\n// هذا يتيح عمليات متعددة المفاتيح:\nMGET user:{1000}:profile user:{1000}:orders
نصيحة: استخدم علامات التجزئة {tag} عندما تحتاج إلى إجراء عمليات متعددة المفاتيح مثل MGET أو المعاملات على مفاتيح ذات صلة.

تكوين التجميع

إعداد Redis Cluster بسيط بـ 3 أسياد و 3 نسخ متماثلة يتطلب 6 عقد.

# redis-node-1.conf (السيد 1)\nport 7000\ncluster-enabled yes\ncluster-config-file nodes-7000.conf\ncluster-node-timeout 5000\nappendonly yes\ndir /var/redis/7000\n\n# redis-node-2.conf (السيد 2)\nport 7001\ncluster-enabled yes\ncluster-config-file nodes-7001.conf\ncluster-node-timeout 5000\nappendonly yes\ndir /var/redis/7001\n\n# redis-node-3.conf (السيد 3)\nport 7002\ncluster-enabled yes\ncluster-config-file nodes-7002.conf\ncluster-node-timeout 5000\nappendonly yes\ndir /var/redis/7002\n\n# تكوينات النسخ المتماثلة (7003، 7004، 7005) مماثلة\n# بمنافذ ودلائل مختلفة

إنشاء تجميع

استخدم redis-cli لإنشاء التجميع وتعيين الفتحات للأسياد.

# بدء جميع مثيلات Redis\nredis-server /path/to/redis-node-1.conf\nredis-server /path/to/redis-node-2.conf\nredis-server /path/to/redis-node-3.conf\nredis-server /path/to/redis-node-4.conf\nredis-server /path/to/redis-node-5.conf\nredis-server /path/to/redis-node-6.conf\n\n# إنشاء التجميع (Redis 5+)\nredis-cli --cluster create \\n  127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \\n  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \\n  --cluster-replicas 1\n\n# الإخراج:\n# Master[0] -> فتحات 0-5460\n# Master[1] -> فتحات 5461-10922\n# Master[2] -> فتحات 10923-16383\n# تعيينات النسخ المتماثلة...

الاتصال بالتجميع

استخدم عملاء Redis المدركين للتجميع الذين يتعاملون مع عمليات إعادة التوجيه تلقائيًا.

const Redis = require('ioredis');\n\n// اتصال التجميع\nconst cluster = new Redis.Cluster([\n  { host: '127.0.0.1', port: 7000 },\n  { host: '127.0.0.1', port: 7001 },\n  { host: '127.0.0.1', port: 7002 }\n], {\n  redisOptions: {\n    password: 'your-password'\n  },\n  clusterRetryStrategy: (times) => {\n    return Math.min(100 * times, 2000);\n  }\n});\n\n// تعمل العمليات بشفافية\nawait cluster.set('user:1000', 'John');\nconst user = await cluster.get('user:1000');\n\n// يتعامل العميل مع عمليات إعادة التوجيه تلقائيًا\n// إذا كان المفتاح على عقدة مختلفة، يتبع العميل MOVED/ASK
إعادة توجيه العميل: عندما يكون المفتاح على عقدة مختلفة، يعيد Redis إعادة توجيه MOVED (دائم) أو ASK (مؤقت). يتعامل العملاء المدركون للتجميع مع هذه تلقائيًا.

إضافة عقد إلى التجميع

وسّع تجميعك بإضافة عقد سيدة أو نسخ متماثلة جديدة ديناميكيًا.

# بدء عقدة جديدة\nredis-server /path/to/redis-node-7.conf\n\n# إضافة كسيد\nredis-cli --cluster add-node \\n  127.0.0.1:7006 127.0.0.1:7000\n\n# إضافة كنسخة متماثلة لسيد محدد\nredis-cli --cluster add-node \\n  127.0.0.1:7006 127.0.0.1:7000 \\n  --cluster-slave \\n  --cluster-master-id <master-node-id>\n\n# إعادة توازن الفتحات للسيد الجديد\nredis-cli --cluster rebalance 127.0.0.1:7000 \\n  --cluster-use-empty-masters

إزالة العقد

أزل العقد بلطف من خلال إعادة توزيع فتحاتها أولاً.

# الحصول على معرف العقدة\nredis-cli -p 7000 cluster nodes\n\n# إعادة تقسيم الفتحات بعيدًا عن العقدة\nredis-cli --cluster reshard 127.0.0.1:7000 \\n  --cluster-from <source-node-id> \\n  --cluster-to <destination-node-id> \\n  --cluster-slots <number-of-slots>\n\n# إزالة العقدة الفارغة\nredis-cli --cluster del-node 127.0.0.1:7000 <node-id>\n\n# للنسخة المتماثلة، ما عليك سوى الإزالة (لا حاجة لإعادة التقسيم)\nredis-cli --cluster del-node 127.0.0.1:7003 <replica-node-id>

التحويل التلقائي

عندما يفشل سيد، يروج Redis Cluster تلقائيًا نسخة متماثلة إلى سيد.

// عملية التحويل:\n// 1. تكتشف النسخ المتماثلة فشل السيد (node-timeout)\n// 2. انتخاب النسخة المتماثلة (أقل رتبة للنسخة المتماثلة تفوز)\n// 3. يروج الفائز نفسه إلى سيد\n// 4. يدعي السيد الجديد الفتحات\n// 5. يستمر التجميع في العمل\n\n// مراقبة صحة التجميع\nredis-cli -p 7000 cluster info\n\n// الإخراج:\ncluster_state:ok\ncluster_slots_assigned:16384\ncluster_slots_ok:16384\ncluster_slots_pfail:0\ncluster_slots_fail:0\ncluster_known_nodes:6\ncluster_size:3
نصيحة: اضبط cluster-node-timeout على قيمة مناسبة (5000 مللي ثانية نموذجية). المنخفض جدًا يسبب نتائج إيجابية زائفة، والمرتفع جدًا يؤخر التحويل.

التحويل اليدوي

قم بتفعيل التحويل اليدوي للصيانة أو الاختبار.

# الاتصال بالنسخة المتماثلة وتفعيل التحويل\nredis-cli -p 7003 cluster failover\n\n# الخيارات:\ncluster failover          # انتظر النسخ المتماثل، ثم التحويل\ncluster failover force    # التحويل الفوري (خطر فقدان البيانات)\ncluster failover takeover # أصبح سيدًا بدون انتخاب\n\n// يبقى كود التطبيق غير متأثر\n// يكتشف عملاء التجميع تغيير التوبولوجيا ويعيدون الاتصال

ترحيل البيانات

يرحل Redis Cluster المفاتيح بين العقد أثناء إعادة التقسيم.

# ترحيل الفتحات 1000-1500 من العقدة A إلى العقدة B\n\n# الخطوة 1: تحضير العقدة المستقبلة\nCLUSTER SETSLOT <slot> IMPORTING <source-node-id>\n\n# الخطوة 2: تحضير العقدة المصدر\nCLUSTER SETSLOT <slot> MIGRATING <destination-node-id>\n\n# الخطوة 3: ترحيل المفاتيح\nCLUSTER GETKEYSINSLOT <slot> 100  # الحصول على المفاتيح\nMIGRATE <dest-host> <dest-port> <key> 0 5000  # ترحيل كل\n\n# الخطوة 4: تعيين الفتحة للعقدة الجديدة\nCLUSTER SETSLOT <slot> NODE <destination-node-id>\n\n# redis-cli --cluster reshard يؤتمت هذه العملية

التجميع مقابل الحارس

يحل Redis Cluster و Redis Sentinel مشاكل مختلفة.

Redis Cluster:\n✓ التوسع الأفقي (أسياد متعددون)\n✓ التقسيم التلقائي عبر العقد\n✓ لا توجد نقطة فشل واحدة\n✓ توزيع 16,384 فتحة تجزئة\n✓ التحويل التلقائي\n✗ إعداد أكثر تعقيدًا\n✗ بعض الأوامر محدودة (عمليات متعددة المفاتيح)\n\nRedis Sentinel:\n✓ التوافر العالي لسيد واحد\n✓ التحويل التلقائي\n✓ المراقبة والإشعارات\n✓ إعداد أبسط\n✗ لا توسع أفقي (سيد واحد)\n✗ التقسيم اليدوي مطلوب\n✗ نقطة فشل واحدة (السيد)\n\nاستخدم التجميع عندما: تحتاج للتوسع بما يتجاوز خادم واحد\nاستخدم الحارس عندما: سيد واحد كافٍ، تحتاج HA
دليل القرار: ابدأ بمثيل Redis واحد. أضف Sentinel للتوافر العالي. ترقية إلى Cluster عندما تتجاوز البيانات/المرور سعة الخادم الواحد.

قيود التجميع

كن على دراية بقيود Redis Cluster عند تصميم تطبيقك.

// تتطلب العمليات متعددة المفاتيح مفاتيح على نفس الفتحة\n// ✗ لن يعمل:\nMGET user:1000 user:2000 user:3000  // فتحات مختلفة\n\n// ✓ يعمل مع علامات التجزئة:\nMGET user:{1000}:profile user:{1000}:orders\n\n// تحديد قاعدة البيانات غير مدعوم\n// ✗ لن يعمل:\nSELECT 1  // يستخدم التجميع قاعدة البيانات 0 فقط\n\n// Pub/Sub عالمي (جميع العقد)\n// تصل الرسائل المنشورة على أي عقدة إلى جميع المشتركين\n\n// المعاملات محدودة بنفس الفتحة\n// ✓ يعمل:\nMULTI\nSET user:{1000}:name \"John\"\nINCR user:{1000}:visits\nEXEC\n\n// ✗ لن يعمل:\nMULTI\nSET user:1000 \"John\"  // الفتحة A\nSET user:2000 \"Jane\"  // الفتحة B - عقدة مختلفة!\nEXEC

مراقبة صحة التجميع

تتبع حالة التجميع ومقاييس الأداء بانتظام.

// فحص حالة التجميع\nredis-cli --cluster check 127.0.0.1:7000\n\n// الإخراج:\n// جميع الـ 16384 فتحة مغطاة\n// جميع العقد توافق على تكوين الفتحات\n// جميع العقد قابلة للوصول\n\n// الحصول على معلومات العقدة\nredis-cli -p 7000 cluster nodes\n\n// مراقبة توزيع الفتحات\nredis-cli -p 7000 cluster slots\n\n// المقاييس الرئيسية للمراقبة:\n// - cluster_state: ok/fail\n// - cluster_slots_fail: يجب أن يكون 0\n// - استخدام الذاكرة لكل عقدة\n// - زمن الوصول للشبكة بين العقد\n// - تكرار التحويل\n// - توازن توزيع المفاتيح
تحذير: يتطلب Redis Cluster ما لا يقل عن 3 عقد سيدة. مع عقد أقل، لا يمكن للتجميع تشكيل النصاب لقرارات التحويل.

أفضل ممارسات الإنتاج

اتبع هذه الإرشادات لنشر Redis Cluster موثوق.

1. عدد فردي من الأسياد (3، 5، 7)\n   - يضمن أغلبية واضحة للانتخابات\n\n2. نسخة متماثلة واحدة على الأقل لكل سيد\n   - يتيح التحويل التلقائي\n\n3. انشر العقد عبر مناطق التوافر\n   - يحمي من فشل مركز البيانات\n\n4. استخدم علامات التجزئة بشكل استراتيجي\n   - جمّع المفاتيح ذات الصلة لعمليات متعددة المفاتيح\n\n5. راقب صحة التجميع باستمرار\n   - تنبيه على مشاكل الانقسام أو تغطية الفتحات\n\n6. اختبر التحويل بانتظام\n   - تأكد من أن الاسترداد التلقائي يعمل\n\n7. خطط لإعادة التقسيم\n   - أضف السعة قبل الوصول إلى الحدود\n\n8. حدد المهلات المناسبة\n   - cluster-node-timeout: 5000 مللي ثانية نموذجي\n   - cluster-replica-validity-factor: 10 (افتراضي)\n\n9. النسخ الاحتياطي بانتظام\n   - لقطات RDB أو استمرارية AOF\n\n10. استخدم مكتبات عميل مدركة للتجميع\n    - ioredis (Node.js)، redis-py-cluster (Python)
تمرين: قم بإعداد Redis Cluster محلي بـ 3 أسياد و 3 نسخ متماثلة. خزّن بيانات المستخدم باستخدام علامات التجزئة (user:{id}:profile، user:{id}:orders). اختبر التحويل التلقائي بإيقاف عقدة سيدة والتحقق من ترقية النسخة المتماثلة. أضف عقدة سيدة جديدة وأعد توازن الفتحات. راقب حالة التجميع وتوزيع الفتحات. نفّذ تطبيق Node.js يتصل بالتجميع ويتعامل بشكل صحيح مع عمليات متعددة المفاتيح.