📌 المقال الرئيسي للسلسلة: Redis 8: caching، queues، pub/sub، streams
تثبيت Redis نظيف، دائم، وقابل للمراقبة هو أساس أيّ معمارية تعتمد على هذا المحرّك. يقود هذا الدليل خطوة بخطوة تثبيت Redis 8.6 على خادم Linux (Ubuntu 24.04 LTS وDebian 12 مرجعيّتان)، تهيئة آليّتَي الاستمرارية — RDB وAOF — والتشديد الأساسي قبل كشف الشبكة. في النهاية، ستملك Redis 8 وظيفي، مُداوم، مُوَثَّق، وجاهز لاستقبال حركة تطبيقية.
المتطلّبات
- خادم Linux Ubuntu 24.04 LTS، Debian 12، أو مكافئ.
- مستخدم بوصول sudo.
- اتّصال شبكي لتنزيل الحزم أو الترجمة من المصادر.
- على الأقلّ 512 ميغا RAM متاحة (موصى به: 2 جيغا).
- الوقت: 40 دقيقة.
الخطوة 1 — اختيار طريقة التثبيت
ثلاثة طرق: الحزمة الرسمية المنشورة من Redis Inc.، حزمة التوزيع (Ubuntu أو Debian)، أو الترجمة من المصادر. الحزمة الرسمية موصى بها لأنّها توفّر Redis 8.6 — بينما النسخة المُضَمَّنة في Ubuntu 24.04 تبقى على Redis 7.x — وتشمل وحدات Redis Search وRedis JSON افتراضيًّا.
# تثبيت المتطلّبات ومفتاح GPG للمستودع
sudo apt update
sudo apt install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis
السكريبت يُضيف مفتاح GPG في keyring النظام بصياغة signed-by الحديثة، يُسَجِّل المستودع بـ codename التوزيع (noble لـ Ubuntu 24.04، jammy لـ 22.04، bookworm لـ Debian 12). تحقّق من النسخة بـ redis-server --version؛ يجب رؤية Redis server v=8.6 أو أحدث.
الخطوة 2 — تشغيل الخدمة والاختبار
# تحقّق من حالة systemd
sudo systemctl status redis-server
# اختبر الاتّصال محلّيًّا
redis-cli ping
# اعرض إعدادات الشبكة النشطة
redis-cli CONFIG GET bind
redis-cli CONFIG GET port
الأمر ping يجب أن يُرجع PONG. إن حصلت على Could not connect to Redis at 127.0.0.1:6379، الخدمة لم تُقلَع — شَغِّل sudo systemctl start redis-server وراجع السجلّات بـ journalctl -u redis-server -n 50. افتراضيًّا، Redis يستمع على 127.0.0.1 فقط، صحيح لخادم ويب وRedis على نفس الآلة.
الخطوة 3 — فهم ملفّ الإعداد
ملفّ الإعداد الرئيسي /etc/redis/redis.conf (Ubuntu/Debian). يجمع نحو 2000 سطر مُعَلَّق تُغَطّي كلّ الخيارات. قبل أيّ تعديل، اعمل نسخة احتياطية.
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.original
sudo nano /etc/redis/redis.conf
الأقسام المهمّة: # NETWORK (bind، port، protected-mode)، # SECURITY (requirepass وACL)، # MEMORY MANAGEMENT (maxmemory)، # SNAPSHOTTING + # APPEND ONLY MODE.
الخطوة 4 — تهيئة استمرارية RDB
# في /etc/redis/redis.conf:
save 3600 1 300 100 60 10000
dbfilename dump.rdb
dir /var/lib/redis
rdbcompression yes
rdbchecksum yes
الـ save تستبدل الأسطر القديمة المنفصلة بصياغة مُكَثَّفة مُقَدَّمة في Redis 7. ضغط LZF يُقَلِّل حجم الملفّ بـ 30 إلى 60%. checksum CRC64 يحمي من الفساد الصامت. snapshot يُكتَب في /var/lib/redis/dump.rdb.
الخطوة 5 — تفعيل استمرارية AOF
# تفعيل AOF إضافة إلى RDB
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
appendfsync everysec هو التسوية الموصى بها: Redis يطلب من النواة الكتابة على القرص كلّ ثانية، ممّا يحدّ الفقدان بثانية. always يضمن صفر فقدان لكن بكلفة أداء كبيرة. no يترك للنواة، قد يُسَبِّب فقدان عدّة ثوانٍ. الكتابة التلقائية تُكَثِّف الملفّ في الخلفية فور تضاعف حجمه.
sudo systemctl restart redis-server
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
ls -lh /var/lib/redis/
الخطوة 6 — تفعيل التوثيق
افتراضيًّا، Redis 8 يُقلِع في الوضع المحمي (protected-mode yes) الذي يرفض الاتّصالات الخارجية دون توثيق. آليّتان متعايشتان: كلمة سرّ شاملة requirepass (legacy)، ونظام ACL متعدّد المستخدمين (Redis 6+، موصى به في الإنتاج).
# مقاربة ACL مع ملفّ مخصَّص
aclfile /etc/redis/users.acl
sudo nano /etc/redis/users.acl
user default off
user appuser on >motdepasse-applicatif-long ~* +@all -@dangerous
user monitoring on >motdepasse-monitoring +info +ping +client
هذا الملفّ يُعلن ثلاثة مستخدمين: default مُعَطَّل (off) لإغلاق الاتّصال المجهول؛ appuser يصل لكلّ المفاتيح (~*) وكلّ الأوامر (+@all) ما عدا الخطيرة (-@dangerous يستثني FLUSHDB، FLUSHALL، DEBUG، CONFIG)؛ monitoring يفحص الخادم فقط.
sudo systemctl restart redis-server
redis-cli --user appuser --askpass
# أدخل كلمة السرّ، ثم:
> SET test "ok"
> GET test
> CONFIG GET maxmemory
# يجب أن يفشل بـ NOPERM
الخطوة 7 — تحديد الذاكرة وسياسة الإخلاء
# في /etc/redis/redis.conf:
maxmemory 1gb
maxmemory-policy allkeys-lru
maxmemory-samples 5
سياسة allkeys-lru تُخلي تلقائيًّا المفاتيح الأقلّ استعمالًا حين تمتلئ الذاكرة — الخيار الصحيح لـ cache. لقاعدة بيانات ببيانات حرجة، اختر noeviction الذي يرفض الكتابات الجديدة، أو volatile-lru الذي لا يُخلي إلّا المفاتيح ذات TTL.
الخطوة 8 — اختبار الاستمرارية بإعادة التشغيل
# أدرج بيانات اختبار
redis-cli --user appuser --askpass
> SET cle:1 "donnee-test"
> LPUSH file:emails "user1@example.com" "user2@example.com"
> HSET utilisateur:42 nom "Salim Al-Otaibi" ville "Riyadh" age 32
> EXIT
# افرض snapshot RDB وflush AOF
redis-cli --user appuser --askpass BGSAVE
redis-cli --user appuser --askpass BGREWRITEAOF
# تحقّق من حجم ملفّات الاستمرارية
ls -lh /var/lib/redis/
# أعد التشغيل عاتيًا
sudo systemctl restart redis-server
# تحقّق من حضور البيانات
redis-cli --user appuser --askpass
> GET cle:1
> LRANGE file:emails 0 -1
> HGETALL utilisateur:42
الخطوة 9 — كشف Redis على الشبكة (بحذر)
# في /etc/redis/redis.conf:
bind 0.0.0.0
protected-mode yes
port 6379
اقرن هذا حتمًا بـ: (أ) ACL مُهَيَّأ في الخطوة 6، (ب) جدار حماية UFW يسمح فقط بـ IPs العملاء الشرعيّين، (ج) مثاليًّا TLS عبر tls-port 6380.
sudo ufw allow from 10.0.0.0/8 to any port 6379 proto tcp
sudo ufw allow from 192.168.0.0/16 to any port 6379 proto tcp
sudo ufw enable
هذه السياسة تحدّ الوصول للمنفذ 6379 على الشبكات الخاصّة (RFC 1918). لا تُعَرِّض Redis مباشرة على 0.0.0.0 عامّيًّا دون VPN أو نفق SSH.
الخطوة 10 — التحقّق النهائي والمراقبة
# 1. الخدمة نشطة وإعادة التشغيل التلقائي مُهَيَّأة
sudo systemctl is-enabled redis-server
sudo systemctl is-active redis-server
# 2. معلومات مفصَّلة عن المثيل
redis-cli --user appuser --askpass INFO server | head -20
redis-cli --user appuser --askpass INFO memory | grep -E "used_memory_human|maxmemory_human|maxmemory_policy"
redis-cli --user appuser --askpass INFO persistence | grep -E "rdb_last_save|aof_enabled|aof_last_write_status"
# 3. اختبار حمل خفيف
redis-benchmark --user appuser -a "motdepasse-applicatif" -t set,get -n 100000 -q
خرج redis-benchmark يجب عرض على الأقلّ 50,000 ops/ثانية على SET وGET. إن حصلت على أقلّ من 10,000 ops/ث، تحقّق أنّك لم تُفَعِّل appendfsync always بالخطأ.
أخطاء شائعة
| الخطأ | السبب | الحلّ |
|---|---|---|
| NOAUTH Authentication required | ACL أو requirepass مُهَيَّأ لكن العميل لا يُوَفِّر توثيق | مَرِّر -a motdepasse أو --user X --askpass |
| Could not connect to Redis at 127.0.0.1:6379 | الخدمة غير مُشَغَّلة أو انهارت | sudo systemctl status redis-server |
| AOF مُعَطَّل بعد تعديل الإعداد | الإعداد في الذاكرة يطغى — CONFIG SET لم يُحفَظ |
CONFIG REWRITE أو عَدِّل الملفّ ثم أعد التشغيل |
| DENIED Redis is running in protected mode | اتّصال خارجي بلا توثيق | هَيِّئ ACL أو requirepass قبل bind على 0.0.0.0 |
| بيانات مفقودة بعد crash | appendfsync no يترك للنواة buffering لأجل غير محدّد |
استعمل appendfsync everysec على الأقلّ |
الأدلّة التالية
- أنماط cache بـ Redis 8: cache-aside، write-through، TTL
- طوابير بـ BullMQ 5.76 وRedis 8
- Redis Sentinel وCluster: HA إنتاج
FAQ
AOF أم RDB أم الاثنان؟ الإعداد الموصى به يجمع الاثنين: AOF للديمومة الدقيقة وRDB للنسخ السريع. RDB وحده يكفي إن قُبل فقدان دقائق. AOF وحده يُنتج ملفّات ضخمة.
كيف نختار maxmemory؟ احجز 60 إلى 75% من RAM الفيزيائي. Redis يحتاج هامشًا لـ fork() وقت snapshots RDB.
Redis ينهار بسبب THP؟ Transparent Huge Pages تُسَبِّب زمن استجابة غير متوقّع. عَطِّل: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled.
كيف نُهَجِّر البيانات من Redis آخر؟ ثلاثة خيارات: (أ) نسخ dump.rdb وappendonly.aof مباشرة؛ (ب) redis-cli --rdb dump.rdb -h source-host؛ (ج) REPLICAOF.
مراجع
- تثبيت Redis على Linux — التوثيق الرسمي
- استمرارية Redis: RDB وAOF — التوثيق الرسمي
- ACL Redis 6+ — التوثيق الرسمي
- ملفّ redis.conf المرجعي (GitHub)