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

مراقبة وتصحيح Redis

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

مراقبة وتصحيح Redis

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

أمر INFO - إحصائيات شاملة للخادم

يوفر أمر INFO معلومات مفصلة حول حالة خادم Redis، منظمة في أقسام:

استخدام INFO الأساسي:
# الحصول على جميع المعلومات
INFO

# الحصول على قسم محدد
INFO server
INFO clients
INFO memory
INFO persistence
INFO stats
INFO replication
INFO cpu
INFO commandstats
INFO cluster
INFO keyspace
المقاييس الرئيسية للمراقبة:
# قسم الخادم
redis_version:7.0.5
uptime_in_seconds:864000
uptime_in_days:10

# قسم العملاء
connected_clients:42
blocked_clients:0
tracking_clients:0

# قسم الذاكرة
used_memory_human:2.50M
used_memory_rss_human:8.20M
mem_fragmentation_ratio:1.23
maxmemory_human:4.00G

# قسم الإحصائيات
total_connections_received:10523
total_commands_processed:1045234
instantaneous_ops_per_sec:1250
keyspace_hits:984521
keyspace_misses:60713
evicted_keys:0
expired_keys:12453
المقاييس الحرجة:
  • mem_fragmentation_ratio: يجب أن يكون 1.0-1.5 (أعلى = ذاكرة مهدرة)
  • keyspace_hits/misses: نسبة الإصابة = الإصابات/(الإصابات+الإخفاقات)، استهدف >80%
  • evicted_keys: غير الصفر = ضغط الذاكرة، فكر في زيادة maxmemory
  • connected_clients: راقب تسربات الاتصال
  • instantaneous_ops_per_sec: الإنتاجية الحالية

أمر MONITOR - تسجيل الأوامر في الوقت الفعلي

يعرض MONITOR كل أمر تتم معالجته بواسطة Redis في الوقت الفعلي، مفيد للتصحيح ولكنه يؤثر على الأداء:

بدء المراقبة:
redis-cli MONITOR

مثال الإخراج:
1634567890.123456 [0 127.0.0.1:54321] "GET" "user:1000:name"
1634567890.234567 [0 127.0.0.1:54322] "SET" "session:abc" "data"
1634567890.345678 [0 192.168.1.50:12345] "HGETALL" "cart:5000"
1634567890.456789 [0 127.0.0.1:54321] "INCR" "counter:pageviews"
تحذير الأداء: يقلل MONITOR بشكل كبير من إنتاجية Redis (حتى 50%). استخدمه فقط لجلسات تصحيح قصيرة، ولا تستخدمه أبدًا في الإنتاج تحت حمل ثقيل.
تصفية إخراج MONITOR:
# مراقبة أوامر SET فقط
redis-cli MONITOR | grep SET

# مراقبة الأوامر من IP محدد
redis-cli MONITOR | grep "192.168.1.50"

# مراقبة الأوامر على مفاتيح محددة
redis-cli MONITOR | grep "user:*"

# حفظ في ملف للتحليل
redis-cli MONITOR > redis-monitor.log

SLOWLOG - تحليل الاستعلام البطيء

يسجل SLOWLOG الاستعلامات التي تتجاوز عتبة مكوّنة، ضروري لتحديد عنق الزجاجة في الأداء:

تكوين السجل البطيء:
# تعيين العتبة إلى 10ms (10000 ميكروثانية)
CONFIG SET slowlog-log-slower-than 10000

# الاحتفاظ بآخر 128 استعلام بطيء
CONFIG SET slowlog-max-len 128

# جعله دائمًا في redis.conf
slowlog-log-slower-than 10000
slowlog-max-len 128
عرض السجل البطيء:
# الحصول على آخر 10 استعلامات بطيئة
SLOWLOG GET 10

تنسيق الإخراج:
1) 1) (integer) 14 # معرف فريد
2) (integer) 1634567890 # طابع زمني Unix
3) (integer) 23451 # وقت التنفيذ (ميكروثانية)
4) 1) "KEYS" # الأمر
2) "user:*" # المعاملات
5) "127.0.0.1:54321" # IP:port العميل
6) "" # اسم العميل

# الحصول على عدد الإدخالات في السجل
SLOWLOG LEN

# مسح السجل البطيء
SLOWLOG RESET
نصيحة التحليل: الأوامر البطيئة الشائعة تشمل KEYS (استخدم SCAN بدلاً من ذلك)، SORT بدون LIMIT، والعمليات على المجموعات الكبيرة (قوائم بملايين العناصر).

أدوات التشخيص redis-cli

يتضمن redis-cli أدوات مدمجة لتحليل الأداء والتشخيص:

--bigkeys - العثور على أكبر المفاتيح:
redis-cli --bigkeys

