Workstation Logo
المنتجات
مختبرات الذكاء الاصطناعيوكلاء OpenAIوكلاء ClaudeGrok BotWorkstation CRM (WSL CRM)التسويقجميع المنتجات
حلول الذكاء الاصطناعي
محطات عمل الذكاء الاصطناعيAI SME Packagesذكاء اصطناعي خاصمجموعات GPUذكاء اصطناعي طرفيمختبر الذكاء الاصطناعي للمؤسساتالذكاء الاصطناعي حسب الصناعة
الخدمات
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous Operationsاستشارات الذكاء الاصطناعيأتمتة DevOpsالأمن السيبرانيتطوير البرمجياتبناء الوكلاءإعداد MLOps
من نحن
الشركاءقصص العملاء
المقالات
الوثائق
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
المدونة
اتصل بناLogin
Workstation

محطات عمل الذكاء الاصطناعي وبرمجيات الوكلاء المتعددة والبنية التحتية لوحدات GPU وحلول الوكلاء الأذكياء للشركات الحديثة.

اتصل بنا

حلول الذكاء الاصطناعي

محطات عمل الذكاء الاصطناعيAI SME Packagesذكاء اصطناعي خاصمجموعات GPUذكاء اصطناعي طرفيمختبر الذكاء الاصطناعي للمؤسساتالذكاء الاصطناعي حسب الصناعة

المنتجات

جميع المنتجاتWSL CRM و ERPالتسويقوكلاء OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

الشركة

من نحنلماذا Workstationالشركاءقصص العملاءالأسعاراتصل

الموارد

المقالاتالتوثيقالمدونةبحثخريطة الموقع
مكتب المملكة المتحدة
77-79 Marlowes, Hemel Hempstead HP1 1LFالاتجاهات - اسلك المخرج 20 من الطريق M25 في لندن الخارجيةرقم الشركة: 11641870الاثنين - الجمعة: 9:00 ص - 6:00 م بتوقيت GMT
+44 7515 356 146
مكتب بلجيكا
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683الاثنين - الجمعة: 9:00 ص - 6:00 م بتوقيت CET
+32 492 45 67 46
مكتب الهند
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI. جميع الحقوق محفوظة.

الخصوصيةملفات تعريف الارتباطشروط الخدمةخريطة الموقع الإلكتروني

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

توفر Redis بشكل كبير في الإنتاج: مشغلي Sentinel وCluster وKubernetes

Redis HA مع Sentinel، ووضع Cluster، ومشغلي Kubernetes

Balinder Walia12 أبريل 202642 min read

Redis هو العمود الفقري للبنية التحتية للتطبيقات الحديثة. إنه بمثابة ذاكرة تخزين مؤقت، ومخزن جلسات، ووسيط رسائل، ومحدد المعدل، ومحرك لوحة المتصدرين، وخط أنابيب التحليلات في الوقت الفعلي لملايين التطبيقات في جميع أنحاء العالم. يمكن لمثيل Redis واحد التعامل مع مئات الآلاف من العمليات في الثانية بزمن وصول أقل من المللي ثانية - ولكن المثيل الواحد يمثل أيضًا نقطة فشل واحدة. عندما يتعطل Redis، تواجه التطبيقات حالات فشل متتالية: يطغى تدافع ذاكرة التخزين المؤقت على قواعد البيانات الخلفية، ويتم فقدان الجلسات، وتتوقف محددات المعدل عن العمل، وتختفي ميزات الوقت الفعلي. لا يعد إنشاء نشر Redis عالي التوفر أمرًا اختياريًا لأنظمة الإنتاج — فهو متطلب هندسي.

يعد هذا الدليل بمثابة بحث عميق شامل يركز على الإنتاج في التوفر العالي لـ Redis. سنغطي أساسيات النسخ المتماثل لـ Redis (النسخ المتماثل غير المتزامن، وأمر WAIT، وإعادة المزامنة الجزئية)، وRedis Sentinel لتجاوز الفشل التلقائي واكتشاف الخدمة، وRedis Cluster للقياس الأفقي مع توزيع فتحة التجزئة، ومشغلي Kubernetes (Spotahome، وOpsTree، وRedis Enterprise)، واستراتيجيات الثبات (لقطات RDB، وAOF، والاستمرارية المختلطة)، وعمليات النشر المُدارة عبر السحابة على AWS ElastiCache وAzure Cache لـ Redis وGCP Memorystore وعمليات نشر k3s المعدنية مع Rancher وLonghorn وإدارة الذاكرة وسياسات الإخلاء وتشفير TLS والتحكم في الوصول المستند إلى ACL وسلوك النشر/الفرع والتدفقات في تكوينات HA ووحدات Redis (RedisJSON وRediSearch وRedisTimeSeries) في HA وتجمع الاتصالات والعميل التكوين لمرونة تجاوز الفشل، واستراتيجيات النسخ الاحتياطي والاستعادة، والمراقبة باستخدام Redis INFO، ومصدر Prometheus، ولوحات معلومات Grafana، وDragonfly وKeyDB كبدائل متوافقة مع Redis، وضبط الأداء باستخدام خطوط الأنابيب، والبرمجة النصية Lua، وتحسين الذاكرة، وسيناريوهات الفشل الشائعة وإجراءات استكشاف الأخطاء وإصلاحها، وتخطيط السعة واستراتيجيات التوسع.

Redis أساسيات النسخ المتماثل

يعد النسخ المتماثل لـ

Redis هو الأساس الذي بنيت عليه جميع بنيات التوفر العالي. يقبل مثيل Redis الرئيسي عمليات الكتابة وينشرها بشكل غير متزامن إلى مثيل واحد أو أكثر من النسخ المتماثلة. تحتفظ النسخ المتماثلة بنسخة في الوقت الفعلي تقريبًا من مجموعة البيانات الرئيسية وتخدم استعلامات القراءة، مما يوفر تكرار البيانات وقابلية التوسع في القراءة.

على عكس النسخ المتماثل المتدفق المستند إلى WAL الخاص بـ PostgreSQL، يستخدم Redis بروتوكول النسخ المتماثل القائم على الأوامر. يتم إجراء تسلسل لكل أمر كتابة يتم تنفيذه على الجهاز الرئيسي في دفق النسخ المتماثل وإرساله إلى النسخ المتماثلة المتصلة، والتي تنفذ نفس الأوامر على مجموعات البيانات المحلية الخاصة بها. هذا الأسلوب بسيط وفعال ولكن له آثار مهمة على الاتساق - نظرًا لأن النسخ المتماثل غير متزامن افتراضيًا، فهناك دائمًا نافذة حيث لم تصل عمليات الكتابة المعترف بها على النسخة الرئيسية بعد إلى النسخ المتماثلة.

النسخ المتماثل غير المتزامن

وأمر الانتظار

افتراضيًا، يكون النسخ المتماثل لـ Redis غير متزامن تمامًا. يقر السيد بالكتابة إلى العميل مباشرة بعد تطبيقها محليًا، دون انتظار أي نسخة طبق الأصل لتأكيد الاستلام. يوفر هذا الحد الأقصى من إنتاجية الكتابة ولكنه يقدم نافذة محتملة لفقدان البيانات - إذا تعطل البرنامج الرئيسي قبل أن تصل عملية الكتابة إلى أي نسخة متماثلة، فسيتم فقدان تلك الكتابة.

يوفر أمرWAITنسخة أولية متزامنة. بعد إصدار عملية الكتابة، يمكن للعميل الاتصال بـWAIT numreplicas timeoutللحظر حتى يقر العدد المحدد من النسخ المتماثلة بالكتابة أو تنتهي المهلة. هذا لا يجعل Redis متزامنًا بالكامل — يضمنWAITفقط أن النسخ المتماثلة قد تلقت البيانات، وليس استمرارها على القرص على النسخ المتماثلة. ومع ذلك، فإنه يقلل بشكل كبير من نافذة فقدان البيانات.

# Write a critical value and wait for 2 replicas to acknowledge
SET order:12345 '{"status":"confirmed","amount":599.99}'
WAIT 2 5000
# Returns the number of replicas that acknowledged within 5000ms
# Returns 0 if no replica acknowledged (timeout or no replicas connected)

استخدمWAITبشكل انتقائي لعمليات الكتابة الهامة (المعاملات المالية، تأكيدات الطلب) مع السماح لعمليات الكتابة غير الهامة (تحديثات ذاكرة التخزين المؤقت، تحديثات الجلسة) بالمتابعة بشكل غير متزامن. تتجنب المرونة لكل أمر عقوبة زمن الوصول للنسخ المتماثل المتزامن الكامل.

إعادة المزامنة الجزئية

(PSYNC)

عندما يتم قطع اتصال النسخة المتماثلة لفترة وجيزة (مض الشبكة، إعادة التشغيل)، فإنها لا تحتاج إلى نقل مجموعة بيانات كاملة للانضمام مرة أخرى. يحتفظ Redis بتراكم النسخ المتماثل — مخزن مؤقت دائري لأوامر الكتابة الحديثة — على الجهاز الرئيسي. عند إعادة اتصال النسخة المتماثلة، فإنها ترسل إزاحة النسخ المتماثل إلى الجهاز الرئيسي. إذا كانت الإزاحة لا تزال ضمن الأعمال المتراكمة، يرسل السيد فقط الأوامر المفقودة (إعادة المزامنة الجزئية). إذا وقعت الإزاحة خارج نطاق العمل المتراكم، فسيتم تشغيل عملية إعادة المزامنة الكاملة، والتي تتضمن إنشاء ونقل لقطة RDB.

# redis.conf — Replication backlog configuration
repl-backlog-size 256mb          # Size of the replication backlog buffer
repl-backlog-ttl 3600            # Seconds to retain backlog after last replica disconnects
repl-diskless-sync yes           # Transfer RDB via socket instead of disk (faster for full sync)
repl-diskless-sync-delay 5       # Wait 5s for more replicas before starting diskless sync
repl-diskless-sync-period 0      # No periodic full sync
repl-diskless-load on-empty-db   # Replica loads RDB from socket directly into memory

