Redis والتخزين المؤقت المتقدم
مراقبة وتصحيح Redis
مراقبة وتصحيح 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
# الحصول على جميع المعلومات
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
# قسم الخادم
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"
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
# مراقبة أوامر 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
# تعيين العتبة إلى 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
# الحصول على آخر 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 # مع المصادقة
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
# اختبار الكمون الأساسي
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
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
# فحص جميع المفاتيح
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
# استخدام الذاكرة لمفتاح محدد
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
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 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
# الحصول على معرف العميل الحالي
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
# مراقبة الأحداث التي تستغرق > 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
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
# التنزيل من 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
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
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. قم بتشغيل
2. تحقق من
3. راجع evicted_keys - إذا >0، زد maxmemory
4. تحقق من المفاتيح بدون TTL:
المشكلة: أداء بطيء
1. تحقق من
2. قم بتشغيل
3. تحقق من
4. تحقق من
المشكلة: مشاكل الاتصال
1. تحقق من
2. ابحث عن rejected_connections في
3. راجع إعداد timeout في redis.conf
4. تحقق من كمون الشبكة باستخدام
1. قم بتشغيل
redis-cli --bigkeys للعثور على مفاتيح كبيرة2. تحقق من
INFO memory لـ mem_fragmentation_ratio3. راجع 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_misses4. تحقق من
CLIENT LIST للعملاء المحظورينالمشكلة: مشاكل الاتصال
1. تحقق من
INFO clients لـ connected_clients مقابل maxclients2. ابحث عن rejected_connections في
INFO stats3. راجع إعداد 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) تحقق من تجزئة الذاكرة وقم بتمكين إلغاء التجزئة النشط إذا لزم الأمر.