مثال الإخراج:
Scanning the entire keyspace...
Biggest string: "cache:homepage" (2048576 bytes)
Biggest list: "queue:emails" (50000 items)
Biggest set: "tags:all" (8934 members)
Biggest hash: "user:1000:profile" (1000 fields)
Biggest zset: "leaderboard:global" (100000 members)

# خيارات
--bigkeys --i 0.1 # عينة كل 0.1 ثانية
--bigkeys -a mypass # مع المصادقة
--latency - قياس الكمون:
# اختبار الكمون الأساسي
redis-cli --latency

# الإخراج: min: 0, max: 2, avg: 0.15 (1234 samples)

# تاريخ الكمون (يتتبع مع مرور الوقت)
redis-cli --latency-history

# توزيع الكمون
redis-cli --latency-dist

# الكمون الجوهري (تأخيرات النظام)
redis-cli --intrinsic-latency 100
--stat - إحصائيات مباشرة:
redis-cli --stat

الإخراج (يتم التحديث كل ثانية):
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
506 1.45M 10 0 10000 (+0) 50
506 1.45M 10 0 10234 (+234) 50
506 1.47M 11 0 10567 (+333) 51
--scan - فحص المفاتيح الآمن:
# فحص جميع المفاتيح
redis-cli --scan

# فحص مع نمط
redis-cli --scan --pattern "user:*"

# عد المفاتيح المطابقة للنمط
redis-cli --scan --pattern "session:*" | wc -l

# حذف المفاتيح المطابقة للنمط بأمان
redis-cli --scan --pattern "temp:*" | xargs redis-cli DEL

أوامر تحليل الذاكرة

تحليل مفصل لاستخدام الذاكرة للتحسين:

أوامر MEMORY:
# استخدام الذاكرة لمفتاح محدد
MEMORY USAGE user:1000
# الإخراج: (integer) 1024

# إحصائيات الذاكرة
MEMORY STATS
# الإخراج: توزيع تفصيلي لتخصيص الذاكرة

# طبيب الذاكرة (اقتراحات التحسين)
MEMORY DOCTOR
# الإخراج: اقتراحات بناءً على أنماط الاستخدام الحالية

# استخدام الذاكرة بالعينة
MEMORY MALLOC-STATS

# تطهير الذاكرة (تشغيل إلغاء التجزئة)
MEMORY PURGE
تحليل تجزئة الذاكرة:
INFO memory | grep fragmentation
# mem_fragmentation_ratio:1.23

# إذا كانت النسبة > 1.5، فكر في:
# 1. إعادة تشغيل Redis لإلغاء التجزئة
# 2. تمكين إلغاء التجزئة النشط
CONFIG SET activedefrag yes
CONFIG SET active-defrag-threshold-lower 10
CONFIG SET active-defrag-threshold-upper 100

أوامر CLIENT - تصحيح الاتصال

راقب وأدر اتصالات العميل:

إدارة العميل:
# عرض جميع العملاء المتصلين
CLIENT LIST

تنسيق الإخراج:
id=123 addr=127.0.0.1:54321 fd=8 name= age=300 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

# شرح الحقول:
# id: معرف العميل الفريد
# addr: IP والمنفذ للعميل
# age: عمر الاتصال (ثواني)
# idle: وقت الخمول (ثواني)
# flags: N=عادي، M=رئيسي، S=تابع، P=pubsub
# db: رقم قاعدة البيانات الحالية
# cmd: آخر أمر تم تنفيذه
عمليات العميل:
# الحصول على معرف العميل الحالي
CLIENT ID

# تعيين اسم العميل
CLIENT SETNAME myapp-web-1

# الحصول على اسم العميل
CLIENT GETNAME

# قتل عميل محدد
CLIENT KILL 127.0.0.1:54321

# قتل جميع العملاء المطابقين للفلتر
CLIENT KILL TYPE normal SKIPME yes

# إيقاف جميع العملاء مؤقتًا لمدة 1000ms
CLIENT PAUSE 1000

# تتبع ذاكرة العميل
CLIENT TRACKING ON

مراقبة الكمون

اكتشف وشخص ارتفاعات الكمون:

تمكين مراقبة الكمون:
# مراقبة الأحداث التي تستغرق > 100ms
CONFIG SET latency-monitor-threshold 100

# عرض أحداث الكمون الأخيرة
LATENCY LATEST

الإخراج:
1) 1) "command"
2) (integer) 1634567890
3) (integer) 250
4) (integer) 350

# عرض تاريخ الكمون لحدث محدد
LATENCY HISTORY command

# طبيب الكمون (التشخيص)
LATENCY DOCTOR

# إعادة تعيين بيانات الكمون
LATENCY RESET
أحداث الكمون:
command # أوامر بطيئة
fast-command # أمر سريع يستغرق وقتًا طويلاً
fork # عملية Fork للاستمرارية
aof-write # عملية كتابة AOF
aof-fsync-always # مزامنة AOF إلى القرص
rdb-unlink-temp-file # تنظيف ملف RDB