يعد تحديد حجم تراكم النسخ المتماثل بشكل صحيح أمرًا بالغ الأهمية. يجب أن يكون كبيرًا بما يكفي لاستيعاب كافة أوامر الكتابة التي تم إنشاؤها أثناء أطول فترة قطع اتصال متماثلة متوقعة. بالنسبة لمثيل Redis الذي يعالج 50 ميجابايت/ثانية من حركة مرور الكتابة، يغطي تراكم 256 ميجابايت حوالي 5 ثوانٍ من الكتابة - قم بزيادة هذه المدة إذا كانت النسخ المتماثلة الخاصة بك قد تكون غير متصلة بالإنترنت لفترات أطول.

تكوين النسخ المتماثلة الرئيسية

# redis.conf — Master configuration
bind 0.0.0.0
port 6379
protected-mode no
requirepass strong_master_password
masterauth strong_master_password

# Persistence
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

# Replication
repl-backlog-size 256mb
repl-backlog-ttl 3600
repl-diskless-sync yes
min-replicas-to-write 1          # Refuse writes if fewer than 1 replica connected
min-replicas-max-lag 10          # Replica considered disconnected if lag > 10 seconds
# redis.conf — Replica configuration
bind 0.0.0.0
port 6379
protected-mode no
requirepass strong_master_password
masterauth strong_master_password

replicaof master-host 6379
replica-read-only yes
replica-serve-stale-data yes     # Serve (possibly stale) data during sync
replica-priority 100             # Lower values get promoted first by Sentinel

تمنع إعداداتmin-replicas-to-writeوmin-replicas-max-lagالبرنامج الرئيسي من قبول عمليات الكتابة عندما لا يتمكن من ضمان متانة البيانات في النسخ المتماثلة. تعد هذه شبكة أمان بالغة الأهمية - وبدونها، يستمر البرنامج الرئيسي المقسم على الشبكة في قبول عمليات الكتابة التي ستفقد عندما يقوم Sentinel بترويج نسخة متماثلة.

Redis Sentinel: تجاوز الفشل التلقائي واكتشاف الخدمة

Redis Sentinel هو نظام موزع يراقب مثيلات Redis الرئيسية والنسخ المتماثلة، ويكتشف حالات الفشل الرئيسية، وينفذ تجاوز الفشل التلقائي من خلال ترقية نسخة متماثلة إلى النسخة الرئيسية، ويوفر اكتشاف الخدمة حتى يتمكن العملاء دائمًا من العثور على النسخة الرئيسية الحالية. يعمل Sentinel كعملية منفصلة جنبًا إلى جنب مع Redis ويعمل من خلال بروتوكول إجماع - يجب أن يوافق النصاب القانوني لمثيلات Sentinel على عدم إمكانية الوصول إلى الملف الرئيسي قبل بدء تجاوز الفشل.

Redis Sentinel Architecture - تجاوز الفشل التلقائي & اكتشاف الخدمةعملاء تطبيقمجموعة الحارس (النصاب القانوني = 2)الحارس 1 :26379الحارس 2 :26379الحارس 3 :26379SENTINEL احصل على عنوان رئيسي حسب الاسمRedis ماسترالعقدة 1 — 10.0.1.10:6379القراءة/الكتابة -الأساسيمراقبةPINGكتابة حركة المرورالنسخة المتماثلة 1العقدة 2 — 10.0.1.11:6379للقراءة فقط - الأولوية 100النسخة المتماثلة 2العقدة 3 — 10.0.1.12:6379للقراءة فقط - الأولوية 100النسخ المتماثل غير المتزامنالنسخ المتماثل غير المتزامنتجاوز فشل: فشل السيد → الحارس يختارتمت ترقية النسخة المتماثلة→ يقوم العملاء بإعادة الاتصال عبر Sentinelتم اكتشافODOWN بواسطةأسطورةماستر (RW)نسخة طبق الأصل (RO)الحارسمسار تجاوز الفشل

تكوين الحارس

يتطلب

Sentinel ما لا يقل عن ثلاث مثيلات لتحمل فشل Sentinel واحد مع الحفاظ على النصاب القانوني. يراقب كل Sentinel نفس سيد Redis ويتواصل مع Sentinels الآخرين من خلال بروتوكول القيل والقال للاتفاق على الحالة الصحية للسيد.

# /etc/redis/sentinel.conf — Sentinel instance configuration
port 26379
bind 0.0.0.0
protected-mode no

# Monitor the master named "mymaster" at 10.0.1.10:6379
# The quorum value (2) means 2 Sentinels must agree the master is down
sentinel monitor mymaster 10.0.1.10 6379 2

# Authentication
sentinel auth-pass mymaster strong_master_password

# Timing parameters
sentinel down-after-milliseconds mymaster 5000    # SDOWN after 5s of no PING response
sentinel failover-timeout mymaster 60000          # Max 60s for failover procedure
sentinel parallel-syncs mymaster 1                # Only 1 replica syncs from new master at a time

# Deny script execution for security
sentinel deny-scripts-reconfig yes

# Notification script (called on failover events)
# sentinel notification-script mymaster /opt/redis/notify.sh

# Client reconfiguration script (called when master changes)
# sentinel client-reconfig-script mymaster /opt/redis/reconfig.sh

# Logging
logfile /var/log/redis/sentinel.log
logevel notice

# Enable TLS for Sentinel communication
# tls-port 26379
# port 0
# tls-cert-file /etc/redis/tls/sentinel.crt
# tls-key-file /etc/redis/tls/sentinel.key
# tls-ca-cert-file /etc/redis/tls/ca.crt
# tls-replication yes
# tls-auth-clients optional
يعمل اكتشاف الفشل في

Sentinel على مرحلتين. أولاً، يضع الحارس الفردي علامة رئيسية على أنهذاتيًا لأسفل (SDOWN)عندما لا يتلقى أي رد صالح على PING داخلdown-after-milliseconds. بعد ذلك، عندما يتفق النصاب القانوني للحراس على أن السيد غير قابل للوصول، يتم وضع علامةعليه بشكل موضوعي (ODOWN)، وتبدأ عملية تجاوز الفشل. يتم اختيار One Sentinel كقائد لتجاوز الفشل، والذي يحدد أفضل نسخة متماثلة (استنادًا إلى الأولوية وإزاحة النسخ المتماثل والرونيد)، ويقوم بترقيتها إلى النسخة الرئيسية، ويعيد تكوين النسخ المتماثلة المتبقية لتتبع النسخة الرئيسية الجديدة، ويقوم بتحديث حالة Sentinel.

اكتشاف الخدمة الحارسة وتكوين العميل

الميزة الرئيسية لـ Sentinel مقارنة بإعدادات النسخ المتماثلة الرئيسية الثابتة هي اكتشاف الخدمة. لا يتصل العملاء بعنوان Redis ثابت — فهم يطلبون من Sentinel العنوان الرئيسي الحالي ويشتركون في إشعارات تجاوز الفشل. تدعم كل مكتبة عملاء Redis الرئيسية Sentinel محليًا.

# Node.js — ioredis with Sentinel support
const Redis = require('ioredis');

const redis = new Redis({
  sentinels: [
    { host: '10.0.1.20', port: 26379 },
    { host: '10.0.1.21', port: 26379 },
    { host: '10.0.1.22', port: 26379 }
  ],
  name: 'mymaster',
  password: 'strong_master_password',
  sentinelPassword: 'sentinel_password',
  db: 0,
  retryStrategy(times) {
    const delay = Math.min(times * 200, 5000);
    return delay;
  },
  reconnectOnError(err) {
    const targetError = 'READONLY';
    if (err.message.includes(targetError)) {
      return true; // Reconnect on READONLY error (failover happened)
    }
    return false;
  },
  maxRetriesPerRequest: 3,
  enableReadyCheck: true,
  connectTimeout: 10000,
  lazyConnect: false
});

redis.on('connect', () => console.log('Connected to Redis master'));
redis.on('error', (err) => console.error('Redis error:', err));
redis.on('+switch-master', (msg) => {
  console.log('Master switched:', msg);
});
# Python — redis-py with Sentinel support
from redis.sentinel import Sentinel
import redis

sentinel = Sentinel(
    [('10.0.1.20', 26379), ('10.0.1.21', 26379), ('10.0.1.22', 26379)],
    socket_timeout=5,
    password='strong_master_password',
    sentinel_kwargs={'password': 'sentinel_password'}
)

# Get a connection to the current master (for writes)
master = sentinel.master_for(
    'mymaster',
    socket_timeout=5,
    retry_on_timeout=True,
    db=0
)

# Get a connection to a replica (for reads)
replica = sentinel.slave_for(
    'mymaster',
    socket_timeout=5,
    db=0
)

# Usage
master.set('session:user123', '{"logged_in": true}')
result = replica.get('session:user123')
print(result)
// Go — go-redis with Sentinel support
package main

import (
    "context"
    "fmt"
    "time"

    "github.com/redis/go-redis/v9"
)

