در كپیبرداری یا 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-binserver-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 = 2master-host = db-master.example.commaster-user = replmaster-password =co pyINGmaster-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 \GMaster_Host: db-master.example.comMaster_User: repl3306:Master-Port 15: Connect_retryMaster_Log_File: binary-log.001Read_Master_Log_Pos: 241452666relay_log_File: Relay_Log.001Relay_Log_Pos:113733106Relay_Master_Log_File: binary-log.001Slave_IO_Running: YesSlave_SQL_Running: Yes:Replicate_do_db:Replicate_ignore_dbLast_errno:0:Last_error Skip_counter:0 Exec_master_log_pos:241452666Relay_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ها را در فرصت دیگری مورد بررسی قرار خواهم داد