آژانس هواپیمایی
pop up

Replication در پايگاه‌ داده MySQL

شروع موضوع توسط rasool2062006 ‏2 جولای 2007 در انجمن SQL Server

  1. rasool2062006

    rasool2062006 کاربر تازه وارد

    تاریخ عضویت:
    ‏12 ژوئن 2007
    نوشته ها:
    1
    تشکر شده:
    0
    ر كپيي‌برداري يا Replication، داده‌ها و جداول يك پايگاه‌داده روي چندين سرور قرار مي‌گيرد و از طريق فرايندهايي، داده‌هاي مربوط به پايگاه‌هاي داده فرعي با داده‌هاي پايگاه داده اصلي هماهنگ مي‌شود. به اين ترتيب سيستم نرم‌افزاري استفاده كننده از اين پايگاه داده، براي دسترسي به داده مورد نظر خود به جاي سرور اصلي، به نزديك‌ترين سرور محليِ معرفي شده به آن مراجعه مي‌كند. در نتيجه از ترافيك شبكه كاسته مي‌شود و سرعت تهيه اطلاعات نيز افزايش مي‌يابد. كپي‌برداري به روش پايه / پيرو (Master/Slave) در پايگاه‌داده MySQL براي اولين بار در سال 2000 و در نسخه بتاي اين پايگاه‌داده عرضه شد. بعد از آن كپي‌برداري به يكي از امكانات ضروري اكثر كاربران حرفه‌اي پايگاه‌داده MySQL تبديل شده است. برعكس بسياري از فرضيات قبلي و در مقايسه با ساير پايگاه‌هاي داده تجاري، كپي‌برداري در محيط MySQL بسيار آسان و كاربردي است. در اين مقاله امكانات مرتبط با كپي‌برداري در پايگاه‌داده MySQL و روش‌هاي استفاده از آن را بررسي مي‌كنيم.




    منبع: مجله لينوكس‌

    اصول اوليه‌
    سيستم كپي‌برداري در MySQL به چندين سرور پيرو اجازه مي‌دهد خود را با تغييرات ايجاد شده در يك سرور پايه همزمان كنند. كپي‌برداري از پايگاه داده مزيت‌هاي زيادي دارد. براي مثال، با تهيه نسخه پشتيبان، بازيابي داده‌ها آسان‌تر مي‌شود و به جاي خاموش كردن سرور اصلي به منظور تهيه نسخه پشتيبان از داده‌ها، كافي است نسخه پشتيبان را از اطلاعات يكي از سرورهاي پيرو تهيه كنيد. به علاوه، با استفاده از كپي‌برداري، ايجاد برنامه‌هايي در مقياس بزرگ مقدور مي‌شود. با فرستادن تمام پرس‌وجوهاي نوع درج (INSERT)، حذف (DELETE) و بروزرساني (UPDATE)، به سرور پايه و استفاده از سرور پيرو براي اكثر پرس‌و‌جوهاي بازيابي اطلاعات (SELECT) مي‌توانيد براي برنامه‌هايي كه دسترسي به اطلاعات براي آن‌ها يك فرايند حساس به حساب مي‌آيد، دسترسي به پايگاه داده به صورت بي‌درنگ را فراهم كنيد.

    براي پياده‌سازي محيط كپي‌برداري روي يك سرور داراي پايگاه‌ داده رابطه‌اي مي‌توانيد از دو روش استفاده كنيد: كپي كردن پرس‌وجوهاي ثبت شده (Logها) يا كپي كردن داده‌ها (Data). در روش كپي كردن Logها، كليه پرس‌وجوهاي انجام شده از سرور پايه، در اين سرور ثبت مي‌گردد و به سرورهاي پيرو فرستاده مي‌شود. با اجراي مجدد اين پرس‌وجوها در سرورهاي پيرو، اين سرورها نيز بروزرساني مي‌شوند.

    در روش كپي داده‌ها، كليه بلاك‌هاي داده‌ايِ تغيير يافته، از سرور پايه به سرورهاي پيرو فرستاده مي‌شود. MySQL براي كپي‌برداري از روش ثبت Logها يا همان روش ذخيره پرس‌وجوهاي انجام شده از سرور پايه و انتقال آن‌ها به سرورهاي پيرو استفاده مي‌كند. هر دو روش را مي‌توان به صورت همزمان يا ناهمزمان انجام داد. در روش همزمان، زماني يك پرس‌وجو خاتمه يافته به حساب مي‌آيد كه روي سرور اصلي و همه سرورهاي پيرو اجرا شده باشد.
    مزيت اين روش اين است كه در هر لحظه يك كپي يكتا از هر داده روي همه سرورها ذخيره شده است. البته اين روش عيب بزرگي هم دارد. به اين ترتيب كه اگر بخواهيد اين روش كپي‌برداري را براي مسافت‌هاي طولاني يا در شبكه‌اي با سرعت پايين اجرا كنيد، در آن صورت به علت حجم بالاي پرس‌وجوهايي كه بايد به صورت بي‌درنگ و روي همه سرورها منتقل و اجرا شوند، با مشكل كاهش كارايي مواجه خواهيد شد. به همين سبب در MySQL از كپي‌برداري مبتني بر Logها و به روش غيرهمزمان استفاده مي‌شود.

    فرايندهاي سمت سرور پايه
    براي كپي‌برداري، همه پرس‌وجوهايي كه داده‌هاي سرور پايه را تغيير مي‌دهد، در محل ثبت خاصي به نام binary log ذخيره مي‌شود. binary log يك فايل غيراَسكي است تا كليه پرس‌وجوهاي انجام شده به همراه همه جزئيات مربوط به آن‌ها، نظير پايگاه‌داده مورد استفاده، كد بازگشتي و ... در آن ثبت شود.

    در MySQL براي فعال كردن ثبت اطلاعات در binary log، تنها كافي است تا دو خط كد زير را به قسمت [mysqld] از فايل my.cnf بيفزاييد:


    log-bin
    server-id=1


    و سپس mysqld را راه‌اندازي مجدد كنيد. (اما فعلاً اين كار را انجام ندهيد.)
    خط log-bin مشخص مي‌كند كه MySQL بايد براي ثبت اطلاعات از فايل دودويي يا همان binary log استفاده كند. خط server-id شماره شناسايي عددي براي شناسايي سرور را مشخص مي‌كند. اين خط اجباري نيست و اگر مقداري براي آن مشخص نشود، از مقدار عدديِ يك به صورت پيش‌فرض استفاده مي‌شود. البته اعلان صريح شماره شناسايي سرور در سرور پايه و سرورهاي پيرو كار خوبي است. براي ايجاد يك محيط كپي‌برداري اوليه كليه كارهايي كه بايد انجام دهيد، به همين تغيير كوچك خلاصه مي‌شود.

    فر‌ايندهاي سمت سرورهاي پيرو
    وظيفه سرور پايه آسان است. اين سرور از كليه پرس‌وجوهايي كه از آن درخواست ‌شده و منجر به اصلاح داده‌ها شود، يك رونوشت ذخيره مي‌كند. سرورهاي پيرو موظفند به سرور پايه متصل شوند و يك كپي از كليه رخدادهاي ذخيره شده در سرور مرجع را دريافت و آن‌ها را اجرا كنند.

    براي كپي‌برداري در MySQL بايد در هر سرور پيرو دو فرايند به صورت دو رشته (Thread) جداگانه اجرا شود: در رشته اول با نام I/O (كه رشته رله يا Relay نيز ناميده مي‌شود)، اطلاعات ثبت شده مربوط به تمام رخدادها از سمت سرور پايه به سرورهاي پيرو كپي مي‌شود. به اين ترتيب: ارتباطي با سرور پايه ايجاد مي‌شود، رخدادها از فايلbinary log در سرور پايه خوانده مي‌شوند و در سرور پيرو روي ديسك محلي و در فايلي به نام relay log ذخيره مي‌شوند. از آنجا كه اين فرايند بسيار ساده است، مي‌توانيد در صورت داشتن يك شبكه سريع و سالم آن را به صورت مؤثري اجرا كنيد و در نتيجه سرورهاي پيرو هميشه به صورت مجازي با سرور پيرو همزمانند. در عمل كليه مدخل‌هاي ثبت شده در فايل binary log در سرور پايه تنها چند ميلي‌ثانيه بعد از نوشته شدن توسط سرورهاي پيرو خوانده مي‌شوند.

    با اتمام رشته SQL، رشته I/O آغاز مي‌شود. اين رشته فايل relay log را مي‌خواند و يك به يك، پرس‌وجوهاي ذخيره شده در آن را اجرا مي‌كند.

    اين طراحي دو رشته‌اي تضمين مي‌كند كه آخرين نسخه از داده‌ها هميشه در سرور پيرو ذخيره مي‌شود؛ حتي اگر نيازي به پردازش اين داده‌ها نباشد. البته در نسخه 23/3 فرايند كپي‌برداري در سمت پيرو به صورت يك رشته‌اي طراحي شده بود كه رخدادها را از سمت سرور پايه دريافت مي‌نمود و آن‌ها را به صورت محلي اجرا مي‌كرد. در آن زمان از فايل relay log استفاده نمي‌شد. در اين روش ابتدايي وقتي به مشكل برمي‌خورديم كه يك پرس‌وجو كند با خاموش شدن ناگهاني سرور پايه همراه مي‌شد. در اين صورت سرور پيرو حاوي اطلاعات ناكارآمد بود و تا زماني كه سرور پايه فعال نمي‌شد، اميدي به راه‌اندازي مجدد سرور پيرو نبود.

    در نتيجه اين كل فرايندي است كه رخ مي‌دهد: سرور پايه پرس‌وجوها را در فايل binary log خود ذخيره مي‌كند، رشته I/O از سرور پيرو مدخل‌ها را از فايل binary log در سرور پايه مي‌خواند و آن‌ها را در فايل relay log ذخيره مي‌كند و در نهايت رشته SQL از سرور پيرو، پرس‌وجوهاي ذخيره شده در relay log را اجرا مي‌نمايد.

    تنظيمات سرور پيرو
    تنظيم يك سرور پيرو كمي از تنظيم كردن يك سرور پايه سخت‌تر است. در اينجا دو روش مورد بررسي قرار مي‌گيرد، اما قبل از هر چيز گزينه‌هاي پايه مربوط به هر يك از اين تنظيمات را بررسي مي‌كنيم.
    در قسمت تنظيم فايل‌ [mysqld] گزينه‌هاي مختلفي بايد بررسي شود. مورد زير مثالي از نحوه تنظيم اين گزينه‌ها است.


    server-id = 2
    master-host = db-master.example.com
    master-user = repl
    master-password =co pyING
    master-connect-retry = 15



    نام‌هاي به كار برده شده در اين تنظيمات، به خوبي بيانگر كاربرد آن‌ها است. به سرور پيرو بايد يك server_id يكتا نسبت دهيد، نام يا آدرس IP سرور پايه را به آن اعلان كنيد و سپس اطلاعات مورد نياز براي معرفي و متصل كردن سرور پيرو به سرور پايه را در قسمت تنظيمات ذخيره نماييد.

    براي آن‌كه اين تنظيمات در سمت سرور پايه شناسايي شود، بايد كاربري را در سمت سرور پايه با مجوزهاي مورد نياز ايجاد كنيد. اين مجوزها عبارتند از: REPLICATION SLAVE،FILE فرمان SQL زيرمجوزهاي مورد نياز را ايجاد مي‌كند.

    mysq> GRANT FILE, REPLICATION SLAVE
    "%"@ ON *.* TO repl <-
    ;'IDENTIFIED BY 'c0pyING <-



    البته به منظور ايجاد امنيت بيشتر، بهتر است حرف % را با نام ميزبان يا آدرس IP سرور پيرو جايگزين كنيد.
    آخرين گزينه، يعني master-connect-retry براي سرور پيرو مشخص مي‌كند كه در صورت قطع ارتباط، در چه فواصل زماني بر حسب ثانيه با سرور پايه ارتباط مجدد برقرار كند.

    شروع كار با يك پايگاه‌داده جديد
    راحت‌ترين روش براي ايجاد محيط كپي‌برداري، ايجاد آن روي پايگاه ‌داده MySQL است كه به تازگي روي سرورهاي پايه و پيرو نصب شده وهيچ داده‌اي در آن ذخيره نشده باشد. قبل از ذخيره هر گونه داده روي سرورها مراحل زير را انجام دهيد.

    ‌ظ‌ در سمت سرور پايه: مطابق مرحله قبل كاربر محيط كپي‌برداري را در سرور پايه تعريف كنيد. سپس مدخل‌هاي مربوط به تنظيم محيط كپي‌برداري را به فايل گفته شده در سمت سرور پايه اضافه نماييد و در نهايت mysqld را راه‌اندازي مجدد كنيد.

    ‌ظ‌ در سمت پيرو: مطابق مراحل فوق، مدخل‌هاي مربوط به تنظيم محيط كپي‌برداري را به فايل گفته شده در سمت سرور پيرو اضافه كنيد. سپس mysqld را دوباره راه‌اندازي نماييد.

    بعد از راه‌اندازي پيرو همه چيز بايد به درستي كار كند. براي اطمينان از اين موضوع، با سرور پيرو ارتباط برقرار كنيد و دستور SHOW SLAVE STATUS را اجرا نماييد. اگر خروجي شبيه عبارت زير باشد، يعني همه چيز به درستي كار مي‌كند.
    mysq> SHOW SLAVE STATUS \G
    Master_Host: db-master.example.com
    Master_User: repl
    3306:Master-Port
    15: Connect_retry
    Master_Log_File: binary-log.001
    Read_Master_Log_Pos: 241452666
    relay_log_File: Relay_Log.001
    Relay_Log_Pos:113733106
    Relay_Master_Log_File: binary-log.001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    :Replicate_do_db
    :Replicate_ignore_db
    Last_errno:0
    :Last_error
    Skip_counter:0
    Exec_master_log_pos:241452666
    Relay_log_space:113733106


    مقادير مهم در اين ميان عبارتند از: دو مدخل Yes. اين دو مدخل‌ به ترتيب مربوط به عبارت‌هاي Slave_IQ_Running و Slave_SQL_Running است. عبارت Yes در مقابل اين دو مدخل نشان ‌مي‌دهد كه در سمت سرور پيرو هر دو رشته به درستي كار مي‌كنند.

    افزودن امكان كپي‌برداري به يك پايگاه داده موجود
    تنظيم يك سرور پيرو براي كپي‌برداري از داده‌هاي يك سرور پايه كه هم‌اكنون داده‌هايي در آن ذخيره شده، كمي مشكل است. اگر فقط فايل binary log را در سمت سرور پايه فعال كنيد و در سمت پيرو شروع به كپي‌برداري نماييد، نمي‌توانيد نتيجه قابل قبولي به دست آوريد؛ زيرا جداولي كه قبلاً در سرور پايه ايجاد شده‌اند، در سرور پيرو وجود ندارد و در نتيجه با انتقال و اجراي پرس‌وجوها در سمت سرور پيرو در واقع تلاش مي‌كنيم داده‌ها را به جداولي اضافه كنيم كه در حال حاضر وجود ندارد.

    براي عملكرد درست قبل از ايجاد و استفاده از فايل binary log بايد يك كپي از اطلاعات سرور پايه را در سرور پيرو ايجاد كنيد.

    براي اين كار مي‌توانيد از دو روش استفاده كنيد: در روش اول اگر سرور پايه بيكار است، يعني هيچ پرس‌وجويي براي نوشتن اطلاعات روي آن انجام نمي‌شود، بايد در سمت سرور پيرو بعد از فعال كردن گزينه‌هاي مربوط به محيط كپي‌برداري، دستور LOAD DATA FROM MASTER را اجرا كنيد. اين دستور به سرور پيرو اعلان مي‌كند كه يك كپي از همه جداول را از پايگاه داده موجود در سرور پايه دريافت كند. بعد از اتمام اين فرايند، مي‌توانيد پرس‌وجوهاي مربوط به نوشتن داده‌ها را در سرور پايه از سر گيريد. تنها جداول grant از پايگاه‌داده MySQL در طول فرايند LOAD DATA به جدول پيرو انتقال نمي‌يابد. اگر در سمت سرور پيرو به اين جداول نياز داريد، بايد آن‌ها را به طور دستي كپي كنيد.

    در روش دوم، ابتدا براي ايجاد فايل binary log و ايجاد يك كپي لحظه‌اي (Snapshot) از داده‌ها بايد سرور پايه را خاموش كنيد. به عبارت ديگر، زماني كه سرور خاموش است، يك كپي از پوشه يا درايو حاوي داده‌ها را به سرور پيرو انتقال دهيد. با كامل‌شدن كار كپي، سرور پايه را براي انجام پرس‌وجوي مربوط به ارتباط با سرور روشن كنيد. حال سرور پيرو همه پرس‌وجوهايي كه بعد از ايجاد كپي لحظه‌اي در سرور پايه ايجاد شده است را كپي‌برداري مي‌كند.
    موارد گفته شده، اصول پايه كپي‌برداري در MySQL است و موضوعات پيشرفته‌تري از اين مبحث شامل توپولوژي‌هاي كپي‌برداري، امكانات مربوط به فيلتر كردن و مطالعه دقيق‌تر پرس‌وجوهاي ذخيره شده يا همان Logها را در فرصت ديگري مورد بررسي قرار خواهم داد