func main() {
    ctx := context.Background()

    rdb := redis.NewFailoverClient(&redis.FailoverOptions{
        MasterName:       "mymaster",
        SentinelAddrs:    []string{"10.0.1.20:26379", "10.0.1.21:26379", "10.0.1.22:26379"},
        Password:         "strong_master_password",
        SentinelPassword: "sentinel_password",
        DB:               0,
        DialTimeout:      10 * time.Second,
        ReadTimeout:      5 * time.Second,
        WriteTimeout:     5 * time.Second,
        PoolSize:         50,
        MinIdleConns:     10,
        MaxRetries:       3,
        MinRetryBackoff:  200 * time.Millisecond,
        MaxRetryBackoff:  5 * time.Second,
    })
    defer rdb.Close()

    err := rdb.Set(ctx, "key", "value", 5*time.Minute).Err()
    if err != nil {
        fmt.Printf("Error: %v
", err)
        return
    }

    val, err := rdb.Get(ctx, "key").Result()
    if err != nil {
        fmt.Printf("Error: %v
", err)
        return
    }
    fmt.Printf("key = %s
", val)
}
مجموعة

Redis: القياس الأفقي مع فتحات التجزئة

بينما يوفر Sentinel توافرًا عاليًا لمجموعة بيانات واحدة، يوفر Redis Cluster كلاً من HA والقياس الأفقي. تقوم مجموعة Redis بتقسيم البيانات عبر عقد رئيسية متعددة باستخدام آلية فتحة التجزئة - يتم تقسيم مساحة المفاتيح إلى 16,384 فتحة تجزئة، وكل رئيسي مسؤول عن مجموعة فرعية من تلك الفتحات. لدى كل رئيسي نسخة متماثلة واحدة أو أكثر لتجاوز الفشل. توفر المجموعة بشكل جماعي التقسيم التلقائي وتجاوز الفشل المدمج والقدرة على قياس كل من التخزين والإنتاجية خطيًا عن طريق إضافة العقد.

Redis البنية العنقودية - فتحات التجزئة & توجيه العميلفتحات0-5460فتحات5461-10922فتحات10923-16383إجمالي 16,384 فتحة تجزئة موزعة على 3 شرائح رئيسية (CRC16 mod 16384)العميل الذكي (مدرك للكتلة)العميل يخزن فتحة تعيين العقدة. يعالج عمليات إعادة توجيه MOVED/ASKماستر أ10.0.1.10:7000فتحات: 0-5460~5461 فتحة (33.3%)ماستر ب10.0.1.11:7000 فتحات: 5461-10922~ 5462 فتحة (33.3%)ماستر سي10.0.1.12:7000 فتحات: 10923-16383~5461 فتحة (33.3%)نسخة طبق الأصل A110.0.1.13:7000يكرر فتحات Master Aنسخة طبق الأصل B110.0.1.14:7000يكرر فتحات Master Bنسخة طبق الأصل C110.0.1.15:7000يكرر فتحات Master Cالناقل العنقودي(المنفذ + 10000) - بروتوكول القيل والقال، اكتشاف الفشل، نشر التكوينتقوم كل عقدة بتبادل PING/PONG مع كل عقدة أخرى عبر بروتوكول TCP الثنائيتم نقله 12345 10.0.1.12:7000 — إعادة توجيه دائمة | اسأل 12345 10.0.1.12:7000 — إعادة التوجيه لمرة واحدة أثناء إعادة تقسيم

إعداد مجموعة Redis

# Create a 6-node Redis Cluster (3 masters + 3 replicas)
# Each node needs a redis.conf with cluster-enabled

# redis.conf for each cluster node (adjust port per node)
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
requirepass cluster_password
masterauth cluster_password
bind 0.0.0.0
protected-mode no
repl-backlog-size 256mb

# Start all 6 Redis instances
redis-server /etc/redis/7000.conf
redis-server /etc/redis/7001.conf
# ... repeat for all 6 nodes

# Create the cluster
redis-cli --cluster create \
  10.0.1.10:7000 10.0.1.11:7000 10.0.1.12:7000 \
  10.0.1.13:7000 10.0.1.14:7000 10.0.1.15:7000 \
  --cluster-replicas 1 \
  -a cluster_password

# Verify cluster status
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster info
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster nodes
إعادة تقسيم

وعمليات المفاتيح المتعددة

يقوم

Resharding بنقل فتحات التجزئة بين العناصر الرئيسية لإعادة توازن البيانات بعد إضافة العقد أو إزالتها. أثناء إعادة التوزيع، قد تتلقى المفاتيح الموجودة في فتحات الترحيل عمليات إعادة توجيه ASK، والتي يتعامل معها العميل بشفافية.

# Add a new node to the cluster
redis-cli --cluster add-node 10.0.1.16:7000 10.0.1.10:7000 -a cluster_password

# Reshard slots to the new node
redis-cli --cluster reshard 10.0.1.10:7000 \
  --cluster-from all \
  --cluster-to NEW_NODE_ID \
  --cluster-slots 4096 \
  --cluster-yes \
  -a cluster_password

# Rebalance the cluster automatically
redis-cli --cluster rebalance 10.0.1.10:7000 -a cluster_password

# Check cluster slot distribution
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster slots

تعمل عمليات المفاتيح المتعددة في مجموعة Redis فقط عندما تكون جميع المفاتيح المعنية موجودة في نفس فتحة التجزئة. استخدم علامات التجزئة للتأكد من تعيين المفاتيح ذات الصلة إلى نفس الفتحة: يتم تجزئة كل من{user:123}.profileو{user:123}.sessionsعلىuser:123، مما يضمن وصولهما إلى نفس العقدة. يؤدي ذلك إلى تمكين MGET وMSET والمعاملات والبرامج النصية Lua عبر المفاتيح ذات الصلة.

# Hash tags ensure these keys are in the same slot
SET {order:5000}.details '{"item":"widget","qty":3}'
SET {order:5000}.payment '{"method":"card","status":"paid"}'
SET {order:5000}.shipping '{"carrier":"fedex","tracking":"FX123"}'

# Multi-key operations work because all keys share the {order:5000} hash tag
MGET {order:5000}.details {order:5000}.payment {order:5000}.shipping

# Transaction across same-slot keys
MULTI
SET {order:5000}.details '{"item":"widget","qty":3,"status":"confirmed"}'
SET {order:5000}.payment '{"method":"card","status":"captured"}'
EXEC
مشغل

Redis لـ Kubernetes

يتطلب تشغيل Redis في Kubernetes معالجة دقيقة للتخزين المستمر وهوية الشبكة وتجاوز الفشل وإدارة التكوين. يقوم مشغلو Kubernetes بتشفير هذه المعرفة التشغيلية إلى وحدات تحكم مخصصة تدير مجموعات Redis بشكل تعريفي من خلال تعريفات الموارد المخصصة (CRDs).

مشغل سبوتاهوم Redis

يعد مشغل Spotahome (المعروف أيضًا باسم مشغل redis) مشغلًا ناضجًا ومستخدمًا على نطاق واسع لنشر HA المستند إلى Redis Sentinel في Kubernetes. إنه يدير مجموعات النسخ المتماثلة الرئيسية لـ Redis مع تجاوز الفشل المستند إلى Sentinel.

# Install the Spotahome Redis Operator
helm repo add spotahome https://spotahome.github.io/redis-operator
helm install redis-operator spotahome/redis-operator \
  --namespace redis-system --create-namespace

# RedisFailover CRD — 3 Redis instances + 3 Sentinels
apiVersion: databases.spotahome.com/v1
kind: RedisFailover
metadata:
  name: redis-ha
  namespace: production
spec:
  sentinel:
    replicas: 3
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
    customConfig:
      down-after-milliseconds: "5000"
      failover-timeout: "60000"
  redis:
    replicas: 3
    resources:
      requests:
        cpu: "2"
        memory: 8Gi
      limits:
        cpu: "4"
        memory: 16Gi
    storage:
      persistentVolumeClaim:
        metadata:
          name: redis-data
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
          storageClassName: longhorn
    customConfig:
      maxmemory: "6gb"
      maxmemory-policy: "allkeys-lru"
      save: "900 1 300 10 60 10000"
      appendonly: "yes"
      appendfsync: "everysec"
      aof-use-rdb-preamble: "yes"
      repl-backlog-size: "256mb"
    exporter:
      enabled: true
      image: oliver006/redis_exporter:latest
      args:
        - --include-system-metrics

مشغل OpsTree Redis

يدعم مشغل OpsTree كلاً من طبولوجيا Redis Sentinel (HA المستقلة) وRedis Cluster (HAsharded HA)، مما يجعلها أكثر تنوعًا لحالات الاستخدام المختلفة.

# Install the OpsTree Redis Operator
helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
helm install redis-operator ot-helm/redis-operator \
  --namespace redis-system --create-namespace

# Redis Cluster CRD — 3 masters + 3 replicas
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: RedisCluster
metadata:
  name: redis-cluster
  namespace: production
spec:
  clusterSize: 3
  clusterVersion: v7
  persistenceEnabled: true
  kubernetesConfig:
    image: redis:7.2-alpine
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "2"
        memory: 8Gi
      limits:
        cpu: "4"
        memory: 16Gi
  redisLeader:
    replicas: 3
    redisConfig:
      additionalRedisConfig: |
        maxmemory 6gb
        maxmemory-policy allkeys-lru
        appendonly yes
        appendfsync everysec
  redisFollower:
    replicas: 3
    redisConfig:
      additionalRedisConfig: |
        maxmemory 6gb
        replica-read-only yes
  storage:
    volumeClaimTemplate:
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
        storageClassName: longhorn
  redisExporter:
    enabled: true
    image: quay.io/opstree/redis-exporter:v1.44.0

Redis مشغل المؤسسة

توفر

Redis Enterprise مشغل Kubernetes تجاريًا بميزات متقدمة بما في ذلك النسخ الجغرافي النشط النشط (CRDTs)، ودعم وحدات Redis، والتصنيف التلقائي (RAM + flash)، وإدارة المجموعة الآلية. إنه الخيار الموصى به للمؤسسات التي تحتاج إلى اتفاقيات مستوى الخدمة والدعم على مستوى المؤسسة.

# Redis Enterprise Operator CRD
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
  name: redis-enterprise
  namespace: redis-enterprise
spec:
  nodes: 3
  persistentSpec:
    enabled: true
    storageClassName: longhorn
    volumeSize: 100Gi
  redisEnterpriseNodeResources:
    limits:
      cpu: "8"
      memory: 32Gi
    requests:
      cpu: "4"
      memory: 16Gi
  uiServiceType: ClusterIP
  servicesRiggerSpec:
    databaseServiceType: ClusterIP
---
apiVersion: app.redislabs.com/v1alpha1
kind: RedisEnterpriseDatabase
metadata:
  name: redis-ha-db
  namespace: redis-enterprise
spec:
  memorySize: 10GB
  replication: true
  shardCount: 3
  persistence: aofEverySecond
  tlsMode: enabled
  modulesList:
    - name: search
      version: latest
    - name: json
      version: latest
استراتيجيات الثبات

: RDB وAOF و

الهجين يوفر

Redis ثلاث آليات للثبات. يعتمد اختيار الإستراتيجية الصحيحة على هدف نقطة الاسترداد (RPO) ومتطلبات الأداء وقيود التخزين.

لقطات

RDB تقومبإنشاء لقطات لحظية لمجموعة البيانات بأكملها على فترات زمنية محددة. فهي مدمجة وسريعة التحميل عند إعادة التشغيل ومثالية للنسخ الاحتياطي. ومع ذلك، يتم فقدان البيانات المكتوبة بين اللقطات عند التعطل. يستخدم RDB عملية فرعية متشعبة، لذلك لا يؤدي إنشاء اللقطة إلى حظر مؤشر ترابط Redis الرئيسي - ولكن يمكن أن يتسبب التفرع نفسه في ارتفاع زمن الاستجابة في مجموعات البيانات الكبيرة بسبب تخصيص ذاكرة النسخ عند الكتابة.

AOF (ملف الإلحاق فقط) يقومبتسجيل كل عملية كتابة على القرص. فهو يوفر متانة أفضل بكثير من RDB — معappendfsync everysec، ستفقد ثانية واحدة على الأكثر من البيانات عند التعطل. معappendfsync always، لن تخسر شيئًا، ولكن بتكلفة أداء كبيرة. ملفات AOF أكبر من ملفات RDB وأبطأ في التحميل عند إعادة التشغيل.

الثبات الهجين يجمع(الأسلوب الموصى به) بين الاثنين: يكتبaof-use-rdb-preamble yesلقطة RDB في بداية ملف AOF، متبوعة بإدخالات AOF لعمليات الكتابة اللاحقة. وهذا يعطي أوقات بدء تشغيل سريعة (قسم RDB) مع متانة قوية (قسم AOF).

# redis.conf — Hybrid persistence (recommended for production)

# RDB snapshots
save 900 1          # Snapshot if at least 1 write in 900 seconds
save 300 10         # Snapshot if at least 10 writes in 300 seconds
save 60 10000       # Snapshot if at least 10000 writes in 60 seconds
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis

# AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec           # Best balance of durability and performance
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes       # Hybrid: RDB preamble + AOF tail
aof-timestamp-enabled yes      # Enable timestamps for PITR (Redis 7+)

# Recovery options
rdb-del-sync-files no
aof-load-truncated yes

عمليات نشر Redis المُدارة عبر السحابة

AWS ElastiCache لـ Redis

يوفر

AWS ElastiCache Redis مُدارًا بالكامل مع وضعين HA: تعطيل وضع المجموعة(جزء واحد، ما يصل إلى 5 نسخ متماثلة، تجاوز الفشل الشبيه بـ Sentinel) وتمكين وضع المجموعة(ما يصل إلى 500 جزء، كل منها مع ما يصل إلى 5 نسخ متماثلة، توزيع فتحة التجزئة). يوفر Global Datastore النسخ المتماثل عبر المناطق للتعافي من الكوارث.

# AWS CLI — Create ElastiCache Redis Cluster Mode Enabled
aws elasticache create-replication-group \
  --replication-group-id redis-ha-prod \
  --replication-group-description "Production Redis HA Cluster" \
  --engine redis \
  --engine-version 7.1 \
  --cache-node-type cache.r7g.2xlarge \
  --num-node-groups 3 \
  --replicas-per-node-group 2 \
  --automatic-failover-enabled \
  --multi-az-enabled \
  --at-rest-encryption-enabled \
  --transit-encryption-enabled \
  --auth-token strong_auth_token \
  --cache-subnet-group-name redis-subnet-group \
  --security-group-ids sg-0123456789abcdef0 \
  --snapshot-retention-limit 7 \
  --snapshot-window "03:00-05:00" \
  --preferred-maintenance-window "sun:05:00-sun:07:00" \
  --cache-parameter-group-name redis-ha-params \
  --log-delivery-configurations '[
    {"LogType":"slow-log","DestinationType":"cloudwatch-logs","DestinationDetails":{"CloudWatchLogsDetails":{"LogGroup":"/aws/elasticache/redis-ha-prod"}}},
    {"LogType":"engine-log","DestinationType":"cloudwatch-logs","DestinationDetails":{"CloudWatchLogsDetails":{"LogGroup":"/aws/elasticache/redis-ha-prod"}}}
  ]'

# Create Global Datastore for cross-region DR
aws elasticache create-global-replication-group \
  --global-replication-group-id-suffix redis-global \
  --primary-replication-group-id redis-ha-prod

# Add secondary region
aws elasticache create-replication-group \
  --replication-group-id redis-ha-dr \
  --replication-group-description "DR Redis in eu-west-2" \
  --global-replication-group-id ldgnf-redis-global \
  --cache-node-type cache.r7g.2xlarge \
  --num-node-groups 3 \
  --replicas-per-node-group 1 \
  --region eu-west-2

# Custom parameter group for HA tuning
aws elasticache create-cache-parameter-group \
  --cache-parameter-group-name redis-ha-params \
  --cache-parameter-group-family redis7 \
  --description "HA-optimised Redis 7 parameters"

aws elasticache modify-cache-parameter-group \
  --cache-parameter-group-name redis-ha-params \
  --parameter-name-values \
    "ParameterName=maxmemory-policy,ParameterValue=allkeys-lru" \
    "ParameterName=timeout,ParameterValue=300" \
    "ParameterName=tcp-keepalive,ParameterValue=60" \
    "ParameterName=activedefrag,ParameterValue=yes"

Azure ذاكرة التخزين المؤقت لـ Redis

توفر

Azure Cache لـ Redis ثلاثة مستويات: أساسي (بدون نسخ متماثل)، قياسي (مكرر)، وPremium/Enterprise. تدعم الطبقة المميزة التجميع، والنسخ المتماثل الجغرافي، وتكرار المنطقة، وحقن VNet، واستمرارية البيانات. تضيف طبقة Enterprise وحدات Redis والتوزيع الجغرافي النشط.

# Azure CLI — Create Premium Azure Cache for Redis with clustering
az redis create \
  --resource-group redis-ha-rg \
  --name redis-ha-prod \
  --location westeurope \
  --sku Premium \
  --vm-size P3 \
  --shard-count 3 \
  --replicas-per-master 1 \
  --zones 1 2 3 \
  --minimum-tls-version 1.2 \
  --redis-version 7

# Enable geo-replication (link primary to secondary)
az redis server-link create \
  --name redis-ha-prod \
  --resource-group redis-ha-rg \
  --server-to-link /subscriptions/.../redis-ha-dr \
  --replication-role Secondary

# Configure data persistence
az redis update \
  --name redis-ha-prod \
  --resource-group redis-ha-rg \
  --set redisConfiguration.rdb-backup-enabled=true \
  --set redisConfiguration.rdb-backup-frequency=60 \
  --set redisConfiguration.rdb-storage-connection-string="DefaultEndpointsProtocol=https;..."

# Enable diagnostics
az monitor diagnostic-settings create \
  --name redis-diagnostics \
  --resource /subscriptions/.../redis-ha-prod \
  --workspace /subscriptions/.../log-analytics-workspace \
  --metrics '[{"category":"AllMetrics","enabled":true}]'

GCP Memorystore لـ Redis

يقدم

GCP مستويين من Memorystore:Standard(مثيل واحد مع نسخة متماثلة لتجاوز الفشل التلقائي) وRedis Cluster(مجموعة مقسمة ومُدارة بالكامل مع تحجيم تلقائي). الطبقة القياسية مناسبة لمعظم حالات استخدام HA، بينما تتعامل مجموعة Redis مع مجموعات البيانات الكبيرة التي تتطلب تحجيمًا أفقيًا.

# GCP — Create Standard tier Memorystore (HA with auto-failover)
gcloud redis instances create redis-ha-prod \
  --size=26 \
  --region=europe-west1 \
  --zone=europe-west1-b \
  --alternative-zone=europe-west1-c \
  --tier=standard \
  --redis-version=redis_7_2 \
  --redis-config="maxmemory-policy=allkeys-lru,activedefrag=yes" \
  --network=projects/my-project/global/networks/vpc-main \
  --transit-encryption-mode=SERVER_AUTHENTICATION \
  --enable-auth \
  --persistence-mode=RDB \
  --rdb-snapshot-period=12h \
  --rdb-snapshot-start-time="2026-04-12T03:00:00Z" \
  --maintenance-window-day=SUNDAY \
  --maintenance-window-hour=4

# GCP — Create Memorystore Redis Cluster
gcloud redis clusters create redis-cluster-prod \
  --region=europe-west1 \
  --shard-count=3 \
  --replica-count=1 \
  --network=projects/my-project/global/networks/vpc-main \
  --transit-encryption-mode=SERVER_AUTHENTICATION

نشر Redis متعدد المناطق

يعد نشر Redis متعدد المناطق أمرًا ضروريًا للتعافي من الكوارث وتقليل زمن الوصول العالمي. يختلف النهج حسب البنية: يستخدم Redis Enterprise Active-Active مع CRDTs (أنواع البيانات المنسوخة الخالية من التعارض) للكتابة الحقيقية متعددة الماجستير، بينما تستخدم Redis مفتوحة المصدر والخدمات المُدارة عبر السحابة النسخ المتماثل النشط السلبي مع النسخ المتماثلة للقراءة في المناطق الثانوية.

نشرRedis متعدد المناطق - نشط ونشط & النسخ المتماثل عبر المناطقالمنطقة 1 - AWS us-east-1ElastiCache الأساسي3 أجزاء - تم تمكين وضع المجموعة2 قراءة النسخ المتماثلة لكل قطعةتجاوز الفشل التلقائي متعدد AZنقطة نهاية قارئ(قراءات دائرية)مخزن البيانات العالمي- المنطقة الأساسيةالمنطقة 2 - Azure غرب أوروباAzure كاش بريميوم3 شظايا — منطقةزائدة عن الحاجة1 نسخة طبق الأصل لكل قطعةمناطق1، 2، 3يرتبط النسخ المتماثل الجغرافي بـالأساسينسخة جغرافية سلبية - مزامنة غير متزامنةالمنطقة 3 - GCP asia-east1معيار مخزن الذاكرةجزء واحد - تجاوز الفشل التلقائينسخة طبق الأصل منHA (منطقة متقاطعة)تم تمكين استمراريةRDB لـالنسخ المتماثل على مستوى التطبيقمن المنطقة 1وضع الاستعداد للقراءة فقطجغرافي غير متزامنالنسخ المتماثل عبر المنطقة غير المتزامنRedis Enterprise Active-Active (المتعدد الرئيسي القائم على CRDT)CRDB المثيل أUS — R/W (السرعة المحلية الكاملة)CRDB المثيل BEU — R/W (السرعة المحلية الكاملة)CRDB المثيل CAPAC — R/W (السرعة المحلية الكاملة)مزامنةCRDT - يتم دمج العدادات والمجموعات والسلاسل بدون تعارض عبر المناطقDNS العالمي / توجيه حركة المرور (على أساس زمن الوصول)أسطورة:رئيسي/أساسيالنسخة المتماثلةغير متزامن عبر المناطقنشط نشط CRDBRPO: نشط سلبي ≈ ثواني من التأخر | نشط-نشط CRDT ≈ فقدان البيانات صفر (التناسق النهائي)

المعدن العاري k3s/Rancher مع Longhorn

بالنسبة للمؤسسات التي تقوم بتشغيل أجهزتها الخاصة، يوفر نشر Redis HA على المعدن k3s تحكمًا كاملاً في البنية التحتية، ويزيل تقييد البائع السحابي، ويمكن أن يكون أكثر فعالية من حيث التكلفة بشكل ملحوظ لعمليات النشر واسعة النطاق. k3s هو توزيع Kubernetes خفيف الوزن ومعتمد ومثالي للبيئات المعدنية العارية، بينما يوفر Rancher مستوى إدارة للعمليات متعددة المجموعات.

المعدن العاري k3s + Rancher — Redis HA مع مشغل Sentinelواجهة المستخدم لإدارة المزارعدورة حياة الكتلة + مراقبةموازن التحميل MetalLBVIP: 10.0.0.50 (redis-master)& 10.0.0.51 (إعادة القراءة)مجموعةk3s — 3 عقد خادم (معدنية عارية)مشغلRedis (Spotahome/OpsTree)العقدة 1 - المعدن العاري srv1Redis ماستر بودStatefulSet redis-ha-0 :6379سنتينل بود:26379قرون طويلة PVC (AOF + RDB)50Gi - يتم تكرارها 3x عبر العقدالسيارة الجانبية للمصدر: 9121مقاييسPrometheusNVMe SSD - قرص محلي بسعة 2 تيرابايتالعقدة 2 - المعدن العاري srv2Redis طبق الأصل جرابStatefulSet redis-ha-1 :6379الحارس جراب:26379قرون طويلة PVC (AOF + RDB)50Gi — تم نسخها 3x عبر العقدالسيارة الجانبية للمصدر: 9121مقاييسPrometheusNVMe SSD - قرص محلي بسعة 2 تيرابايتالعقدة 3 - المعدن العاري srv3Redis طبق الأصل جرابStatefulSet redis-ha-2 :6379Sentinel Pod:26379قرون طويلة PVC (AOF + RDB)50Gi — تم نسخها 3x عبر العقدالسيارة الجانبية للمصدر: 9121مقاييسPrometheusNVMe SSD - قرص محلي بسعة 2 تيرابايتأسطورة:ماسترالنسخة المتماثلةالحارسقرون طويلة PVCمصدرميتالبالمشغلرانشريوفرk3s Kubernetes خفيف الوزن. يوفر Longhorn تخزينًا موزعًا للكتل مع النسخ المتماثل 3x عبر محركات أقراص NVMe SSD.يقومMetalLB بتعيين عناوين IP مستقرة لـ LoadBalancer لخدمات (الكتابة) الرئيسية وRedis للقراءة (النسخ المتماثلة). يدير Rancher دورة حياة المجموعة.تثبيت

k3s ونشر مشغل Redis

# Install k3s on the first server node
curl -sfL https://get.k3s.io | K3S_TOKEN=redis-cluster-token \
  INSTALL_K3S_EXEC="server --cluster-init --disable traefik --disable servicelb" sh -

# Join additional server nodes
curl -sfL https://get.k3s.io | K3S_TOKEN=redis-cluster-token \
  K3S_URL=https://10.0.0.1:6443 \
  INSTALL_K3S_EXEC="server" sh -

# Install Longhorn for distributed block storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system --create-namespace \
  --set defaultSettings.defaultDataPath=/mnt/longhorn \
  --set defaultSettings.replicaCount=3 \
  --set defaultSettings.storageMinimalAvailablePercentage=15

# Install MetalLB for bare-metal LoadBalancer services
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb --namespace metallb-system --create-namespace

# Configure MetalLB IP address pool
kubectl apply -f - <

Redis HA Helm قيم k3s

# values-redis-ha.yaml — Helm values for Redis HA on k3s/Longhorn
redis:
  replicas: 3
  resources:
    requests:
      cpu: "2"
      memory: 8Gi
    limits:
      cpu: "4"
      memory: 16Gi
  storage:
    persistentVolumeClaim:
      metadata:
        name: redis-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
        storageClassName: longhorn
  customConfig:
    maxmemory: "6gb"
    maxmemory-policy: "allkeys-lru"
    save: "900 1 300 10 60 10000"
    appendonly: "yes"
    appendfsync: "everysec"
    aof-use-rdb-preamble: "yes"
    repl-backlog-size: "256mb"
    tcp-keepalive: "60"
    timeout: "300"
    hz: "10"
    activedefrag: "yes"
  exporter:
    enabled: true
    image: oliver006/redis_exporter:latest

sentinel:
  replicas: 3
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 200m
      memory: 256Mi
  customConfig:
    down-after-milliseconds: "5000"
    failover-timeout: "60000"
    parallel-syncs: "1"

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app.kubernetes.io/component
              operator: In
              values:
                - redis
        topologyKey: kubernetes.io/hostname

إدارة الذاكرة وسياسات الإخلاء

يقوم

Redis بتخزين جميع البيانات في الذاكرة، مما يجعل إدارة الذاكرة هي الاهتمام التشغيلي الأكثر أهمية. عندما يصل Redis إلى حدmaxmemoryالذي تم تكوينه، يجب أن يقرر ما يجب فعله بأوامر الكتابة الواردة. وتتحكم سياسة الإخلاء في هذا السلوك.

# redis.conf — Memory management
maxmemory 6gb
maxmemory-policy allkeys-lru

# Available eviction policies:
# noeviction        — Return errors on writes when memory limit reached
# allkeys-lru       — Evict least recently used keys (general-purpose cache)
# allkeys-lfu       — Evict least frequently used keys (better for skewed access patterns)
# volatile-lru      — Evict LRU keys with TTL set
# volatile-lfu      — Evict LFU keys with TTL set
# volatile-ttl      — Evict keys with shortest TTL first
# allkeys-random    — Evict random keys
# volatile-random   — Evict random keys with TTL set

# Active defragmentation (Redis 4.0+)
activedefrag yes
active-defrag-enabled yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
active-defrag-cycle-min 1
active-defrag-cycle-max 25
active-defrag-max-scan-fields 1000

# Memory usage monitoring
# redis-cli INFO memory
# Key metrics:
#   used_memory           — Total bytes allocated by Redis
#   used_memory_rss       — Resident set size (OS-level memory)
#   mem_fragmentation_ratio — RSS / used_memory (should be close to 1.0)
#   maxmemory             — Configured memory limit
#   evicted_keys          — Total keys evicted due to maxmemory

بالنسبة لعمليات نشر HA، قم بتعيينmaxmemoryإلى 75% تقريبًا من ذاكرة الوصول العشوائي المتوفرة للعقدة. تستوعب نسبة 25% المتبقية المخزن المؤقت لإخراج النسخ المتماثل، والمخزن المؤقت لإعادة كتابة AOF، وذاكرة النسخ عند الكتابة أثناء لقطات RDB، وعبء نظام التشغيل. بالنسبة لجراب سعة 16 جيجابايت، اضبط الحد الأقصى للذاكرة على 12 جيجابايت. بالنسبة للخادم المعدني بسعة 64 جيجابايت، اضبطه على 48 جيجابايت.

تشفير

TLS وقوائم ACL

يجب أن تقوم عمليات نشر Redis بتشفير البيانات أثناء النقل باستخدام TLS وفرض التحكم الدقيق في الوصول باستخدام قوائم ACL (قوائم التحكم في الوصول)، المقدمة في Redis 6.0.

# redis.conf — TLS configuration
tls-port 6380
port 0                            # Disable non-TLS port entirely
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients optional         # Require client certificates (mutual TLS)
tls-replication yes               # Encrypt replication traffic
tls-cluster yes                   # Encrypt cluster bus traffic
tls-protocols "TLSv1.3"           # Only allow TLS 1.3

# ACL configuration (Redis 6.0+)
# user  on|off [>password] [~pattern] [+command|-command] [&channel]
user default off                  # Disable the default user
user admin on >strong_admin_pass ~* +@all
user appuser on >app_pass ~app:* ~session:* ~cache:* +@read +@write +@connection -@admin -@dangerous
user readonly on >readonly_pass ~* +@read +@connection -@write -@admin
user replicator on >repl_pass +psync +replconf +ping

# Load ACL from external file
aclfile /etc/redis/users.acl

Pub/Sub والتدفقات في إعدادات HA

يتصرف

Redis Pub/Sub والتدفقات بشكل مختلف في تكوينات HA. يعد فهم هذه الاختلافات أمرًا ضروريًا لبناء أنظمة موثوقة تعتمد على الأحداث.

Pub/Sub رسائلهي رسائل "إطلاق ونسيان" — فهي لا تستمر، ولا يتم نسخها، ولا يتم تخزينها مؤقتًا. في إعداد HA المستند إلى Sentinel، يتلقى المشتركون المتصلون بالرئيسي الرسائل بشكل طبيعي، ولكن أثناء تجاوز الفشل، لا يكون لدى الرئيسي الجديد أي معرفة بالاشتراكات السابقة. يجب على العملاء إعادة الاشتراك بعد إعادة الاتصال. باستخدام مجموعة Redis، يتم بث رسائل Pub/Sub إلى جميع العقد في المجموعة، بحيث يتلقى المشتركون المتصلون بأي عقدة الرسائل المنشورة (على الرغم من أن هذا يولد حركة مرور بين العقد).

Redis Streamsعبارة عن بنية بيانات ثابتة ومتكررة توفر تسليمًا موثوقًا للرسائل في بيئات HA. يتم نسخ إدخالات الدفق إلى النسخ المتماثلة من خلال آلية النسخ المتماثل العادية، والبقاء على قيد الحياة بعد الفشل، ودعم مجموعات المستهلكين بدلالات التسليم مرة واحدة على الأقل. بالنسبة لرسائل HA، يجب دائمًا تفضيل التدفقات على Pub/Sub.

# Redis Streams with consumer groups — HA-safe message processing

# Create a stream and consumer group
XGROUP CREATE events:orders orders-processors $ MKSTREAM

# Produce events
XADD events:orders * action "order_placed" order_id "12345" amount "599.99"
XADD events:orders * action "order_placed" order_id "12346" amount "149.99"

# Consume events (in consumer group — at-least-once delivery)
XREADGROUP GROUP orders-processors worker-1 COUNT 10 BLOCK 5000 STREAMS events:orders >

# Acknowledge processed events
XACK events:orders orders-processors 1681234567890-0

# Check pending messages (unacknowledged)
XPENDING events:orders orders-processors - + 10

# Claim abandoned messages (from a dead consumer)
XAUTOCLAIM events:orders orders-processors worker-2 60000 0-0 COUNT 10

# Trim stream to prevent unbounded growth
XTRIM events:orders MAXLEN ~ 100000
وحدات

Redis في HA

تعمل وحدات

Redis على توسيع Redis بهياكل ووظائف البيانات المتخصصة. تعمل الثلاثة الأكثر شيوعًا — RedisJSON، وRediSearch، وRedisTimeSeries — مع النسخ المتماثل وSentinel، ولكن لها اعتبارات محددة في عمليات نشر HA.

# redis.conf — Loading modules
loadmodule /opt/redis-stack/lib/rejson.so
loadmodule /opt/redis-stack/lib/redisearch.so
loadmodule /opt/redis-stack/lib/redistimeseries.so

# Modules are replicated to replicas via the command stream
# Ensure the same modules are installed on all nodes (master + replicas)

# RedisJSON — store and query JSON documents
JSON.SET user:1001 $ '{"name":"Alice","email":"alice@example.com","orders":42}'
JSON.GET user:1001 $.name

# RediSearch — full-text search with indexing
FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.email AS email TAG $.orders AS orders NUMERIC
FT.SEARCH idx:users "@name:Alice"

# RedisTimeSeries — time-series data
TS.CREATE metrics:cpu:node1 RETENTION 86400000 LABELS host node1 metric cpu
TS.ADD metrics:cpu:node1 * 73.5
TS.RANGE metrics:cpu:node1 - + AGGREGATION avg 60000

عند تشغيل Redis Stack (حزمة الوحدة) في HA، تأكد من تثبيت إصدارات الوحدة النمطية المتطابقة على جميع العقد - الرئيسية والنسخ المتماثلة. يتم نسخ أوامر الوحدة عبر دفق النسخ المتماثل القياسي، لذلك يجب أن تكون النسخ المتماثلة قادرة على تنفيذها. بعد تجاوز الفشل، تتواجد فهارس RediSearch في النسخة المتماثلة التي تمت ترقيتها وتخدم الاستعلامات على الفور.

تجمع اتصال

وتكوين العميل لـ HA

يعد تجميع الاتصال المناسب أمرًا ضروريًا لأداء ومرونة Redis HA. تعمل تجمعات الاتصال على تقليل الحمل الزائد لإنشاء اتصالات TCP، وتوفير منطق إعادة المحاولة التلقائي، وتمكين معالجة تجاوز الفشل بشكل سلس.

# Node.js — ioredis connection pool with cluster mode
const Redis = require('ioredis');

// Cluster mode connection
const cluster = new Redis.Cluster(
  [
    { host: '10.0.1.10', port: 7000 },
    { host: '10.0.1.11', port: 7000 },
    { host: '10.0.1.12', port: 7000 }
  ],
  {
    redisOptions: {
      password: 'cluster_password',
      connectTimeout: 10000,
      maxRetriesPerRequest: 3
    },
    scaleReads: 'slave',           // Route reads to replicas
    clusterRetryStrategy(times) {
      return Math.min(times * 200, 5000);
    },
    slotsRefreshTimeout: 2000,
    slotsRefreshInterval: 5000,
    enableOfflineQueue: true,
    enableReadyCheck: true,
    natMap: {}                     // For NAT/port-forwarded environments
  }
);

cluster.on('error', (err) => console.error('Cluster error:', err));
cluster.on('node error', (err, address) => {
  console.error(`Node ${address} error:`, err);
});
# Python — redis-py connection pool with cluster mode
from redis.cluster import RedisCluster
from redis.backoff import ExponentialBackoff
from redis.retry import Retry

retry = Retry(ExponentialBackoff(cap=5, base=0.1), retries=5)

rc = RedisCluster(
    startup_nodes=[
        {"host": "10.0.1.10", "port": 7000},
        {"host": "10.0.1.11", "port": 7000},
        {"host": "10.0.1.12", "port": 7000}
    ],
    password="cluster_password",
    decode_responses=True,
    read_from_replicas=True,
    retry=retry,
    retry_on_timeout=True,
    socket_timeout=5,
    socket_connect_timeout=5,
    max_connections=50,
    health_check_interval=30
)

rc.set("key", "value")
print(rc.get("key"))
// Go — go-redis cluster client with connection pooling
package main

import (
    "context"
    "time"

    "github.com/redis/go-redis/v9"
)

func NewRedisCluster() *redis.ClusterClient {
    return redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{
            "10.0.1.10:7000",
            "10.0.1.11:7000",
            "10.0.1.12:7000",
        },
        Password:         "cluster_password",
        ReadOnly:         true,
        RouteRandomly:    true,
        RouteByLatency:   false,
        PoolSize:         50,
        MinIdleConns:     10,
        DialTimeout:      10 * time.Second,
        ReadTimeout:      5 * time.Second,
        WriteTimeout:     5 * time.Second,
        PoolTimeout:      10 * time.Second,
        MaxRetries:       5,
        MinRetryBackoff:  200 * time.Millisecond,
        MaxRetryBackoff:  5 * time.Second,
    })
}

