MySqlدیتابیس

آموزش Replication در MySql

رپلیکیشن در Mysql

MySQL replication فرایندی است که امکان کپی برداری داده ها از یک سرور پایگاه داده MySQL (مستر) را فراهم می کند و به طور خودکار در یک یا چند سرور پایگاه داده MySQL (اسلیوها) کپی می شود. این به طور معمول برای گسترش دسترسی خواندن در چندین سرور برای مقیاس پذیری مورد استفاده قرار می گیرد ، اگرچه می تواند برای اهداف دیگر از جمله برای خرابی یا تجزیه و تحلیل داده ها بر روی بلا استفاده شود تا استاد بیش از حد بارگیری نکند.

از آنجا که تکثیر master-slave یک تکرار یک طرفه است (از master به slave) ، فقط از پایگاه داده اصلی برای عملیات نوشتن استفاده می شود ، در حالی که عملیات خواندن ممکن است در چندین پایگاه داده slave گسترش یابد. معنی این امر این است که اگر از تکثیر master-slave به عنوان راه حل مقیاس استفاده می شود ، شما باید حداقل دو منبع داده تعریف کنید ، یکی برای عملیات نوشتن و دیگری برای خواندن.

همانندسازی MySQL master-slave

توسعه دهندگان MySQL معمولاً فقط بر روی یک ماشین کار می کنند و تمایل دارند که کل محیط توسعه خود را بر روی آن دستگاه قرار دهند ، با این منطق که وابسته به شبکه یا اتصال اینترنت نیستند. اگر به تکثیر master-slave نیاز باشد ، به عنوان مثال ، آنها نیاز به آزمایش تکرار در یک محیط توسعه قبل از استقرار تغییرات در جای دیگر دارند ، آنها باید آن را در همان دستگاه ایجاد کنند. در حالی که تنظیم یک نمونه MySQL نسبتاً ساده است ، ما باید برای تنظیم نسخه دوم ، و سپس یک نسخه اصلی master-slave تلاش بیشتری انجام دهیم.

برای این آموزش گام به گام ، من اوبونتو لینوکس را به عنوان سیستم عامل میزبان انتخاب کرده ام و دستورات ارائه شده مربوط به آن سیستم عامل است. اگر می خواهید همانندسازی MySQL master-slave خود را روی برخی از سیستم عاملهای دیگر تنظیم کنید ، باید دستورات خاص آن را تغییر دهید. با این حال ، اصول کلی تنظیم نسخه مستقل MySQL برده در همان دستگاه برای همه سیستم عامل ها یکسان است.

همانندسازی MySQL master-slave

نصب اولین نمونه MySQL

اگر قبلاً یک نمونه از پایگاه داده MySQL روی دستگاه خود نصب کرده اید ، می توانید از این مرحله صرف نظر کنید.

ساده ترین راه برای نصب MySQL در اوبونتو اجرای دستور زیر از طریق ترمینال است:

sudo apt-get install mysql-server

در طی مراحل نصب ، از شما خواسته می شود برای rootکاربر MySQL رمز عبور تعیین کنید.

راه اندازی mysqld_multi

برای اینکه بتوانیم دو نمونه MySQL را روی یک ماشین به طور کارآمد مدیریت کنیم ، باید استفاده کنیم mysqld_multi.

اولین قدم در راه اندازی mysqld_multiایجاد دو [mysqld]گروه جداگانه در my.cnfپرونده موجود است. مکان پیش فرض my.cnfفایل در اوبونتو است /etc/mysql/. بنابراین ، my.cnfپرونده را با ویرایشگر متن مورد علاقه خود باز کنید و [mysqld]گروه موجود را به نام تغییر دهید [mysqld1]. این گروه تغییر نام یافته برای پیکربندی اولین نمونه MySQL استفاده می شود و همچنین به عنوان نمونه اصلی پیکربندی می شود. همانطور که در MySQL تکثیر master-slave هر نمونه باید منحصر به فرد خود باشد server-id، خط زیر را در [mysqld1]گروه اضافه کنید:

server-id = 1

از آنجا که [mysqld]برای نمونه MySQL دوم به یک گروه جداگانه احتیاج داریم ، [mysqld1]گروه را با تمام تنظیمات کنونی کپی کرده و در زیر در همان my.cnfپرونده جای گذاری کنید. اکنون ، گروه کپی شده را به نام تغییر دهید [mysqld2]و تغییرات زیر را در پیکربندی Slave ایجاد کنید:

