بخشی از مقاله
ويژگي هاي الگوريتمهاي كنترل همروندي توزيعي
چكيده : در اين گزارش ما به بررسي ويژگي هاي الگوريتمهاي كنترل همروندي توزيعي كه بر پايه مكانيزم قفل دو مرحله اي(2 Phase Locking) ايجاد شده اند خواهيم پرداخت. محور اصلي اين بررسي بر مبناي تجزيه مساله كنترل همروندي به دو حالت read-wirte و write-write ميباشد. در اين مقال، تعدادي از تكنيكهاي همزمان سازي براي حل هر يك از قسمتهاي مساله بيان شده و سپس اين تكنيكها براي حل كلي مساله با يكديگر تركيب ميشوند.
در اين گزارش بر روي درستي و ساختار الگوريتمها متمركز خواهيم شد. در اين راستا براي ساختار پايگاه داده توزيعي يك سطحي از انتزاع را در نظر ميگيريم تا مساله تا حد ممكن ساده سازي شود.
1. مقدمه : كنترل همروندي فرآيندي است كه طي آن بين دسترسي هاي همزمان به يك پايگاه داده در يك سيستم مديريت پايگاه داده چند كاربره هماهنگي بوجود ميآيد. كنترل همروندي به كاربران اجازه ميدهد تا در يك حالت چند برنامگي با سيستم تعامل داشته باشند در حاليكه رفتار سيستم از ديدگاه كاربر به نحو خواهد بود كه كاربر تصور ميكند در يك محيط تك برنامه در حال فعاليت است. سخت ترين حالت در اين سيستم مقابله با بروز آوري هاي آزار دهنده اي است كه يك كاربر هنگام استخراج داده توسط كاربر ديگر انجام ميدهد. به دو دليل ذيل كنترل همروندي در پايگاه داده هاي توزيعي از اهميت بالايي برخوردار است:
1. كاربراان ممكن است به داده هايي كه در كامپيوترهاي مختلف در سيستم قرار دارند دسترسي پيدا كنند.
2. يك مكانيزم كنترل همروندي در يك كامپيوتر از وضعيت دسترسي در ساير كامپيوترها اطلاعي ندارد.
مساله كنترل همروندي در چندين سال قبل كاملا مورد بررسي قرار گفته است و در خصوص پايگاهدادههاي متمركز كاملا شناخته شده است. در خصوص اين مسال در پايگاه داده توزيعي با توجه به اينكه مساله در حوزه مساله توزيعي قرار ميگيرد بصورت مداوم راهكارهاي بهبود مختلف عرضه ميشود. يك تئوري رياضي وسيع براي تحليل اين مساله ارائه شده و يك راهكار قفل دو مرحله اي به عنوان راه حل استاندارد در اين خصوص ارائه شده است. بيش از 20 الگوريتم كنترل همروندي توزيعي ارائه شده است كه بسياري از آنها پياده سازي شده و در حال استفاده ميباشند.اين الگوريتمها معمولا پيچيده هستند و اثبات درستي آنها بسيار سخت ميباشد. يكي از دلايل اينكه اين پيچيدگي وجود دارد اين است كه آنها در
اصطلاحات مختلف بيان ميشوند و بيان هاي مختلفي براي آنها وجود دارد. يكي از دلايل اينكه اين پيچدگي وجود دارد اين است كه مساله از زير قسمتهاي مختلف تشكيل شده است و براي هر يك از اين زير قسمتها يك زير الگوريتم ارائه ميشود. بهترين راه براي فائق آمدن بر اين پيچدگي اين است كه زير مساله ها و الگوريتمهاي ارائه شده براي هر يك را در ي.ك سطح از انتزاع نگاه داريم.
با بررسي الگوريتمهاي مختلف ميتوان به اين حقيقت رسيد كه اين الگوريتمها همگي تركيبي از زير الگوريتمهاي محدودي هستند. در حقيقت اين زير الگوريتمها نسخههاي متفاوتي از دو تكنيك اصلي در كنترل همروندي توزيعي به نامهاي قفل دو مرحله اي و ترتيب برچسب زماني ميباشند.
همانطور كه گفته شد، هدف كنترل همروندي مقابله با تزاحمهايي است كه در اثر استفاده چند كاربر از يك سري داده واحد براي كاربران بوجود ميآيد است. حال ما با ارائه دو مثال در خصوص اين مسائل بحث خواهيم نمود. اين دو مثال از محك معروف TPC_A مقتبس شده اند. در اين مثالها، يك سيستم اطلاعات را از پايگاه داده ها استخراج كرده و محاسبات لازم را انجام داده و در نهايت اطلاعات را در پايگاه داده ذخيره مينمايد.
حالت اول را ميتوان بروزآوري از دست رفته ناميد. حالتي را تصور كنيد كه دو مشتري از دو سيستم مجزا بخواهند از يك حساب مالي برداشت نمايند. در اين حالت فرض كنيد در غياب سيستم كنترل همروندي، هر دو با هم اقدام به خواندن اطلاعات و درج اطلاعات جديد در سيستم ميكنند. در اين حالت در غياب سيستم كنترل همروندي تنها آخرين درج در سيستم ثبت ميشود. اين حالت در شكل 1 نشان داده شده است.
شكل 1 نمايش حالت بروز آوري از دست رفته
حالت دوم حالتي است كه در آن اطلاعات صحيح از پايگاه داده استخراج نميشود. در اين حالت فرض كنيد دو مشتري بخواهند كارهاي ذيل را انجام دهند.
• مشتري 1: بخواهد يك چك 1 ميليوني را به حساب X واريز و از حساب Y برداشت نمايد.
• مشتري 2: بخواهد بيلان حساب مالي X و Y شامل كل موجودي را نمايش دهد.
در غياب كنترل همروندي همانطور كه در شكل 2 نشان داده شدهاست، تزاحم بين پروسس ها بوجود خواهد آمد. فرض كنيد در زماني كه مشتري 1 اطلاعات را از حساب Y خوانده و اطلاعات حساب X را دريافت نموده و 1 ميليون از حساب Y برداشت نموده ولي هنوز 1 ميليون به حساب X و اريز نكرده مشتري 2 اطلاعات كل دو حساب را دريافت نموده و نتيجه را چاپ نمايد. در اين حالت مشتري شماره 2 اطلاعاتي را كه به عنوان بيلان نمايش ميدهد 1 ميليون از مقدار واقعي كمتر است. اين حالت يك فرق اساسي با حالت اول دارد و آن اين است كه در اين حالت نتيجه نهايي در پايگاه داده درست خواهد بود در حاليكه اطلاعات دريافت شده بصورت موقت غلط خواهند بود.
شكل 2 خواندن اطلاعات نادرست از سيستم
مساله كنترل همروندي در پايگاه داده هاي توزيعي تا حدودي شبيه مساله دوبهدو ناسزگاري در سيستم عامل ميباشد. در مساله دوبهدو ناسازگاري، هماهنگي جهت دسترسي به منابع سيستم ائم از حافظه، ابزارهاي ورودي و خروجي و CPU و .... بوجود ميآيد. در اين حالت راه حلهاي گوناگوني ائم از قفلها، سمافورها، مونيتورها و ... پيشنهاد شده است.
كنرتل همروندي و دوبهدو ناسگاري از اين جهت كه هر دو دسترسي به منابع مشترك را كنترل ميكنند با هم شباهت دارند. با اين حال راه حلي كه براي يكي بكار ميرود قابل بهره برداري براي ديگري نيست. فرض كنيد پردازه هاي P1 و P2 بخواهند از نقاط مختلف كدهاي خود به منابع R1 و R2 دسترسي پيدا كنند. در سيستم عامل دسترسي مجزاي ذيل قابل قبول است. P2 از R1 استفاده كند، P2 از R1 استفاده كند، P2 از R2 استفاده نموده و سپس P1 از R2 استفاده نمايد. در پايگاه داده اين روند اجرا مورد قبول نيست و مشكلاتي را ايجاد ميكند. فرض كنيد P1 بخواهد از R1 مبلغي را به R2 انتقال دهد. در اين حالت اگر P2 مقادير R1 وR2 را چك كند مقادير غير صحيح را دريافت ميكند.
2. مدل پردازش تراكنش: براي اينكه روند اجراي عمليات در سيستمهاي پايگاه داده هاي توزيعي براي خواننده مشخص شود ما در اينجا يك مدل از پايگاه دادههاي توزيعي را ارائه ميدهيم. سپس نحوه عملكرد مكانيزم كنترل همروندي را در اين مدل بيان خواهيم نمود. در اين مدل پايگاه داده، يك پايگاه داده توزيعي مجموعه از سايتهاست كه توسط يك شبكه به هم متصل شدهاند. هر سايت يك كامپيوتر است كه يكي يا هر دوي برنامه هاي ذيل را اجرا ميكند. برنامهها شامل يك مدير تراكنش يا TM و يك مدير داده يا DM است. TM مسئول
مديريت تعامل كاربر با پايگاه داده است و DM مسئول نگهداري دادهها است. شبكه نيز يك وسيله ارتباطي كامپيوتر – كامپيوتر است. فرض بر اين است كه شبكه كاملا امن ميباشد و پيامها را با همان ترتيبي كه وارد سيستم ميشوند به مقصد ارسال ميشود. فرض بر اين است كه تعداد داده هاي موجود در سيستم شامل X ، Y و Z است كه داده هاي منطقي موجود در سيستم را تشكيل ميدهند. داده هاي ذكر شده فقط واحد داده هاي منطقي هستند و ما با سايز و قالب و جزئيات آنها كاري نخواهيم داشت. هر پايگاه داده در اين سيستم يك نسبت دهي مقادير بصورت منطقي به اين داده هاي منطقي است. هر داده منطقي ميتواند در يك يا بيشتر از يك DM ذخيره شود. افزونگي داده در اثر ذخيره داده در چندين DM براي افزايش دسترسي به دادهها است. هر كپي از داده ذخيره شده آيتم داده ناميده ميشود. نسخه هاي متعدد داده X را بصورت X1,X2,... نشان داده ميشوند. كاربران با
DDBMS از طريق اجراي تراكنشها تعامل دارند. تراكنشها ميتوانند پرس و جو هاي ON-LINE باشند كه با زبان استاندارد پرس و جو ارسال شده اند. از طرفي تراكنشها ميتوانند عملياتي باشند كه از طريق برنامه هاي نوشته شده به سيستم داده ميشوند. الگوريتمهاي كنترل همروندي، كاري با نوع تراكنشهاي موجود در سيستم ندارند و محاسبات انحام شده در اين تراكنشها تاثيري در روند اين الگوريتمها ندارد. بر خلاف اينها اين الگوريتمها تمام تصميم گيري هاي خود را بر اساس داده هايي كه اين تراكنشها به آنها دسترسي پيدا ميكنند انجام ميدهند. دسترسي ها ميتوانند از نوع خواندن يا نوشتن باشند. فرض بر اين است كه محاسبات در تراكنشها كامل بوده و اگر تراكنش در يك پايگاه داده به تنهايي اجرا شود، پايگاه داده در حالت صحيح و مانا قرار گرفته و نتايج كاملا صحيحي در بر خواهد داشت. مجموعه منطقي خواندني يك تراكنش مجموعه اي از آيتمهاي داده اي است كه تراكنش ميخواند. اين امر در شكل 3 نمايش داده شده است.
شكل 3 مدل اجراي تراكنشها
صحت يك الگوريتم كنترل همروندي بر اساس نياز كاربران به اجراي تراكنشها تعريف ميشود. در اينجا ميتوان دو شرط اساسي را ميتوان براي اجراي صحيح تراكنشها ميتوان در نظر گرفت. شرط اول اين است كه كاربران انتظار دارند تراكنشهايي را كه در سيستم ثبت ميكنند، نهايتا اجرا شود. شرط دو م اين است كه كاربران انتظار دارند تراكنشهاي ارسالي دقيقا مانند زماني كه تراكنش در يك سيستم مجزا يا در يك محيط موازي چند برنامه، اجرا ميشود اجرا شود و نتايج آن در هر دوحالت كاملا مشابه باشد. تحقق اين شرايط دقيقا اهداف يك الگوريتم كنترل همروندي را مشخص ميكنند. يك سيستم DDBMS چهار جزء اصلي را در برخواهد داشت: تراكنش، TM، DM و دادهها. تراكنشها با TM ارتباط دارند. TM ها با DM ها ارتباط برقرار ميكنند و DM ها داده ها را مديريت ميكنند. TM ها با ساير TM ها ارتباط برقرار نميكنند.
TM ها بر تركانش ها و اجراي آنها نظارت ميكنند. هر تراكنش در پايگاه داده هاي توزيعي فقط با يك TM در ارتباط است. اين بدين معنا است كه هر تراكنش تمام عمليات پايگاه داده خود را به TM مربوط به خود ارسال ميكنند. تمامي عملياتهاي توزيعي كه بايستي توسط تراكنش انجام شود توسط TM مزبور مديريت ميشود. چهار عمليات مختلف توسط واسط TM براي تراكنشها قابل تعريف است. READ(X) مقدار جاري X را در وضعيت فعلي پايگاه داده هاي منطقي برميگرداند. WRITE(X,NEWVALUE) مقدار X را در حالت جاري پايگاه دادههاي منطقي به مقدار NEWVALUE تغيير ميدهد. همچنين با استفاده از BEGIN و END ابتدا و انتهاي يك تراكنش براي يك TM مشخص ميشود.
3-تحليل مساله كنترل همروندي : در اينجا ما با دو رويكرد به مواجه با مساله كنترل همروندي خواهيم پرداخت. در رويكرد اول به نحوه اجراي صحيح خواهيم پرداخت و در رويكرد دوم به تجزيه مساله به بخشهاي قابل حل خواهيم پرداخت.
3-1- قابليت توالي: فرض كنيد E يك ترتيب اجراي تراكنشهاي T1 تا TN باشد. در اينصورت E يك اجراي متوالي از تراكنشها است، در صورتيكه هر تراكنش قبل از اجراي تراكنش بعدي به طور كامل اجرا شده و خاتمه پذيرد. تمامي ترتيبهاي اجراي متوالي از ديدگاه پايگاه دادهها صحيح تصور ميشوند، چرا كه خواص تراكنش اذعان ميكند كه در خاتمه اجراي متوالي صحت پايگاه داده حفظ ميشود. يك ترتيب اجراي تراكنش قابل توالي (SERIALIZABLE) محسوب ميشود در صورتيكه نتيجه خروجي اجراي آن برابر يك اجراي متوالي از تراكنشهاي مشابه باشد. در نتيجه تمام اجراهاي متوالي SERIALIZABLE محسوب ميشوند و نتيجه صحيحي خواهند داشت.
هدف الگوريتم كنترل همروندي اين است كه تضمين كند كه تمامي ترتيب هاي اجراي تراكنش ها قابل توالي ميباشند. تنها عملياتي كه به دادههاي پايگاه داده دسترسي پيدا ميكنند DM-READ و DM-WRITE ميباشند. بنا براين براي پايش اجراي توالي لازم است فقط DM-READ و DM-WRITE هاي موجود در پايگاه داده توزيعي در DM ها مختلف مدل شده و رفتار آنها كنترل شود. LOG فايلها ميتوانند شرح دهنده توالي DM-READ ها و DM-WRITE ها باشند. در يك پايگاه داده توزيعي، يك ترتيب اجرا قابل توالي ناميده ميشود در صورتيكه به ازاي TI كه قبل از TJ در توالي قرار دارد، تمامي عملياتهاي TI قبل از TJ در تمامي سايتها انجام شده باشند. اين نشان دهنده اين است كه تمامي تراكنشها بايد به ترتيب وارد شده در تمامي سايتها اجرا شوند.
دو عمليات با هم تداخل دارند اگر هر دو عمليات بر روي يك داده مشترك كار كرده و يكي از داده ها DM-WRITE باشد. در اين حالت اگر دو عمليات با هم تداخل داشته باشند، ترتيب اجراي دو عمل بر روي نتيجه نهايي تاثير مستقيم خواهد داشت. براي روشنتر شدن موضوع به بحث در خصوص يك مثال خواهيم پرداخت. فرض كنيد ايتم دادهاي X و تراكنشهاي TI و TJ موجود باشند. اگر TI اقدام به خواندن مقدار X نموده و TJ اقدام به نوشتن مقدار جديدي در X نمايد. در اينصورت مقدار خوانده شده توسط TI به تقدم و تاخر عملياتهاي خواندن و نوشتن وابسته خواهد شد. بطور مشابه فرض كنيد TI و TJ هر دو بخواهند مقدار جديد را در X بنويسند، در اينصورت مقدار X دقيقا به اين امر وابسته ميشود كه كدام عمليات ديرتر انجام شده است. حالت اول را تداخل خواندن- نوشتن (RW) و حالت دوم را تداخل نوشتن – نوشتن (WW) مينامند.
نمايش تداخل هاي مختلف ميتواند به ارائه يك تعريف فرموله شده براي ترتيبهاي اجراي هم ارز كمك كند. دو ترتيب اجراي تراكنش از نظر محاسباتي زماني معادل هستند كه دو شرط ذيل در آنها صادق باشد:
1. هر DM-READ در تراكنش، داده اي را بخواند كه از ابتدا به تراكنش داده شده باشد يا داده اي باشد كه توسط يك DM-WRITE از همين تراكنش نوشته شده باشد.
2. نتيجه نهايي نوشته شده در آيتم دادهاي در هر دو ترتيب اجرا يكسان باشد.
قضيه 1: فرض كنيد T كه بصورت ذيل تعريف شده است مجموعه اي از تراكنشها در يك پيگاه داده باشد:
آنگاه اگر E يك ترتيب اجرا از اين تراكنشها در LOG هاي L1 تا LM باشد، E قابل توالي خواهد بود اگر به ازاي هر دو عمليات OI و OJ كه با يكديگر تداخل دارند به ازاي تمامي LOG ها ترتيب يكساني نسبت به يكديگر داشته باشند.
قضيه فوق الذكر براي حل مسائل مربوط به ترتيب توالي در سيستم بكارميرود.
3-2- يك الگو براي كنترل همروندي: در قضيه فوق تداخلهاي خواندن- نوشتن و نوشتن – نوشتن بصورت مشترك در يك تعريف عمومي از تداخل ظاهر شده اند. در هر حال ما ميتوانيم مساله قابليت توالي را با تفكيك اين دو نوع تداخل بهتر بررسي كنيم. فرض كنيد E يك مجموعه از LOG هاي ثبت شده در يك توالي باشد. ما چند رابطه را ميتوانيم بين تراكنشهاي موجود در E تعريف كنيم. براي هر جفت تراكنش TI و TJ خواهيم داشت:
شرح رابطه نوع رابظه
اگر LOG وجود داشته باشد كه در آن TI دادهاي را ميخواند كه بلافاصله TJ در آن مينويسد. RW
اگر LOG وجود داشته باشد كه در آن TI در دادهاي را مينويسد كه بلافاصله TJ از آن ميخواند. WR
اگر LOG وجود داشته باشد كه در آن TI در دادهاي را مينويسد كه بلافاصله TJ در آن مينويسد WW
اگر TI->RW TJ با TI->WR TJ RWR
اگر TI->RWR TJ با TI->WW TJ
قضيه 2: اگر روابط RWR و WW بصورت غير حلقوي بوده و يك ترتيب كلي براي اين روابط بتوان متصور شد.
بنا بر قضيه فوق ميتوان الگوريتمهاي كنترل همروندي را مورد ارزيابي و بررسي قرار داده و صحت آنها را از طريق اثبات رياضي محك زد. تشخيص تداخلهاي RW و WW براي كشف ايراد در الگوريتمهاي كنترل همروندي كاربرد فراواني دارد. قضيه 2 به ما اجازه ميدهد تا مساله كنترل همروندي را به قسمتهاي كوچكتر تقسيم نموده و بتوان هر يك از اين قسمتها را بطور مستقل بررسي نمود.
4-مكانيزمهاي كنترل همروندي بر پايه قفل دو مرحلهاي : قفل دو مرحله اي با تشخيص روشن تداخل بين عملياتهاي همروند و جلوگيري از آنها، بين عملياتهاي خواندن و نوشتن همزماني بوجود ميآورد. قبل از اينكه يك تراكنش X را بخواند بايد يك قفل خواندن بر روي X قرار دهد و قبل از اينكه يك تراكنش روي داده X بنويسد، بايد يك قفل نوشتن روي X قرار دهد. تصاحب قفلها با توجه به دو قانون بدست ميآيد.:
1. تراكنشهاي مختلف نميتوانند قفلهايي كه باعث ايجاد تداخل ميشوند بدست آورند.
2. زماني كه يك تراكنش شروع به آزاد كردن قفلهاي خود نمود، ديگر نميتواند قفل ديگري بدست آورد.
قفلهايي كه باعث تزاحم ميشوند با توجه به نوع همزمان سازي مشخص و تعريف ميشوند. براي حالت RW دو قفل زماني با هم تداخل دارند كه دو شرط در آنها صدق كند:
1. هر دو قفل بر روي يك داده واحد باشند.
2. يكي قفل نوشتني و ديگري قفل خواندني باشد.
براي حالت WW دو قفل زماني با هم تداخل دارند كه دو شرط در آنها صدق كند:
1. هر دو قفل بر روي يك داده واحد باشند.
2. هر دو قفل از نوع نوشتني باشند.
قانون دوم ايجاب ميكند كه هر تراكنش براي بدست آوردن قفل دو فاز را طي كند. فاز اول كه فاز دستيابي به قفلهاست، تراكنش اقدام به بدست آوردن قفلهاي لازم ميكند. در فاز دوم كه فاز تخليه است، تراكنش به مرور زمان قفلهاي خود را آزاد ميكند. هنگامي كه تراكنش خاتمه پيدا ميكند كليه قفلها رها ميشوند.
روشهاي مختلفي براي الگوريتمهاي قفل دو مرحلهاي پيشنهاد شده است. يكي از اين روشها اين است كه تراكنش قفلهاي مورد نياز را قبل از اجراي اصلي خود بدست آورد. اين نسخه از قفل دو مرحلهاي را پيش تعريف مينامند. برخي از سيستمهاي تراكنشها را مجبور ميكنند تا قفلهاي خود را تا پيش از خاتمه نگه دارند. قفل دو مرحلهاي يك تكنيك صحيح ايجاد قابليت توالي است. اين امر با بررسي سيستم از لحظه عدم وجود حلقه و دور در روابط RWR و WW مشخص است. ترتيب اجراي تراكنشها با ترتيب بدست آوردن قفلها مشخص ميگردند. نقطه اي كه در آن تراكنش تمامي قفلهاي مورد نياز خود را بدست آورده است را نقطه تصاحب قفل مينامند. روشهاي مختلفي براي ايجاد الگوريتم قفل دو مرحله اي در سيستمهاي توزيعي وجود دارد كه در قسمت بعد مورد بررسي قرار ميگيرد.
5-پياده سازي پايه قفل دو مرحلهاي : در پياده سازي پايه الگوريتم قفل دو مرحلهاي يك ماژول نرم افزاري ايجاد ميشود كه روند دريافت و آزاد سازي قفلها را بر اساس ويژگي هاي الگوريتم قفل دو مرحلهاي كنترل ميكند.
يك روش براي پياده سازي توزيعي اين الگوريتم اين است كه ماژولهاي نرم افزاري را بين اجزاي پايگاهداده توزيع نمائيم. براي اينكار هر ماژول را در DM يعني آنجائيكه X داده تحت كنترل است قرار دهيم. اگر يك قفل قابل تخصيص نباشد، درخواست براي قفل در يك صف انتظار قرار داده ميشود. قفلهاي نوشتن بطور خودكار با انجام عمل WRITE آزاد ميشوند. در اينصورت براي آزاد نمودن قفلهاي خواندني بايستي عمليات اضافه تعريف نمود. آزاد نمودن قفلها با نوشتن اطلاعات و آغاز فاز تخليه آغاز ميشود. هرگاه يك قفل آزاد ميشود عملياتهاي موجود در صف شروع به ادامه ميكنند.
توجه داشته باشيد كه اين پياده سازي افزونگي داده را به درستي پوشش داده و مشكل افزونگي داده و صحت و مانايي اطلاعات را حل ميكند. اگر اين روش براي همزمان سازي هاي RW بكار رود، تراكنش ميتواند هر كپي داده اي را كه در دسترس بود بخواند و هر قفل خواندني كه مهيا بود را بدست آورد. در هر صورت اگر بخواهد داده را بروزآوري كند، يعني مقدار جديدي به داده اي نسبت دهد بايد بر روي تمام افزونههاي دادهاي مورد نظر، مقدار جديد را ثبت كند و داده را بروز كند كه مستلزم بدست آوردن قفل نوشتن بر روي تمامي نسخه هاي داده اي است.