استراتيجيات النسخ الاحتياطي والاستعادة

حتى مع النسخ المتماثل لـ HA، تعد النسخ الاحتياطية المنتظمة ضرورية لاستعادة القدرة على العمل بعد الكوارث، والامتثال، والحماية من الأخطاء المنطقية (FLUSHALL العرضية، وعمليات الكتابة السيئة للتطبيق). تعتمد النسخ الاحتياطية لـ Redis على لقطات RDB وملفات AOF.

#!/bin/bash
# redis-backup.sh — Automated Redis backup script

REDIS_HOST="10.0.1.10"
REDIS_PORT="6379"
REDIS_PASS="strong_master_password"
BACKUP_DIR="/backups/redis"
S3_BUCKET="s3://redis-backups-prod"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Trigger RDB snapshot on the master
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" BGSAVE

# Wait for background save to complete
while [ "$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS LASTSAVE)" = "$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS LASTSAVE)" ]; do
  sleep 1
done
sleep 2

# Copy the RDB file
RDB_FILE=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" CONFIG GET dir | tail -1)
cp "${RDB_FILE}/dump.rdb" "${BACKUP_DIR}/dump_${DATE}.rdb"

# Compress and upload to S3
gzip "${BACKUP_DIR}/dump_${DATE}.rdb"
aws s3 cp "${BACKUP_DIR}/dump_${DATE}.rdb.gz" "${S3_BUCKET}/daily/dump_${DATE}.rdb.gz" \
  --storage-class STANDARD_IA