server-id           = 2
port                = 3307
socket              = /var/run/mysqld/mysqld_slave.sock
pid-file            = /var/run/mysqld/mysqld_slave.pid
datadir             = /var/lib/mysql_slave
log_error           = /var/log/mysql_slave/error_slave.log
relay-log           = /var/log/mysql_slave/relay-bin
relay-log-index     = /var/log/mysql_slave/relay-bin.index
master-info-file    = /var/log/mysql_slave/master.info
relay-log-info-file = /var/log/mysql_slave/relay-log.info
read_only           = 1

برای تنظیم نمونه MySQL دوم به عنوان برده ، روی server-id۲ تنظیم کنید ، زیرا باید با شناسه سرور اصلی متفاوت باشد.

از آنجا که هر دو نمونه بر روی یک ماشین اجرا می شوند ، portبرای نمونه دوم تنظیم کنید ۳۳۰۷زیرا باید متفاوت از درگاهی باشد که برای نمونه اول استفاده می شود ، که به ۳۳۰۶طور پیش فرض است.

به منظور فعال کردن این مورد دوم به استفاده از فایل های باینری خروجی همان، ما نیاز به تنظیم مقادیر مختلف برای socket، pid-file، datadirو log_error.

ما همچنین نیاز به فعال کردن relay-logبه منظور استفاده از مثال دوم به عنوان یک برده ( پارامترهای relay-log ، relay-log-indexو relay-log-info-file)، و همچنین به مجموعه master-info-file.

سرانجام ، برای اینکه نمونه slave فقط خواندنی باشد ، پارامتر read_onlyبر روی تنظیم شده است ۱. باید مراقب این گزینه باشید زیرا کاملاً مانع از تغییر برده نمی شود. حتی هنگامی که روی read_onlyحالت تنظیم شده است ۱، فقط از کاربرانی که این SUPERامتیاز را دارند ، به روزرسانی مجاز است . MySQL اخیراً پارامتر جدیدی را super_read_onlyبرای جلوگیری از SUPERایجاد تغییر در کاربران معرفی کرده است . این گزینه با نسخه ۵.۷.۸ در دسترس است.

به غیر از گروه ها [mysqld1]و [mysqld2]گروه ها ، ما همچنین باید یک گروه جدید [mysqld_multi]به my.cnfپرونده اضافه کنیم:

