يُسمح للزوار بالتعليق.
جداول ذات محرك InnoDB عالي الأداء
هاني كتبه بتاريخ 29/11/2009 الساعة 7:23 م
وصلتني في العام الماضي رسالة من صاحب موقع يواجه مشكلة في قواعد البيانات الخاصة بموقعه, علما أن الخادم الخاص بالقاعدة مواصفاته من أعلى المواصفات الموجودة بالسوق, و ذاكرته العشوائية تصل إلى 24 جيجا!
سألته عن عدد النقرات في الثانية الواحدة, و أجاب بأنها تصل إلى 200 خلال وقت الذروة, و أنّ متوسط الاستعلامات ما بين 10-25 بين الصفحات.
25 استعلام * 200 نقرة في الثانية / 2 المتوسط = 2500 استعلام في الثانية الواحدة. لكن هذا ليس بمشكلة كبيرة و يمكن التغاضي عنها, طالما أن خادمه قوي.
أخبرته أن هنالك عدة حلول, و أجاب من فوره بقول: الأسرع
, لأن الوضع سيئ, و تعليق الموقع مستمر ليل نهار.
أعلم أنك تعتقد أن الخلل هو من الاستعلامات. حقيقة: لا!. دعني اشرح لك بالتفصيل, فالتعليق ينتج عندما يتم إغلاق الجداول عن الاستعلامات و إدخال البيانات. و هذا ما يحدث مع محرك MyISAM, الافتراضي في قواعد بيانات MySQL. و متى يتم إغلاق الجدول؟ إن كان هذا هو سؤال فإليك الإجابة.
أي تعديل على الجدول أو أي استعلام ثقيل (يستغرق الكثير من الوقت لتنفيذه), قد يتسبب بغلق الجدول بالكامل و من ثم رفض جميع الطلبات حتى ينتهي التعديل أو الاستعلام الحالي (Table Locking Issues).
هذه العملية تستهلك الكثير من الذاكرة العشوائية, حيث أن الطلبات المرسلة توضع في الانتظار, و التي بدورها غالباً ما تكون في RAM.
زوار الموقع السابق ذكره, على درجة عالية من النشاط, فقد كانوا ينفذون العديد من عمليات الإدخال على الجداول, و التي بدورها تغلق التصفح عن الآخرين لينتظروا أصحاب الاتصالات البطيئة من أن يرسلوا حزمهم إلى الخادم و الذي بدوره سيقوم على معالجتها عن طريق قاعدة البيانات. و للتخلص من مشكلة الإغلاق الكامل للجداول, لجأنا إلى InnoDB.
InnoDB لتحاشى الإغلاق الكامل للجدول, بالإغلاق على الحقل المعني, و هذا من أجمل مميزات هذا المحرك. حيث أن الاتصال بالجدول (تعديل أو حذف حقل أو إدخال أو حتى الاستعلام) يتم تنفيذه بنفس الوقت دون أي انتظار.
بعد إعداد MySQL بالشكل المطلوب و البدء بتحويل الجداول. (و الذي استغرق يوما كاملا على قاعدة بيانات تجاوزت 15 جيجا) بدأنا بالاختبار و بتنفيذ الكثير من الاستعلامات البطيئة, و كانت النتيجة جداً مذهلة. فلم يعد هنالك أي تعليق بالموقع, غير أن بعض البطء ما يزال موجودا بسبب استعلامات لا تتمتع حقولها بأي نوعٍ من الأرشفة.
أضفنا الأرشفة "Index", لأغلب الحقول, و أعدنا بعض الجداول إلى محرك MyISAM, لأن InnoDB لا تدعم الفهرسة الكاملة. و الذي خصصناه على الجداول التي تحمل التعليقات, و القابلة للبحث في محرك بحث الموقع. و بعدها عمل الموقع بسلاسة تامة و دون أي توقف.
و لتتعرف أكثر على الاستعلامات البطيئة و الغير مؤرشفة (الاستعلامات التي تبحث بكامل الجدول لتصل إلى غايتها) و طريقة اصطيادها, اطلع على الصفحة التالية:
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
قبل مدّة قريبة, اتصل بي ليسألني هل من الممكن تحسين أداء MySQL أكثر؟ فأجبته بنعم, يمكن ذلك. عن طريق الاستغناء عن محرك InnoDB الأساسي, بنظام منفصل كالنظام InnoDB Plugin, و بعد تحديث خادم القواعد إلى الإصدار 5.1.37 و تركيب InnoDB Plugin 1.4, تغير الأداء بنسبة كبيرة. و سألته إن كان يرغب بأن لا يتوقف موقعه خلال النسخ الاحتياطي. فعليه استخدام النظام InnoDB Hot Backup, لكن حينها قد دفع الكثير, و لم يكن مستعدا لدفع 500$ سنويا مقابل توقف 10 دقائق في اليوم!.
ما دفعني لكتابة هذه المقالة - أو هذه القصة إن صح التعبير - هو Anders في مقالته:
Part 1 vB4mance: Helping communities grow, performance data model changes in vB 4.0, و الذي تحدث به عن بعض مما تحدثت عنه هنا.
حقيقة ما تكلم عنه جميل جداً, لكنه لم يوضح أن الإعداد الخاطئ لخادم MySQL من خلال ملف my.ini, قد يتسبب بمشاكل كبيرة علىه, و بطء غير متوقع, على عكس ما ينتج من MyISAM. فإن المخاطرة به أقل منه في نظيره. فمحرك InnoDB قد يتسبب بسقوط بعض الحقول من الجداول, و الذي يكون سببه هو استخدام إعدادات على الخادم, تعنى بالتخزين المؤقت أو تقادم في إصدارته. لكن لا تقلق, فهذه مجرد تحرّكات تجارية, ترهبك حتى تشتري ما لا تحتاجه, فأنا عن نفسي لم أواجه أي مشاكل معه منذ العامين الماضيين.
للمبتدئين, أنصحهم بالاستفادة من هذه الإعدادات:
بعد أن ألقيت نظرة على الإصدار الرابع للمنتدى, و الرموز البرمجية التي تعنى باستخدام InnoDB, أصابني بعضاً من الإحباط, فكأنما من قام بكتابة تلك الرموز لم يكمل عامه الأول في برمجة PHP و التعامل مع MySQL, كحال السفينة. فإنها تغرق في حال تعدد قباطنتها. و vBulletin بها أكثر مما وضع على برمجة Windows 7 من ربان.
على كل حال و بعد ما شاهدته, قررت أن أطور منتج بسيط و مجاني. يعنى بتحويل الجداول إلى InnoDB بشكل سلس. فبعد تركيبه, تتوجه إلى الصيانة - في لوحة تحكم المنتدى - و تجد الخيار الخاص به آخر الصفحة.
لتحميل المنتج:
http://files.plusvb.com/plus/product-plusvb_myisam_to_innodb.zip
موضوع المنتج:
http://www.vbulletin.org/forum/showthread.php?t=228846
يرجى أخذ نسخة احتياطية من قاعدة البيانات قبل البدء بتحويل الجداول. ولا تنسى أن تغلق المنتدى وقتها.
هاني.
سألته عن عدد النقرات في الثانية الواحدة, و أجاب بأنها تصل إلى 200 خلال وقت الذروة, و أنّ متوسط الاستعلامات ما بين 10-25 بين الصفحات.
25 استعلام * 200 نقرة في الثانية / 2 المتوسط = 2500 استعلام في الثانية الواحدة. لكن هذا ليس بمشكلة كبيرة و يمكن التغاضي عنها, طالما أن خادمه قوي.
أخبرته أن هنالك عدة حلول, و أجاب من فوره بقول: الأسرع
, لأن الوضع سيئ, و تعليق الموقع مستمر ليل نهار.أعلم أنك تعتقد أن الخلل هو من الاستعلامات. حقيقة: لا!. دعني اشرح لك بالتفصيل, فالتعليق ينتج عندما يتم إغلاق الجداول عن الاستعلامات و إدخال البيانات. و هذا ما يحدث مع محرك MyISAM, الافتراضي في قواعد بيانات MySQL. و متى يتم إغلاق الجدول؟ إن كان هذا هو سؤال فإليك الإجابة.
أي تعديل على الجدول أو أي استعلام ثقيل (يستغرق الكثير من الوقت لتنفيذه), قد يتسبب بغلق الجدول بالكامل و من ثم رفض جميع الطلبات حتى ينتهي التعديل أو الاستعلام الحالي (Table Locking Issues).
هذه العملية تستهلك الكثير من الذاكرة العشوائية, حيث أن الطلبات المرسلة توضع في الانتظار, و التي بدورها غالباً ما تكون في RAM.
زوار الموقع السابق ذكره, على درجة عالية من النشاط, فقد كانوا ينفذون العديد من عمليات الإدخال على الجداول, و التي بدورها تغلق التصفح عن الآخرين لينتظروا أصحاب الاتصالات البطيئة من أن يرسلوا حزمهم إلى الخادم و الذي بدوره سيقوم على معالجتها عن طريق قاعدة البيانات. و للتخلص من مشكلة الإغلاق الكامل للجداول, لجأنا إلى InnoDB.
InnoDB لتحاشى الإغلاق الكامل للجدول, بالإغلاق على الحقل المعني, و هذا من أجمل مميزات هذا المحرك. حيث أن الاتصال بالجدول (تعديل أو حذف حقل أو إدخال أو حتى الاستعلام) يتم تنفيذه بنفس الوقت دون أي انتظار.
بعد إعداد MySQL بالشكل المطلوب و البدء بتحويل الجداول. (و الذي استغرق يوما كاملا على قاعدة بيانات تجاوزت 15 جيجا) بدأنا بالاختبار و بتنفيذ الكثير من الاستعلامات البطيئة, و كانت النتيجة جداً مذهلة. فلم يعد هنالك أي تعليق بالموقع, غير أن بعض البطء ما يزال موجودا بسبب استعلامات لا تتمتع حقولها بأي نوعٍ من الأرشفة.
أضفنا الأرشفة "Index", لأغلب الحقول, و أعدنا بعض الجداول إلى محرك MyISAM, لأن InnoDB لا تدعم الفهرسة الكاملة. و الذي خصصناه على الجداول التي تحمل التعليقات, و القابلة للبحث في محرك بحث الموقع. و بعدها عمل الموقع بسلاسة تامة و دون أي توقف.
و لتتعرف أكثر على الاستعلامات البطيئة و الغير مؤرشفة (الاستعلامات التي تبحث بكامل الجدول لتصل إلى غايتها) و طريقة اصطيادها, اطلع على الصفحة التالية:
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
قبل مدّة قريبة, اتصل بي ليسألني هل من الممكن تحسين أداء MySQL أكثر؟ فأجبته بنعم, يمكن ذلك. عن طريق الاستغناء عن محرك InnoDB الأساسي, بنظام منفصل كالنظام InnoDB Plugin, و بعد تحديث خادم القواعد إلى الإصدار 5.1.37 و تركيب InnoDB Plugin 1.4, تغير الأداء بنسبة كبيرة. و سألته إن كان يرغب بأن لا يتوقف موقعه خلال النسخ الاحتياطي. فعليه استخدام النظام InnoDB Hot Backup, لكن حينها قد دفع الكثير, و لم يكن مستعدا لدفع 500$ سنويا مقابل توقف 10 دقائق في اليوم!.
ما دفعني لكتابة هذه المقالة - أو هذه القصة إن صح التعبير - هو Anders في مقالته:
Part 1 vB4mance: Helping communities grow, performance data model changes in vB 4.0, و الذي تحدث به عن بعض مما تحدثت عنه هنا.
حقيقة ما تكلم عنه جميل جداً, لكنه لم يوضح أن الإعداد الخاطئ لخادم MySQL من خلال ملف my.ini, قد يتسبب بمشاكل كبيرة علىه, و بطء غير متوقع, على عكس ما ينتج من MyISAM. فإن المخاطرة به أقل منه في نظيره. فمحرك InnoDB قد يتسبب بسقوط بعض الحقول من الجداول, و الذي يكون سببه هو استخدام إعدادات على الخادم, تعنى بالتخزين المؤقت أو تقادم في إصدارته. لكن لا تقلق, فهذه مجرد تحرّكات تجارية, ترهبك حتى تشتري ما لا تحتاجه, فأنا عن نفسي لم أواجه أي مشاكل معه منذ العامين الماضيين.
للمبتدئين, أنصحهم بالاستفادة من هذه الإعدادات:
بعد أن ألقيت نظرة على الإصدار الرابع للمنتدى, و الرموز البرمجية التي تعنى باستخدام InnoDB, أصابني بعضاً من الإحباط, فكأنما من قام بكتابة تلك الرموز لم يكمل عامه الأول في برمجة PHP و التعامل مع MySQL, كحال السفينة. فإنها تغرق في حال تعدد قباطنتها. و vBulletin بها أكثر مما وضع على برمجة Windows 7 من ربان.
على كل حال و بعد ما شاهدته, قررت أن أطور منتج بسيط و مجاني. يعنى بتحويل الجداول إلى InnoDB بشكل سلس. فبعد تركيبه, تتوجه إلى الصيانة - في لوحة تحكم المنتدى - و تجد الخيار الخاص به آخر الصفحة.
لتحميل المنتج:
http://files.plusvb.com/plus/product-plusvb_myisam_to_innodb.zip
موضوع المنتج:
http://www.vbulletin.org/forum/showthread.php?t=228846
يرجى أخذ نسخة احتياطية من قاعدة البيانات قبل البدء بتحويل الجداول. ولا تنسى أن تغلق المنتدى وقتها.
هاني.
إجمالي التعليقات 14
التعليقات
-
السلام عليكم
ابوسعد
أغلق المنتدى وقت أخذ البيك أب أو وقت تحويل الجداول ؟