# Cleanup old local backups
find "$BACKUP_DIR" -name "dump_*.rdb.gz" -mtime +$RETENTION_DAYS -delete

# Verify backup integrity
redis-check-rdb "${BACKUP_DIR}/dump_${DATE}.rdb.gz" && \
  echo "Backup verified: dump_${DATE}.rdb.gz" || \
  echo "ERROR: Backup verification failed!"

echo "Backup complete: ${BACKUP_DIR}/dump_${DATE}.rdb.gz"
# Restore from RDB backup
# 1. Stop Redis
systemctl stop redis

# 2. Replace the RDB file
gunzip /backups/redis/dump_20260412_030000.rdb.gz
cp /backups/redis/dump_20260412_030000.rdb /data/redis/dump.rdb
chown redis:redis /data/redis/dump.rdb

# 3. Disable AOF temporarily (if enabled) to prevent AOF overriding RDB on startup
redis-cli -a password CONFIG SET appendonly no

# 4. Start Redis (loads RDB)
systemctl start redis

# 5. Re-enable AOF and rewrite it from the loaded data
redis-cli -a password CONFIG SET appendonly yes
redis-cli -a password BGREWRITEAOF
مراقبة

باستخدام معلومات Redis وPrometheus وGrafana

المراقبة الشاملة هي أساس التميز التشغيلي لـ Redis HA. يعرض Redis مقاييس داخلية غنية من خلال أمرINFO، والذي يترجمه مصدر Prometheus Redis إلى مقاييس السلاسل الزمنية للوحات المعلومات والتنبيهات Grafana.