[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = multipass


هنگامی که نمونه MySQL دوم را نصب کردیم و هر دو را راه اندازی کردیم ، امتیازات مناسبی را به multi_adminکاربر می دهیم تا بتواند موارد MySQL را خاموش کند.

پوشه های جدیدی برای نمونه MySQL دوم ایجاد کنید

در مرحله قبلی ما پرونده پیکربندی را برای نمونه MySQL دوم آماده کردیم. در آن پرونده پیکربندی از دو پوشه جدید استفاده شده است. برای ایجاد این پوشه ها با امتیازات مناسب باید از دستورات زیر استفاده کنید:

mkdir -p /var/lib/mysql_slave
chmod --reference /var/lib/mysql /var/lib/mysql_slave
chown --reference /var/lib/mysql /var/lib/mysql_slave
 
mkdir -p /var/log/mysql_slave
chmod --reference /var/log/mysql /var/log/mysql_slave
chown --reference /var/log/mysql /var/log/mysql_slave

تنظیمات امنیتی اضافی در AppArmor

در برخی از محیط های لینوکس ، برای اجرای نمونه MySQL دوم ، به تنظیمات امنیتی AppArmor نیاز است. حداقل ، آنها در اوبونتو مورد نیاز هستند.

برای تنظیم صحیح AppArmor ، /etc/apparmor.d/usr.sbin.mysqldپرونده را با ویرایشگر متن مورد علاقه خود ویرایش کنید ، خطوط زیر را اضافه کنید:

/var/lib/mysql_slave/ r, 
/var/lib/mysql_slave/** rwk, 
/var/log/mysql_slave/ r, 
/var/log/mysql_slave/* rw, 
/var/run/mysqld/mysqld_slave.pid rw, 
/var/run/mysqld/mysqld_slave.sock w, 
/run/mysqld/mysqld_slave.pid rw, 
/run/mysqld/mysqld_slave.sock w,

پس از ذخیره پرونده ، دستگاه را راه اندازی مجدد کنید تا این تغییرات اعمال شود.

نصب MySQL Instance Second

چندین رویکرد مختلف ممکن است برای نصب نمونه MySQL دوم دنبال شود. روشی که در این آموزش ارائه شده است از همان باینری های MySQL استفاده می کند که دارای فایلهای داده جداگانه برای نصب دوم است.

از آنجایی که ما در مراحل قبلی پرونده پیکربندی و پوشه های لازم و تغییرات امنیتی را آماده کرده ایم ، مرحله نهایی نصب نمونه MySQL دوم ، مقدماتی سازی پوشه داده MySQL است.

برای راه اندازی اولیه دایرکتوری داده MySQL ، دستور زیر را اجرا کنید:

mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

پس از شروع دایرکتوری MySQL ، می توانید هر دو نمونه MySQL را با استفاده از mysqld_multiسرویس شروع کنید:

mysqld_multi start

تنظیم rootرمز عبور برای مثال خروجی دوم با استفاده از mysqladminبا میزبان و پورت مناسب است. بخاطر داشته باشید ، اگر میزبان و درگاه مشخص نشده باشند ، mysqladminبه طور پیش فرض به اولین نمونه MySQL متصل می شوند:

mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

در مثال بالا من رمز عبور را روی “rootpwd” تنظیم کردم ، اما استفاده از رمز عبور ایمن تر توصیه می شود.

پیکربندی اضافی از mysqld_multi

در انتهای بخش “Setting mysqld_multi” ، نوشتم که multi_adminبعداً امتیازات مناسبی را به کاربر می دهیم ، بنابراین زمان آن فرا رسیده است. ما باید در هر دو نمونه امتیازات مناسبی به این کاربر دهیم ، بنابراین بیایید ابتدا به نمونه اول متصل شویم:

mysql --host=127.0.0.1 --port=3306 -uroot -p

پس از ورود به سیستم ، دو دستور زیر را اجرا کنید:

mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
mysql> FLUSH PRIVILEGES;

از سرویس گیرنده MySQL خارج شوید و به مرحله دوم متصل شوید:

mysql --host=127.0.0.1 --port=3307 -uroot -p

پس از ورود به سیستم ، همان دو دستور بالا را اجرا کنید:

mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
mysql> FLUSH PRIVILEGES;

از سرویس گیرنده MySQL خارج شوید.

هر دو نمونه MySQL را به طور خودکار در بوت شروع کنید

مرحله آخر mysqld_multiنصب نصب اسکریپت بوت خودکار در init.d.

برای انجام این کار ، پرونده جدیدی ایجاد کنید که نام آن mysqld_multiدر /etc/init.dآن است و امتیازات مناسب را به آن بدهید:

cd /etc/init.d
touch mysqld_multi
chmod +x /etc/init.d/mysqld_multi

این فایل جدید را با ویرایشگر متن مورد علاقه خود باز کنید و اسکریپت زیر را کپی کنید:

#!/bin/sh

### BEGIN INIT INFO
# Provides:       scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop:  $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Start daemon at boot time
# Description:    Enable service provided by daemon.
### END INIT INFO
 
bindir=/usr/bin
 
if test -x $bindir/mysqld_multi
then
    mysqld_multi="$bindir/mysqld_multi";
else
    echo "Can't execute $bindir/mysqld_multi";
    exit;
fi
 
case "$1" in
    'start' )
     "$mysqld_multi" start $2
     ;;
    'stop' )
     "$mysqld_multi" stop $2
     ;;
    'report' )
     "$mysqld_multi" report $2
     ;;
    'restart' )
     "$mysqld_multi" stop $2
     "$mysqld_multi" start $2
     ;;
    *)
     echo "Usage: $0 {start|stop|report|restart}" >&2
     ;;
esac

با دستور زیر mysqld_multiسرویس را به حالت پیش فرض اضافه کنید runlevels:

update-rc.d mysqld_multi defaults

دستگاه خود را دوباره راه اندازی کنید و با استفاده از دستور زیر بررسی کنید که هر دو نمونه MySQL در حال اجرا هستند:

mysqld_multi report

نسخه اصلی Master-slave را تنظیم کنید

حال ، هنگامی که دو نمونه MySQL روی یک ماشین اجرا می شوند ، نمونه اول را به عنوان master و نسخه دوم را به عنوان slave تنظیم می کنیم.

بخشی از پیکربندی قبلاً در فصل “Setting mysqld_multi” انجام شده است. تنها تغییر باقیمانده در my.cnfپرونده ، تنظیم ورود به سیستم باینری بر روی master است. برای این کار ، my.cnfپرونده را با تغییرات و اضافات زیر در [mysqld1]گروه ویرایش کنید:

log_bin                     = /var/log/mysql/mysql-bin.log
innodb_flush_log_at_trx_commit  = 1
sync_binlog                 = 1
binlog-format               = ROW

برای اعمال این تغییرات ، نمونه اصلی MySQL را مجدداً راه اندازی کنید:

mysqld_multi stop 1
mysqld_multi start 1

برای اینکه بنده با امتیازات تکثیر صحیح به master متصل شود ، باید یک کاربر جدید در master ایجاد شود. با استفاده از سرویس گیرنده MySQL با میزبان و پورت مناسب به نمونه اصلی متصل شوید:

mysql -uroot -p --host=127.0.0.1 --port=3306

یک کاربر جدید برای تکثیر ایجاد کنید:

mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

از سرویس گیرنده MySQL خارج شوید.

برای ایجاد یک dump از داده های اصلی ، دستور زیر را اجرا کنید:

mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

در اینجا ما از این گزینه استفاده می کنیم --master-data=2تا بتوانیم نظریه ای حاوی CHANGE MASTERگزاره ای در داخل فایل پشتیبان داشته باشیم. این نظر مختصات تکثیر را در زمان تهیه نسخه پشتیبان نشان می دهد و بعداً برای به روزرسانی اطلاعات اصلی در نمونه slave به این مختصات نیاز خواهیم داشت. در اینجا مثالی از این نظر آورده شده است:

--
-- Position to start replication or point-in-time recovery from
--

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

تخلیه ای را که در مرحله قبل ایجاد کرده اید به نمونه برده وارد کنید:

mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

سرانجام ، برای اینکه نمونه slave به نمونه اصلی متصل شود ، لازم است اطلاعات اصلی مربوط به slave با پارامترهای اتصال مناسب به روز شود.

با استفاده از سرویس گیرنده MySQL با میزبان و درگاه مناسب به نمونه slave متصل شوید:

mysql -uroot -p --host=127.0.0.1 --port=3307

برای به روزرسانی اطلاعات اصلی ، دستور زیر را اجرا کنید replicationdump.sql(همانطور که در بالا توضیح داده شد ، مختصات تکثیر را از پرونده dump بگیرید ):

mysql> CHANGE MASTER TO
  -> MASTER_HOST='127.0.0.1',
  -> MASTER_USER='replication',
  -> MASTER_PASSWORD='replication',
  -> MASTER_LOG_FILE='mysql-bin.000001',
  -> MASTER_LOG_POS=349;

برای شروع برده ، دستور زیر را اجرا کنید:

mysql> START SLAVE;

برای اطمینان از فعال بودن و تکثیر ، دستور زیر را اجرا کنید:

mysql> SHOW SLAVE STATUS \G

تبریک می گویم. همانندسازی MySQL master-slave شما در همان دستگاه اکنون با موفقیت تنظیم شده است.

همانندسازی MySQL master-slave

جمع بندی

پیکربندی نسخه اصلی master-slave در محیط توسعه برای شما مفید است در صورتی که برای راه حل گسترده در محیط تولید به آن نیاز دارید. به این ترتیب ، شما همچنین منابع داده جداگانه ای برای تنظیمات نوشتن و خواندن پیکربندی خواهید کرد ، بنابراین می توانید به صورت محلی تست کنید که همه چیز مطابق انتظار قبل از استقرار بیشتر کار می کند.

بعلاوه ، ممکن است بخواهید چندین نمونه برده را در یک ماشین برای آزمایش توازن بار که عملکرد خواندن را به چندین برده توزیع می کند ، پیکربندی کنید. در این صورت ، می توانید با استفاده از همین کتابچه راهنما با تکرار تمام مراحل مشابه ، سایر موارد برده را تنظیم کنید.

Comment here