s-qu كتبه بتاريخ 01/12/2009 الساعة 2:21 ص
-
عليكم السلام والرحمة,
أغلق المنتدى, خذ باك أب, حول الجداول, افتح المنتدى.اقتباس:أغلق المنتدى وقت أخذ البيك أب أو وقت تحويل الجداول ؟
لكن قبل كل شيء, تأكد من اعداد قواعد البيانات بالشكل الصحيح.
من أهمل الخيارات:
موفق.رمز برمجي:innodb_flush_log_at_trx_commit = 2 innodb_file_per_table innodb_flush_method = O_DIRECT
هاني كتبه بتاريخ 01/12/2009 الساعة 3:11 ص
-
بصراحة موقعي يستهلك موارد السيرفر بشكل كبير
وهل المنتدى يحتاج مستقبلا لهذا المنتج دائما ام فقط عند التحويل ومن ثم ازالته .
اقصد عند الترقية للنسخه الرابعهلقيت روحي كتبه بتاريخ 08/12/2009 الساعة 3:09 م
-
هاني كتبه بتاريخ 09/12/2009 الساعة 10:19 م
-
عند بدء التحويل اتتني هذه الرساله
InnoDB is DISABLED.
Please remove 'skip-innodb' form 'my.ini'.
ايش مسار my.ini في الشيللقيت روحي كتبه بتاريخ 11/12/2009 الساعة 2:26 ص
-
هاني كتبه بتاريخ 11/12/2009 الساعة 3:10 ص
-
مقال رائع.
أجمل ما في المقالة هو سهولة التحويل.
آه لو كان عندي عضوية في ترايدنت لنشرته.مرجان كتبه بتاريخ 11/12/2009 الساعة 7:03 م
-
عملت التحويل ولكن انتهى وقت تحميل الصفحه ولم ينتهي من كل لقوعد
رجعت وحاولت ان اعيد الكرة وايضا نفس اللي صارلي
ورجعت المرة الثالثه واعطاني صفحة لايوجد بها سوا هذه الجملة
vBulletin® v3.8.4 Patch Level 1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.
فقط ولا ادري هل اكتمل التحويل ام لا وكيف اتاكد من ذلكلقيت روحي كتبه بتاريخ 12/12/2009 الساعة 1:48 ص
-
هاني كتبه بتاريخ 12/12/2009 الساعة 5:32 ص
-
هاني كتبه بتاريخ 12/12/2009 الساعة 5:33 ص
-
كل الملفات تحولت الى InnoDB
ماعدا هذه الملفات
post ==== MyISAM
language === MyISAM
groupmessage === MyISAM
socialgroup === MyISAM
thread === MyISAM
session , cpsession ==== MEMORY
لقيت روحي كتبه بتاريخ 12/12/2009 الساعة 11:29 م
-
هاني كتبه بتاريخ 12/12/2009 الساعة 11:41 م
-
الله يطمنك بالخير اخوي هاني
مشكور وما قصرت ،،، يعطيك العافيهلقيت روحي كتبه بتاريخ 13/12/2009 الساعة 1:04 م
-
هاني كتبه بتاريخ 15/12/2009 الساعة 3:35 م
كتابة تعليق
|
مجموع التعقبات 0



