اشاره :
در کپیبرداری یا Replication، دادهها و جداول یک پایگاهداده روی چندین سرور قرار میگیرد و از طریق فرایندهایی، دادههای مربوط به پایگاههای داده فرعی با دادههای پایگاه داده اصلی هماهنگ میشود. به این ترتیب سیستم نرمافزاری استفاده کننده از این پایگاه داده، برای دسترسی به داده مورد نظر خود به جای سرور اصلی، به نزدیکترین سرور محلیِ معرفی شده به آن مراجعه میکند. در نتیجه از ترافیک شبکه کاسته میشود و سرعت تهیه اطلاعات نیز افزایش مییابد. کپیبرداری به روش پایه / پیرو (Master/Slave) در پایگاهداده MySQL برای اولین بار در سال 2000 و در نسخه بتای این پایگاهداده عرضه شد. بعد از آن کپیبرداری به یکی از امکانات ضروری اکثر کاربران حرفهای پایگاهداده 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 |
و سپس 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 |
نامهای به کار برده شده در این تنظیمات، به خوبی بیانگر کاربرد آنها است. به سرور پیرو باید یک server_id یکتا نسبت دهید، نام یا آدرس IP سرور پایه را به آن اعلان کنید و سپس اطلاعات مورد نیاز برای معرفی و متصل کردن سرور پیرو به سرور پایه را در قسمت تنظیمات ذخیره نمایید.برای آنکه این تنظیمات در سمت سرور پایه شناسایی شود، باید کاربری را در سمت سرور پایه با مجوزهای مورد نیاز ایجاد کنید. این مجوزها عبارتند از: REPLICATION SLAVE،FILE فرمان SQL زیرمجوزهای مورد نیاز را ایجاد میکند.
mysq> GRANT FILE, REPLICATION SLAVE |
البته به منظور ایجاد امنیت بیشتر، بهتر است حرف % را با نام میزبان یا آدرس IP سرور پیرو جایگزین کنید.آخرین گزینه، یعنی master-connect-retry برای سرور پیرو مشخص میکند که در صورت قطع ارتباط، در چه فواصل زمانی بر حسب ثانیه با سرور پایه ارتباط مجدد برقرار کند.
شروع کار با یک پایگاهداده جدید
راحتترین روش برای ایجاد محیط کپیبرداری، ایجاد آن روی پایگاه داده MySQL است که به تازگی روی سرورهای پایه و پیرو نصب شده و هیچ دادهای در آن ذخیره نشده باشد. قبل از ذخیره هر گونه داده روی سرورها مراحل زیر را انجام دهید.
در سمت سرور پایه: مطابق مرحله قبل کاربر محیط کپیبرداری را در سرور پایه تعریف کنید. سپس مدخلهای مربوط به تنظیم محیط کپیبرداری را به فایل گفته شده در سمت سرور پایه اضافه نمایید و در نهایت mysqld را راهاندازی مجدد کنید.در سمت پیرو: مطابق مراحل فوق، مدخلهای مربوط به تنظیم محیط کپیبرداری را به فایل گفته شده در سمت سرور پیرو اضافه کنید. سپس mysqld را دوباره راهاندازی نمایید.
بعد از راهاندازی پیرو همه چیز باید به درستی کار کند. برای اطمینان از این موضوع، با سرور پیرو ارتباط برقرار کنید و دستور SHOW SLAVE STATUS را اجرا نمایید. اگر خروجی شبیه عبارت زیر باشد، یعنی همه چیز به درستی کار میکند.
mysq> SHOW SLAVE STATUS \G |
مقادیر مهم در
این میان عبارتند از: دو مدخل
Yes.
این دو مدخل به ترتیب مربوط به عبارتهای
Slave_IQ_Running
و
Slave_SQL_Running است.
عبارت
Yes در
مقابل این دو مدخل نشان میدهد که در سمت سرور پیرو هر دو رشته به درستی کار
میکنند.
افزودن امکان کپیبرداری به یک پایگاه داده موجود
تنظیم یک سرور پیرو برای کپیبرداری از دادههای یک سرور پایه که هماکنون دادههایی در آن ذخیره شده، کمی مشکل است. اگر فقط فایل binary log را در سمت سرور پایه فعال کنید و در سمت پیرو شروع به کپیبرداری نمایید، نمیتوانید نتیجه قابل قبولی به دست آورید؛ زیرا جداولی که قبلاً در سرور پایه ایجاد شدهاند، در سرور پیرو وجود ندارد و در نتیجه با انتقال و اجرای پرسوجوها در سمت سرور پیرو در واقع تلاش میکنیم دادهها را به جداولی اضافه کنیم که در حال حاضر وجود ندارد.برای عملکرد درست قبل از ایجاد و استفاده از فایل binary log باید یک کپی از اطلاعات سرور پایه را در سرور پیرو ایجاد کنید.
برای این کار میتوانید از دو روش استفاده کنید: در روش اول اگر سرور پایه بیکار است، یعنی هیچ پرسوجویی برای نوشتن اطلاعات روی آن انجام نمیشود، باید در سمت سرور پیرو بعد از فعال کردن گزینههای مربوط به محیط کپیبرداری، دستور LOAD DATA FROM MASTER را اجرا کنید. این دستور به سرور پیرو اعلان میکند که یک کپی از همه جداول را از پایگاه داده موجود در سرور پایه دریافت کند. بعد از اتمام این فرایند، میتوانید پرسوجوهای مربوط به نوشتن دادهها را در سرور پایه از سر گیرید. تنها جداول grant از پایگاهداده MySQL در طول فرایند LOAD DATA به جدول پیرو انتقال نمییابد. اگر در سمت سرور پیرو به این جداول نیاز دارید، باید آنها را به طور دستی کپی کنید.
در روش دوم، ابتدا برای ایجاد فایل binary log و ایجاد یک کپی لحظهای (Snapshot) از دادهها باید سرور پایه را خاموش کنید. به عبارت دیگر، زمانی که سرور خاموش است، یک کپی از پوشه یا درایو حاوی دادهها را به سرور پیرو انتقال دهید. با کاملشدن کار کپی، سرور پایه را برای انجام پرسوجوی مربوط به ارتباط با سرور روشن کنید. حال سرور پیرو همه پرسوجوهایی که بعد از ایجاد کپی لحظهای در سرور پایه ایجاد شده است را کپیبرداری میکند.
منبع : ماهنامه شبکه