ال Redis ببساطة هو عبارة عن قاعدة بيانات non-relational أو No-SQL ويقوم بالتخزين بمبدأ Key -> Value و يعتمد على استخدام الذاكرة في الوصول إلى البيانات مما يجعلها سريعة جداً.
للحفاظ على البيانات Persistence يقوم Redis بتخزين البيانات وفقاً لأحد الطرق التالية:
1- AOF أو Append Only File
وفيه يتم انشاء مخزن لتخزين البيانات وإضافة البيانات الجديدة إليه كلما وصلت.
2- RDB أو Redis Database Backup
وفيه يتم انشاء مخزن جديد لتخزين كافة البيانات كلما وصلت بيانات جديدة.
من أنواع ال Data Persistence أو الحفاظ على البيانات:
1- No Persistance: بيانات مؤقتة ويتم ذلك عن طريق إلغاء تفعيل كلاً من RDB و AOF
2- Persistent: بيانات محفوظة ويتم فيها حفظ البيانات فوراً ويتم ذلك بتفعيل RDB
2- Partially Persistent: بيانات مؤقتة ويتم حفظها كل فترة ويتم ذلك بتفعيل كلا ال AOF و كذلك RDB
ال Max Memory Policy
بما أن الذاكرة هي جوهر الآداء فإن ال Redis Server يضع عدد من الحالات للتصرف حال امتلئت الذاكرة:
1- LRU وهي Least Recently Used البيانات الأقل استخداماً مؤخراً.
- volatile-lru: البيانات الأقل استخداماً مؤخراً وفقاً لتوقيت ال Expiry.
- allkeys-lru: البيانات الأقل استخداماً مؤخراً.
2- Random وهي استبدال عشوائي
- volatile-random: عشوائياً وفقاً لتوقيت ال Expiry.
- allkeys-random: عشوائياً أي بيانات.
3- volatile-ttl وفقاً للأقرب من توقيت ال Expiry.
4- noeviction لا يوجد استبدال وتظهر رسالة خطأ بإمتلاء الذاكرة.
يتم استخدام عينة من عدد معين من البيانات والإختيار فيما بينها وذلك يمكن تحديده عبر المتغير maxmemory-samples
يتم تنصيب ال Redis server وبعد ذلك يتم عمل الاعدادات الخاصة به ومن أهمها:
1- اختيار كون البيانات Persistent أي انها دائماً متوفرة أو أنها بيانات مؤقتة.
كلما اخترت أن تكون البيانات Persistent كان الآداء أكثر بطئاً ولكن جعلها مؤقتة أيضاً قد لا يكون الاختيار الصحيح لأنه يعرضك لفقد البيانات نتيجة حدوث شئ طارئ أو إعادة تشغيل السيرفر ولذلك يوجد خيار آخر وهو أن تكون متوفرة جزئياً ( Partial Persistence ) وفي هذه الحالة يقوم السيرفر بتخزين البيانات كل فترة مع امكانية فقدان بعضها.
2- تحديد عدد قواعد البيانات داخل السيرفر وكل قاعدة بيانات لها رقم من ( 0 إلى X ) حيث X هي القيمة التي يتم تحديدها.
3- اختيار عمل Session Lock مما يجعل البيانات غير قابلة للكتابة عليها أثناء الكتابة عليها بالفعل وهذا يحمي من حدوث عملية اعادة توليد ال Sessions وتسجيل الخروج التلقائي دون سبب.
ويتم ذلك التغيير عبر التعديل على ملف php.ini الخاص بإعدادات السيرفر وإضافة السطور كما هو موضح:
السطور الخاصة بإنشاء سيرفر Redis على سيرفر Apache2 ونظام Ubuntu 11
أولاً السيرفر الخاص بال Redis والذي سيتم استخدامه كمخزن لل Sessions
تنصيب السيرفر ، وفتح ال Port عبر جدار الحماية
1 2 3 |
sudo apt update sudo apt install redis-server sudo ufw allow 6379/tcp |
فتح ملف redis.conf
1 |
sudo nano /etc/redis/redis.conf |
إضافة # أمام السطور الآتي ليتم السماح بإستخدام السيرفر خارجياً أو إضافة IP السيرفر الذي سيتم استخدامه
1 |
#bind 127.0.0.1 |
كما يمكن تعديل عدد قواعد البيانات المستخدمة
عند إضافة بيانات السيشن يمكن عزلها عن طريق اسم قاعدة البيانات المستخدمة بحيث يمكن إضافة بيانات السيشن لأكثر من تطبيق في نفس السيرفر
القاعدة الافتراضية رقمها هو 0
1 |
databases 16 |
كما يمكن إضافة كلمة مرور يتم استخدامها لتأمين الطلبات الموجهة للسيرفر في نفس الملف يتم إزالة ال # من أمام السطر التالي وإضافة كلمة المرور بدلاً من foobared
1 |
# requirepass foobared |
ثم نقوم بحفظ الملف
يتم فتح ملف php.ini :
1 |
nano /etc/php/7.0/apache2/php.ini |
وإضافة السطور الآتية:
1 2 3 4 5 6 7 8 |
; Should the locking be enabled? Defaults to: 0. redis.session.locking_enabled = 1 ; How long should the lock live (in seconds)? Defaults to: value of max_execution_time. redis.session.lock_expire = 120 ; How long to wait between attempts to acquire lock, in microseconds (µs)?. Defaults to: 2000 redis.session.lock_wait_time = 50000 ; Maximum number of times to retry (-1 means infinite). Defaults to: 10 redis.session.lock_retries = 10 |
يتم حفظ الملف ثم يتم عمل ريستارت للسيرفر
1 2 |
sudo systemctl restart redis.service service apache2 restart |
ثانياً السيرفر الآخر الموجود عليه البرمجية والذي سيستخدم السيرفر الأول كمخزن لل sessions
يتم تفعيل Redis Extension لل PHP وفقاً لإصدار ال PHP الموجود على السيرفر
1 |
apt-get install php7.1-redis |
تعديل إعدادات codeigniter لبدأ عملية تخزين ملفات ال session على سيرفر ال Redis
من خلال ملف Config.php يتم تغيير الإعدادات كما يلي:
1 2 |
$config['sess_driver'] = 'redis'; $config['sess_save_path'] = 'server-ip-address:6379?auth=&database=0'; |
حل بعض المشكلات الخاصة بالسيرفر
مشكلة
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
هذه المشكلة بسبب تفعيل الحفظ على الهارد ديسك RDB ووصول حجم الملفات المخزن في الذاكرة إلى مساحة أكبر من المساحة المتبقية في الذاكرة نفسها ولا يستطيع فتح الملف ليقوم بكتابته على الهارد ديسك
الحل
يتم فتح الملف
/proc/sys/vm/overcommit_memory
وتغيير القيمة الموجودة بداخله إلى 1 بدلاً من 0