Redis Insight - أداة مراقبة GUI

يوفر Redis Insight واجهة رسومية للمراقبة والتوصيف والتصحيح:

ميزات Redis Insight:
  • المتصفح: متصفح مفاتيح مرئي مع البحث والفلاتر
  • الملف الشخصي: توصيف الأوامر في الوقت الفعلي (مثل MONITOR)
  • Slowlog: تحليل مرئي للاستعلامات البطيئة
  • تحليل الذاكرة: مخططات استخدام الذاكرة والتوصيات
  • CLI: واجهة سطر أوامر مدمجة
  • إدارة المجموعة: نظرة عامة على المجموعة متعددة العقد
  • Workbench: تنفيذ الأوامر والسكريبتات
تثبيت Redis Insight:
# التنزيل من RedisLabs
https://redis.com/redis-enterprise/redis-insight/

# أو عبر Docker
docker run -d -p 8001:8001 redislabs/redisinsight:latest

# الوصول على http://localhost:8001

إحصائيات الأوامر

تتبع الأوامر الأكثر استخدامًا:

عرض إحصائيات الأوامر:
INFO commandstats

الإخراج:
cmdstat_get:calls=458234,usec=1234567,usec_per_call=2.69
cmdstat_set:calls=312456,usec=987654,usec_per_call=3.16
cmdstat_hgetall:calls=12345,usec=456789,usec_per_call=37.01

# إعادة تعيين إحصائيات الأوامر
CONFIG RESETSTAT
نصيحة التحسين: الأوامر ذات usec_per_call العالي هي مرشحة للتحسين. ابحث عن HGETALL على هاشات كبيرة، SMEMBERS على مجموعات كبيرة، أو استخدام KEYS.

مراقبة الاستمرارية

راقب عمليات RDB و AOF:

حالة RDB:
INFO persistence

rdb_last_save_time:1634567890
rdb_changes_since_last_save:12345
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:5
rdb_current_bgsave_time_sec:-1

حالة AOF:
aof_enabled:1
aof_rewrite_in_progress:0
aof_last_rewrite_time_sec:12
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

تصحيح المشكلات الشائعة

المشكلة: استخدام الذاكرة العالي
1. قم بتشغيل redis-cli --bigkeys للعثور على مفاتيح كبيرة
2. تحقق من INFO memory لـ mem_fragmentation_ratio
3. راجع evicted_keys - إذا >0، زد maxmemory
4. تحقق من المفاتيح بدون TTL: redis-cli --scan | xargs redis-cli TTL | grep -c "\-1"

المشكلة: أداء بطيء
1. تحقق من SLOWLOG GET 100 للاستعلامات البطيئة
2. قم بتشغيل MONITOR لفترة وجيزة لرؤية الأوامر المباشرة
3. تحقق من INFO stats لنسبة keyspace_misses
4. تحقق من CLIENT LIST للعملاء المحظورين

المشكلة: مشاكل الاتصال
1. تحقق من INFO clients لـ connected_clients مقابل maxclients
2. ابحث عن rejected_connections في INFO stats
3. راجع إعداد timeout في redis.conf
4. تحقق من كمون الشبكة باستخدام redis-cli --latency

أفضل ممارسات المراقبة

قائمة التحقق من مراقبة الإنتاج:
  • ✅ إعداد جمع INFO تلقائي كل 60 ثانية
  • ✅ تنبيه عند mem_fragmentation_ratio > 1.5
  • ✅ تنبيه عند نسبة إصابة keyspace < 80%
  • ✅ تنبيه عند evicted_keys > 0
  • ✅ مراقبة connected_clients للتسريبات
  • ✅ مراجعة SLOWLOG يوميًا لفرص التحسين
  • ✅ تتبع instantaneous_ops_per_sec لتخطيط السعة
  • ✅ مراقبة used_memory مقابل maxmemory
  • ✅ تعيين latency-monitor-threshold ومراجعة LATENCY DOCTOR
  • ✅ استخدام Redis Insight لاستكشاف الأخطاء المرئية
تمرين: قم بإعداد مراقبة شاملة لـ Redis: 1) أنشئ سكريبت يقوم بتشغيل INFO كل 60 ثانية ويسجل المقاييس الرئيسية، 2) قم بتمكين SLOWLOG بعتبة 10ms وحلل الاستعلامات البطيئة، 3) استخدم CLIENT LIST لتحديد الاتصالات الخاملة، 4) قم بتشغيل redis-cli --bigkeys للعثور على مفاتيح كثيفة الذاكرة، 5) تحقق من تجزئة الذاكرة وقم بتمكين إلغاء التجزئة النشط إذا لزم الأمر.