# Key Redis INFO sections for HA monitoring
redis-cli -a password INFO replication
# role:master
# connected_slaves:2
# slave0:ip=10.0.1.11,port=6379,state=online,offset=1234567,lag=0
# slave1:ip=10.0.1.12,port=6379,state=online,offset=1234560,lag=1
# master_replid:abc123...
# master_repl_offset:1234567
# repl_backlog_size:268435456
# repl_backlog_first_byte_offset:1000000

redis-cli -a password INFO memory
# used_memory:6442450944
# used_memory_human:6.00G
# used_memory_rss:6879707136
# mem_fragmentation_ratio:1.07
# maxmemory:6442450944
# maxmemory_policy:allkeys-lru
# evicted_keys:12345

redis-cli -a password INFO stats
# total_connections_received:50000
# total_commands_processed:12345678
# instantaneous_ops_per_sec:85432
# keyspace_hits:11000000
# keyspace_misses:1345678
# expired_keys:500000
# evicted_keys:12345

redis-cli -a password INFO clients
# connected_clients:150
# blocked_clients:0
# maxclients:10000
# Prometheus Redis Exporter deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-exporter
  template:
    metadata:
      labels:
        app: redis-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9121"
    spec:
      containers:
        - name: redis-exporter
          image: oliver006/redis_exporter:latest
          args:
            - --redis.addr=redis://redis-ha-master:6379
            - --redis.password=$(REDIS_PASSWORD)
            - --include-system-metrics
            - --is-cluster
          env:
            - name: REDIS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: redis-secret
                  key: password
          ports:
            - containerPort: 9121
              name: metrics
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 200m
              memory: 256Mi
# PrometheusRule for Redis HA alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: redis-ha-alerts
  namespace: monitoring
