إنشاء سيرفر Redis واستخدامه مع codeingiter لحفظ ال Sessions

ال Redis ببساطة هو عبارة عن قاعدة بيانات non-relational أو No-SQL ويقوم بالتخزين بمبدأ Key -> Value و يعتمد على استخدام الذاكرة في الوصول إلى البيانات مما يجعلها سريعة جداً.

 

للحفاظ على البيانات Persistence يقوم Redis بتخزين البيانات وفقاً لأحد الطرق التالية:

1- AOF أو Append Only File

وفيه يتم انشاء مخزن لتخزين البيانات وإضافة البيانات الجديدة إليه كلما وصلت.

append_only

2- RDB أو Redis Database Backup

وفيه يتم انشاء مخزن جديد لتخزين كافة البيانات كلما وصلت بيانات جديدة.

snapshotting

 

من أنواع ال Data Persistence أو الحفاظ على البيانات:

1- No Persistance: بيانات مؤقتة ويتم ذلك عن طريق إلغاء تفعيل كلاً من RDB و AOF

2- Persistent: بيانات محفوظة ويتم فيها حفظ البيانات فوراً ويتم ذلك بتفعيل RDB

2- Partially Persistent: بيانات مؤقتة ويتم حفظها كل فترة ويتم ذلك بتفعيل كلا ال AOF و كذلك RDB

 

ال Max Memory Policy

بما أن الذاكرة هي جوهر الآداء فإن ال Redis Server يضع عدد من الحالات للتصرف حال امتلئت الذاكرة:

maxmemory_policy

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 هي القيمة التي يتم تحديدها.

databases

3- اختيار عمل Session Lock مما يجعل البيانات غير قابلة للكتابة عليها أثناء الكتابة عليها بالفعل وهذا يحمي من حدوث عملية اعادة توليد ال Sessions وتسجيل الخروج التلقائي دون سبب.

ويتم ذلك التغيير عبر التعديل على ملف php.ini الخاص بإعدادات السيرفر وإضافة السطور كما هو موضح:

session.lock

 

السطور الخاصة بإنشاء سيرفر Redis على سيرفر Apache2 ونظام Ubuntu 11

 

أولاً السيرفر الخاص بال Redis والذي سيتم استخدامه  كمخزن لل Sessions

تنصيب السيرفر ، وفتح ال Port عبر جدار الحماية

فتح ملف redis.conf

إضافة # أمام السطور الآتي ليتم السماح بإستخدام السيرفر خارجياً أو إضافة IP السيرفر الذي سيتم استخدامه

كما يمكن تعديل عدد قواعد البيانات المستخدمة

عند إضافة بيانات السيشن يمكن عزلها عن طريق اسم قاعدة البيانات المستخدمة بحيث يمكن إضافة بيانات السيشن لأكثر من تطبيق في نفس السيرفر

القاعدة الافتراضية رقمها هو 0

كما يمكن إضافة كلمة مرور يتم استخدامها لتأمين الطلبات الموجهة للسيرفر في نفس الملف يتم إزالة ال # من أمام السطر التالي وإضافة كلمة المرور بدلاً من foobared

ثم نقوم بحفظ الملف

 

يتم فتح ملف php.ini :

وإضافة السطور الآتية:

يتم حفظ الملف ثم يتم عمل ريستارت للسيرفر

 

ثانياً السيرفر الآخر الموجود عليه البرمجية والذي سيستخدم السيرفر الأول كمخزن لل sessions

يتم تفعيل Redis Extension لل PHP وفقاً لإصدار ال PHP الموجود على السيرفر

 

تعديل إعدادات codeigniter لبدأ عملية تخزين ملفات ال session على سيرفر ال Redis

من خلال ملف Config.php يتم تغيير الإعدادات كما يلي:

 

حل بعض المشكلات الخاصة بالسيرفر

مشكلة

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