spec:
  groups:
    - name: redis-availability
      rules:
        - alert: RedisDown
          expr: redis_up == 0
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Redis instance {{ $labels.instance }} is down"

        - alert: RedisReplicaDisconnected
          expr: redis_connected_slaves < 2
          for: 2m
          labels:
            severity: warning
          annotations:
            summary: "Redis master has fewer than 2 connected replicas"

        - alert: RedisReplicationLagHigh
          expr: redis_replication_lag > 5
          for: 3m
          labels:
            severity: warning
          annotations:
            summary: "Redis replication lag exceeds 5 seconds on {{ $labels.instance }}"

        - alert: RedisMemoryUsageHigh
          expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis memory usage above 90% on {{ $labels.instance }}"

        - alert: RedisEvictionsHigh
          expr: rate(redis_evicted_keys_total[5m]) > 100
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis evicting keys at >100/s on {{ $labels.instance }}"

        - alert: RedisKeyspaceHitRateLow
          expr: redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) < 0.8
          for: 10m
          labels:
            severity: info
          annotations:
            summary: "Redis cache hit rate below 80% on {{ $labels.instance }}"

        - alert: RedisSentinelDown
          expr: redis_sentinel_master_status != 1
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Redis Sentinel reports master unhealthy"

    - name: redis-performance
      rules:
        - alert: RedisSlowlogGrowing
          expr: increase(redis_slowlog_length[5m]) > 10
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis slow log growing rapidly on {{ $labels.instance }}"

        - alert: RedisConnectionsNearLimit
          expr: redis_connected_clients / redis_config_maxclients > 0.8
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis connected clients above 80% of maxclients"

Dragonfly وKeyDB: البدائل المتوافقة مع Redis

في حين أن Redis هو مخزن البيانات المهيمن في الذاكرة، فقد اكتسب بديلان متوافقان مع Redis قوة جذب لحالات استخدام محددة.

اليعسوب

Dragonfly هو بديل Redis حديث ومتعدد الخيوط يهدف إلى أن يكون بديلاً سهل الاستخدام مع الاستفادة من جميع نوى CPU المتاحة. Redis التقليدي عبارة عن خيط واحد لمعالجة الأوامر — يستخدم Dragonfly بنية لا شيء مشترك مع سلاسل عمليات متعددة لتحقيق إنتاجية أعلى بشكل ملحوظ على الأجهزة متعددة النواة. وهو يدعم بروتوكول Redis، ومعظم أوامر Redis، ويمكنه استبدال Redis دون تغيير التطبيق.

# Run Dragonfly as a Redis replacement
docker run -d --name dragonfly \
  -p 6379:6379 \
  -v /data/dragonfly:/data \
  docker.dragonflydb.io/dragonflydb/dragonfly \
  --maxmemory 12gb \
  --proactor_threads 8 \
  --dbfilename dump.rdb \
  --requirepass strong_password

# Dragonfly in Kubernetes
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dragonfly
  namespace: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dragonfly
  template:
    metadata:
      labels:
        app: dragonfly
    spec:
      containers:
        - name: dragonfly
          image: docker.dragonflydb.io/dragonflydb/dragonfly:latest
          args:
            - --maxmemory=12gb
            - --proactor_threads=8
            - --requirepass=strong_password
            - --snapshot_cron=*/30 * * * *
          ports:
            - containerPort: 6379
          resources:
            requests:
              cpu: "4"
              memory: 16Gi
            limits:
              cpu: "8"
              memory: 16Gi
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: longhorn
        resources:
          requests:
            storage: 100Gi
المزايا الرئيسية لـ

Dragonfly: متعدد الخيوط (إنتاجية 25x على 8 مراكز مقابل Redis أحادي الخيط)، وكفاءة أفضل للذاكرة (تستخدم جداول تجزئة Dash بدلاً من Redis dict)، ولقطات مدمجة بدون حمل fork()، ودعم أصلي لمجموعات البيانات الكبيرة. ومع ذلك، اعتبارًا من عام 2026، لا يزال دعم النسخ المتماثل لـ Dragonfly في مرحلة النضج - فهو يدعم النسخ المتماثل الأساسي ولكن ليس لديه حتى الآن نظام تجاوز الفشل التلقائي المكافئ لـ Sentinel. بالنسبة إلى HA، استخدم فحوصات صحة Kubernetes وسياسات إعادة تشغيل StatefulSet، أو قم بالنشر خلف موازن التحميل مع تجاوز الفشل على مستوى التطبيق.

كي دي بي

KeyDB عبارة عن شوكة متعددة الخيوط لـ Redis تديرها شركة Snap (الشركة التي تقف وراء Snapchat). وهو متوافق تمامًا مع Redis ويضيف تعدد الخيوط والنسخ المتماثل النشط (متعدد الماجستير) وطبقات تخزين FLASH وانتهاء صلاحية المفتاح الفرعي. يعد النسخ المتماثل النشط والنشط لـ KeyDB أمرًا مثيرًا للاهتمام بشكل خاص بالنسبة لـ HA - حيث يمكن لمثيلين من KeyDB قبول عمليات الكتابة في وقت واحد والنسخ المتماثل لبعضهما البعض، مما يوفر تجاوز الفشل بدون توقف.

# keydb.conf — Multi-threaded configuration with active replication
server-threads 4                  # Use 4 threads for command processing
bind 0.0.0.0
port 6379
requirepass strong_password
masterauth strong_password

# Active-active replication (multi-master)
active-replica yes
replicaof peer-host 6379          # Bidirectional replication

# On the peer node, configure the reverse:
# replicaof this-host 6379

# FLASH storage tiering (for datasets larger than RAM)
# storage-provider flash /mnt/flash-storage 100
# maxmemory 16gb
# Will keep hot data in RAM and spill cold data to SSD

# SubKey expiration (unique to KeyDB)
# Allows setting TTL on hash fields, not just top-level keys
# EXPIREMEMBER myhash field1 3600
يعد

KeyDB خيارًا قويًا عندما تحتاج إلى النسخ المتماثل متعدد الأقسام للتوزيع الجغرافي أو الصيانة بدون توقف، أو عندما تحتاج إلى إنتاجية أعلى مما يمكن أن يوفره Redis أحادي الخيط ولكنك ترغب في البقاء أقرب إلى قاعدة بيانات Redis من Dragonfly.

ضبط أداء

خط الأنابيب

تعمل تقنية

Pipelining على تجميع أوامر متعددة في رحلة ذهاب وإياب على شبكة واحدة، مما يقلل بشكل كبير من زمن الوصول للعمليات المجمعة. بدلاً من انتظار كل استجابة قبل إرسال الأمر التالي، يرسل العميل جميع الأوامر مرة واحدة ويقرأ جميع الاستجابات معًا.

# Python — Pipelining with redis-py
import redis
import time

r = redis.Redis(host='10.0.1.10', port=6379, password='password', decode_responses=True)

# Without pipelining: 1000 round-trips
start = time.time()
for i in range(1000):
    r.set(f'key:{i}', f'value:{i}')
print(f'Without pipeline: {time.time() - start:.3f}s')

# With pipelining: 1 round-trip for 1000 commands
start = time.time()
pipe = r.pipeline(transaction=False)
for i in range(1000):
    pipe.set(f'key:{i}', f'value:{i}')
pipe.execute()
print(f'With pipeline: {time.time() - start:.3f}s')
# Typically 5-10x faster

لوا البرمجة النصية

يتم تنفيذ البرامج النصية

Lua تلقائيًا على خادم Redis، مما يلغي الرحلات ذهابًا وإيابًا للعمليات المعقدة ويضمن عدم تنفيذ أي أمر آخر بين عمليات البرنامج النصي. في Redis Cluster، تأكد من أن جميع المفاتيح التي يتم الوصول إليها بواسطة برنامج Lua النصي موجودة في نفس فتحة التجزئة باستخدام علامات التجزئة.

# Lua script for atomic rate limiting
# KEYS[1] = rate limit key
# ARGV[1] = max requests
# ARGV[2] = window in seconds
local current = redis.call('INCR', KEYS[1])
if current == 1 then
    redis.call('EXPIRE', KEYS[1], ARGV[2])
end
if current > tonumber(ARGV[1]) then
    return 0  -- Rate limited
end
return 1  -- Allowed

# Load and execute
redis-cli -a password EVAL "\
  local current = redis.call('INCR', KEYS[1]) \
  if current == 1 then redis.call('EXPIRE', KEYS[1], ARGV[2]) end \
  if current > tonumber(ARGV[1]) then return 0 end \
  return 1" 1 ratelimit:user:123 100 60
تحسين الذاكرة

# redis.conf — Memory optimisation settings

# Use ziplist encoding for small hashes, lists, sorted sets
hash-max-listpack-entries 128
hash-max-listpack-value 64
list-max-listpack-size -2          # 8KB per node
zset-max-listpack-entries 128
zset-max-listpack-value 64
set-max-intset-entries 512

# Lazy freeing (avoid blocking on large key deletion)
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
lazyfree-lazy-user-del yes
lazyfree-lazy-user-flush yes

# jemalloc tuning
# MALLOC_CONF="background_thread:true,dirty_decay_ms:5000,muzzy_decay_ms:5000"

# Analyse memory usage
redis-cli -a password MEMORY DOCTOR
redis-cli -a password MEMORY STATS
redis-cli -a password --bigkeys
redis-cli -a password --memkeys

سيناريوهات الفشل الشائعة واستكشاف الأخطاء وإصلاحها

السيناريو 1: فشل البرنامج الرئيسي، ويقوم Sentinel بترويج النسخة المتماثلة

# Diagnosis
redis-cli -p 26379 SENTINEL master mymaster
# Check: flags should show 's_down' or 'o_down' if master is unreachable

redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# Returns the current master address (should be the promoted replica)

# Check Sentinel logs for failover events
tail -f /var/log/redis/sentinel.log
# Look for: +sdown, +odown, +try-failover, +elected-leader,
#           +failover-state-select-slave, +selected-slave,
#           +failover-state-send-slaveof-noone, +failover-end

السيناريو 2: انقسام الدماغ مع سيدين

# Diagnosis: check if min-replicas-to-write is configured
redis-cli -a password CONFIG GET min-replicas-to-write
redis-cli -a password CONFIG GET min-replicas-max-lag

# Prevention: configure min-replicas on all masters
redis-cli -a password CONFIG SET min-replicas-to-write 1
redis-cli -a password CONFIG SET min-replicas-max-lag 10

# If split-brain occurred: identify the stale master
# Compare replication offsets — the master with the higher offset has more data
redis-cli -h master1-ip -a password INFO replication | grep master_repl_offset
redis-cli -h master2-ip -a password INFO replication | grep master_repl_offset

# Force the stale master to become a replica
redis-cli -h stale-master-ip -a password REPLICAOF correct-master-ip 6379

السيناريو 3: عاصفة إعادة المزامنة الكاملة بعد قسم الشبكة

# Diagnosis: check replication backlog
redis-cli -a password INFO replication | grep repl_backlog
# If repl_backlog_first_byte_offset is ahead of replica's offset, full sync triggers

# Prevention: increase backlog size
redis-cli -a password CONFIG SET repl-backlog-size 512mb

# Monitor for full syncs
redis-cli -a password INFO stats | grep sync_full
redis-cli -a password INFO stats | grep sync_partial_ok
redis-cli -a password INFO stats | grep sync_partial_err

السيناريو 4: استنفاد الذاكرة وقتل OOM

# Diagnosis
redis-cli -a password INFO memory
# Check: used_memory vs maxmemory, mem_fragmentation_ratio

redis-cli -a password MEMORY DOCTOR
# Returns advice on memory issues

# Prevention: set proper maxmemory and eviction
redis-cli -a password CONFIG SET maxmemory 12gb
redis-cli -a password CONFIG SET maxmemory-policy allkeys-lru

# Find large keys consuming memory
redis-cli -a password --bigkeys
redis-cli -a password --memkeys --memkeys-samples 100

# Emergency: manually evict keys
redis-cli -a password SCAN 0 COUNT 1000 TYPE string
# Identify and DEL unnecessary large keys

السيناريو 5: الأوامر البطيئة تمنع النسخ المتماثل

# Diagnosis: check slowlog
redis-cli -a password SLOWLOG GET 20
redis-cli -a password SLOWLOG LEN

# Check for blocking commands
redis-cli -a password CLIENT LIST | grep -E 'cmd=(keys|sort|smembers)'

# Prevention: configure slowlog threshold
redis-cli -a password CONFIG SET slowlog-log-slower-than 10000   # 10ms
redis-cli -a password CONFIG SET slowlog-max-len 256

# Rename dangerous commands
rename-command KEYS ""              # Disable KEYS entirely
rename-command FLUSHALL ""          # Disable FLUSHALL
rename-command FLUSHDB ""           # Disable FLUSHDB
rename-command DEBUG ""             # Disable DEBUG

تخطيط القدرات واستراتيجيات القياس

يتضمن تخطيط سعة

لـ Redis HA تقدير متطلبات الذاكرة وعرض النطاق الترددي للشبكة واستخدام CPU عبر العقد الرئيسية والنسخ المتماثلة. المقاييس الأساسية التي يجب التخطيط لها هي حجم مجموعة البيانات، والعمليات في الثانية، ومتوسط ​​حجم المفتاح/القيمة، وحمل النسخ المتماثل.

# Capacity estimation formulas

# Memory per node:
#   Base dataset size (use redis-cli DBSIZE and MEMORY USAGE on a sample)
#   + Replication output buffer: ~64MB per replica
#   + AOF rewrite buffer: ~64MB during rewrites
#   + Copy-on-write overhead during BGSAVE: up to 2x during heavy writes
#   + Client output buffers: ~1KB per client
#   + OS overhead: ~1-2GB
#   Rule of thumb: maxmemory = 75% of available RAM

# Network bandwidth:
#   Replication: write_throughput_bytes * num_replicas
#   Client traffic: ops_per_sec * avg_response_size
#   Full sync: dataset_size (one-time during replica bootstrap or failover)

# Example sizing for 20GB dataset, 100K ops/sec:
#   RAM per node: 20GB data + 4GB buffers + 2GB OS = 26GB -> 32GB node (75% = 24GB maxmemory)
#   CPU: 1 core handles ~100K ops/sec for simple commands (GET/SET)
#   Network: 100K ops * 1KB avg = 100MB/s client + 50MB/s replication = 150MB/s per master

# Scaling decision tree:
#   Need more read throughput? -> Add replicas (up to 5 per master)
#   Need more write throughput? -> Redis Cluster (add shards)
#   Need more memory? -> Redis Cluster (distribute dataset across shards)
#   Need lower latency? -> Reduce network hops (co-locate, use unix sockets)
#   Need global distribution? -> Multi-region replication or Redis Enterprise Active-Active

القياس الأفقي مع مجموعة Redis

# Add shards to an existing Redis Cluster

# 1. Start new Redis nodes
redis-server /etc/redis/new-master.conf
redis-server /etc/redis/new-replica.conf

# 2. Add the new master to the cluster
redis-cli --cluster add-node new-master:7000 existing-node:7000 -a password

# 3. Add the new replica to follow the new master
redis-cli --cluster add-node new-replica:7000 existing-node:7000 \
  --cluster-slave --cluster-master-id NEW_MASTER_ID -a password

# 4. Reshard slots to the new master
redis-cli --cluster reshard existing-node:7000 \
  --cluster-from all --cluster-to NEW_MASTER_ID \
  --cluster-slots 4096 --cluster-yes -a password

# 5. Verify the new slot distribution
redis-cli -c -h existing-node -p 7000 -a password CLUSTER SLOTS

# Remove a shard (scale down)
# 1. Reshard all slots away from the node
redis-cli --cluster reshard existing-node:7000 \
  --cluster-from REMOVING_NODE_ID --cluster-to TARGET_NODE_ID \
  --cluster-slots 5461 --cluster-yes -a password

# 2. Remove the empty node
redis-cli --cluster del-node existing-node:7000 REMOVING_NODE_ID -a password
اعتبارات القياس الرأسي

# When to scale vertically vs horizontally:

# Scale UP (bigger instances) when:
#   - Dataset fits in single-node memory
#   - Workload uses multi-key operations (MGET, SUNION, Lua across keys)
#   - Operational simplicity is more important than cost efficiency
#   - Using Redis modules that don't support Cluster mode well

# Scale OUT (more shards) when:
#   - Dataset exceeds single-node memory
#   - Write throughput exceeds single-thread capacity (~200K ops/sec)
#   - You need per-shard isolation for multi-tenant workloads
#   - Cost per GB of RAM is a concern (many smaller nodes vs few large ones)

# Cloud instance recommendations:
# AWS:   cache.r7g.xlarge (4 vCPU, 26GB) to cache.r7g.16xlarge (64 vCPU, 419GB)
# Azure: P1 (6GB) to P5 (120GB) per shard
# GCP:   5GB to 300GB per instance (Memorystore Standard)

# Bare metal:
#   CPU: 2-4 cores dedicated to Redis (single-threaded, but background tasks use extra cores)
#   RAM: 32-128GB per node (NVMe for swap-as-last-resort)
#   Network: 10Gbps minimum, 25Gbps for large datasets
#   Storage: NVMe SSD for AOF/RDB persistence (IOPS matters for fsync)
استنتاج

Redis لا يعد التوفر العالي خيارًا واحدًا للتكوين — بل هو تصميم نظام شامل يمتد إلى طبولوجيا النسخ المتماثل، واكتشاف الفشل، وتجاوز الفشل التلقائي، وتكوين العميل، واستراتيجية الثبات، وإدارة الذاكرة، والأمن، والمراقبة، والإجراءات التشغيلية. تعتمد بنية HA الصحيحة على متطلباتك المحددة.

بالنسبة لمعظم التطبيقات، يوفرRedis Sentinelمع ثلاث مثيلات Sentinel التي تراقب نسخة رئيسية ونسختين متماثلتين حل HA مثبتًا ومختبرًا في المعركة مع تجاوز الفشل التلقائي في أقل من 30 ثانية. عندما تحتاج إلى القياس الأفقي بما يتجاوز إنتاجية وحدة رئيسية واحدة أو سعة الذاكرة، تقوم مجموعةRedisبتوزيع مجموعة البيانات عبر أجزاء متعددة مع الحفاظ على تجاوز الفشل المدمج لكل جزء. بالنسبة لبيئات Kubernetes، يقوم المشغلون مثلSpotahomeوOpsTreeبتشفير أفضل الممارسات التشغيلية في CRDs التعريفية، بينما يوفرRedis Enterpriseالخيار الأكثر ثراءً بالميزات مع النسخ المتماثل الجغرافي النشط ودعم الوحدة النمطية.

خدمات

المُدارة عبر السحابة -AWS ElastiCacheوAzure Cache لـ RedisوGCP Memorystore- تتخلص من العبء التشغيلي لتشغيل البنية التحتية لـ Redis ولكنها تأتي بمرونة أقل وتكاليف أعلى على نطاق واسع. بالنسبة للمؤسسات ذات البنية التحتية المعدنية العارية، يوفرk3s المزود بـ Rancher وLonghornبديلاً مفتوح المصدر تمامًا ومستقلًا عن السحابة يوفر HA على مستوى المؤسسات دون تقييد البائع.

تستحق بدائل

، مثلDragonflyوKeyDB، التقييم لحالات استخدام محددة - Dragonfly للإنتاجية الأولية متعددة الخيوط على الأجهزة الكبيرة، وKeyDB للنسخ المتماثل النشط النشط المتعدد الرئيسي. كلاهما متوافق مع Redis ويمكن أن يكون بمثابة بدائل في العديد من السيناريوهات.

بغض النظر عن البنية التي تختارها، تظل أساسيات التشغيل ثابتة: تكوين الثبات المناسب (RDB + AOF المختلط)، وفرضmin-replicas-to-writeلمنع فقدان البيانات المنقسمة، وحجم تراكم النسخ المتماثل لحجم الكتابة الخاص بك، وتشفير كل حركة المرور باستخدام TLS، وفرض الوصول الأقل امتيازًا باستخدام قوائم ACL، ومراقبة تأخر النسخ المتماثل واستخدام الذاكرة مع Prometheus وGrafana، وعمل نسخة احتياطية من لقطات RDB لتدوم طويلاً. التخزين خارج الموقع، والأهم من ذلك، اختبار تجاوز الفشل بانتظام. نظام تجاوز الفشل الذي لم يتم اختباره مطلقًا هو نظام لا يعمل. قم بإجراء تدريبات شهرية لتجاوز الفشل، وحقن حالات الفشل باستخدام أدوات هندسة الفوضى، وقياس وقت التعافي الفعلي. الثقة التي تكتسبها من الاختبار المنهجي هي ما يفصل بين نشر Redis الذي ينجو من حوادث الإنتاج وبين النشر الذي يحول فشل الخادم إلى انقطاع على مستوى الشركة.